blob: 71c811608a9f988a7fec264851d735dcf2ffc882 [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
881func (oo *OmciCC) SendMibUpload(ctx context.Context, timeout int, highPrio 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)
885 isExtended := oo.pOnuDeviceEntry.GetPersIsExtOmciSupported()
886
887 omciLayer := &omci.OMCI{
888 TransactionID: tid,
889 MessageType: omci.MibUploadRequestType,
890 }
891 if isExtended {
892 omciLayer.DeviceIdentifier = omci.ExtendedIdent
893 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000894 request := &omci.MibUploadRequest{
895 MeBasePacket: omci.MeBasePacket{
896 EntityClass: me.OnuDataClassID,
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000897 Extended: isExtended,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000898 },
899 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000900 var options gopacket.SerializeOptions
901 options.FixLengths = true
902
903 buffer := gopacket.NewSerializeBuffer()
904 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000905 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000906 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000907 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000908 return err
909 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000910 oo.UploadSequNo = 0
911 oo.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000912
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000913 omciRxCallbackPair := CallbackPair{
914 CbKey: tid,
915 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000916 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000917 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000918}
919
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000920// SendMibUploadNext sends MibUploadNextRequest
921func (oo *OmciCC) SendMibUploadNext(ctx context.Context, timeout int, highPrio bool) error {
922 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "UploadSequNo": oo.UploadSequNo})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000923
924 tid := oo.GetNextTid(highPrio)
925 isExtended := oo.pOnuDeviceEntry.GetPersIsExtOmciSupported()
926
927 omciLayer := &omci.OMCI{
928 TransactionID: tid,
929 MessageType: omci.MibUploadNextRequestType,
930 }
931 if isExtended {
932 omciLayer.DeviceIdentifier = omci.ExtendedIdent
933 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000934 request := &omci.MibUploadNextRequest{
935 MeBasePacket: omci.MeBasePacket{
936 EntityClass: me.OnuDataClassID,
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000937 Extended: isExtended,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000938 },
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000939 CommandSequenceNumber: oo.UploadSequNo,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000940 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000941 var options gopacket.SerializeOptions
942 options.FixLengths = true
943
944 buffer := gopacket.NewSerializeBuffer()
945 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000946 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000947 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000948 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000949 return err
950 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000951 oo.UploadSequNo++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000952
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000953 omciRxCallbackPair := CallbackPair{
954 CbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000955 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
956 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
957 // compare also software upgrade download section handling
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000958 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000959 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000960 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000961}
962
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000963// SendGetAllAlarm gets all alarm ME instances
964func (oo *OmciCC) SendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool) error {
Himani Chawlad3dac422021-03-13 02:31:31 +0530965 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
966 request := &omci.GetAllAlarmsRequest{
967 MeBasePacket: omci.MeBasePacket{
968 EntityClass: me.OnuDataClassID,
969 },
970 AlarmRetrievalMode: byte(alarmRetreivalMode),
971 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000972 tid := oo.GetNextTid(highPrio)
973 pkt, err := Serialize(ctx, omci.GetAllAlarmsRequestType, request, tid)
Himani Chawlad3dac422021-03-13 02:31:31 +0530974 if err != nil {
975 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{
976 "Err": err, "device-id": oo.deviceID})
977 return err
978 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000979 oo.pOnuAlarmManager.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +0530980
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000981 omciRxCallbackPair := CallbackPair{
982 CbKey: tid,
983 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +0530984 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000985 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +0530986}
987
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000988// SendGetAllAlarmNext gets next alarm ME instance
989func (oo *OmciCC) SendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool) error {
990 alarmUploadSeqNo := oo.pOnuAlarmManager.GetAlarmUploadSeqNo()
991 logger.Debugw(ctx, "send SendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
Himani Chawlad3dac422021-03-13 02:31:31 +0530992 "alarmUploadSeqNo": alarmUploadSeqNo})
993 request := &omci.GetAllAlarmsNextRequest{
994 MeBasePacket: omci.MeBasePacket{
995 EntityClass: me.OnuDataClassID,
996 },
997 CommandSequenceNumber: alarmUploadSeqNo,
998 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000999 tid := oo.GetNextTid(highPrio)
1000 pkt, err := Serialize(ctx, omci.GetAllAlarmsNextRequestType, request, tid)
Himani Chawlad3dac422021-03-13 02:31:31 +05301001 if err != nil {
1002 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{
1003 "Err": err, "device-id": oo.deviceID})
1004 return err
1005 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001006 oo.pOnuAlarmManager.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +05301007
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001008 omciRxCallbackPair := CallbackPair{
1009 CbKey: tid,
1010 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301011 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001012 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +05301013}
1014
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001015// SendCreateGalEthernetProfile creates GalEthernetProfile ME instance
1016func (oo *OmciCC) SendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1017 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001018 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001019 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001020
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001021 meParams := me.ParamData{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001022 EntityID: GalEthernetEID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001023 Attributes: me.AttributeValueMap{me.GalEthernetProfile_MaximumGemPayloadSize: maxGemPayloadSize},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001024 }
1025 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
1026 if omciErr.GetError() == nil {
1027 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001028 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001029 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001030 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001031 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001032 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001033 }
1034
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001035 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001036 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001037 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001038 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001039 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001040 }
1041
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001042 omciRxCallbackPair := CallbackPair{
1043 CbKey: tid,
1044 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001045 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001046 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001047 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001048 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001049 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001050 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001051 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001052 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001053 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001054 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001055 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001056 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001057 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001058}
1059
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001060// SendSetOnu2g sets Onu2G ME instance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001061// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001062func (oo *OmciCC) SendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1063 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001064 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001065 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001066
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001067 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
1068 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001069 // By now we just use fix values to fire - this is anyway what the python adapter does
1070 // read ONU-2G from DB ???? //TODO!!!
1071 meParams := me.ParamData{
1072 EntityID: 0,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001073 Attributes: me.AttributeValueMap{me.Onu2G_CurrentConnectivityMode: connectivityModeValue},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001074 }
1075 meInstance, omciErr := me.NewOnu2G(meParams)
1076 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001077 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001078 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001079 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001080 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001081 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001082 }
1083
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001084 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001085 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001086 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001087 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001088 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001089 }
1090
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001091 omciRxCallbackPair := CallbackPair{
1092 CbKey: tid,
1093 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001094 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001095 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001096 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001097 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001098 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001099 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001100 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001101 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001102 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001103 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001104 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001105 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001106 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001107}
1108
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001109// SendCreateMBServiceProfile creates MacBridgeServiceProfile ME instance
1110func (oo *OmciCC) SendCreateMBServiceProfile(ctx context.Context,
1111 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1112 tid := oo.GetNextTid(highPrio)
1113 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001114 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001115 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001116
1117 meParams := me.ParamData{
1118 EntityID: instID,
1119 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001120 me.MacBridgeServiceProfile_Priority: 0x8000,
1121 me.MacBridgeServiceProfile_MaxAge: 20 * 256, //20s
1122 me.MacBridgeServiceProfile_HelloTime: 2 * 256, //2s
1123 me.MacBridgeServiceProfile_ForwardDelay: 15 * 256, //15s
1124 me.MacBridgeServiceProfile_DynamicFilteringAgeingTime: 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001125 },
1126 }
1127
1128 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
1129 if omciErr.GetError() == nil {
1130 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001131 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1132 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001133 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001134 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001135 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001136 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001137 }
1138
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001139 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001140 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001141 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001142 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001143 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001144 }
1145
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001146 omciRxCallbackPair := CallbackPair{
1147 CbKey: tid,
1148 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001149 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001150 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001151 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001152 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001153 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001154 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001155 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001156 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001157 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001158 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001159 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001160 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001161 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001162}
1163
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001164// SendCreateMBPConfigDataUniSide creates MacBridgePortConfigurationData ME instance
1165func (oo *OmciCC) SendCreateMBPConfigDataUniSide(ctx context.Context,
1166 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1167 tid := oo.GetNextTid(highPrio)
1168 instID, idErr := GenerateUNISideMBPCDEID(uint16(aPUniPort.MacBpNo))
Mahir Gunyel6781f962021-05-16 23:30:08 -07001169 if idErr != nil {
1170 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1171 "Err": idErr, "device-id": oo.deviceID})
1172 return nil, idErr
1173 }
1174 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001175 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.MacBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001176
1177 meParams := me.ParamData{
1178 EntityID: instID,
1179 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001180 me.MacBridgePortConfigurationData_BridgeIdPointer: MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo),
1181 me.MacBridgePortConfigurationData_PortNum: aPUniPort.MacBpNo,
1182 me.MacBridgePortConfigurationData_TpType: uint8(aPUniPort.PortType),
1183 me.MacBridgePortConfigurationData_TpPointer: aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001184 },
1185 }
1186 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1187 if omciErr.GetError() == nil {
1188 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001189 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1190 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001191 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001192 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001193 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001194 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001195 }
1196
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001197 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001198 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001199 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001200 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001201 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001202 }
1203
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001204 omciRxCallbackPair := CallbackPair{
1205 CbKey: tid,
1206 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001207 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001208 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001209 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001210 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001211 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001212 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001213 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001214 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001215 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001216 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001217 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001218 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001219 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001220}
1221
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001222// SendCreateEVTOConfigData creates ExtendedVlanTaggingOperationConfigurationData ME instance
1223func (oo *OmciCC) SendCreateEVTOConfigData(ctx context.Context,
1224 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1225 tid := oo.GetNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001226 //same entityId is used as for MBSP (see there), but just arbitrary ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001227 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001228 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001229 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001230
1231 // compare python adapter code WA VOL-1311: this is not done here!
1232 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1233 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1234 assType := uint8(2) // default AssociationType is PPTPEthUni
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001235 if aPUniPort.PortType == UniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001236 assType = uint8(10) // for VEIP
1237 }
1238 meParams := me.ParamData{
1239 EntityID: instID,
1240 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001241 me.ExtendedVlanTaggingOperationConfigurationData_AssociationType: assType,
1242 me.ExtendedVlanTaggingOperationConfigurationData_AssociatedMePointer: aPUniPort.EntityID,
mpagenko836a1fd2021-11-01 16:12:42 +00001243 //EnhancedMode not yet supported, used with default options
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001244 },
1245 }
1246 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1247 if omciErr.GetError() == nil {
1248 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001249 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1250 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001251 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001252 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001253 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001254 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001255 }
1256
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001257 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001258 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001259 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001260 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001261 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001262 }
1263
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001264 omciRxCallbackPair := CallbackPair{
1265 CbKey: tid,
1266 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001267 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001268 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001269 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001270 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001271 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001272 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001273 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001274 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001275 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001276 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001277 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001278 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001279 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001280}
1281
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001282// SendSetOnuGLS sets OnuG ME instance
1283func (oo *OmciCC) SendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001284 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001285 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001286 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001287 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001288
1289 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1290 meParams := me.ParamData{
1291 EntityID: 0,
1292 Attributes: requestedAttributes,
1293 }
1294 meInstance, omciErr := me.NewOnuG(meParams)
1295 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001296 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001297 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001298 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001299 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001300 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001301 }
1302
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001303 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001304 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001305 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001306 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001307 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001308 }
1309
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001310 omciRxCallbackPair := CallbackPair{
1311 CbKey: tid,
1312 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001313 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001314 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001315 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001316 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001317 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001318 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001319 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001320 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001321 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001322 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001323 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001324 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001325 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001326}
1327
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001328// SendSetPptpEthUniLS sets PhysicalPathTerminationPointEthernetUni ME instance
1329func (oo *OmciCC) SendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001330 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001331 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001332 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001333 "SequNo": strconv.FormatInt(int64(tid), 16)})
1334
1335 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1336 meParams := me.ParamData{
1337 EntityID: aInstNo,
1338 Attributes: requestedAttributes,
1339 }
1340 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1341 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001342 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001343 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001344 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001345 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001346 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001347 }
1348
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001349 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001350 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001351 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001352 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001353 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001354 }
1355
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001356 omciRxCallbackPair := CallbackPair{
1357 CbKey: tid,
1358 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001359 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001360 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001361 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001362 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001363 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001364 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001365 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001366 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001367 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001368 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001369 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001370 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001371 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001372}
1373
1374/* UniG obsolete by now, left here in case it should be needed once again
1375 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301376func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001377 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001378 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001379 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001380 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001381
1382 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1383 meParams := me.ParamData{
1384 EntityID: aInstNo,
1385 Attributes: requestedAttributes,
1386 }
1387 meInstance, omciErr := me.NewUniG(meParams)
1388 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001389 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001390 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001391 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001392 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001393 return nil
1394 }
1395
1396 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1397 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001398 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001399 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001400 return nil
1401 }
1402
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001403 omciRxCallbackPair := CallbackPair{
1404 CbKey: tid,
1405 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001406 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001407 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001408 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001409 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001410 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001411 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001412 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001413 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001414 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001415 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001416 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001417 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001418 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001419}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001420*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001421
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001422// SendSetVeipLS sets VirtualEthernetInterfacePoint ME instance
1423func (oo *OmciCC) SendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001424 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001425 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001426 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001427 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001428
1429 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1430 meParams := me.ParamData{
1431 EntityID: aInstNo,
1432 Attributes: requestedAttributes,
1433 }
1434 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1435 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001436 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001437 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001438 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001439 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001440 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001441 }
1442
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001443 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001444 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001445 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001446 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001447 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001448 }
1449
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001450 omciRxCallbackPair := CallbackPair{
1451 CbKey: tid,
1452 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001453 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001454 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001455 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001456 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001457 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001458 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001459 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001460 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001461 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001462 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001463 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001464 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001465 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001466}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001467
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001468// SendGetMe gets ME instance
1469func (oo *OmciCC) SendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001470 timeout int, highPrio bool, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001471
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001472 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001473 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001474 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001475
1476 meParams := me.ParamData{
1477 EntityID: entityID,
1478 Attributes: requestedAttributes,
1479 }
1480 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1481 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301482 meClassIDName := meInstance.GetName()
mpagenko836a1fd2021-11-01 16:12:42 +00001483 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001484 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001485 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 +03001486 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001487 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001488 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001489 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001490 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001491 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001492 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001493 omciRxCallbackPair := CallbackPair{
1494 CbKey: tid,
1495 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001496 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001497 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001498 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001499 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001500 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001501 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001502 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001503 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001504 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001505 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001506 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001507}
1508
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001509// SendGetMeWithAttributeMask gets ME instance with attribute mask
1510func (oo *OmciCC) SendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
Himani Chawla43f95ff2021-06-03 00:24:12 +05301511 timeout int, highPrio bool, rxChan chan Message) error {
1512
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001513 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301514 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1515 "SequNo": strconv.FormatInt(int64(tid), 16)})
1516
1517 request := &omci.GetRequest{
1518 MeBasePacket: omci.MeBasePacket{
1519 EntityInstance: entityID,
1520 EntityClass: classID,
1521 },
1522 AttributeMask: requestedAttributesMask,
1523 }
1524
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001525 pkt, err := Serialize(ctx, omci.GetRequestType, request, tid)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301526 if err != nil {
1527 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1528 return err
1529 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001530 omciRxCallbackPair := CallbackPair{
1531 CbKey: tid,
1532 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05301533 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001534 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301535 if err != nil {
1536 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1537 return err
1538 }
1539 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1540 return nil
1541}
1542
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001543// SendCreateDot1PMapper creates Ieee8021PMapperServiceProfile ME instance
1544func (oo *OmciCC) SendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001545 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001546 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001547 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001548 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1549
1550 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001551 EntityID: aInstID,
1552 Attributes: me.AttributeValueMap{
1553 //workaround for unsuitable omci-lib default values, cmp VOL-3729
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001554 me.Ieee8021PMapperServiceProfile_TpPointer: 0xFFFF,
1555 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority0: 0xFFFF,
1556 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority1: 0xFFFF,
1557 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority2: 0xFFFF,
1558 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority3: 0xFFFF,
1559 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority4: 0xFFFF,
1560 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority5: 0xFFFF,
1561 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority6: 0xFFFF,
1562 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority7: 0xFFFF,
mpagenko8b5fdd22020-12-17 17:58:32 +00001563 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001564 }
1565 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1566 if omciErr.GetError() == nil {
1567 //we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001568 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1569 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001570 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001571 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001572 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001573 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001574 }
1575
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001576 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001577 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001578 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001579 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001580 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001581 }
1582
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001583 omciRxCallbackPair := CallbackPair{
1584 CbKey: tid,
1585 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001586 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001587 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001588 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001589 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001590 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001591 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001592 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001593 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001594 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001595 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001596 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001597 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001598 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001599}
1600
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001601// SendCreateMBPConfigDataVar creates MacBridgePortConfigurationData ME instance
1602func (oo *OmciCC) SendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001603 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001604 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001605 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001606 "SequNo": strconv.FormatInt(int64(tid), 16),
1607 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1608
1609 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1610 if omciErr.GetError() == nil {
1611 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001612 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1613 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001614 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001615 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001616 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001617 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001618 }
1619
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001620 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001621 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001622 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001623 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001624 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001625 }
1626
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001627 omciRxCallbackPair := CallbackPair{
1628 CbKey: tid,
1629 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001630 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001631 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001632 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001633 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001634 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001635 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001636 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001637 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001638 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001639 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001640 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001641 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001642 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001643}
1644
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001645// SendCreateGemNCTPVar creates GemPortNetworkCtp ME instance
1646func (oo *OmciCC) SendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001647 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001648 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001649 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001650 "SequNo": strconv.FormatInt(int64(tid), 16),
1651 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1652
1653 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1654 if omciErr.GetError() == nil {
1655 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001656 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1657 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001658 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001659 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001660 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001661 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001662 }
1663
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001664 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001665 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001666 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001667 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001668 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001669 }
1670
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001671 omciRxCallbackPair := CallbackPair{
1672 CbKey: tid,
1673 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001674 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001675 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001676 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001677 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001678 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001679 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001680 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001681 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001682 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001683 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001684 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001685 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001686 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001687}
1688
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001689// SendSetGemNCTPVar sets GemPortNetworkCtp ME instance
1690func (oo *OmciCC) SendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1691 tid := oo.GetNextTid(highPrio)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001692 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1693 "SequNo": strconv.FormatInt(int64(tid), 16),
1694 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1695
1696 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1697 if omciErr.GetError() == nil {
1698 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001699 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1700 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsia82b91a62021-05-21 18:54:49 +03001701 if err != nil {
1702 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1703 "Err": err, "device-id": oo.deviceID})
1704 return nil, err
1705 }
1706
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001707 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001708 if err != nil {
1709 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1710 "Err": err, "device-id": oo.deviceID})
1711 return nil, err
1712 }
1713
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001714 omciRxCallbackPair := CallbackPair{
1715 CbKey: tid,
1716 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia82b91a62021-05-21 18:54:49 +03001717 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001718 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001719 if err != nil {
1720 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1721 "Err": err, "device-id": oo.deviceID})
1722 return nil, err
1723 }
1724 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1725 return meInstance, nil
1726 }
1727 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1728 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1729 return nil, omciErr.GetError()
1730}
1731
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001732// SendCreateGemIWTPVar creates GemInterworkingTerminationPoint ME instance
1733func (oo *OmciCC) SendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001734 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001735 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001736 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001737 "SequNo": strconv.FormatInt(int64(tid), 16),
1738 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1739
1740 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1741 if omciErr.GetError() == nil {
1742 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001743 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1744 oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001745 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001746 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001747 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001748 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001749 }
1750
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001751 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001752 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001753 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001754 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001755 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001756 }
1757
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001758 omciRxCallbackPair := CallbackPair{
1759 CbKey: tid,
1760 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001761 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001762 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001763 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001764 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001765 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001766 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001767 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001768 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001769 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001770 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001771 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001772 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001773 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001774}
1775
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001776// SendSetTcontVar sets TCont ME instance
1777func (oo *OmciCC) SendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001778 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001779 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001780 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001781 "SequNo": strconv.FormatInt(int64(tid), 16),
1782 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1783
1784 meInstance, omciErr := me.NewTCont(params[0])
1785 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001786 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001787 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001788 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001789 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001790 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001791 }
1792
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001793 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001794 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001795 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001796 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001797 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001798 }
1799
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001800 omciRxCallbackPair := CallbackPair{
1801 CbKey: tid,
1802 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001803 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001804 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001805 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001806 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001807 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001808 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001809 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001810 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001811 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001812 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001813 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001814 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001815 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001816}
1817
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001818// SendSetPrioQueueVar sets PriorityQueue ME instance
1819func (oo *OmciCC) SendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001820 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001821 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001822 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001823 "SequNo": strconv.FormatInt(int64(tid), 16),
1824 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1825
1826 meInstance, omciErr := me.NewPriorityQueue(params[0])
1827 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001828 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001829 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001830 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001831 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001832 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001833 }
1834
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001835 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001836 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001837 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001838 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001839 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001840 }
1841
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001842 omciRxCallbackPair := CallbackPair{
1843 CbKey: tid,
1844 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001845 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001846 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001847 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001848 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001849 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001850 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001851 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001852 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001853 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001854 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001855 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001856 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001857 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001858}
1859
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001860// SendSetDot1PMapperVar sets Ieee8021PMapperServiceProfile ME instance
1861func (oo *OmciCC) SendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001862 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001863 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001864 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001865 "SequNo": strconv.FormatInt(int64(tid), 16),
1866 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1867
1868 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1869 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001870 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001871 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001872 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001873 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001874 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001875 }
1876
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001877 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001878 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001879 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001880 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001881 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001882 }
1883
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001884 omciRxCallbackPair := CallbackPair{
1885 CbKey: tid,
1886 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001887 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001888 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001889 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001890 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001891 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001892 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001893 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001894 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001895 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001896 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001897 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001898 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001899 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001900}
mpagenkodff5dda2020-08-28 11:52:01 +00001901
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001902// SendCreateVtfdVar creates VlanTaggingFilterData ME instance
1903func (oo *OmciCC) SendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001904 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001905 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001906 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001907 "SequNo": strconv.FormatInt(int64(tid), 16),
1908 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1909
1910 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1911 if omciErr.GetError() == nil {
1912 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001913 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1914 oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00001915 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001916 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001917 "Err": err, "device-id": oo.deviceID})
1918 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1919 // return (dual format) error code that can be used at caller for immediate error treatment
1920 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001921 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001922 }
1923
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001924 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001925 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001926 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001927 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001928 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001929 }
1930
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001931 omciRxCallbackPair := CallbackPair{
1932 CbKey: tid,
1933 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001934 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001935 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001936 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001937 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001938 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001939 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001940 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001941 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001942 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00001943 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001944 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001945 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001946 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00001947}
1948
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001949// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001950func (oo *OmciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001951 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001952 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001953 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001954 "SequNo": strconv.FormatInt(int64(tid), 16),
1955 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1956
1957 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1958 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001959 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1960 oframe.TransactionID(tid))
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001961 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001962 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001963 "Err": err, "device-id": oo.deviceID})
1964 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1965 // return (dual format) error code that can be used at caller for immediate error treatment
1966 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001967 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001968 }
1969
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001970 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001971 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001972 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001973 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001974 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001975 }
1976
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001977 omciRxCallbackPair := CallbackPair{
1978 CbKey: tid,
1979 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001980 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001981 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001982 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001983 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001984 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001985 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001986 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001987 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001988 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001989 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001990 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001991 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001992 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001993}
1994
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001995// SendCreateEvtocdVar creates ExtendedVlanTaggingOperationConfigurationData ME instance
1996func (oo *OmciCC) SendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001997 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001998 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001999 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002000 "SequNo": strconv.FormatInt(int64(tid), 16),
2001 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2002
2003 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2004 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002005 //EnhancedMode not yet supported, used with default options
2006 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2007 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002008 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002009 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002010 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002011 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002012 }
2013
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002014 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002015 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002016 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002017 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002018 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002019 }
2020
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002021 omciRxCallbackPair := CallbackPair{
2022 CbKey: tid,
2023 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002024 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002025 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002026 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002027 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002028 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002029 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002030 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002031 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002032 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002033 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002034 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002035 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002036 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002037}
2038
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002039// SendSetEvtocdVar sets ExtendedVlanTaggingOperationConfigurationData ME instance
2040func (oo *OmciCC) SendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002041 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002042 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002043 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002044 "SequNo": strconv.FormatInt(int64(tid), 16),
2045 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2046
2047 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2048 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002049 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002050 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002051 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002052 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002053 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002054 }
2055
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002056 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002057 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002058 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002059 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002060 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002061 }
2062
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002063 omciRxCallbackPair := CallbackPair{
2064 CbKey: tid,
2065 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002066 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002067 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002068 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002069 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002070 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002071 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002072 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002073 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002074 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002075 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002076 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002077 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002078 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002079}
mpagenko01e726e2020-10-23 09:45:29 +00002080
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002081// SendDeleteEvtocd deletes ExtendedVlanTaggingOperationConfigurationData ME instance
2082func (oo *OmciCC) SendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002083 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002084 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002085 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002086 "SequNo": strconv.FormatInt(int64(tid), 16),
2087 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2088
2089 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2090 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002091 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002092 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002093 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002094 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002095 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002096 }
2097
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002098 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002099 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002100 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002101 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002102 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002103 }
2104
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002105 omciRxCallbackPair := CallbackPair{
2106 CbKey: tid,
2107 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002108 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002109 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002110 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002111 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002112 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002113 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002114 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002115 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002116 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002117 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002118 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002119 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002120 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002121}
2122
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002123// SendDeleteVtfd deletes VlanTaggingFilterData ME instance
2124func (oo *OmciCC) SendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002125 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002126 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002127 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00002128 "SequNo": strconv.FormatInt(int64(tid), 16),
2129 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2130
2131 meParams := me.ParamData{EntityID: aInstID}
2132 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
2133 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002134 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2135 oframe.TransactionID(tid))
mpagenko01e726e2020-10-23 09:45:29 +00002136 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002137 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002138 "Err": err, "device-id": oo.deviceID})
2139 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2140 // return (dual format) error code that can be used at caller for immediate error treatment
2141 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002142 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002143 }
2144
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002145 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00002146 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002147 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002148 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002149 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002150 }
2151
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002152 omciRxCallbackPair := CallbackPair{
2153 CbKey: tid,
2154 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00002155 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002156 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00002157 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002158 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002159 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002160 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002161 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002162 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002163 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00002164 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002165 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002166 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002167 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00002168}
ozgecanetsia422dbf32020-10-28 14:07:19 +03002169
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002170// SendCreateTDVar creates TrafficDescriptor ME instance
2171func (oo *OmciCC) SendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2172 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002173 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
2174 "SequNo": strconv.FormatInt(int64(tid), 16),
2175 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2176 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2177 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002178 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002179 if err != nil {
2180 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002181 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002182 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002183 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002184 if err != nil {
2185 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002186 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002187 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002188 omciRxCallbackPair := CallbackPair{
2189 CbKey: tid,
2190 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002191 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002192 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002193 if err != nil {
2194 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002195 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002196 }
2197 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002198 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002199 }
2200 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002201 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002202}
2203
2204// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002205func (oo *OmciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002206 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002207 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002208 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2209 "SequNo": strconv.FormatInt(int64(tid), 16),
2210 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2211
2212 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2213 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002214 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002215 if err != nil {
2216 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002217 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002218 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002219 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002220 if err != nil {
2221 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002222 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002223 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002224 omciRxCallbackPair := CallbackPair{
2225 CbKey: tid,
2226 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002227 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002228 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002229 if err != nil {
2230 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002231 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002232 }
2233 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002234 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002235 }
2236 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002237 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002238
2239}
2240
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002241// SendDeleteTD - TODO: add comment
2242func (oo *OmciCC) SendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002243 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002244 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002245 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2246 "SequNo": strconv.FormatInt(int64(tid), 16),
2247 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2248
2249 meParams := me.ParamData{EntityID: aInstID}
2250 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2251 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002252 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002253 if err != nil {
2254 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002255 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002256 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002257 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002258 if err != nil {
2259 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002260 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002261 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002262 omciRxCallbackPair := CallbackPair{
2263 CbKey: tid,
2264 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002265 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002266 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002267 if err != nil {
2268 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002269 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002270 }
2271 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002272 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002273 }
2274 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002275 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002276
2277}
2278
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002279// SendDeleteGemIWTP deletes GemInterworkingTerminationPoint ME instance
2280func (oo *OmciCC) SendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002281 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002282 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002283 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002284 "SequNo": strconv.FormatInt(int64(tid), 16),
2285 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2286
2287 meParams := me.ParamData{EntityID: aInstID}
2288 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2289 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002290 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2291 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002292 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002293 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002294 "Err": err, "device-id": oo.deviceID})
2295 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2296 // return (dual format) error code that can be used at caller for immediate error treatment
2297 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002298 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002299 }
2300
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002301 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002302 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002303 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002304 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002305 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002306 }
2307
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002308 omciRxCallbackPair := CallbackPair{
2309 CbKey: tid,
2310 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002311 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002312 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002313 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002314 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002315 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002316 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002317 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002318 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002319 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002320 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002321 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002322 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002323 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002324}
2325
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002326// SendDeleteGemNCTP deletes GemPortNetworkCtp ME instance
2327func (oo *OmciCC) SendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002328 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002329 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002330 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002331 "SequNo": strconv.FormatInt(int64(tid), 16),
2332 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2333
2334 meParams := me.ParamData{EntityID: aInstID}
2335 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2336 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002337 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2338 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002339 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002340 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002341 "Err": err, "device-id": oo.deviceID})
2342 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2343 // return (dual format) error code that can be used at caller for immediate error treatment
2344 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002345 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002346 }
2347
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002348 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002349 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002350 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002351 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002352 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002353 }
2354
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002355 omciRxCallbackPair := CallbackPair{
2356 CbKey: tid,
2357 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002358 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002359 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002360 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002361 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002362 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002363 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002364 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002365 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002366 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002367 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002368 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002369 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002370 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002371}
2372
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002373// SendDeleteDot1PMapper deletes Ieee8021PMapperServiceProfile ME instance
2374func (oo *OmciCC) SendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002375 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002376 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002377 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002378 "SequNo": strconv.FormatInt(int64(tid), 16),
2379 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2380
2381 meParams := me.ParamData{EntityID: aInstID}
2382 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2383 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002384 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2385 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002386 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002387 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002388 "Err": err, "device-id": oo.deviceID})
2389 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2390 // return (dual format) error code that can be used at caller for immediate error treatment
2391 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002392 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002393 }
2394
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002395 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002396 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002397 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002398 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002399 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002400 }
2401
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002402 omciRxCallbackPair := CallbackPair{
2403 CbKey: tid,
2404 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002405 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002406 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002407 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002408 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002409 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002410 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002411 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002412 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002413 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002414 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002415 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002416 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002417 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002418}
2419
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002420// SendDeleteMBPConfigData deletes MacBridgePortConfigurationData ME instance
2421func (oo *OmciCC) SendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002422 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002423 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002424 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002425 "SequNo": strconv.FormatInt(int64(tid), 16),
2426 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2427
2428 meParams := me.ParamData{EntityID: aInstID}
2429 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2430 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002431 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2432 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002433 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002434 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002435 "Err": err, "device-id": oo.deviceID})
2436 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2437 // return (dual format) error code that can be used at caller for immediate error treatment
2438 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002439 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002440 }
2441
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002442 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002443 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002444 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002445 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002446 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002447 }
2448
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002449 omciRxCallbackPair := CallbackPair{
2450 CbKey: tid,
2451 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002452 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002453 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002454 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002455 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002456 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002457 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002458 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002459 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002460 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002461 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002462 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002463 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002464 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002465}
2466
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002467// SendCreateMulticastGemIWTPVar creates MulticastGemInterworkingTerminationPoint ME instance
2468func (oo *OmciCC) SendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002469 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002470 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002471 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002472 "SequNo": strconv.FormatInt(int64(tid), 16),
2473 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2474
2475 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2476 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002477 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2478 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002479 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002480 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002481 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002482 }
2483
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002484 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002485 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002486 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002487 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002488 }
2489
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002490 omciRxCallbackPair := CallbackPair{CbKey: tid,
2491 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002492 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002493 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002494 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002495 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002496 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002497 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002498 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002499 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002500 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002501 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002502 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002503 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002504}
2505
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002506// SendSetMulticastGemIWTPVar sets MulticastGemInterworkingTerminationPoint ME instance
2507func (oo *OmciCC) SendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002508 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002509 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002510 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002511 "SequNo": strconv.FormatInt(int64(tid), 16),
2512 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2513
2514 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2515 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002516 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2517 oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002518 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002519 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002520 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002521 }
2522
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002523 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002524 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002525 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002526 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002527 }
2528
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002529 omciRxCallbackPair := CallbackPair{CbKey: tid,
2530 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002531 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002532 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002533 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002534 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002535 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002536 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002537 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002538 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002539 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002540 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002541 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002542 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002543}
2544
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002545// SendCreateMulticastOperationProfileVar creates MulticastOperationsProfile ME instance
2546func (oo *OmciCC) SendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002547 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002548 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002549 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002550 "SequNo": strconv.FormatInt(int64(tid), 16),
2551 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2552
2553 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2554 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002555 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2556 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002557 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002558 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002559 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002560 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002561 }
2562
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002563 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002564 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002565 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002566 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002567 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002568 }
2569
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002570 omciRxCallbackPair := CallbackPair{CbKey: tid,
2571 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002572 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002573 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002574 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002575 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002576 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002577 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002578 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002579 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002580 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002581 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002582 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002583 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002584 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002585}
2586
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002587// SendSetMulticastOperationProfileVar sets MulticastOperationsProfile ME instance
2588func (oo *OmciCC) SendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002589 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002590 tid := oo.GetNextTid(highPrio)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002591 logger.Debugw(ctx, "send MulticastOperationProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002592 "SequNo": strconv.FormatInt(int64(tid), 16),
2593 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2594
2595 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2596 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002597 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2598 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002599 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002600 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002601 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002602 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002603 }
2604
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002605 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002606 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002607 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002608 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002609 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002610 }
2611
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002612 omciRxCallbackPair := CallbackPair{CbKey: tid,
2613 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002614 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002615 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002616 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002617 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002618 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002619 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002620 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002621 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002622 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002623 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002624 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002625 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002626 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002627}
2628
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002629// SendCreateMulticastSubConfigInfoVar creates MulticastSubscriberConfigInfo ME instance
2630func (oo *OmciCC) SendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002631 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002632 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002633 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002634 "SequNo": strconv.FormatInt(int64(tid), 16),
2635 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2636
2637 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2638 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002639 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2640 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002641 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002642 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002643 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002644 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002645 }
2646
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002647 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002648 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002649 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002650 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002651 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002652 }
2653
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002654 omciRxCallbackPair := CallbackPair{CbKey: tid,
2655 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002656 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002657 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002658 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002659 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002660 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002661 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002662 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002663 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002664 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002665 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002666 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002667 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002668 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002669}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002670
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002671// SendCreateVoipVoiceCTP nolint: unused
2672func (oo *OmciCC) SendCreateVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2673 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2674 tid := oo.GetNextTid(highPrio)
2675 logger.Debugw(ctx, "send VoipVoiceCTP-create-msg:", log.Fields{"device-id": oo.deviceID,
2676 "SequNo": strconv.FormatInt(int64(tid), 16),
2677 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2678
2679 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2680 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002681 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2682 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002683 if err != nil {
2684 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for create", log.Fields{"Err": err,
2685 "device-id": oo.deviceID})
2686 return nil, err
2687 }
2688
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002689 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002690 if err != nil {
2691 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP create", log.Fields{"Err": err,
2692 "device-id": oo.deviceID})
2693 return nil, err
2694 }
2695
2696 omciRxCallbackPair := CallbackPair{CbKey: tid,
2697 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2698 }
2699 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2700 if err != nil {
2701 logger.Errorw(ctx, "Cannot send VoipVoiceCTP create", log.Fields{"Err": err,
2702 "device-id": oo.deviceID})
2703 return nil, err
2704 }
2705 logger.Debug(ctx, "send VoipVoiceCTP-create-msg done")
2706 return meInstance, nil
2707 }
2708 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2709 "device-id": oo.deviceID})
2710 return nil, omciErr.GetError()
2711}
2712
2713// SendSetVoipVoiceCTP nolint: unused
2714func (oo *OmciCC) SendSetVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2715 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2716 tid := oo.GetNextTid(highPrio)
2717 logger.Debugw(ctx, "send VoipVoiceCTP-set-msg:", log.Fields{"device-id": oo.deviceID,
2718 "SequNo": strconv.FormatInt(int64(tid), 16),
2719 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2720
2721 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2722 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002723 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2724 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002725 if err != nil {
2726 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for set", log.Fields{"Err": err,
2727 "device-id": oo.deviceID})
2728 return nil, err
2729 }
2730
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002731 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002732 if err != nil {
2733 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP set", log.Fields{"Err": err,
2734 "device-id": oo.deviceID})
2735 return nil, err
2736 }
2737
2738 omciRxCallbackPair := CallbackPair{CbKey: tid,
2739 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2740 }
2741 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2742 if err != nil {
2743 logger.Errorw(ctx, "Cannot send VoipVoiceCTP set", log.Fields{"Err": err,
2744 "device-id": oo.deviceID})
2745 return nil, err
2746 }
2747 logger.Debug(ctx, "send VoipVoiceCTP-set-msg done")
2748 return meInstance, nil
2749 }
2750 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2751 "device-id": oo.deviceID})
2752 return nil, omciErr.GetError()
2753}
2754
2755// SendDeleteVoipVoiceCTP nolint: unused
2756func (oo *OmciCC) SendDeleteVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2757 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2758 tid := oo.GetNextTid(highPrio)
2759 logger.Debugw(ctx, "send VoipVoiceCTP-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2760 "SequNo": strconv.FormatInt(int64(tid), 16),
2761 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2762
2763 meParams := me.ParamData{EntityID: aInstID}
2764 meInstance, omciErr := me.NewVoipVoiceCtp(meParams)
2765 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002766 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2767 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002768 if err != nil {
2769 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for delete", log.Fields{
2770 "Err": err, "device-id": oo.deviceID})
2771 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2772 // return (dual format) error code that can be used at caller for immediate error treatment
2773 // (relevant to all used sendXX() methods and their error conditions)
2774 return nil, err
2775 }
2776
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002777 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002778 if err != nil {
2779 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP delete", log.Fields{
2780 "Err": err, "device-id": oo.deviceID})
2781 return nil, err
2782 }
2783
2784 omciRxCallbackPair := CallbackPair{
2785 CbKey: tid,
2786 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2787 }
2788 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2789 if err != nil {
2790 logger.Errorw(ctx, "Cannot send VoipVoiceCTP delete", log.Fields{
2791 "Err": err, "device-id": oo.deviceID})
2792 return nil, err
2793 }
2794 logger.Debug(ctx, "send VoipVoiceCTP-Delete-msg done")
2795 return meInstance, nil
2796 }
2797 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance for delete", log.Fields{
2798 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2799 return nil, omciErr.GetError()
2800}
2801
2802// SendCreateVoipMediaProfile nolint: unused
2803func (oo *OmciCC) SendCreateVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2804 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2805 tid := oo.GetNextTid(highPrio)
2806 logger.Debugw(ctx, "send VoipMediaProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2807 "SequNo": strconv.FormatInt(int64(tid), 16),
2808 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2809
2810 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2811 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002812 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2813 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002814 if err != nil {
2815 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for create", log.Fields{"Err": err,
2816 "device-id": oo.deviceID})
2817 return nil, err
2818 }
2819
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002820 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002821 if err != nil {
2822 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile create", log.Fields{"Err": err,
2823 "device-id": oo.deviceID})
2824 return nil, err
2825 }
2826
2827 omciRxCallbackPair := CallbackPair{CbKey: tid,
2828 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2829 }
2830 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2831 if err != nil {
2832 logger.Errorw(ctx, "Cannot send VoipMediaProfile create", log.Fields{"Err": err,
2833 "device-id": oo.deviceID})
2834 return nil, err
2835 }
2836 logger.Debug(ctx, "send VoipMediaProfile-create-msg done")
2837 return meInstance, nil
2838 }
2839 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2840 "device-id": oo.deviceID})
2841 return nil, omciErr.GetError()
2842}
2843
2844// SendSetVoipMediaProfile nolint: unused
2845func (oo *OmciCC) SendSetVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2846 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2847 tid := oo.GetNextTid(highPrio)
2848 logger.Debugw(ctx, "send VoipMediaProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
2849 "SequNo": strconv.FormatInt(int64(tid), 16),
2850 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2851
2852 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2853 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002854 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2855 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002856 if err != nil {
2857 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for set", log.Fields{"Err": err,
2858 "device-id": oo.deviceID})
2859 return nil, err
2860 }
2861
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002862 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002863 if err != nil {
2864 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile set", log.Fields{"Err": err,
2865 "device-id": oo.deviceID})
2866 return nil, err
2867 }
2868
2869 omciRxCallbackPair := CallbackPair{CbKey: tid,
2870 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2871 }
2872 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2873 if err != nil {
2874 logger.Errorw(ctx, "Cannot send VoipMediaProfile set", log.Fields{"Err": err,
2875 "device-id": oo.deviceID})
2876 return nil, err
2877 }
2878 logger.Debug(ctx, "send VoipMediaProfile-set-msg done")
2879 return meInstance, nil
2880 }
2881 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2882 "device-id": oo.deviceID})
2883 return nil, omciErr.GetError()
2884}
2885
2886// SendDeleteVoipMediaProfile nolint: unused
2887func (oo *OmciCC) SendDeleteVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2888 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2889 tid := oo.GetNextTid(highPrio)
2890 logger.Debugw(ctx, "send VoipMediaProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2891 "SequNo": strconv.FormatInt(int64(tid), 16),
2892 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2893
2894 meParams := me.ParamData{EntityID: aInstID}
2895 meInstance, omciErr := me.NewVoipMediaProfile(meParams)
2896 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002897 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2898 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002899 if err != nil {
2900 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for delete", log.Fields{
2901 "Err": err, "device-id": oo.deviceID})
2902 return nil, err
2903 }
2904
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002905 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002906 if err != nil {
2907 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile delete", log.Fields{
2908 "Err": err, "device-id": oo.deviceID})
2909 return nil, err
2910 }
2911
2912 omciRxCallbackPair := CallbackPair{
2913 CbKey: tid,
2914 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2915 }
2916 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2917 if err != nil {
2918 logger.Errorw(ctx, "Cannot send VoipMediaProfile delete", log.Fields{
2919 "Err": err, "device-id": oo.deviceID})
2920 return nil, err
2921 }
2922 logger.Debug(ctx, "send VoipMediaProfile-Delete-msg done")
2923 return meInstance, nil
2924 }
2925 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance for delete", log.Fields{
2926 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2927 return nil, omciErr.GetError()
2928}
2929
2930// SendCreateVoiceServiceProfile nolint: unused
2931func (oo *OmciCC) SendCreateVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
2932 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2933 tid := oo.GetNextTid(highPrio)
2934 logger.Debugw(ctx, "send VoiceServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2935 "SequNo": strconv.FormatInt(int64(tid), 16),
2936 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2937
2938 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
2939 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002940 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2941 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002942 if err != nil {
2943 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for create", log.Fields{"Err": err,
2944 "device-id": oo.deviceID})
2945 return nil, err
2946 }
2947
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002948 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002949 if err != nil {
2950 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile create", log.Fields{"Err": err,
2951 "device-id": oo.deviceID})
2952 return nil, err
2953 }
2954
2955 omciRxCallbackPair := CallbackPair{CbKey: tid,
2956 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2957 }
2958 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2959 if err != nil {
2960 logger.Errorw(ctx, "Cannot send VoiceServiceProfile create", log.Fields{"Err": err,
2961 "device-id": oo.deviceID})
2962 return nil, err
2963 }
2964 logger.Debug(ctx, "send VoiceServiceProfile-create-msg done")
2965 return meInstance, nil
2966 }
2967 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
2968 "device-id": oo.deviceID})
2969 return nil, omciErr.GetError()
2970}
2971
2972// SendSetVoiceServiceProfile nolint: unused
2973func (oo *OmciCC) SendSetVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
2974 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2975 tid := oo.GetNextTid(highPrio)
2976 logger.Debugw(ctx, "send VoiceServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
2977 "SequNo": strconv.FormatInt(int64(tid), 16),
2978 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2979
2980 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
2981 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002982 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2983 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002984 if err != nil {
2985 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for set", log.Fields{"Err": err,
2986 "device-id": oo.deviceID})
2987 return nil, err
2988 }
2989
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002990 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002991 if err != nil {
2992 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile set", log.Fields{"Err": err,
2993 "device-id": oo.deviceID})
2994 return nil, err
2995 }
2996
2997 omciRxCallbackPair := CallbackPair{CbKey: tid,
2998 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2999 }
3000 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3001 if err != nil {
3002 logger.Errorw(ctx, "Cannot send VoiceServiceProfile set", log.Fields{"Err": err,
3003 "device-id": oo.deviceID})
3004 return nil, err
3005 }
3006 logger.Debug(ctx, "send VoiceServiceProfile-set-msg done")
3007 return meInstance, nil
3008 }
3009 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3010 "device-id": oo.deviceID})
3011 return nil, omciErr.GetError()
3012}
3013
3014// SendDeleteVoiceServiceProfile nolint: unused
3015func (oo *OmciCC) SendDeleteVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3016 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3017 tid := oo.GetNextTid(highPrio)
3018 logger.Debugw(ctx, "send VoiceServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3019 "SequNo": strconv.FormatInt(int64(tid), 16),
3020 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3021
3022 meParams := me.ParamData{EntityID: aInstID}
3023 meInstance, omciErr := me.NewVoiceServiceProfile(meParams)
3024 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003025 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3026 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003027 if err != nil {
3028 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for delete", log.Fields{
3029 "Err": err, "device-id": oo.deviceID})
3030 return nil, err
3031 }
3032
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003033 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003034 if err != nil {
3035 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile delete", log.Fields{
3036 "Err": err, "device-id": oo.deviceID})
3037 return nil, err
3038 }
3039
3040 omciRxCallbackPair := CallbackPair{
3041 CbKey: tid,
3042 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3043 }
3044 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3045 if err != nil {
3046 logger.Errorw(ctx, "Cannot send VoiceServiceProfile delete", log.Fields{
3047 "Err": err, "device-id": oo.deviceID})
3048 return nil, err
3049 }
3050 logger.Debug(ctx, "send VoiceServiceProfile-Delete-msg done")
3051 return meInstance, nil
3052 }
3053 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance for delete", log.Fields{
3054 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3055 return nil, omciErr.GetError()
3056}
3057
3058// SendCreateSIPUserData nolint: unused
3059func (oo *OmciCC) SendCreateSIPUserData(ctx context.Context, timeout int, highPrio bool,
3060 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3061 tid := oo.GetNextTid(highPrio)
3062 logger.Debugw(ctx, "send SIPUserData-create-msg:", log.Fields{"device-id": oo.deviceID,
3063 "SequNo": strconv.FormatInt(int64(tid), 16),
3064 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3065
3066 meInstance, omciErr := me.NewSipUserData(params[0])
3067 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003068 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3069 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003070 if err != nil {
3071 logger.Errorw(ctx, "Cannot encode SIPUserData for create", log.Fields{"Err": err,
3072 "device-id": oo.deviceID})
3073 return nil, err
3074 }
3075
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003076 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003077 if err != nil {
3078 logger.Errorw(ctx, "Cannot serialize SIPUserData create", log.Fields{"Err": err,
3079 "device-id": oo.deviceID})
3080 return nil, err
3081 }
3082
3083 omciRxCallbackPair := CallbackPair{CbKey: tid,
3084 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3085 }
3086 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3087 if err != nil {
3088 logger.Errorw(ctx, "Cannot send SIPUserData create", log.Fields{"Err": err,
3089 "device-id": oo.deviceID})
3090 return nil, err
3091 }
3092 logger.Debug(ctx, "send SIPUserData-create-msg done")
3093 return meInstance, nil
3094 }
3095 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3096 "device-id": oo.deviceID})
3097 return nil, omciErr.GetError()
3098}
3099
3100// SendSetSIPUserData nolint: unused
3101func (oo *OmciCC) SendSetSIPUserData(ctx context.Context, timeout int, highPrio bool,
3102 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3103 tid := oo.GetNextTid(highPrio)
3104 logger.Debugw(ctx, "send SIPUserData-set-msg:", log.Fields{"device-id": oo.deviceID,
3105 "SequNo": strconv.FormatInt(int64(tid), 16),
3106 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3107
3108 meInstance, omciErr := me.NewSipUserData(params[0])
3109 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003110 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3111 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003112 if err != nil {
3113 logger.Errorw(ctx, "Cannot encode SIPUserData for set", log.Fields{"Err": err,
3114 "device-id": oo.deviceID})
3115 return nil, err
3116 }
3117
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003118 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003119 if err != nil {
3120 logger.Errorw(ctx, "Cannot serialize SIPUserData set", log.Fields{"Err": err,
3121 "device-id": oo.deviceID})
3122 return nil, err
3123 }
3124
3125 omciRxCallbackPair := CallbackPair{CbKey: tid,
3126 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3127 }
3128 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3129 if err != nil {
3130 logger.Errorw(ctx, "Cannot send SIPUserData set", log.Fields{"Err": err,
3131 "device-id": oo.deviceID})
3132 return nil, err
3133 }
3134 logger.Debug(ctx, "send SIPUserData-set-msg done")
3135 return meInstance, nil
3136 }
3137 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3138 "device-id": oo.deviceID})
3139 return nil, omciErr.GetError()
3140}
3141
3142// SendDeleteSIPUserData nolint: unused
3143func (oo *OmciCC) SendDeleteSIPUserData(ctx context.Context, timeout int, highPrio bool,
3144 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3145 tid := oo.GetNextTid(highPrio)
3146 logger.Debugw(ctx, "send SIPUserData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3147 "SequNo": strconv.FormatInt(int64(tid), 16),
3148 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3149
3150 meParams := me.ParamData{EntityID: aInstID}
3151 meInstance, omciErr := me.NewSipUserData(meParams)
3152 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003153 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3154 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003155 if err != nil {
3156 logger.Errorw(ctx, "Cannot encode SIPUserData for delete", log.Fields{
3157 "Err": err, "device-id": oo.deviceID})
3158 return nil, err
3159 }
3160
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003161 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003162 if err != nil {
3163 logger.Errorw(ctx, "Cannot serialize SIPUserData delete", log.Fields{
3164 "Err": err, "device-id": oo.deviceID})
3165 return nil, err
3166 }
3167
3168 omciRxCallbackPair := CallbackPair{
3169 CbKey: tid,
3170 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3171 }
3172 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3173 if err != nil {
3174 logger.Errorw(ctx, "Cannot send SIPUserData delete", log.Fields{
3175 "Err": err, "device-id": oo.deviceID})
3176 return nil, err
3177 }
3178 logger.Debug(ctx, "send SIPUserData-Delete-msg done")
3179 return meInstance, nil
3180 }
3181 logger.Errorw(ctx, "Cannot generate SIPUserData Instance for delete", log.Fields{
3182 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3183 return nil, omciErr.GetError()
3184}
3185
3186// SendCreateVoipApplicationServiceProfile nolint: unused
3187func (oo *OmciCC) SendCreateVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3188 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3189 tid := oo.GetNextTid(highPrio)
3190 logger.Debugw(ctx, "send VoipApplicationServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3191 "SequNo": strconv.FormatInt(int64(tid), 16),
3192 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3193
3194 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3195 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003196 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3197 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003198 if err != nil {
3199 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for create", log.Fields{"Err": err,
3200 "device-id": oo.deviceID})
3201 return nil, err
3202 }
3203
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003204 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003205 if err != nil {
3206 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile create", log.Fields{"Err": err,
3207 "device-id": oo.deviceID})
3208 return nil, err
3209 }
3210
3211 omciRxCallbackPair := CallbackPair{CbKey: tid,
3212 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3213 }
3214 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3215 if err != nil {
3216 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile create", log.Fields{"Err": err,
3217 "device-id": oo.deviceID})
3218 return nil, err
3219 }
3220 logger.Debug(ctx, "send VoipApplicationServiceProfile-create-msg done")
3221 return meInstance, nil
3222 }
3223 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3224 "device-id": oo.deviceID})
3225 return nil, omciErr.GetError()
3226}
3227
3228// SendSetVoipApplicationServiceProfile nolint: unused
3229func (oo *OmciCC) SendSetVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3230 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3231 tid := oo.GetNextTid(highPrio)
3232 logger.Debugw(ctx, "send VoipApplicationServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3233 "SequNo": strconv.FormatInt(int64(tid), 16),
3234 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3235
3236 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3237 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003238 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3239 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003240 if err != nil {
3241 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for set", log.Fields{"Err": err,
3242 "device-id": oo.deviceID})
3243 return nil, err
3244 }
3245
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003246 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003247 if err != nil {
3248 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile set", log.Fields{"Err": err,
3249 "device-id": oo.deviceID})
3250 return nil, err
3251 }
3252
3253 omciRxCallbackPair := CallbackPair{CbKey: tid,
3254 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3255 }
3256 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3257 if err != nil {
3258 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile set", log.Fields{"Err": err,
3259 "device-id": oo.deviceID})
3260 return nil, err
3261 }
3262 logger.Debug(ctx, "send VoipApplicationServiceProfile-set-msg done")
3263 return meInstance, nil
3264 }
3265 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3266 "device-id": oo.deviceID})
3267 return nil, omciErr.GetError()
3268}
3269
3270// SendDeleteVoipApplicationServiceProfile nolint: unused
3271func (oo *OmciCC) SendDeleteVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3272 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3273 tid := oo.GetNextTid(highPrio)
3274 logger.Debugw(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3275 "SequNo": strconv.FormatInt(int64(tid), 16),
3276 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3277
3278 meParams := me.ParamData{EntityID: aInstID}
3279 meInstance, omciErr := me.NewVoipApplicationServiceProfile(meParams)
3280 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003281 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3282 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003283 if err != nil {
3284 logger.Errorw(ctx, "Cannot encode SIPVoipApplicationServiceProfile for delete", log.Fields{
3285 "Err": err, "device-id": oo.deviceID})
3286 return nil, err
3287 }
3288
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003289 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003290 if err != nil {
3291 logger.Errorw(ctx, "Cannot serialize SIPVoipApplicationServiceProfile delete", log.Fields{
3292 "Err": err, "device-id": oo.deviceID})
3293 return nil, err
3294 }
3295
3296 omciRxCallbackPair := CallbackPair{
3297 CbKey: tid,
3298 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3299 }
3300 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3301 if err != nil {
3302 logger.Errorw(ctx, "Cannot send SIPVoipApplicationServiceProfile delete", log.Fields{
3303 "Err": err, "device-id": oo.deviceID})
3304 return nil, err
3305 }
3306 logger.Debug(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg done")
3307 return meInstance, nil
3308 }
3309 logger.Errorw(ctx, "Cannot generate SIPVoipApplicationServiceProfile Instance for delete", log.Fields{
3310 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3311 return nil, omciErr.GetError()
3312}
3313
3314// SendCreateSIPAgentConfigData nolint: unused
3315func (oo *OmciCC) SendCreateSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3316 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3317 tid := oo.GetNextTid(highPrio)
3318 logger.Debugw(ctx, "send SIPAgentConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3319 "SequNo": strconv.FormatInt(int64(tid), 16),
3320 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3321
3322 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3323 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003324 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3325 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003326 if err != nil {
3327 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for create", log.Fields{"Err": err,
3328 "device-id": oo.deviceID})
3329 return nil, err
3330 }
3331
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003332 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003333 if err != nil {
3334 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData create", log.Fields{"Err": err,
3335 "device-id": oo.deviceID})
3336 return nil, err
3337 }
3338
3339 omciRxCallbackPair := CallbackPair{CbKey: tid,
3340 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3341 }
3342 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3343 if err != nil {
3344 logger.Errorw(ctx, "Cannot send SIPAgentConfigData create", log.Fields{"Err": err,
3345 "device-id": oo.deviceID})
3346 return nil, err
3347 }
3348 logger.Debug(ctx, "send SIPAgentConfigData-create-msg done")
3349 return meInstance, nil
3350 }
3351 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3352 "device-id": oo.deviceID})
3353 return nil, omciErr.GetError()
3354}
3355
3356// SendSetSIPAgentConfigData nolint: unused
3357func (oo *OmciCC) SendSetSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3358 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3359 tid := oo.GetNextTid(highPrio)
3360 logger.Debugw(ctx, "send SIPAgentConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3361 "SequNo": strconv.FormatInt(int64(tid), 16),
3362 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3363
3364 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3365 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003366 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3367 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003368 if err != nil {
3369 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for set", log.Fields{"Err": err,
3370 "device-id": oo.deviceID})
3371 return nil, err
3372 }
3373
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003374 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003375 if err != nil {
3376 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData set", log.Fields{"Err": err,
3377 "device-id": oo.deviceID})
3378 return nil, err
3379 }
3380
3381 omciRxCallbackPair := CallbackPair{CbKey: tid,
3382 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3383 }
3384 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3385 if err != nil {
3386 logger.Errorw(ctx, "Cannot send SIPAgentConfigData set", log.Fields{"Err": err,
3387 "device-id": oo.deviceID})
3388 return nil, err
3389 }
3390 logger.Debug(ctx, "send SIPAgentConfigData-set-msg done")
3391 return meInstance, nil
3392 }
3393 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3394 "device-id": oo.deviceID})
3395 return nil, omciErr.GetError()
3396}
3397
3398// SendDeleteSIPAgentConfigData nolint: unused
3399func (oo *OmciCC) SendDeleteSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3400 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3401 tid := oo.GetNextTid(highPrio)
3402 logger.Debugw(ctx, "send SIPAgentConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3403 "SequNo": strconv.FormatInt(int64(tid), 16),
3404 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3405
3406 meParams := me.ParamData{EntityID: aInstID}
3407 meInstance, omciErr := me.NewSipAgentConfigData(meParams)
3408 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003409 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3410 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003411 if err != nil {
3412 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for delete", log.Fields{
3413 "Err": err, "device-id": oo.deviceID})
3414 return nil, err
3415 }
3416
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003417 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003418 if err != nil {
3419 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData delete", log.Fields{
3420 "Err": err, "device-id": oo.deviceID})
3421 return nil, err
3422 }
3423
3424 omciRxCallbackPair := CallbackPair{
3425 CbKey: tid,
3426 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3427 }
3428 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3429 if err != nil {
3430 logger.Errorw(ctx, "Cannot send SIPAgentConfigData delete", log.Fields{
3431 "Err": err, "device-id": oo.deviceID})
3432 return nil, err
3433 }
3434 logger.Debug(ctx, "send SIPAgentConfigData-Delete-msg done")
3435 return meInstance, nil
3436 }
3437 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3438 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3439 return nil, omciErr.GetError()
3440}
3441
3442// SendCreateTCPUDPConfigData nolint: unused
3443func (oo *OmciCC) SendCreateTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3444 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3445 tid := oo.GetNextTid(highPrio)
3446 logger.Debugw(ctx, "send TCPUDPConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3447 "SequNo": strconv.FormatInt(int64(tid), 16),
3448 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3449
3450 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3451 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003452 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3453 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003454 if err != nil {
3455 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for create", log.Fields{"Err": err,
3456 "device-id": oo.deviceID})
3457 return nil, err
3458 }
3459
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003460 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003461 if err != nil {
3462 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData create", log.Fields{"Err": err,
3463 "device-id": oo.deviceID})
3464 return nil, err
3465 }
3466
3467 omciRxCallbackPair := CallbackPair{CbKey: tid,
3468 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3469 }
3470 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3471 if err != nil {
3472 logger.Errorw(ctx, "Cannot send TCPUDPConfigData create", log.Fields{"Err": err,
3473 "device-id": oo.deviceID})
3474 return nil, err
3475 }
3476 logger.Debug(ctx, "send TCPUDPConfigData-create-msg done")
3477 return meInstance, nil
3478 }
3479 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3480 "device-id": oo.deviceID})
3481 return nil, omciErr.GetError()
3482}
3483
3484// SendSetTCPUDPConfigData nolint: unused
3485func (oo *OmciCC) SendSetTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3486 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3487 tid := oo.GetNextTid(highPrio)
3488 logger.Debugw(ctx, "send TCPUDPConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3489 "SequNo": strconv.FormatInt(int64(tid), 16),
3490 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3491
3492 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3493 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003494 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3495 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003496 if err != nil {
3497 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for set", log.Fields{"Err": err,
3498 "device-id": oo.deviceID})
3499 return nil, err
3500 }
3501
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003502 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003503 if err != nil {
3504 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData set", log.Fields{"Err": err,
3505 "device-id": oo.deviceID})
3506 return nil, err
3507 }
3508
3509 omciRxCallbackPair := CallbackPair{CbKey: tid,
3510 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3511 }
3512 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3513 if err != nil {
3514 logger.Errorw(ctx, "Cannot send TCPUDPConfigData set", log.Fields{"Err": err,
3515 "device-id": oo.deviceID})
3516 return nil, err
3517 }
3518 logger.Debug(ctx, "send TCPUDPConfigData-set-msg done")
3519 return meInstance, nil
3520 }
3521 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3522 "device-id": oo.deviceID})
3523 return nil, omciErr.GetError()
3524}
3525
3526// SendDeleteTCPUDPConfigData nolint: unused
3527func (oo *OmciCC) SendDeleteTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3528 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3529 tid := oo.GetNextTid(highPrio)
3530 logger.Debugw(ctx, "send TCPUDPConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3531 "SequNo": strconv.FormatInt(int64(tid), 16),
3532 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3533
3534 meParams := me.ParamData{EntityID: aInstID}
3535 meInstance, omciErr := me.NewTcpUdpConfigData(meParams)
3536 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003537 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3538 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003539 if err != nil {
3540 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for delete", log.Fields{
3541 "Err": err, "device-id": oo.deviceID})
3542 return nil, err
3543 }
3544
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003545 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003546 if err != nil {
3547 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData delete", log.Fields{
3548 "Err": err, "device-id": oo.deviceID})
3549 return nil, err
3550 }
3551
3552 omciRxCallbackPair := CallbackPair{
3553 CbKey: tid,
3554 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3555 }
3556 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3557 if err != nil {
3558 logger.Errorw(ctx, "Cannot send TCPUDPConfigData delete", log.Fields{
3559 "Err": err, "device-id": oo.deviceID})
3560 return nil, err
3561 }
3562 logger.Debug(ctx, "send TCPUDPConfigData-Delete-msg done")
3563 return meInstance, nil
3564 }
3565 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3566 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3567 return nil, omciErr.GetError()
3568}
3569
3570// SendCreateIPHostConfigData nolint: unused
3571func (oo *OmciCC) SendCreateIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3572 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3573 tid := oo.GetNextTid(highPrio)
3574 logger.Debugw(ctx, "send IPHostConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3575 "SequNo": strconv.FormatInt(int64(tid), 16),
3576 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3577
3578 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3579 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003580 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3581 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003582 if err != nil {
3583 logger.Errorw(ctx, "Cannot encode IPHostConfigData for create", log.Fields{"Err": err,
3584 "device-id": oo.deviceID})
3585 return nil, err
3586 }
3587
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003588 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003589 if err != nil {
3590 logger.Errorw(ctx, "Cannot serialize IPHostConfigData create", log.Fields{"Err": err,
3591 "device-id": oo.deviceID})
3592 return nil, err
3593 }
3594
3595 omciRxCallbackPair := CallbackPair{CbKey: tid,
3596 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3597 }
3598 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3599 if err != nil {
3600 logger.Errorw(ctx, "Cannot send IPHostConfigData create", log.Fields{"Err": err,
3601 "device-id": oo.deviceID})
3602 return nil, err
3603 }
3604 logger.Debug(ctx, "send IPHostConfigData-create-msg done")
3605 return meInstance, nil
3606 }
3607 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3608 "device-id": oo.deviceID})
3609 return nil, omciErr.GetError()
3610}
3611
3612// SendSetIPHostConfigData nolint: unused
3613func (oo *OmciCC) SendSetIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3614 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3615 tid := oo.GetNextTid(highPrio)
3616 logger.Debugw(ctx, "send IPHostConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3617 "SequNo": strconv.FormatInt(int64(tid), 16),
3618 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3619
3620 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3621 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003622 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3623 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003624 if err != nil {
3625 logger.Errorw(ctx, "Cannot encode IPHostConfigData for set", log.Fields{"Err": err,
3626 "device-id": oo.deviceID})
3627 return nil, err
3628 }
3629
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003630 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003631 if err != nil {
3632 logger.Errorw(ctx, "Cannot serialize IPHostConfigData set", log.Fields{"Err": err,
3633 "device-id": oo.deviceID})
3634 return nil, err
3635 }
3636
3637 omciRxCallbackPair := CallbackPair{CbKey: tid,
3638 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3639 }
3640 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3641 if err != nil {
3642 logger.Errorw(ctx, "Cannot send IPHostConfigData set", log.Fields{"Err": err,
3643 "device-id": oo.deviceID})
3644 return nil, err
3645 }
3646 logger.Debug(ctx, "send IPHostConfigData-set-msg done")
3647 return meInstance, nil
3648 }
3649 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3650 "device-id": oo.deviceID})
3651 return nil, omciErr.GetError()
3652}
3653
3654// SendDeleteIPHostConfigData nolint: unused
3655func (oo *OmciCC) SendDeleteIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3656 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3657 tid := oo.GetNextTid(highPrio)
3658 logger.Debugw(ctx, "send IPHostConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3659 "SequNo": strconv.FormatInt(int64(tid), 16),
3660 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3661
3662 meParams := me.ParamData{EntityID: aInstID}
3663 meInstance, omciErr := me.NewIpHostConfigData(meParams)
3664 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003665 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3666 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003667 if err != nil {
3668 logger.Errorw(ctx, "Cannot encode IPHostConfigData for delete", log.Fields{
3669 "Err": err, "device-id": oo.deviceID})
3670 return nil, err
3671 }
3672
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003673 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003674 if err != nil {
3675 logger.Errorw(ctx, "Cannot serialize IPHostConfigData delete", log.Fields{
3676 "Err": err, "device-id": oo.deviceID})
3677 return nil, err
3678 }
3679
3680 omciRxCallbackPair := CallbackPair{
3681 CbKey: tid,
3682 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3683 }
3684 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3685 if err != nil {
3686 logger.Errorw(ctx, "Cannot send IPHostConfigData delete", log.Fields{
3687 "Err": err, "device-id": oo.deviceID})
3688 return nil, err
3689 }
3690 logger.Debug(ctx, "send IPHostConfigData-Delete-msg done")
3691 return meInstance, nil
3692 }
3693 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance for delete", log.Fields{
3694 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3695 return nil, omciErr.GetError()
3696}
3697
3698// SendCreateRTPProfileData nolint: unused
3699func (oo *OmciCC) SendCreateRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3700 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3701 tid := oo.GetNextTid(highPrio)
3702 logger.Debugw(ctx, "send RTPProfileData-create-msg:", log.Fields{"device-id": oo.deviceID,
3703 "SequNo": strconv.FormatInt(int64(tid), 16),
3704 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3705
3706 meInstance, omciErr := me.NewRtpProfileData(params[0])
3707 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003708 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3709 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003710 if err != nil {
3711 logger.Errorw(ctx, "Cannot encode RTPProfileData for create", log.Fields{"Err": err,
3712 "device-id": oo.deviceID})
3713 return nil, err
3714 }
3715
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003716 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003717 if err != nil {
3718 logger.Errorw(ctx, "Cannot serialize RTPProfileData create", log.Fields{"Err": err,
3719 "device-id": oo.deviceID})
3720 return nil, err
3721 }
3722
3723 omciRxCallbackPair := CallbackPair{CbKey: tid,
3724 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3725 }
3726 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3727 if err != nil {
3728 logger.Errorw(ctx, "Cannot send RTPProfileData create", log.Fields{"Err": err,
3729 "device-id": oo.deviceID})
3730 return nil, err
3731 }
3732 logger.Debug(ctx, "send RTPProfileData-create-msg done")
3733 return meInstance, nil
3734 }
3735 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3736 "device-id": oo.deviceID})
3737 return nil, omciErr.GetError()
3738}
3739
3740// SendSetRTPProfileData nolint: unused
3741func (oo *OmciCC) SendSetRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3742 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3743 tid := oo.GetNextTid(highPrio)
3744 logger.Debugw(ctx, "send RTPProfileData-set-msg:", log.Fields{"device-id": oo.deviceID,
3745 "SequNo": strconv.FormatInt(int64(tid), 16),
3746 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3747
3748 meInstance, omciErr := me.NewRtpProfileData(params[0])
3749 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003750 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3751 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003752 if err != nil {
3753 logger.Errorw(ctx, "Cannot encode RTPProfileData for set", log.Fields{"Err": err,
3754 "device-id": oo.deviceID})
3755 return nil, err
3756 }
3757
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003758 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003759 if err != nil {
3760 logger.Errorw(ctx, "Cannot serialize RTPProfileData set", log.Fields{"Err": err,
3761 "device-id": oo.deviceID})
3762 return nil, err
3763 }
3764
3765 omciRxCallbackPair := CallbackPair{CbKey: tid,
3766 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3767 }
3768 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3769 if err != nil {
3770 logger.Errorw(ctx, "Cannot send RTPProfileData set", log.Fields{"Err": err,
3771 "device-id": oo.deviceID})
3772 return nil, err
3773 }
3774 logger.Debug(ctx, "send RTPProfileData-set-msg done")
3775 return meInstance, nil
3776 }
3777 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3778 "device-id": oo.deviceID})
3779 return nil, omciErr.GetError()
3780}
3781
3782// SendDeleteRTPProfileData nolint: unused
3783func (oo *OmciCC) SendDeleteRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3784 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3785 tid := oo.GetNextTid(highPrio)
3786 logger.Debugw(ctx, "send RTPProfileData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3787 "SequNo": strconv.FormatInt(int64(tid), 16),
3788 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3789
3790 meParams := me.ParamData{EntityID: aInstID}
3791 meInstance, omciErr := me.NewRtpProfileData(meParams)
3792 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003793 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3794 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003795 if err != nil {
3796 logger.Errorw(ctx, "Cannot encode RTPProfileData for delete", log.Fields{
3797 "Err": err, "device-id": oo.deviceID})
3798 return nil, err
3799 }
3800
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003801 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003802 if err != nil {
3803 logger.Errorw(ctx, "Cannot serialize RTPProfileData delete", log.Fields{
3804 "Err": err, "device-id": oo.deviceID})
3805 return nil, err
3806 }
3807
3808 omciRxCallbackPair := CallbackPair{
3809 CbKey: tid,
3810 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3811 }
3812 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3813 if err != nil {
3814 logger.Errorw(ctx, "Cannot send RTPProfileData delete", log.Fields{
3815 "Err": err, "device-id": oo.deviceID})
3816 return nil, err
3817 }
3818 logger.Debug(ctx, "send RTPProfileData-Delete-msg done")
3819 return meInstance, nil
3820 }
3821 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance for delete", log.Fields{
3822 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3823 return nil, omciErr.GetError()
3824}
3825
3826// SendCreateNetworkDialPlanTable nolint: unused
3827func (oo *OmciCC) SendCreateNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3828 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3829 tid := oo.GetNextTid(highPrio)
3830 logger.Debugw(ctx, "send NetworkDialPlanTable-create-msg:", log.Fields{"device-id": oo.deviceID,
3831 "SequNo": strconv.FormatInt(int64(tid), 16),
3832 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3833
3834 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3835 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003836 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3837 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003838 if err != nil {
3839 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for create", log.Fields{"Err": err,
3840 "device-id": oo.deviceID})
3841 return nil, err
3842 }
3843
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003844 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003845 if err != nil {
3846 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable create", log.Fields{"Err": err,
3847 "device-id": oo.deviceID})
3848 return nil, err
3849 }
3850
3851 omciRxCallbackPair := CallbackPair{CbKey: tid,
3852 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3853 }
3854 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3855 if err != nil {
3856 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable create", log.Fields{"Err": err,
3857 "device-id": oo.deviceID})
3858 return nil, err
3859 }
3860 logger.Debug(ctx, "send NetworkDialPlanTable-create-msg done")
3861 return meInstance, nil
3862 }
3863 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3864 "device-id": oo.deviceID})
3865 return nil, omciErr.GetError()
3866}
3867
3868// SendSetNetworkDialPlanTable nolint: unused
3869func (oo *OmciCC) SendSetNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3870 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3871 tid := oo.GetNextTid(highPrio)
3872 logger.Debugw(ctx, "send NetworkDialPlanTable-set-msg:", log.Fields{"device-id": oo.deviceID,
3873 "SequNo": strconv.FormatInt(int64(tid), 16),
3874 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3875
3876 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3877 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003878 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3879 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003880 if err != nil {
3881 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for set", log.Fields{"Err": err,
3882 "device-id": oo.deviceID})
3883 return nil, err
3884 }
3885
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003886 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003887 if err != nil {
3888 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable set", log.Fields{"Err": err,
3889 "device-id": oo.deviceID})
3890 return nil, err
3891 }
3892
3893 omciRxCallbackPair := CallbackPair{CbKey: tid,
3894 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3895 }
3896 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3897 if err != nil {
3898 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable set", log.Fields{"Err": err,
3899 "device-id": oo.deviceID})
3900 return nil, err
3901 }
3902 logger.Debug(ctx, "send NetworkDialPlanTable-set-msg done")
3903 return meInstance, nil
3904 }
3905 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3906 "device-id": oo.deviceID})
3907 return nil, omciErr.GetError()
3908}
3909
3910// SendDeleteNetworkDialPlanTable nolint: unused
3911func (oo *OmciCC) SendDeleteNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3912 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3913 tid := oo.GetNextTid(highPrio)
3914 logger.Debugw(ctx, "send NetworkDialPlanTable-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3915 "SequNo": strconv.FormatInt(int64(tid), 16),
3916 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3917
3918 meParams := me.ParamData{EntityID: aInstID}
3919 meInstance, omciErr := me.NewNetworkDialPlanTable(meParams)
3920 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003921 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3922 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003923 if err != nil {
3924 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for delete", log.Fields{
3925 "Err": err, "device-id": oo.deviceID})
3926 return nil, err
3927 }
3928
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003929 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003930 if err != nil {
3931 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable delete", log.Fields{
3932 "Err": err, "device-id": oo.deviceID})
3933 return nil, err
3934 }
3935
3936 omciRxCallbackPair := CallbackPair{
3937 CbKey: tid,
3938 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3939 }
3940 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3941 if err != nil {
3942 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable delete", log.Fields{
3943 "Err": err, "device-id": oo.deviceID})
3944 return nil, err
3945 }
3946 logger.Debug(ctx, "send NetworkDialPlanTable-Delete-msg done")
3947 return meInstance, nil
3948 }
3949 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance for delete", log.Fields{
3950 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3951 return nil, omciErr.GetError()
3952}
3953
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003954// SendSyncTime sends SynchronizeTimeRequest
3955func (oo *OmciCC) SendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
3956 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08003957 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
3958 "SequNo": strconv.FormatInt(int64(tid), 16)})
3959
3960 omciLayer := &omci.OMCI{
3961 TransactionID: tid,
3962 MessageType: omci.SynchronizeTimeRequestType,
3963 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
3964 // Length: 0x28, // Optional, defaults to 40 octets
3965 }
3966 utcTime := time.Now().UTC()
3967 request := &omci.SynchronizeTimeRequest{
3968 MeBasePacket: omci.MeBasePacket{
3969 EntityClass: me.OnuGClassID,
3970 // Default Instance ID is 0
3971 },
3972 Year: uint16(utcTime.Year()),
3973 Month: uint8(utcTime.Month()),
3974 Day: uint8(utcTime.Day()),
3975 Hour: uint8(utcTime.Hour()),
3976 Minute: uint8(utcTime.Minute()),
3977 Second: uint8(utcTime.Second()),
3978 }
3979
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003980 pkt, err := SerializeOmciLayer(ctx, omciLayer, request)
Girish Gowdrae0140f02021-02-02 16:55:09 -08003981 if err != nil {
3982 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
3983 "device-id": oo.deviceID})
3984 return err
3985 }
3986
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003987 omciRxCallbackPair := CallbackPair{CbKey: tid,
3988 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08003989 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003990 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08003991 if err != nil {
3992 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
3993 "device-id": oo.deviceID})
3994 return err
3995 }
3996 logger.Debug(ctx, "send synchronize time request done")
3997 return nil
3998}
3999
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004000// SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME creates or deletes EthernetFramePerformanceMonitoringHistoryData ME instance
4001func (oo *OmciCC) SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004002 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004003 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004004 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4005 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4006 meParam := me.ParamData{EntityID: entityID}
4007 var meInstance *me.ManagedEntity
4008 var omciErr me.OmciErrors
4009 if upstream {
4010 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
4011 } else {
4012 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
4013 }
4014 if omciErr.GetError() == nil {
4015 var omciLayer *omci.OMCI
4016 var msgLayer gopacket.SerializableLayer
4017 var err error
4018 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004019 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4020 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004021 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004022 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4023 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004024 }
4025 if err != nil {
4026 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
4027 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004028 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004029 }
4030
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004031 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004032 if err != nil {
4033 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
4034 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004035 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004036 }
4037
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004038 omciRxCallbackPair := CallbackPair{CbKey: tid,
4039 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004040 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004041 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004042 if err != nil {
4043 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
4044 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004045 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004046 }
4047 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
4048 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004049 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004050 }
4051 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
4052 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 +03004053 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004054}
4055
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004056// SendCreateOrDeleteEthernetUniHistoryME creates or deletes EthernetPerformanceMonitoringHistoryData ME instance
4057func (oo *OmciCC) SendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004058 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004059 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004060 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4061 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4062 meParam := me.ParamData{EntityID: entityID}
4063 var meInstance *me.ManagedEntity
4064 var omciErr me.OmciErrors
4065 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
4066
4067 if omciErr.GetError() == nil {
4068 var omciLayer *omci.OMCI
4069 var msgLayer gopacket.SerializableLayer
4070 var err error
4071 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004072 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4073 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004074 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004075 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4076 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004077 }
4078 if err != nil {
4079 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
4080 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004081 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004082 }
4083
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004084 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004085 if err != nil {
4086 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
4087 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004088 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004089 }
4090
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004091 omciRxCallbackPair := CallbackPair{CbKey: tid,
4092 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004093 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004094 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004095 if err != nil {
4096 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
4097 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004098 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004099 }
4100 logger.Debugw(ctx, "send ethernet uni history data ME done",
4101 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004102 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004103 }
4104 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
4105 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004106 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004107}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004108
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004109// SendCreateOrDeleteFecHistoryME creates or deletes FecPerformanceMonitoringHistoryData ME instance
4110func (oo *OmciCC) SendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004111 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004112 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004113 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4114 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4115 meParam := me.ParamData{EntityID: entityID}
4116 var meInstance *me.ManagedEntity
4117 var omciErr me.OmciErrors
4118 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
4119
4120 if omciErr.GetError() == nil {
4121 var omciLayer *omci.OMCI
4122 var msgLayer gopacket.SerializableLayer
4123 var err error
4124 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004125 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4126 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004127 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004128 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4129 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004130 }
4131 if err != nil {
4132 logger.Errorw(ctx, "Cannot encode fec history data ME",
4133 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004134 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004135 }
4136
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004137 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004138 if err != nil {
4139 logger.Errorw(ctx, "Cannot serialize fec history data ME",
4140 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004141 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004142 }
4143
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004144 omciRxCallbackPair := CallbackPair{CbKey: tid,
4145 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004146 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004147 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004148 if err != nil {
4149 logger.Errorw(ctx, "Cannot send fec history data ME",
4150 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004151 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004152 }
4153 logger.Debugw(ctx, "send fec history data ME done",
4154 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004155 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004156 }
4157 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
4158 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004159 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004160}
4161
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004162// SendCreateOrDeleteGemPortHistoryME deletes GemPortNetworkCtpPerformanceMonitoringHistoryData ME instance
4163func (oo *OmciCC) SendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004164 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004165 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004166 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4167 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4168 meParam := me.ParamData{EntityID: entityID}
4169 var meInstance *me.ManagedEntity
4170 var omciErr me.OmciErrors
4171 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
4172
4173 if omciErr.GetError() == nil {
4174 var omciLayer *omci.OMCI
4175 var msgLayer gopacket.SerializableLayer
4176 var err error
4177 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004178 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4179 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004180 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004181 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4182 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004183 }
4184 if err != nil {
4185 logger.Errorw(ctx, "Cannot encode gemport history data ME",
4186 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004187 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004188 }
4189
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004190 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004191 if err != nil {
4192 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
4193 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004194 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004195 }
4196
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004197 omciRxCallbackPair := CallbackPair{CbKey: tid,
4198 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004199 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004200 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004201 if err != nil {
4202 logger.Errorw(ctx, "Cannot send gemport history data ME",
4203 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004204 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004205 }
4206 logger.Debugw(ctx, "send gemport history data ME done",
4207 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004208 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004209 }
4210 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
4211 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004212 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004213}
4214
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004215// SendStartSoftwareDownload sends StartSoftwareDownloadRequest
4216func (oo *OmciCC) SendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
mpagenko80622a52021-02-09 16:53:23 +00004217 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004218 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004219 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4220 "SequNo": strconv.FormatInt(int64(tid), 16),
4221 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4222
4223 omciLayer := &omci.OMCI{
4224 TransactionID: tid,
4225 MessageType: omci.StartSoftwareDownloadRequestType,
4226 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4227 // Length: 0x28, // Optional, defaults to 40 octets
4228 }
4229 request := &omci.StartSoftwareDownloadRequest{
4230 MeBasePacket: omci.MeBasePacket{
4231 EntityClass: me.SoftwareImageClassID,
4232 EntityInstance: aImageMeID, //inactive image
4233 },
4234 WindowSize: aDownloadWindowSize,
4235 ImageSize: aFileLen,
4236 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
4237 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
4238 }
4239
4240 var options gopacket.SerializeOptions
4241 options.FixLengths = true
4242 buffer := gopacket.NewSerializeBuffer()
4243 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4244 if err != nil {
4245 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
4246 "device-id": oo.deviceID})
4247 return err
4248 }
4249 outgoingPacket := buffer.Bytes()
4250
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004251 omciRxCallbackPair := CallbackPair{CbKey: tid,
4252 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004253 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004254 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004255 if err != nil {
4256 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
4257 "device-id": oo.deviceID})
4258 return err
4259 }
4260 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004261 return nil
4262}
4263
kesavand011d5162021-11-25 19:21:06 +05304264// PrepareOnuSectionsOfWindow prepares a list of sections for each window
4265//Before invoking this function the oo.mutexTid needs to be be locked so that
4266//GetOnuSwSecNextTid can be invoked without further locking
4267func (oo *OmciCC) PrepareOnuSectionsOfWindow(ctx context.Context,
4268 aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte,
4269 omciMsgsPerWindow *ia.OmciMessages) (OmciTransferStructure, error) {
4270 //onuswsections uses only low prioirity tids
4271 tid := oo.GetOnuSwSecNextTid()
4272 logger.Infow(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4273 "SequNo": strconv.FormatInt(int64(tid), 16),
4274 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest, "sectionNo": aDownloadSectionNo, "sectionData": aSection})
4275
4276 var omciTxReq OmciTransferStructure
4277 msgType := omci.DownloadSectionRequestType
4278
4279 if aAckRequest > 0 {
4280 msgType = omci.DownloadSectionRequestWithResponseType
4281
4282 }
4283 omciLayer := &omci.OMCI{
4284 TransactionID: tid,
4285 MessageType: msgType,
4286 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4287 // Length: 0x28, // Optional, defaults to 40 octets
4288 }
4289 localSectionData := make([]byte, len(aSection))
4290
4291 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
4292 request := &omci.DownloadSectionRequest{
4293 MeBasePacket: omci.MeBasePacket{
4294 EntityClass: me.SoftwareImageClassID,
4295 EntityInstance: aImageMeID, //inactive image
4296 },
4297 SectionNumber: aDownloadSectionNo,
4298 SectionData: localSectionData,
4299 }
4300
4301 var options gopacket.SerializeOptions
4302 options.FixLengths = true
4303 buffer := gopacket.NewSerializeBuffer()
4304 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4305 if err != nil {
4306 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4307 "device-id": oo.deviceID})
4308 return omciTxReq, err
4309 }
4310 outgoingPacket := buffer.Bytes()
4311
4312 omciMsgsPerWindow.Messages = append(omciMsgsPerWindow.Messages, outgoingPacket)
4313
4314 if aAckRequest > 0 {
4315 // only the last section should have a timeout as an ack is required only for the last section of the window
4316 omciTxReq = OmciTransferStructure{
4317 withFramePrint: true,
4318 OnuSwWindow: omciMsgsPerWindow,
4319 }
4320 return omciTxReq, nil
4321 }
4322
4323 return omciTxReq, nil
4324}
4325
4326//SendOnuSwSectionsWindowWithRxSupervision sends onu swd sections
4327func (oo *OmciCC) SendOnuSwSectionsWindowWithRxSupervision(ctx context.Context,
4328 aOmciTxRequest OmciTransferStructure, aTimeout int, rxChan chan Message) {
4329 if aOmciTxRequest.OnuSwWindow == nil {
4330 logger.Errorw(ctx, "SendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil",
4331 log.Fields{"device-id": oo.deviceID})
4332 return
4333
4334 }
4335
4336 tid := oo.GetOnuSwSecLastTid()
4337 logger.Debugw(ctx, "SendOnuSwSectionsWindowWithRxSupervision tid for the last segment is ", log.Fields{"TID": tid})
4338 omciRxCallbackPair := CallbackPair{CbKey: tid,
4339 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4340 }
4341
4342 aOmciTxRequest.cbPair = omciRxCallbackPair
4343 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": aOmciTxRequest.cbPair.CbKey})
4344 oo.mutexRxSchedMap.Lock()
4345 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
4346 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4347 oo.mutexRxSchedMap.Unlock()
4348
4349 chSuccess := make(chan bool)
4350 aOmciTxRequest.chSuccess = chSuccess
4351 aOmciTxRequest.timeout = aTimeout
4352 aOmciTxRequest.retries = CDefaultRetries
4353
4354 //tid := aOmciTxRequest.cbPair.CbKey
4355 oo.mutexMonReq.Lock()
4356 oo.monitoredRequests[tid] = aOmciTxRequest
4357 oo.mutexMonReq.Unlock()
4358
4359 retries := aOmciTxRequest.retries
4360 retryCounter := 0
4361 if aTimeout == 0 {
4362 logger.Errorw(ctx, "no timeout present for last section of window", log.Fields{"device-id": oo.deviceID})
4363 return
4364 }
4365loop:
4366 for retryCounter <= retries {
4367 // the onu sw sections are enqueued only to the low priority queue
4368 oo.mutexLowPrioTxQueue.Lock()
4369 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4370 oo.mutexLowPrioTxQueue.Unlock()
4371
4372 go oo.sendQueuedRequests(ctx)
4373
4374 select {
4375 case success := <-chSuccess:
4376 if success {
4377 logger.Debugw(ctx, "reqMon: response received in time",
4378 log.Fields{"tid": tid, "device-id": oo.deviceID})
4379 } else {
4380 logger.Debugw(ctx, "reqMon: wait for response aborted",
4381 log.Fields{"tid": tid, "device-id": oo.deviceID})
4382 }
4383 break loop
4384 case <-time.After(time.Duration(aTimeout) * time.Second):
4385 if retryCounter == retries {
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004386 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
kesavand011d5162021-11-25 19:21:06 +05304387 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004388 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureSwUpgrade, OnuOmciCommunicationFailureSwUpgradeDesc)
kesavand011d5162021-11-25 19:21:06 +05304389 break loop
4390 } else {
4391 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4392 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4393 }
4394 }
4395 retryCounter++
4396 }
4397 oo.mutexMonReq.Lock()
4398 delete(oo.monitoredRequests, tid)
4399 oo.mutexMonReq.Unlock()
4400}
4401
4402func (oo *OmciCC) sendOnuSwSectionsOfWindow(ctx context.Context, omciTxRequest OmciTransferStructure) error {
4403 if omciTxRequest.withFramePrint && omciTxRequest.OnuSwWindow != nil {
4404 lastSection := omciTxRequest.OnuSwWindow.Messages[len(omciTxRequest.OnuSwWindow.Messages)-1]
4405 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
4406 "TxOmciMessage": hex.EncodeToString(lastSection),
4407 "device-id": oo.deviceID,
4408 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
4409 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
4410 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
4411 }
4412 sendErr := oo.pBaseDeviceHandler.SendOnuSwSectionsOfWindow(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciTxRequest.OnuSwWindow)
4413 if sendErr != nil {
4414 logger.Errorw(ctx, "send onu sw sections omci request error", log.Fields{"ChildId": oo.deviceID, "error": sendErr})
4415 return sendErr
4416 }
4417 return nil
4418}
4419
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004420// SendDownloadSection sends DownloadSectionRequestWithResponse
4421func (oo *OmciCC) SendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
mpagenko80622a52021-02-09 16:53:23 +00004422 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004423 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004424 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4425 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00004426 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00004427
4428 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
4429 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00004430 msgType := omci.DownloadSectionRequestType
mpagenkoc26d4c02021-05-06 14:27:57 +00004431 var timeout int = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00004432 if aAckRequest > 0 {
4433 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00004434 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00004435 }
mpagenko80622a52021-02-09 16:53:23 +00004436 omciLayer := &omci.OMCI{
4437 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004438 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00004439 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4440 // Length: 0x28, // Optional, defaults to 40 octets
4441 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05304442 localSectionData := make([]byte, len(aSection))
4443
mpagenko15ff4a52021-03-02 10:09:20 +00004444 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00004445 request := &omci.DownloadSectionRequest{
4446 MeBasePacket: omci.MeBasePacket{
4447 EntityClass: me.SoftwareImageClassID,
4448 EntityInstance: aImageMeID, //inactive image
4449 },
4450 SectionNumber: aDownloadSectionNo,
4451 SectionData: localSectionData,
4452 }
4453
4454 var options gopacket.SerializeOptions
4455 options.FixLengths = true
4456 buffer := gopacket.NewSerializeBuffer()
4457 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4458 if err != nil {
4459 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4460 "device-id": oo.deviceID})
4461 return err
4462 }
4463 outgoingPacket := buffer.Bytes()
4464
mpagenko15ff4a52021-03-02 10:09:20 +00004465 //for initial debug purpose overrule the requested print state for some frames
4466 printFrame := aPrint
4467 if aAckRequest > 0 || aDownloadSectionNo == 0 {
4468 printFrame = true
4469 }
4470
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004471 omciRxCallbackPair := CallbackPair{CbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00004472 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
4473 // (used to avoid retransmission of frames with the same TID)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004474 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00004475 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004476 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004477 if err != nil {
4478 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
4479 "device-id": oo.deviceID})
4480 return err
4481 }
4482 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004483 return nil
4484}
4485
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004486//SendEndSoftwareDownload sends EndSoftwareDownloadRequest
4487func (oo *OmciCC) SendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
mpagenko80622a52021-02-09 16:53:23 +00004488 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004489 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004490 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4491 "SequNo": strconv.FormatInt(int64(tid), 16),
4492 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4493
mpagenko15ff4a52021-03-02 10:09:20 +00004494 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004495 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004496 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004497 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4498 // Length: 0x28, // Optional, defaults to 40 octets
4499 }
mpagenko15ff4a52021-03-02 10:09:20 +00004500 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00004501 MeBasePacket: omci.MeBasePacket{
4502 EntityClass: me.SoftwareImageClassID,
4503 EntityInstance: aImageMeID, //inactive image
4504 },
mpagenko15ff4a52021-03-02 10:09:20 +00004505 CRC32: aImageCrc,
4506 ImageSize: aFileLen,
4507 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
4508 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00004509 }
mpagenko15ff4a52021-03-02 10:09:20 +00004510
4511 var options gopacket.SerializeOptions
4512 options.FixLengths = true
4513 buffer := gopacket.NewSerializeBuffer()
4514 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4515 if err != nil {
4516 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004517 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004518 return err
mpagenko80622a52021-02-09 16:53:23 +00004519 }
mpagenko15ff4a52021-03-02 10:09:20 +00004520 outgoingPacket := buffer.Bytes()
4521
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004522 omciRxCallbackPair := CallbackPair{CbKey: tid,
4523 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004524 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004525 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004526 if err != nil {
4527 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
4528 "device-id": oo.deviceID})
4529 return err
4530 }
4531 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004532 return nil
4533}
4534
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004535// SendActivateSoftware sends ActivateSoftwareRequest
4536func (oo *OmciCC) SendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
mpagenko80622a52021-02-09 16:53:23 +00004537 rxChan chan Message, aImageMeID uint16) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004538 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004539 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
4540 "SequNo": strconv.FormatInt(int64(tid), 16),
4541 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4542
4543 omciLayer := &omci.OMCI{
4544 TransactionID: tid,
4545 MessageType: omci.ActivateSoftwareRequestType,
4546 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4547 // Length: 0x28, // Optional, defaults to 40 octets
4548 }
4549 request := &omci.ActivateSoftwareRequest{
4550 MeBasePacket: omci.MeBasePacket{
4551 EntityClass: me.SoftwareImageClassID,
4552 EntityInstance: aImageMeID, //inactive image
4553 },
4554 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
4555 }
4556
4557 var options gopacket.SerializeOptions
4558 options.FixLengths = true
4559 buffer := gopacket.NewSerializeBuffer()
4560 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4561 if err != nil {
4562 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
4563 "device-id": oo.deviceID})
4564 return err
4565 }
4566 outgoingPacket := buffer.Bytes()
4567
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004568 omciRxCallbackPair := CallbackPair{CbKey: tid,
4569 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004570 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004571 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004572 if err != nil {
4573 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
4574 "device-id": oo.deviceID})
4575 return err
4576 }
4577 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00004578 return nil
4579}
mpagenko80622a52021-02-09 16:53:23 +00004580
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004581// SendCommitSoftware sends CommitSoftwareRequest
4582func (oo *OmciCC) SendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
mpagenko15ff4a52021-03-02 10:09:20 +00004583 rxChan chan Message, aImageMeID uint16) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004584 tid := oo.GetNextTid(highPrio)
mpagenko15ff4a52021-03-02 10:09:20 +00004585 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
4586 "SequNo": strconv.FormatInt(int64(tid), 16),
4587 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4588
4589 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004590 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004591 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004592 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4593 // Length: 0x28, // Optional, defaults to 40 octets
4594 }
mpagenko15ff4a52021-03-02 10:09:20 +00004595 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00004596 MeBasePacket: omci.MeBasePacket{
4597 EntityClass: me.SoftwareImageClassID,
4598 EntityInstance: aImageMeID, //inactive image
4599 },
mpagenko80622a52021-02-09 16:53:23 +00004600 }
mpagenko15ff4a52021-03-02 10:09:20 +00004601
4602 var options gopacket.SerializeOptions
4603 options.FixLengths = true
4604 buffer := gopacket.NewSerializeBuffer()
4605 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4606 if err != nil {
4607 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004608 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004609 return err
mpagenko80622a52021-02-09 16:53:23 +00004610 }
mpagenko15ff4a52021-03-02 10:09:20 +00004611 outgoingPacket := buffer.Bytes()
4612
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004613 omciRxCallbackPair := CallbackPair{CbKey: tid,
4614 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004615 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004616 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004617 if err != nil {
4618 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
4619 "device-id": oo.deviceID})
4620 return err
4621 }
4622 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004623 return nil
4624}
4625
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004626//SendSelfTestReq sends TestRequest
4627func (oo *OmciCC) SendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
4628 tid := oo.GetNextTid(highPrio)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004629 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
4630 "SequNo": strconv.FormatInt(int64(tid), 16),
4631 "InstId": strconv.FormatInt(int64(instdID), 16)})
4632 omciLayer := &omci.OMCI{
4633 TransactionID: tid,
4634 MessageType: omci.TestRequestType,
4635 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4636 // Length: 0x28, // Optional, defaults to 40 octets
4637 }
4638
4639 var request *omci.OpticalLineSupervisionTestRequest
4640 switch classID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004641 case me.AniGClassID:
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004642 request = &omci.OpticalLineSupervisionTestRequest{
4643 MeBasePacket: omci.MeBasePacket{
4644 EntityClass: classID,
4645 EntityInstance: instdID,
4646 },
4647 SelectTest: uint8(7), // self test
4648 GeneralPurposeBuffer: uint16(0),
4649 VendorSpecificParameters: uint16(0),
4650 }
4651 default:
4652 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
4653 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
4654 }
4655 // Test serialization back to former string
4656 var options gopacket.SerializeOptions
4657 options.FixLengths = true
4658
4659 buffer := gopacket.NewSerializeBuffer()
4660 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4661 if err != nil {
4662 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
4663 "device-id": oo.deviceID})
4664 return err
4665 }
4666 outgoingPacket := buffer.Bytes()
4667
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004668 omciRxCallbackPair := CallbackPair{CbKey: tid,
4669 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004670 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004671 err = oo.Send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004672 if err != nil {
4673 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
4674 "device-id": oo.deviceID})
4675 return err
4676 }
4677 logger.Debug(ctx, "send self test request done")
4678 return nil
4679}
4680
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004681//nolint: gocyclo
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004682func (oo *OmciCC) isSuccessfulResponseWithMibDataSync(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) (bool, error) {
4683
4684 nextLayer, err := omci.MsgTypeToNextLayer(omciMsg.MessageType, false)
4685 if err != nil {
4686 logger.Errorw(ctx, "omci-message: could not map msgType to nextLayer", log.Fields{"device-id": oo.deviceID})
4687 return false, fmt.Errorf("could not map msgType to nextLayer - %s", oo.deviceID)
4688 }
4689 msgLayer := (*packet).Layer(nextLayer)
4690 if msgLayer != nil {
4691 // Note: Due to relaxed decoding, you may now still have a decoding error attached to the layers
4692 if failure := (*packet).ErrorLayer(); failure != nil {
4693 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4694 // In the case of MibUploadNextResponse, we let the packet pass so that later processing
4695 // can examine for UnkonwnMEs and UnknownAttributes
4696 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with ErrorLayer - let it pass",
4697 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4698 return false, nil
4699 } else if nextLayer == omci.LayerTypeGetResponse {
4700 if resp := msgLayer.(*omci.GetResponse); resp != nil {
4701 if resp.NextLayerType() == omci.LayerTypeUnknownAttributes {
4702 unknownAttrLayer := (*packet).Layer(omci.LayerTypeUnknownAttributes)
4703 if unknownAttrLayer != nil {
4704 logger.Errorw(ctx, "omci-message: GetResponse packet contains unknownAttrLayer - skip it!",
4705 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "unknownAttrLayer": unknownAttrLayer})
4706 return false, fmt.Errorf("packet contains unknownAttrLayer - %s", oo.deviceID)
4707 }
4708 }
4709 }
4710 }
4711 // Try to decode any further error information
4712 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
4713 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer with further info - skip it!",
4714 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": decodeFailure.String()})
4715 return false, fmt.Errorf("packet contains ErrorLayer with further info - %s", oo.deviceID)
4716 }
4717 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer - skip it!",
4718 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4719 return false, fmt.Errorf("packet contains ErrorLayer - %s", oo.deviceID)
4720 }
4721 } else if failure := (*packet).ErrorLayer(); failure != nil {
4722 // message layer could not be decoded, but at least check if additional failure information is available
4723 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004724 errMsg := decodeFailure.String()
4725 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4726 if strings.Contains(strings.ToLower(errMsg), "table decode") {
4727 // In the case of MibUploadNextResponse with non-standard table attributes, we let the packet pass
4728 // so that later processing can deal with it
4729 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with table attributes - let it pass",
4730 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4731 return false, nil
4732 }
4733 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004734 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, further info available - skip it!",
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004735 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": errMsg})
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004736 return false, fmt.Errorf("could not decode msgLayer of packet, further info available - %s", oo.deviceID)
4737 }
4738 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, ErrorLayer available",
4739 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4740 return false, fmt.Errorf("could not decode msgLayer of packet, ErrorLayer available - %s", oo.deviceID)
4741 } else {
4742 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet", log.Fields{"device-id": oo.deviceID})
4743 return false, fmt.Errorf("could not decode msgLayer of packet - %s", oo.deviceID)
4744 }
4745
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004746 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004747 if v == omciMsg.MessageType {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004748 switch nextLayer {
4749 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004750 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
4751 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004752 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004753 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004754 }
4755 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004756 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
4757 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004758 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004759 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004760 }
4761 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004762 if resp := msgLayer.(*omci.SetResponse); resp != nil {
4763 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004764 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004765 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004766 }
4767 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004768 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
4769 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004770 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004771 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004772 }
4773 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004774 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
4775 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004776 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004777 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004778 }
4779 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004780 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
4781 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004782 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004783 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004784 }
4785 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004786 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
4787 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004788 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004789 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004790 }
4791 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004792 }
4793 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004794 return false, nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004795}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004796
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004797func (oo *OmciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest OmciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004798 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00004799 if timeout == 0 {
4800 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt34555512021-10-01 16:26:59 +00004801 // enqueue
4802 if aOmciTxRequest.highPrio {
4803 oo.mutexHighPrioTxQueue.Lock()
4804 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4805 oo.mutexHighPrioTxQueue.Unlock()
4806 } else {
4807 oo.mutexLowPrioTxQueue.Lock()
4808 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4809 oo.mutexLowPrioTxQueue.Unlock()
4810 }
4811 go oo.sendQueuedRequests(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00004812 } else {
mpagenko7455fd42021-06-10 16:25:55 +00004813 //the supervised sending with waiting on the response (based on TID) is called in background
4814 // to avoid blocking of the sender for the complete OMCI handshake procedure
4815 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
4816 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
4817 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004818 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004819}
4820
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004821func (oo *OmciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest OmciTransferStructure, aTimeout int) {
mpagenko7455fd42021-06-10 16:25:55 +00004822 chSuccess := make(chan bool)
4823 aOmciTxRequest.chSuccess = chSuccess
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004824 tid := aOmciTxRequest.cbPair.CbKey
mpagenko7455fd42021-06-10 16:25:55 +00004825 oo.mutexMonReq.Lock()
4826 oo.monitoredRequests[tid] = aOmciTxRequest
4827 oo.mutexMonReq.Unlock()
4828
4829 retries := aOmciTxRequest.retries
4830 retryCounter := 0
4831loop:
4832 for retryCounter <= retries {
Holger Hildebrandt34555512021-10-01 16:26:59 +00004833 // enqueue
4834 if aOmciTxRequest.highPrio {
4835 oo.mutexHighPrioTxQueue.Lock()
4836 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4837 oo.mutexHighPrioTxQueue.Unlock()
4838 } else {
4839 oo.mutexLowPrioTxQueue.Lock()
4840 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4841 oo.mutexLowPrioTxQueue.Unlock()
4842 }
4843 go oo.sendQueuedRequests(ctx)
mpagenko7455fd42021-06-10 16:25:55 +00004844
4845 select {
4846 case success := <-chSuccess:
4847 if success {
4848 logger.Debugw(ctx, "reqMon: response received in time",
4849 log.Fields{"tid": tid, "device-id": oo.deviceID})
4850 } else {
4851 logger.Debugw(ctx, "reqMon: wait for response aborted",
4852 log.Fields{"tid": tid, "device-id": oo.deviceID})
4853 }
4854 break loop
4855 case <-time.After(time.Duration(aTimeout) * time.Second):
4856 if retryCounter == retries {
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004857 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
mpagenko7455fd42021-06-10 16:25:55 +00004858 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004859 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureConfig, OnuOmciCommunicationFailureConfigDesc)
mpagenko7455fd42021-06-10 16:25:55 +00004860 break loop
4861 } else {
4862 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4863 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4864 }
4865 }
4866 retryCounter++
4867 }
4868 oo.mutexMonReq.Lock()
4869 delete(oo.monitoredRequests, tid)
4870 oo.mutexMonReq.Unlock()
4871}
4872
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004873//CancelRequestMonitoring terminates monitoring of outstanding omci requests
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004874func (oo *OmciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00004875 logger.Debugw(ctx, "CancelRequestMonitoring entered", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004876 oo.mutexMonReq.RLock()
4877 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00004878 //implement non-blocking channel send to avoid blocking on mutexMonReq later
4879 select {
4880 case oo.monitoredRequests[k].chSuccess <- false:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00004881 logger.Debugw(ctx, "send cancellation on omciRespChannel",
4882 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00004883 default:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00004884 logger.Debugw(ctx, "cancellation could not be send on omciRespChannel (no receiver)",
4885 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00004886 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004887 }
4888 oo.mutexMonReq.RUnlock()
4889}
4890
4891//GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
4892//time consumed for retry processing of a particular OMCI-request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004893func (oo *OmciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
4894 return time.Duration((CDefaultRetries+1)*oo.pBaseDeviceHandler.GetOmciTimeout() + 1)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004895}
Himani Chawla43f95ff2021-06-03 00:24:12 +05304896
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004897// SendCreateOrDeleteEthernetFrameExtendedPMME deletes EthernetFrameExtendedPm ME instance
4898func (oo *OmciCC) SendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
Himani Chawla43f95ff2021-06-03 00:24:12 +05304899 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004900 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05304901 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
4902 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4903
4904 meParam := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00004905 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawla43f95ff2021-06-03 00:24:12 +05304906 }
4907 var meInstance *me.ManagedEntity
4908 var omciErr me.OmciErrors
4909 if classID == me.EthernetFrameExtendedPmClassID {
4910 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
4911 } else {
4912 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
4913 }
4914
4915 if omciErr.GetError() == nil {
4916 var omciLayer *omci.OMCI
4917 var msgLayer gopacket.SerializableLayer
4918 var err error
4919 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004920 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4921 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05304922 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004923 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4924 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05304925 }
4926 if err != nil {
4927 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
4928 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
4929 return nil, err
4930 }
4931
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004932 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawla43f95ff2021-06-03 00:24:12 +05304933 if err != nil {
4934 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
4935 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
4936 return nil, err
4937 }
4938
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004939 omciRxCallbackPair := CallbackPair{CbKey: tid,
4940 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05304941 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004942 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05304943 if err != nil {
4944 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
4945 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
4946 return nil, err
4947 }
4948 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
4949 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
4950 return meInstance, nil
4951 }
4952 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
4953 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
4954 return nil, omciErr.GetError()
4955}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004956
4957// RLockMutexMonReq lock read access to monitoredRequests
4958func (oo *OmciCC) RLockMutexMonReq() {
4959 oo.mutexMonReq.RLock()
4960}
4961
4962// RUnlockMutexMonReq unlock read access to monitoredRequests
4963func (oo *OmciCC) RUnlockMutexMonReq() {
4964 oo.mutexMonReq.RUnlock()
4965}
4966
4967// GetMonitoredRequest get OmciTransferStructure for an omciTransID
4968func (oo *OmciCC) GetMonitoredRequest(omciTransID uint16) (value OmciTransferStructure, exist bool) {
4969 value, exist = oo.monitoredRequests[omciTransID]
4970 return value, exist
4971}
4972
4973// SetChMonitoredRequest sets chSuccess to indicate whether response was received or not
4974func (oo *OmciCC) SetChMonitoredRequest(omciTransID uint16, chVal bool) {
4975 oo.monitoredRequests[omciTransID].chSuccess <- chVal
4976}
Himani Chawlaee10b542021-09-20 16:46:40 +05304977
4978// SendSetEthernetFrameExtendedPMME sends the set request for ethernet frame extended type me
4979func (oo *OmciCC) SendSetEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
4980 rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
4981 tid := oo.GetNextTid(highPrio)
4982 logger.Debugw(ctx, "send-set-ethernet-frame-extended-pm-me-control-block:", log.Fields{"device-id": oo.deviceID,
4983 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16)})
4984
4985 meParams := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00004986 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawlaee10b542021-09-20 16:46:40 +05304987 }
4988 var meInstance *me.ManagedEntity
4989 var omciErr me.OmciErrors
4990 if classID == me.EthernetFrameExtendedPmClassID {
4991 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParams)
4992 } else {
4993 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParams)
4994 }
4995
4996 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004997 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Himani Chawlaee10b542021-09-20 16:46:40 +05304998 if err != nil {
4999 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5000 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5001 return nil, err
5002 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005003 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawlaee10b542021-09-20 16:46:40 +05305004 if err != nil {
5005 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me-set-msg",
5006 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5007 return nil, err
5008 }
5009 omciRxCallbackPair := CallbackPair{
5010 CbKey: tid,
5011 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
5012 }
5013 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
5014 if err != nil {
5015 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5016 log.Fields{"Err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5017 return nil, err
5018 }
5019 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-set-msg-done",
5020 log.Fields{"device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5021 return meInstance, nil
5022 }
5023 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5024 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5025 return nil, omciErr.GetError()
5026}
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00005027
5028// PrepareForGarbageCollection - remove references to prepare for garbage collection
5029func (oo *OmciCC) PrepareForGarbageCollection(ctx context.Context, aDeviceID string) {
5030 logger.Debugw(ctx, "prepare for garbage collection", log.Fields{"device-id": aDeviceID})
5031 oo.pBaseDeviceHandler = nil
5032 oo.pOnuDeviceEntry = nil
5033 oo.pOnuAlarmManager = nil
5034}