blob: 08ee18959b16070de831509c3fd3d550fa63112b [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 Hildebrandtb42e11f2022-09-15 08:49:00 +000075const cMaxConsecutiveOmciTimeouts = 3
76
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000077// ### OMCI related definitions - end
78
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000079//CallbackPairEntry to be used for OMCI send/receive correlation
80type CallbackPairEntry struct {
81 CbRespChannel chan Message
82 CbFunction func(context.Context, *omci.OMCI, *gp.Packet, chan Message) error
83 FramePrint bool //true for printing
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000084}
85
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000086//CallbackPair to be used for ReceiveCallback init
87type CallbackPair struct {
88 CbKey uint16
89 CbEntry CallbackPairEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +000090}
91
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000092// OmciTransferStructure - TODO: add comment
93type OmciTransferStructure struct {
mpagenko80622a52021-02-09 16:53:23 +000094 txFrame []byte
95 timeout int
Holger Hildebrandt366ef192021-05-05 11:07:44 +000096 retries int
mpagenko80622a52021-02-09 16:53:23 +000097 highPrio bool
98 withFramePrint bool
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000099 cbPair CallbackPair
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000100 chSuccess chan bool
kesavand011d5162021-11-25 19:21:06 +0530101 OnuSwWindow *ia.OmciMessages
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000102}
103
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000104//OmciCC structure holds information needed for OMCI communication (to/from OLT Adapter)
105type OmciCC struct {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000106 enabled bool
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000107 pBaseDeviceHandler IdeviceHandler
108 pOnuDeviceEntry IonuDeviceEntry
109 pOnuAlarmManager IonuAlarmManager
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000110 deviceID string
khenaidoo7d3c5582021-08-11 18:09:44 -0400111 coreClient *vgrpc.Client
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000112 supportExtMsg bool
mpagenkoc8bba412021-01-15 15:38:44 +0000113 rxOmciFrameError tOmciReceiveError
114
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000115 txFrames, txOnuFrames uint32
116 rxFrames, rxOnuFrames, rxOnuDiscards uint32
117
118 // OMCI params
119 mutexTid sync.Mutex
120 tid uint16
121 mutexHpTid sync.Mutex
122 hpTid uint16
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000123 UploadSequNo uint16
124 UploadNoOfCmds uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000125
Holger Hildebrandtb42e11f2022-09-15 08:49:00 +0000126 mutexSendQueuedRequests sync.Mutex
127 mutexLowPrioTxQueue sync.Mutex
128 lowPrioTxQueue *list.List
129 mutexHighPrioTxQueue sync.Mutex
130 highPrioTxQueue *list.List
131 mutexRxSchedMap sync.Mutex
132 rxSchedulerMap map[uint16]CallbackPairEntry
133 mutexMonReq sync.RWMutex
134 monitoredRequests map[uint16]OmciTransferStructure
135 mutexConsecutiveOmciTimeouts sync.RWMutex
136 consecutiveOmciTimeouts uint8
137 mutexOmciAbortInProgress sync.RWMutex
138 omciAbortInProgress bool
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000139}
140
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000141var responsesWithMibDataSync = []omci.MessageType{
142 omci.CreateResponseType,
143 omci.DeleteResponseType,
144 omci.SetResponseType,
145 omci.StartSoftwareDownloadResponseType,
146 omci.EndSoftwareDownloadResponseType,
147 omci.ActivateSoftwareResponseType,
148 omci.CommitSoftwareResponseType,
149}
150
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000151//NewOmciCC constructor returns a new instance of a OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000152//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000153func NewOmciCC(ctx context.Context, deviceID string, deviceHandler IdeviceHandler,
154 onuDeviceEntry IonuDeviceEntry, onuAlarmManager IonuAlarmManager,
155 coreClient *vgrpc.Client) *OmciCC {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000156 logger.Debugw(ctx, "init-omciCC", log.Fields{"device-id": deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000157 var omciCC OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000158 omciCC.enabled = false
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000159 omciCC.pBaseDeviceHandler = deviceHandler
160 omciCC.pOnuAlarmManager = onuAlarmManager
Himani Chawla4d908332020-08-31 12:30:20 +0530161 omciCC.pOnuDeviceEntry = onuDeviceEntry
162 omciCC.deviceID = deviceID
khenaidoo7d3c5582021-08-11 18:09:44 -0400163 omciCC.coreClient = coreClient
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000164 omciCC.supportExtMsg = false
mpagenkoc8bba412021-01-15 15:38:44 +0000165 omciCC.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000166 omciCC.txFrames = 0
167 omciCC.txOnuFrames = 0
168 omciCC.rxFrames = 0
169 omciCC.rxOnuFrames = 0
170 omciCC.rxOnuDiscards = 0
171 omciCC.tid = 0x1
172 omciCC.hpTid = 0x8000
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000173 omciCC.UploadSequNo = 0
174 omciCC.UploadNoOfCmds = 0
Holger Hildebrandt34555512021-10-01 16:26:59 +0000175 omciCC.lowPrioTxQueue = list.New()
176 omciCC.highPrioTxQueue = list.New()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000177 omciCC.rxSchedulerMap = make(map[uint16]CallbackPairEntry)
178 omciCC.monitoredRequests = make(map[uint16]OmciTransferStructure)
Holger Hildebrandtb42e11f2022-09-15 08:49:00 +0000179 omciCC.consecutiveOmciTimeouts = 0
180 omciCC.omciAbortInProgress = false
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000181 return &omciCC
182}
183
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000184//Stop stops/resets the omciCC
185func (oo *OmciCC) Stop(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000186 logger.Debugw(ctx, "omciCC-stopping", log.Fields{"device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000187 //reseting all internal data, which might also be helpful for discarding any lingering tx/rx requests
mpagenko8cd1bf72021-06-22 10:11:19 +0000188 oo.CancelRequestMonitoring(ctx)
Holger Hildebrandt34555512021-10-01 16:26:59 +0000189 // clear the tx queues
190 oo.mutexHighPrioTxQueue.Lock()
191 oo.highPrioTxQueue.Init()
192 oo.mutexHighPrioTxQueue.Unlock()
193 oo.mutexLowPrioTxQueue.Lock()
194 oo.lowPrioTxQueue.Init()
195 oo.mutexLowPrioTxQueue.Unlock()
196 //clear the scheduler map
mpagenko900ee4b2020-10-12 11:56:34 +0000197 oo.mutexRxSchedMap.Lock()
198 for k := range oo.rxSchedulerMap {
Holger Hildebrandt34555512021-10-01 16:26:59 +0000199 delete(oo.rxSchedulerMap, k)
mpagenko900ee4b2020-10-12 11:56:34 +0000200 }
201 oo.mutexRxSchedMap.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000202 //reset the high prio transactionId
mpagenko900ee4b2020-10-12 11:56:34 +0000203 oo.mutexHpTid.Lock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000204 oo.hpTid = 0x8000
mpagenko900ee4b2020-10-12 11:56:34 +0000205 oo.mutexHpTid.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000206 //reset the low prio transactionId
mpagenko900ee4b2020-10-12 11:56:34 +0000207 oo.mutexTid.Lock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000208 oo.tid = 1
mpagenko900ee4b2020-10-12 11:56:34 +0000209 oo.mutexTid.Unlock()
210 //reset control values
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000211 oo.UploadSequNo = 0
212 oo.UploadNoOfCmds = 0
mpagenkoc8bba412021-01-15 15:38:44 +0000213 oo.rxOmciFrameError = cOmciMessageReceiveNoError
mpagenko900ee4b2020-10-12 11:56:34 +0000214 //reset the stats counter - which might be topic of discussion ...
215 oo.txFrames = 0
216 oo.txOnuFrames = 0
217 oo.rxFrames = 0
218 oo.rxOnuFrames = 0
219 oo.rxOnuDiscards = 0
220
221 return nil
222}
223
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000224// Rx handler for omci messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000225func (oo *OmciCC) receiveOnuMessage(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000226 logger.Debugw(ctx, "rx-onu-autonomous-message", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000227 "payload": hex.EncodeToString(omciMsg.Payload)})
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530228 switch omciMsg.MessageType {
229 case omci.AlarmNotificationType:
230 data := OmciMessage{
231 OmciMsg: omciMsg,
232 OmciPacket: packet,
233 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000234 go oo.pOnuAlarmManager.HandleOmciAlarmNotificationMessage(ctx, data)
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530235 return nil
236 default:
237 return fmt.Errorf("receiveOnuMessageType %s unimplemented", omciMsg.MessageType.String())
238 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000239 /*
240 msgType = rxFrame.fields["message_type"] //assumed OmciOperationsValue
241 rxOnuFrames++
242
243 switch msgType {
244 case AlarmNotification:
245 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000246 logger.Info("Unhandled: received-onu-alarm-message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000247 // python code was:
248 //if msg_type == EntityOperations.AlarmNotification.value:
249 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Alarm_Notification)
250 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
251 //
252 return errors.New("RxAlarmNotification unimplemented")
253 }
254 case AttributeValueChange:
255 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000256 logger.Info("Unhandled: received-attribute-value-change")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000257 // python code was:
258 //elif msg_type == EntityOperations.AttributeValueChange.value:
259 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.AVC_Notification)
260 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
261 //
262 return errors.New("RxAttributeValueChange unimplemented")
263 }
264 case TestResult:
265 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000266 logger.Info("Unhandled: received-test-result")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000267 // python code was:
268 //elif msg_type == EntityOperations.TestResult.value:
269 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Test_Result)
270 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
271 //
272 return errors.New("RxTestResult unimplemented")
273 }
274 default:
275 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000276 logger.Errorw(ctx,"rx-onu-unsupported-autonomous-message", log.Fields{"msgType": msgType})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000277 rxOnuDiscards++
278 return errors.New("RxOnuMsgType unimplemented")
279 }
280 }
281 */
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000282}
283
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000284func (oo *OmciCC) printRxMessage(ctx context.Context, rxMsg []byte) {
mpagenko80622a52021-02-09 16:53:23 +0000285 //assuming omci message content is hex coded!
286 // with restricted output of 16bytes would be ...rxMsg[:16]
287 logger.Debugw(ctx, "omci-message-received:", log.Fields{
288 "RxOmciMessage": hex.EncodeToString(rxMsg),
289 "device-id": oo.deviceID})
290}
291
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000292// ReceiveMessage - Rx handler for onu messages
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000293// e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000294// nolint: gocyclo
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000295func (oo *OmciCC) ReceiveMessage(ctx context.Context, rxMsg []byte) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000296 //logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000297
298 if len(rxMsg) < 10 {
299 logger.Errorw(ctx, "rxOmciMessage has wrong length in general - abort",
300 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
301 if len(rxMsg) > 0 {
302 oo.printRxMessage(ctx, rxMsg)
mpagenkoc8bba412021-01-15 15:38:44 +0000303 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000304 return fmt.Errorf("rxOmciMessage has wrong length in general - abort %s", oo.deviceID)
305 }
306 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
307 if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
308 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
309 // (an extendedFormat message could be destroyed this way!)
310 trailerLenData := rxMsg[42:44]
311 trailerLen := binary.BigEndian.Uint16(trailerLenData)
312 //logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
313 if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
314 binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
315 if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
316 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
317 logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
318 log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
319 oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
320 }
321 }
322 } else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
323 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
324 // (an extendedFormat message could be destroyed this way!)
325 // extend/overwrite with trailer
326 trailer := make([]byte, 8)
327 binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
328 rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
329 if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
330 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
331 logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
332 log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
333 oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
334 }
335 } else {
336 logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
337 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
338 oo.printRxMessage(ctx, rxMsg)
339 return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
340 }
341 } else if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.ExtendedIdent) {
342 if len(rxMsg) > 1980 {
343 logger.Errorw(ctx, "rxOmciMessage has wrong length for OmciExtendedFormat - abort",
344 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
345 oo.printRxMessage(ctx, rxMsg)
346 return fmt.Errorf("rxOmciMessage has wrong length for OmciExtendedFormat %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000347 }
348 } else {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000349 logger.Errorw(ctx, "rxOmciMessage has wrong Device Identifier - abort",
mpagenkoc8bba412021-01-15 15:38:44 +0000350 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000351 oo.printRxMessage(ctx, rxMsg)
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000352 return fmt.Errorf("rxOmciMessage has wrong Device Identifier %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000353 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000354 decodeOptions := gopacket.DecodeOptions{
355 Lazy: true,
356 NoCopy: true,
357 }
358 packet := gopacket.NewPacket(rxMsg, omci.LayerTypeOMCI, decodeOptions)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000359 if packet == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000360 logger.Errorw(ctx, "omci-message could not be decoded", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000361 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200362 return fmt.Errorf("could not decode rxMsg as OMCI %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000363 }
364 omciLayer := packet.Layer(omci.LayerTypeOMCI)
365 if omciLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000366 logger.Errorw(ctx, "omci-message could not decode omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000367 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200368 return fmt.Errorf("could not decode omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000369 }
mpagenko836a1fd2021-11-01 16:12:42 +0000370 // insert some check on detected OMCI decoding issues and log them
371 // e.g. should indicate problems when detecting some unknown attribute mask content (independent from message type)
372 // even though allowed from omci-lib due to set relaxed decoding
373 // application may dig into further details if wanted/needed on their own [but info is not transferred from here so far]
374 // (compare mib_sync.go unknownAttrLayer)
375 errLayer := packet.Layer(gopacket.LayerTypeDecodeFailure)
376 if failure, decodeOk := errLayer.(*gopacket.DecodeFailure); decodeOk {
377 errMsg := failure.Error()
378 logger.Warnw(ctx, "Detected decode issue on received OMCI frame", log.Fields{
379 "device-id": oo.deviceID, "issue": errMsg})
380 }
381 //anyway try continue OMCI decoding further on message type layer
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000382 omciMsg, ok := omciLayer.(*omci.OMCI)
383 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000384 logger.Errorw(ctx, "omci-message could not assign omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000385 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200386 return fmt.Errorf("could not assign omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000387 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000388 logger.Debugw(ctx, "omci-message-decoded:", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000389 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16),
390 "DeviceIdent": omciMsg.DeviceIdentifier, "device-id": oo.deviceID})
mpagenko836a1fd2021-11-01 16:12:42 +0000391
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700392 // TestResult is asynchronous indication that carries the same TID as the TestResponse.
393 // We expect to find the TID in the oo.rxSchedulerMap
394 if byte(omciMsg.MessageType)&me.AK == 0 && omciMsg.MessageType != omci.TestResultType {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000395 // Not a response
mpagenko80622a52021-02-09 16:53:23 +0000396 oo.printRxMessage(ctx, rxMsg)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000397 logger.Debugw(ctx, "RxMsg is no Omci Response Message", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000398 if omciMsg.TransactionID == 0 {
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530399 return oo.receiveOnuMessage(ctx, omciMsg, &packet)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000400 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000401 logger.Errorw(ctx, "Unexpected TransCorrId != 0 not accepted for autonomous messages",
Andrea Campanella6515c582020-10-05 11:25:00 +0200402 log.Fields{"msgType": omciMsg.MessageType, "payload": hex.EncodeToString(omciMsg.Payload),
mpagenko8b07c1b2020-11-26 10:36:31 +0000403 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200404 return fmt.Errorf("autonomous Omci Message with TranSCorrId != 0 not acccepted %s", oo.deviceID)
Himani Chawla4d908332020-08-31 12:30:20 +0530405 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000406 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530407 oo.mutexRxSchedMap.Lock()
408 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000409 if ok && rxCallbackEntry.CbFunction != nil {
Holger Hildebrandtb42e11f2022-09-15 08:49:00 +0000410
411 // valid OMCI Response Message received - reset counter of consecutive OMCI timeouts
412 oo.mutexConsecutiveOmciTimeouts.Lock()
413 oo.consecutiveOmciTimeouts = 0
414 oo.mutexConsecutiveOmciTimeouts.Unlock()
415
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000416 if rxCallbackEntry.FramePrint {
mpagenko80622a52021-02-09 16:53:23 +0000417 oo.printRxMessage(ctx, rxMsg)
418 }
Himani Chawla4d908332020-08-31 12:30:20 +0530419 //disadvantage of decoupling: error verification made difficult, but anyway the question is
420 // how to react on erroneous frame reception, maybe can simply be ignored
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000421 go rxCallbackEntry.CbFunction(ctx, omciMsg, &packet, rxCallbackEntry.CbRespChannel)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000422 isSuccessfulResponse, err := oo.isSuccessfulResponseWithMibDataSync(ctx, omciMsg, &packet)
423 if err != nil {
424 // qualified error logging already done in function above
425 if !rxCallbackEntry.FramePrint {
426 oo.printRxMessage(ctx, rxMsg)
427 }
428 return fmt.Errorf("could not decode further layers %s", oo.deviceID)
429 }
430 if isSuccessfulResponse {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000431 oo.pOnuDeviceEntry.IncrementMibDataSync(ctx)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000432 } else {
433 logger.Debugw(ctx, "mibDataSync counter not to be updated for this message type",
434 log.Fields{"omciMsg.MessageType": omciMsg.MessageType, "device-id": oo.deviceID})
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000435 }
mpagenkoc8bba412021-01-15 15:38:44 +0000436
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700437 // If omciMsg.MessageType is omci.TestResponseType, we still expect the TestResult OMCI message,
438 // so do not clean up the TransactionID in that case.
439 if omciMsg.MessageType != omci.TestResponseType {
440 // having posted the response the request is regarded as 'done'
441 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
442 }
Himani Chawla4d908332020-08-31 12:30:20 +0530443 oo.mutexRxSchedMap.Unlock()
mpagenko80622a52021-02-09 16:53:23 +0000444 return nil
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000445 }
mpagenko80622a52021-02-09 16:53:23 +0000446 oo.mutexRxSchedMap.Unlock()
447 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID})
448 oo.printRxMessage(ctx, rxMsg)
449 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000450
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000451 /* py code was:
452 Receive and OMCI message from the proxy channel to the OLT.
453
454 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
455 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
456 """
457 if not self.enabled:
458 return
459
460 try:
461 now = arrow.utcnow()
462 d = None
463
464 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
465 # save the current value of the entity_id_to_class_map, then
466 # replace it with our custom one before decode, and then finally
467 # restore it later. Tried other ways but really made the code messy.
468 saved_me_map = omci_entities.entity_id_to_class_map
469 omci_entities.entity_id_to_class_map = self._me_map
470
471 try:
472 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000473 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000474 except KeyError as e:
475 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000476 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000477 rx_frame = self._decode_unknown_me(msg)
478 self._rx_unknown_me += 1
479
480 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000481 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000482 return
483
484 finally:
485 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
486
487 rx_tid = rx_frame.fields['transaction_id']
488 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000489 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000490 # Filter the Test Result frame and route through receive onu
491 # message method.
492 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000493 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000494 return self._receive_onu_message(rx_frame)
495
496 # Previously unreachable if this is the very first round-trip Rx or we
497 # have been running consecutive errors
498 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000499 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000500 self.reactor.callLater(0, self._publish_connectivity_event, True)
501
502 self._rx_frames += 1
503 self._consecutive_errors = 0
504
505 try:
506 high_priority = self._tid_is_high_priority(rx_tid)
507 index = self._get_priority_index(high_priority)
508
509 # (timestamp, defer, frame, timeout, retry, delayedCall)
510 last_tx_tuple = self._tx_request[index]
511
512 if last_tx_tuple is None or \
513 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
514 # Possible late Rx on a message that timed-out
515 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000516 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000517 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
518 self._rx_unknown_tid += 1
519 self._rx_late += 1
520 return
521
522 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
523 if dc is not None and not dc.cancelled and not dc.called:
524 dc.cancel()
525
526 _secs = self._update_rx_tx_stats(now, ts)
527
528 # Late arrival already serviced by a timeout?
529 if d.called:
530 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000531 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000532 return
533
534 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000535 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000536 if d is not None:
537 return d.errback(failure.Failure(e))
538 return
539
540 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000541 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000542 tx_tid = tx_frame.fields['transaction_id'])
543 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
544
545 # begin success callback chain (will cancel timeout and queue next Tx message)
546 self._rx_response[index] = rx_frame
547 d.callback(rx_frame)
548
549 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000550 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000551 */
552}
553
Himani Chawla6d2ae152020-09-02 13:11:20 +0530554/*
555func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530556 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530557 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000558}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530559*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000560
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700561// ReleaseTid releases OMCI transaction identifier from rxSchedulerMap
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000562func (oo *OmciCC) ReleaseTid(ctx context.Context, tid uint16) {
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700563 logger.Debugw(ctx, "releasing tid from rxSchedulerMap", log.Fields{"tid": tid})
564 delete(oo.rxSchedulerMap, tid)
565}
566
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000567// Send - Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
568func (oo *OmciCC) Send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
569 receiveCallbackPair CallbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000570
mpagenkoc26d4c02021-05-06 14:27:57 +0000571 if timeout != 0 {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000572 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TransCorrId": receiveCallbackPair.CbKey})
mpagenkoc26d4c02021-05-06 14:27:57 +0000573 oo.mutexRxSchedMap.Lock()
574 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000575 oo.rxSchedulerMap[receiveCallbackPair.CbKey] = receiveCallbackPair.CbEntry
mpagenkoc26d4c02021-05-06 14:27:57 +0000576 oo.mutexRxSchedMap.Unlock()
577 } //else timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000578
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000579 printFrame := receiveCallbackPair.CbEntry.FramePrint //printFrame true means debug print of frame is requested
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000580 //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 +0000581 omciTxRequest := OmciTransferStructure{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000582 txFrame,
583 timeout,
584 retry,
585 highPrio,
mpagenko80622a52021-02-09 16:53:23 +0000586 printFrame,
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000587 receiveCallbackPair,
588 nil,
kesavand011d5162021-11-25 19:21:06 +0530589 nil,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000590 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000591 oo.mutexMonReq.Lock()
592 defer oo.mutexMonReq.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000593 if _, exist := oo.monitoredRequests[receiveCallbackPair.CbKey]; !exist {
mpagenko7455fd42021-06-10 16:25:55 +0000594 // do not call processRequestMonitoring in background here to ensure correct sequencing
595 // of requested messages into txQueue (especially for non-response-supervised messages)
596 oo.processRequestMonitoring(ctx, omciTxRequest)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000597 return nil
598 }
599 logger.Errorw(ctx, "A message with this tid is processed already!",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000600 log.Fields{"tid": receiveCallbackPair.CbKey, "device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000601 return fmt.Errorf("message with tid is processed already %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000602}
603
Holger Hildebrandt34555512021-10-01 16:26:59 +0000604func (oo *OmciCC) sendQueuedRequests(ctx context.Context) {
605 // Avoid accessing the txQueues from parallel send routines to block
606 // parallel omci send requests at least until SendIAP is 'committed'.
607 // To guarantee window size 1 for one ONU it would be necessary to wait
608 // for the corresponding response too (t.b.d.).
609 oo.mutexSendQueuedRequests.Lock()
610 defer oo.mutexSendQueuedRequests.Unlock()
611 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
612 logger.Errorw(ctx, "Error during sending high prio requests!",
613 log.Fields{"err": err, "device-id": oo.deviceID})
614 return
615 }
616 if err := oo.sendQueuedLowPrioRequests(ctx); err != nil {
617 logger.Errorw(ctx, "Error during sending low prio requests!",
618 log.Fields{"err": err, "device-id": oo.deviceID})
619 return
620 }
621}
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000622
Holger Hildebrandt34555512021-10-01 16:26:59 +0000623func (oo *OmciCC) sendQueuedHighPrioRequests(ctx context.Context) error {
624 oo.mutexHighPrioTxQueue.Lock()
625 defer oo.mutexHighPrioTxQueue.Unlock()
626 for oo.highPrioTxQueue.Len() > 0 {
627 queueElement := oo.highPrioTxQueue.Front() // First element
628 if err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure)); err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000629 // Element will be removed from the queue regardless of the send success, to prevent
630 // an accumulation of send requests for the same message in the event of an error.
631 // In this case, resend attempts for the message are ensured by our retry
632 // mechanism after omci-timeout.
633 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
Holger Hildebrandt34555512021-10-01 16:26:59 +0000634 return err
mpagenko80622a52021-02-09 16:53:23 +0000635 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000636 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
637 }
638 return nil
639}
640
641func (oo *OmciCC) sendQueuedLowPrioRequests(ctx context.Context) error {
642 oo.mutexLowPrioTxQueue.Lock()
643 for oo.lowPrioTxQueue.Len() > 0 {
644 queueElement := oo.lowPrioTxQueue.Front() // First element
kesavand011d5162021-11-25 19:21:06 +0530645 // check if the element is for onu sw section
646 aOmciTxReq := queueElement.Value.(OmciTransferStructure)
647 if aOmciTxReq.OnuSwWindow != nil {
648 if err := oo.sendOnuSwSectionsOfWindow(ctx, aOmciTxReq); err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000649 // Element will be removed from the queue regardless of the send success, to prevent
650 // an accumulation of send requests for the same message in the event of an error.
651 // In this case, resend attempts for the message are ensured by our retry
652 // mechanism after omci-timeout.
653 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
kesavand011d5162021-11-25 19:21:06 +0530654 oo.mutexLowPrioTxQueue.Unlock()
655 return err
656 }
657 } else {
658 err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure))
659 if err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000660 // Element will be removed from the queue regardless of the send success, to prevent
661 // an accumulation of send requests for the same message in the event of an error.
662 // In this case, resend attempts for the message are ensured by our retry
663 // mechanism after omci-timeout.
664 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
kesavand011d5162021-11-25 19:21:06 +0530665 oo.mutexLowPrioTxQueue.Unlock()
666 return err
667 }
amit.ghosh58b704b2021-06-18 03:45:52 +0200668 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000669 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
670 // Interrupt the sending of low priority requests to process any high priority requests
671 // that may have arrived in the meantime
672 oo.mutexLowPrioTxQueue.Unlock()
673 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
674 return err
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000675 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000676 oo.mutexLowPrioTxQueue.Lock()
677 }
678
679 oo.mutexLowPrioTxQueue.Unlock()
680 return nil
681}
682
683func (oo *OmciCC) sendOMCIRequest(ctx context.Context, omciTxRequest OmciTransferStructure) error {
684 if omciTxRequest.withFramePrint {
685 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
686 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
687 "device-id": oo.deviceID,
688 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
689 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
690 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
691 }
khenaidoo42dcdfd2021-10-19 17:34:12 -0400692 omciMsg := &ia.OmciMessage{
Holger Hildebrandt34555512021-10-01 16:26:59 +0000693 ParentDeviceId: oo.pBaseDeviceHandler.GetProxyAddressID(),
694 ChildDeviceId: oo.deviceID,
695 Message: omciTxRequest.txFrame,
696 ProxyAddress: oo.pBaseDeviceHandler.GetProxyAddress(),
697 ConnectStatus: common.ConnectStatus_REACHABLE, // If we are sending OMCI messages means we are connected, else we should not be here
698 }
699 sendErr := oo.pBaseDeviceHandler.SendOMCIRequest(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciMsg)
700 if sendErr != nil {
Holger Hildebrandtabfef032022-02-25 12:40:20 +0000701 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 +0000702 return sendErr
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000703 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000704 return nil
705}
706
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000707// GetNextTid - TODO: add comment
708func (oo *OmciCC) GetNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000709 var next uint16
710 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000711 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000712 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530713 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000714 if oo.hpTid < 0x8000 {
715 oo.hpTid = 0x8000
716 }
mpagenko900ee4b2020-10-12 11:56:34 +0000717 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000718 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000719 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000720 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530721 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000722 if oo.tid >= 0x8000 {
723 oo.tid = 1
724 }
mpagenko900ee4b2020-10-12 11:56:34 +0000725 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000726 }
727 return next
728}
729
kesavand011d5162021-11-25 19:21:06 +0530730//GetOnuSwSecNextTid get the next low prio tid for the onu sw sections
731//onu sw sections uses only low priority tids
732//The mutexTid lock should be taken prior to using this function
733func (oo *OmciCC) GetOnuSwSecNextTid() uint16 {
734 next := oo.tid
735 oo.tid++
736 if oo.tid >= 0x8000 {
737 oo.tid = 1
738 }
739 return next
740}
741
742//GetOnuSwSecLastTid gets the last allocated tid
743//The mutexTid lock should be taken prior to using this function
744func (oo *OmciCC) GetOnuSwSecLastTid() uint16 {
745 next := oo.tid
746 lastAllocatedTid := next - 1
747 return lastAllocatedTid
748}
749
750//LockMutexTID locks mutexTid
751func (oo *OmciCC) LockMutexTID() {
752 oo.mutexTid.Lock()
753}
754
755//UnLockMutexTID unlocks mutexTid
756func (oo *OmciCC) UnLockMutexTID() {
757 oo.mutexTid.Unlock()
758}
759
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000760// ###################################################################################
761// # utility methods provided to work on OMCI messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000762
763// Serialize - TODO: add comment
764func Serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000765 omciLayer := &omci.OMCI{
766 TransactionID: tid,
767 MessageType: msgType,
768 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000769 return SerializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000770}
771
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000772// SerializeOmciLayer - TODO: add comment
773func SerializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000774 var options gopacket.SerializeOptions
775 options.FixLengths = true
776
777 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530778 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000779 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000780 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000781 return nil, err
782 }
783 return buffer.Bytes(), nil
784}
785
Himani Chawla4d908332020-08-31 12:30:20 +0530786/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000787func hexEncode(omciPkt []byte) ([]byte, error) {
788 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
789 hex.Encode(dst, omciPkt)
790 return dst, nil
791}
Himani Chawla4d908332020-08-31 12:30:20 +0530792*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000793
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000794//supply a response handler for omci response messages to be transferred to the requested FSM
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000795func (oo *OmciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000796
dbainbri4d3a0dc2020-12-02 00:33:42 +0000797 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000798 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000799
800 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000801 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000802 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200803 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000804 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000805 oo.mutexMonReq.RLock()
806 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000807 //implement non-blocking channel send to avoid blocking on mutexMonReq later
808 select {
809 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
810 default:
811 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
812 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
813 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000814 } else {
815 logger.Infow(ctx, "reqMon: map entry does not exist!",
816 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
817 }
818 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000819
820 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
821 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000822 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000823 Type: OMCI,
824 Data: OmciMessage{
825 OmciMsg: omciMsg,
826 OmciPacket: packet,
827 },
828 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000829 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000830 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000831
832 return nil
833}
834
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000835// SendMibReset sends MibResetRequest
836func (oo *OmciCC) SendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000837
dbainbri4d3a0dc2020-12-02 00:33:42 +0000838 logger.Debugw(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000839 request := &omci.MibResetRequest{
840 MeBasePacket: omci.MeBasePacket{
841 EntityClass: me.OnuDataClassID,
842 },
843 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000844 tid := oo.GetNextTid(highPrio)
845 pkt, err := Serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000846 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000847 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000848 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000849 return err
850 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000851 omciRxCallbackPair := CallbackPair{
852 CbKey: tid,
853 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000854 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000855 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000856}
857
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000858// SendReboot sends RebootRequest
859func (oo *OmciCC) SendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
860 logger.Debugw(ctx, "send reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300861 request := &omci.RebootRequest{
862 MeBasePacket: omci.MeBasePacket{
863 EntityClass: me.OnuGClassID,
864 },
865 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000866 tid := oo.GetNextTid(highPrio)
867 pkt, err := Serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300868 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000869 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000870 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300871 return err
872 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000873 omciRxCallbackPair := CallbackPair{
874 CbKey: tid,
875 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetOmciRebootMsgRevChan(), oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300876 }
877
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000878 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300879 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000880 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000881 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300882 return err
883 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000884 err = oo.pOnuDeviceEntry.WaitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300885 if err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000886 logger.Errorw(ctx, "aborting ONU reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200887 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300888 return err
889 }
890 return nil
891}
892
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000893// SendMibUpload sends MibUploadRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000894func (oo *OmciCC) SendMibUpload(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000895 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000896
897 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000898
899 omciLayer := &omci.OMCI{
900 TransactionID: tid,
901 MessageType: omci.MibUploadRequestType,
902 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000903 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000904 omciLayer.DeviceIdentifier = omci.ExtendedIdent
905 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000906 request := &omci.MibUploadRequest{
907 MeBasePacket: omci.MeBasePacket{
908 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000909 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000910 },
911 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000912 var options gopacket.SerializeOptions
913 options.FixLengths = true
914
915 buffer := gopacket.NewSerializeBuffer()
916 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000917 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000918 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000919 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000920 return err
921 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000922 oo.UploadSequNo = 0
923 oo.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000924
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000925 omciRxCallbackPair := CallbackPair{
926 CbKey: tid,
927 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000928 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000929 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000930}
931
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000932// SendMibUploadNext sends MibUploadNextRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000933func (oo *OmciCC) SendMibUploadNext(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000934 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "UploadSequNo": oo.UploadSequNo})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000935
936 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000937
938 omciLayer := &omci.OMCI{
939 TransactionID: tid,
940 MessageType: omci.MibUploadNextRequestType,
941 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000942 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000943 omciLayer.DeviceIdentifier = omci.ExtendedIdent
944 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000945 request := &omci.MibUploadNextRequest{
946 MeBasePacket: omci.MeBasePacket{
947 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000948 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000949 },
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000950 CommandSequenceNumber: oo.UploadSequNo,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000951 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000952 var options gopacket.SerializeOptions
953 options.FixLengths = true
954
955 buffer := gopacket.NewSerializeBuffer()
956 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000957 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000958 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000959 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000960 return err
961 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000962 oo.UploadSequNo++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000963
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000964 omciRxCallbackPair := CallbackPair{
965 CbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000966 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
967 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
968 // compare also software upgrade download section handling
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000969 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000970 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000971 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000972}
973
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000974// SendGetAllAlarm gets all alarm ME instances
975func (oo *OmciCC) SendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool) error {
Himani Chawlad3dac422021-03-13 02:31:31 +0530976 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
977 request := &omci.GetAllAlarmsRequest{
978 MeBasePacket: omci.MeBasePacket{
979 EntityClass: me.OnuDataClassID,
980 },
981 AlarmRetrievalMode: byte(alarmRetreivalMode),
982 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000983 tid := oo.GetNextTid(highPrio)
984 pkt, err := Serialize(ctx, omci.GetAllAlarmsRequestType, request, tid)
Himani Chawlad3dac422021-03-13 02:31:31 +0530985 if err != nil {
986 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{
987 "Err": err, "device-id": oo.deviceID})
988 return err
989 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000990 oo.pOnuAlarmManager.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +0530991
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000992 omciRxCallbackPair := CallbackPair{
993 CbKey: tid,
994 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +0530995 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000996 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +0530997}
998
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000999// SendGetAllAlarmNext gets next alarm ME instance
1000func (oo *OmciCC) SendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool) error {
1001 alarmUploadSeqNo := oo.pOnuAlarmManager.GetAlarmUploadSeqNo()
1002 logger.Debugw(ctx, "send SendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
Himani Chawlad3dac422021-03-13 02:31:31 +05301003 "alarmUploadSeqNo": alarmUploadSeqNo})
1004 request := &omci.GetAllAlarmsNextRequest{
1005 MeBasePacket: omci.MeBasePacket{
1006 EntityClass: me.OnuDataClassID,
1007 },
1008 CommandSequenceNumber: alarmUploadSeqNo,
1009 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001010 tid := oo.GetNextTid(highPrio)
1011 pkt, err := Serialize(ctx, omci.GetAllAlarmsNextRequestType, request, tid)
Himani Chawlad3dac422021-03-13 02:31:31 +05301012 if err != nil {
1013 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{
1014 "Err": err, "device-id": oo.deviceID})
1015 return err
1016 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001017 oo.pOnuAlarmManager.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +05301018
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001019 omciRxCallbackPair := CallbackPair{
1020 CbKey: tid,
1021 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301022 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001023 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +05301024}
1025
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001026// SendCreateGalEthernetProfile creates GalEthernetProfile ME instance
1027func (oo *OmciCC) SendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1028 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001029 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001030 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001031
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001032 meParams := me.ParamData{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001033 EntityID: GalEthernetEID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001034 Attributes: me.AttributeValueMap{me.GalEthernetProfile_MaximumGemPayloadSize: maxGemPayloadSize},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001035 }
1036 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
1037 if omciErr.GetError() == nil {
1038 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001039 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001040 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001041 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001042 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001043 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001044 }
1045
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001046 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001047 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001048 logger.Errorw(ctx, "Cannot serialize 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 }
1052
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001053 omciRxCallbackPair := CallbackPair{
1054 CbKey: tid,
1055 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001056 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001057 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001058 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001059 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001060 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001061 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001062 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001063 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001064 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001065 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001066 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001067 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001068 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001069}
1070
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001071// SendSetOnu2g sets Onu2G ME instance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001072// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001073func (oo *OmciCC) SendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1074 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001075 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001076 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001077
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001078 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
1079 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001080 // By now we just use fix values to fire - this is anyway what the python adapter does
1081 // read ONU-2G from DB ???? //TODO!!!
1082 meParams := me.ParamData{
1083 EntityID: 0,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001084 Attributes: me.AttributeValueMap{me.Onu2G_CurrentConnectivityMode: connectivityModeValue},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001085 }
1086 meInstance, omciErr := me.NewOnu2G(meParams)
1087 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001088 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001089 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001090 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001091 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001092 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001093 }
1094
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001095 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001096 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001097 logger.Errorw(ctx, "Cannot serialize 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 }
1101
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001102 omciRxCallbackPair := CallbackPair{
1103 CbKey: tid,
1104 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001105 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001106 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001107 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001108 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001109 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001110 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001111 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001112 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001113 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001114 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001115 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001116 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001117 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001118}
1119
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001120// SendCreateMBServiceProfile creates MacBridgeServiceProfile ME instance
1121func (oo *OmciCC) SendCreateMBServiceProfile(ctx context.Context,
1122 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1123 tid := oo.GetNextTid(highPrio)
1124 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001125 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001126 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001127
1128 meParams := me.ParamData{
1129 EntityID: instID,
1130 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001131 me.MacBridgeServiceProfile_Priority: 0x8000,
1132 me.MacBridgeServiceProfile_MaxAge: 20 * 256, //20s
1133 me.MacBridgeServiceProfile_HelloTime: 2 * 256, //2s
1134 me.MacBridgeServiceProfile_ForwardDelay: 15 * 256, //15s
1135 me.MacBridgeServiceProfile_DynamicFilteringAgeingTime: 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001136 },
1137 }
1138
1139 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
1140 if omciErr.GetError() == nil {
1141 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001142 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1143 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001144 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001145 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001146 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001147 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001148 }
1149
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001150 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001151 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001152 logger.Errorw(ctx, "Cannot serialize 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 }
1156
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001157 omciRxCallbackPair := CallbackPair{
1158 CbKey: tid,
1159 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001160 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001161 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001162 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001163 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001164 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001165 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001166 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001167 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001168 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001169 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001170 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001171 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001172 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001173}
1174
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001175// SendCreateMBPConfigDataUniSide creates MacBridgePortConfigurationData ME instance
1176func (oo *OmciCC) SendCreateMBPConfigDataUniSide(ctx context.Context,
1177 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1178 tid := oo.GetNextTid(highPrio)
1179 instID, idErr := GenerateUNISideMBPCDEID(uint16(aPUniPort.MacBpNo))
Mahir Gunyel6781f962021-05-16 23:30:08 -07001180 if idErr != nil {
1181 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1182 "Err": idErr, "device-id": oo.deviceID})
1183 return nil, idErr
1184 }
1185 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001186 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.MacBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001187
1188 meParams := me.ParamData{
1189 EntityID: instID,
1190 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001191 me.MacBridgePortConfigurationData_BridgeIdPointer: MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo),
1192 me.MacBridgePortConfigurationData_PortNum: aPUniPort.MacBpNo,
1193 me.MacBridgePortConfigurationData_TpType: uint8(aPUniPort.PortType),
1194 me.MacBridgePortConfigurationData_TpPointer: aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001195 },
1196 }
1197 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1198 if omciErr.GetError() == nil {
1199 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001200 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1201 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001202 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001203 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001204 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001205 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001206 }
1207
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001208 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001209 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001210 logger.Errorw(ctx, "Cannot serialize 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 }
1214
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001215 omciRxCallbackPair := CallbackPair{
1216 CbKey: tid,
1217 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001218 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001219 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001220 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001221 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001222 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001223 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001224 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001225 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001226 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001227 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001228 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001229 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001230 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001231}
1232
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001233// SendCreateEVTOConfigData creates ExtendedVlanTaggingOperationConfigurationData ME instance
1234func (oo *OmciCC) SendCreateEVTOConfigData(ctx context.Context,
1235 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1236 tid := oo.GetNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001237 //same entityId is used as for MBSP (see there), but just arbitrary ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001238 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001239 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001240 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001241
1242 // compare python adapter code WA VOL-1311: this is not done here!
1243 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1244 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1245 assType := uint8(2) // default AssociationType is PPTPEthUni
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001246 if aPUniPort.PortType == UniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001247 assType = uint8(10) // for VEIP
1248 }
1249 meParams := me.ParamData{
1250 EntityID: instID,
1251 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001252 me.ExtendedVlanTaggingOperationConfigurationData_AssociationType: assType,
1253 me.ExtendedVlanTaggingOperationConfigurationData_AssociatedMePointer: aPUniPort.EntityID,
mpagenko836a1fd2021-11-01 16:12:42 +00001254 //EnhancedMode not yet supported, used with default options
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001255 },
1256 }
1257 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1258 if omciErr.GetError() == nil {
1259 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001260 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1261 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001262 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001263 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001264 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001265 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001266 }
1267
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001268 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001269 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001270 logger.Errorw(ctx, "Cannot serialize 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 }
1274
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001275 omciRxCallbackPair := CallbackPair{
1276 CbKey: tid,
1277 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001278 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001279 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001280 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001281 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001282 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001283 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001284 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001285 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001286 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001287 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001288 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001289 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001290 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001291}
1292
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001293// SendSetOnuGLS sets OnuG ME instance
1294func (oo *OmciCC) SendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001295 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001296 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001297 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001298 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001299
1300 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1301 meParams := me.ParamData{
1302 EntityID: 0,
1303 Attributes: requestedAttributes,
1304 }
1305 meInstance, omciErr := me.NewOnuG(meParams)
1306 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001307 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001308 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001309 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001310 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001311 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001312 }
1313
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001314 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001315 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001316 logger.Errorw(ctx, "Cannot serialize 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 }
1320
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001321 omciRxCallbackPair := CallbackPair{
1322 CbKey: tid,
1323 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001324 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001325 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001326 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001327 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001328 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001329 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001330 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001331 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001332 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001333 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001334 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001335 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001336 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001337}
1338
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001339// SendSetPptpEthUniLS sets PhysicalPathTerminationPointEthernetUni ME instance
1340func (oo *OmciCC) SendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001341 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001342 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001343 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001344 "SequNo": strconv.FormatInt(int64(tid), 16)})
1345
1346 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1347 meParams := me.ParamData{
1348 EntityID: aInstNo,
1349 Attributes: requestedAttributes,
1350 }
1351 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1352 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001353 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001354 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001355 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001356 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001357 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001358 }
1359
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001360 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001361 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001362 logger.Errorw(ctx, "Cannot serialize 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 }
1366
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001367 omciRxCallbackPair := CallbackPair{
1368 CbKey: tid,
1369 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001370 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001371 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001372 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001373 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001374 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001375 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001376 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001377 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001378 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001379 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001380 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001381 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001382 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001383}
1384
1385/* UniG obsolete by now, left here in case it should be needed once again
1386 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301387func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001388 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001389 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001390 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001391 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001392
1393 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1394 meParams := me.ParamData{
1395 EntityID: aInstNo,
1396 Attributes: requestedAttributes,
1397 }
1398 meInstance, omciErr := me.NewUniG(meParams)
1399 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001400 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001401 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001402 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001403 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001404 return nil
1405 }
1406
1407 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1408 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001409 logger.Errorw(ctx,"Cannot serialize UNI-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
1412 }
1413
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001414 omciRxCallbackPair := CallbackPair{
1415 CbKey: tid,
1416 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001417 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001418 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001419 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001420 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001421 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001422 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001423 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001424 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001425 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001426 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001427 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001428 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001429 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001430}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001431*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001432
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001433// SendSetVeipLS sets VirtualEthernetInterfacePoint ME instance
1434func (oo *OmciCC) SendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001435 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001436 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001437 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001438 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001439
1440 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1441 meParams := me.ParamData{
1442 EntityID: aInstNo,
1443 Attributes: requestedAttributes,
1444 }
1445 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1446 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001447 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001448 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001449 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001450 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001451 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001452 }
1453
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001454 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001455 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001456 logger.Errorw(ctx, "Cannot serialize 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 }
1460
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001461 omciRxCallbackPair := CallbackPair{
1462 CbKey: tid,
1463 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001464 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001465 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001466 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001467 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001468 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001469 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001470 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001471 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001472 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001473 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001474 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001475 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001476 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001477}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001478
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001479// SendGetMe gets ME instance
1480func (oo *OmciCC) SendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001481 timeout int, highPrio bool, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001482
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001483 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001484 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001485 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001486
1487 meParams := me.ParamData{
1488 EntityID: entityID,
1489 Attributes: requestedAttributes,
1490 }
1491 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1492 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301493 meClassIDName := meInstance.GetName()
mpagenko836a1fd2021-11-01 16:12:42 +00001494 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001495 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001496 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 +03001497 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001498 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001499 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001500 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001501 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001502 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001503 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001504 omciRxCallbackPair := CallbackPair{
1505 CbKey: tid,
1506 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001507 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001508 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001509 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001510 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001511 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001512 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001513 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001514 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001515 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001516 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001517 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001518}
1519
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001520// SendGetMeWithAttributeMask gets ME instance with attribute mask
1521func (oo *OmciCC) SendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
Himani Chawla43f95ff2021-06-03 00:24:12 +05301522 timeout int, highPrio bool, rxChan chan Message) error {
1523
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001524 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301525 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1526 "SequNo": strconv.FormatInt(int64(tid), 16)})
1527
1528 request := &omci.GetRequest{
1529 MeBasePacket: omci.MeBasePacket{
1530 EntityInstance: entityID,
1531 EntityClass: classID,
1532 },
1533 AttributeMask: requestedAttributesMask,
1534 }
1535
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001536 pkt, err := Serialize(ctx, omci.GetRequestType, request, tid)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301537 if err != nil {
1538 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1539 return err
1540 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001541 omciRxCallbackPair := CallbackPair{
1542 CbKey: tid,
1543 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05301544 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001545 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301546 if err != nil {
1547 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1548 return err
1549 }
1550 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1551 return nil
1552}
1553
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001554// SendCreateDot1PMapper creates Ieee8021PMapperServiceProfile ME instance
1555func (oo *OmciCC) SendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001556 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001557 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001558 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001559 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1560
1561 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001562 EntityID: aInstID,
1563 Attributes: me.AttributeValueMap{
1564 //workaround for unsuitable omci-lib default values, cmp VOL-3729
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001565 me.Ieee8021PMapperServiceProfile_TpPointer: 0xFFFF,
1566 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority0: 0xFFFF,
1567 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority1: 0xFFFF,
1568 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority2: 0xFFFF,
1569 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority3: 0xFFFF,
1570 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority4: 0xFFFF,
1571 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority5: 0xFFFF,
1572 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority6: 0xFFFF,
1573 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority7: 0xFFFF,
mpagenko8b5fdd22020-12-17 17:58:32 +00001574 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001575 }
1576 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1577 if omciErr.GetError() == nil {
1578 //we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001579 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1580 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001581 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001582 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001583 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001584 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001585 }
1586
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001587 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001588 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001589 logger.Errorw(ctx, "Cannot serialize .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 }
1593
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001594 omciRxCallbackPair := CallbackPair{
1595 CbKey: tid,
1596 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001597 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001598 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001599 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001600 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001601 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001602 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001603 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001604 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001605 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001606 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001607 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001608 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001609 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001610}
1611
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001612// SendCreateMBPConfigDataVar creates MacBridgePortConfigurationData ME instance
1613func (oo *OmciCC) SendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001614 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001615 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001616 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001617 "SequNo": strconv.FormatInt(int64(tid), 16),
1618 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1619
1620 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1621 if omciErr.GetError() == nil {
1622 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001623 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1624 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001625 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001626 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001627 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001628 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001629 }
1630
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001631 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001632 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001633 logger.Errorw(ctx, "Cannot serialize 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 }
1637
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001638 omciRxCallbackPair := CallbackPair{
1639 CbKey: tid,
1640 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001641 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001642 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001643 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001644 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001645 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001646 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001647 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001648 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001649 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001650 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001651 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001652 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001653 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001654}
1655
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001656// SendCreateGemNCTPVar creates GemPortNetworkCtp ME instance
1657func (oo *OmciCC) SendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001658 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001659 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001660 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001661 "SequNo": strconv.FormatInt(int64(tid), 16),
1662 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1663
1664 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1665 if omciErr.GetError() == nil {
1666 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001667 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1668 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001669 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001670 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001671 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001672 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001673 }
1674
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001675 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001676 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001677 logger.Errorw(ctx, "Cannot serialize 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 }
1681
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001682 omciRxCallbackPair := CallbackPair{
1683 CbKey: tid,
1684 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001685 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001686 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001687 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001688 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001689 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001690 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001691 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001692 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001693 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001694 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001695 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001696 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001697 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001698}
1699
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001700// SendSetGemNCTPVar sets GemPortNetworkCtp ME instance
1701func (oo *OmciCC) SendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1702 tid := oo.GetNextTid(highPrio)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001703 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1704 "SequNo": strconv.FormatInt(int64(tid), 16),
1705 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1706
1707 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1708 if omciErr.GetError() == nil {
1709 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001710 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1711 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsia82b91a62021-05-21 18:54:49 +03001712 if err != nil {
1713 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1714 "Err": err, "device-id": oo.deviceID})
1715 return nil, err
1716 }
1717
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001718 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001719 if err != nil {
1720 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1721 "Err": err, "device-id": oo.deviceID})
1722 return nil, err
1723 }
1724
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001725 omciRxCallbackPair := CallbackPair{
1726 CbKey: tid,
1727 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia82b91a62021-05-21 18:54:49 +03001728 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001729 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001730 if err != nil {
1731 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1732 "Err": err, "device-id": oo.deviceID})
1733 return nil, err
1734 }
1735 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1736 return meInstance, nil
1737 }
1738 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1739 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1740 return nil, omciErr.GetError()
1741}
1742
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001743// SendCreateGemIWTPVar creates GemInterworkingTerminationPoint ME instance
1744func (oo *OmciCC) SendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001745 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001746 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001747 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001748 "SequNo": strconv.FormatInt(int64(tid), 16),
1749 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1750
1751 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1752 if omciErr.GetError() == nil {
1753 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001754 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1755 oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001756 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001757 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001758 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001759 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001760 }
1761
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001762 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001763 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001764 logger.Errorw(ctx, "Cannot serialize 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 }
1768
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001769 omciRxCallbackPair := CallbackPair{
1770 CbKey: tid,
1771 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001772 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001773 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001774 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001775 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001776 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001777 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001778 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001779 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001780 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001781 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001782 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001783 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001784 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001785}
1786
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001787// SendSetTcontVar sets TCont ME instance
1788func (oo *OmciCC) SendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001789 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001790 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001791 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001792 "SequNo": strconv.FormatInt(int64(tid), 16),
1793 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1794
1795 meInstance, omciErr := me.NewTCont(params[0])
1796 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001797 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001798 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001799 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001800 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001801 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001802 }
1803
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001804 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001805 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001806 logger.Errorw(ctx, "Cannot serialize 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 }
1810
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001811 omciRxCallbackPair := CallbackPair{
1812 CbKey: tid,
1813 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001814 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001815 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001816 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001817 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001818 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001819 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001820 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001821 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001822 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001823 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001824 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001825 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001826 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001827}
1828
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001829// SendSetPrioQueueVar sets PriorityQueue ME instance
1830func (oo *OmciCC) SendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001831 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001832 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001833 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001834 "SequNo": strconv.FormatInt(int64(tid), 16),
1835 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1836
1837 meInstance, omciErr := me.NewPriorityQueue(params[0])
1838 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001839 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001840 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001841 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001842 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001843 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001844 }
1845
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001846 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001847 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001848 logger.Errorw(ctx, "Cannot serialize 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 }
1852
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001853 omciRxCallbackPair := CallbackPair{
1854 CbKey: tid,
1855 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001856 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001857 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001858 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001859 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001860 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001861 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001862 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001863 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001864 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001865 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001866 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001867 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001868 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001869}
1870
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001871// SendSetDot1PMapperVar sets Ieee8021PMapperServiceProfile ME instance
1872func (oo *OmciCC) SendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001873 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001874 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001875 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001876 "SequNo": strconv.FormatInt(int64(tid), 16),
1877 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1878
1879 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1880 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001881 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001882 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001883 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001884 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001885 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001886 }
1887
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001888 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001889 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001890 logger.Errorw(ctx, "Cannot serialize 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 }
1894
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001895 omciRxCallbackPair := CallbackPair{
1896 CbKey: tid,
1897 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001898 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001899 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001900 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001901 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001902 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001903 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001904 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001905 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001906 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001907 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001908 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001909 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001910 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001911}
mpagenkodff5dda2020-08-28 11:52:01 +00001912
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001913// SendCreateVtfdVar creates VlanTaggingFilterData ME instance
1914func (oo *OmciCC) SendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001915 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001916 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001917 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001918 "SequNo": strconv.FormatInt(int64(tid), 16),
1919 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1920
1921 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1922 if omciErr.GetError() == nil {
1923 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001924 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1925 oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00001926 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001927 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001928 "Err": err, "device-id": oo.deviceID})
1929 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1930 // return (dual format) error code that can be used at caller for immediate error treatment
1931 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001932 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001933 }
1934
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001935 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001936 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001937 logger.Errorw(ctx, "Cannot serialize 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 }
1941
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001942 omciRxCallbackPair := CallbackPair{
1943 CbKey: tid,
1944 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001945 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001946 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001947 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001948 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001949 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001950 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001951 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001952 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001953 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00001954 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001955 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001956 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001957 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00001958}
1959
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001960// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001961func (oo *OmciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001962 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001963 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001964 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001965 "SequNo": strconv.FormatInt(int64(tid), 16),
1966 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1967
1968 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1969 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001970 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1971 oframe.TransactionID(tid))
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001972 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001973 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001974 "Err": err, "device-id": oo.deviceID})
1975 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1976 // return (dual format) error code that can be used at caller for immediate error treatment
1977 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001978 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001979 }
1980
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001981 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001982 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001983 logger.Errorw(ctx, "Cannot serialize 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 }
1987
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001988 omciRxCallbackPair := CallbackPair{
1989 CbKey: tid,
1990 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001991 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001992 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001993 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001994 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001995 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001996 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001997 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001998 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001999 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002000 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002001 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002002 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002003 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002004}
2005
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002006// SendCreateEvtocdVar creates ExtendedVlanTaggingOperationConfigurationData ME instance
2007func (oo *OmciCC) SendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002008 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002009 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002010 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002011 "SequNo": strconv.FormatInt(int64(tid), 16),
2012 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2013
2014 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2015 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002016 //EnhancedMode not yet supported, used with default options
2017 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2018 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002019 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002020 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002021 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002022 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002023 }
2024
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002025 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002026 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002027 logger.Errorw(ctx, "Cannot serialize 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 }
2031
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002032 omciRxCallbackPair := CallbackPair{
2033 CbKey: tid,
2034 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002035 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002036 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002037 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002038 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002039 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002040 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002041 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002042 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002043 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002044 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002045 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002046 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002047 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002048}
2049
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002050// SendSetEvtocdVar sets ExtendedVlanTaggingOperationConfigurationData ME instance
2051func (oo *OmciCC) SendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002052 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002053 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002054 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002055 "SequNo": strconv.FormatInt(int64(tid), 16),
2056 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2057
2058 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2059 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002060 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002061 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002062 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002063 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002064 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002065 }
2066
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002067 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002068 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002069 logger.Errorw(ctx, "Cannot serialize 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 }
2073
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002074 omciRxCallbackPair := CallbackPair{
2075 CbKey: tid,
2076 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002077 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002078 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002079 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002080 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002081 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002082 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002083 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002084 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002085 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002086 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002087 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002088 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002089 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002090}
mpagenko01e726e2020-10-23 09:45:29 +00002091
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002092// SendDeleteEvtocd deletes ExtendedVlanTaggingOperationConfigurationData ME instance
2093func (oo *OmciCC) SendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002094 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002095 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002096 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002097 "SequNo": strconv.FormatInt(int64(tid), 16),
2098 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2099
2100 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2101 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002102 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002103 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002104 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002105 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002106 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002107 }
2108
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002109 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002110 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002111 logger.Errorw(ctx, "Cannot serialize 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 }
2115
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002116 omciRxCallbackPair := CallbackPair{
2117 CbKey: tid,
2118 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002119 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002120 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002121 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002122 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002123 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002124 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002125 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002126 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002127 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002128 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002129 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002130 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002131 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002132}
2133
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002134// SendDeleteVtfd deletes VlanTaggingFilterData ME instance
2135func (oo *OmciCC) SendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002136 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002137 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002138 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00002139 "SequNo": strconv.FormatInt(int64(tid), 16),
2140 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2141
2142 meParams := me.ParamData{EntityID: aInstID}
2143 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
2144 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002145 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2146 oframe.TransactionID(tid))
mpagenko01e726e2020-10-23 09:45:29 +00002147 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002148 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002149 "Err": err, "device-id": oo.deviceID})
2150 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2151 // return (dual format) error code that can be used at caller for immediate error treatment
2152 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002153 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002154 }
2155
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002156 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00002157 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002158 logger.Errorw(ctx, "Cannot serialize 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 }
2162
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002163 omciRxCallbackPair := CallbackPair{
2164 CbKey: tid,
2165 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00002166 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002167 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00002168 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002169 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002170 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002171 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002172 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002173 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002174 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00002175 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002176 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002177 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002178 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00002179}
ozgecanetsia422dbf32020-10-28 14:07:19 +03002180
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002181// SendCreateTDVar creates TrafficDescriptor ME instance
2182func (oo *OmciCC) SendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2183 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002184 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
2185 "SequNo": strconv.FormatInt(int64(tid), 16),
2186 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2187 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2188 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002189 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002190 if err != nil {
2191 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002192 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002193 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002194 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002195 if err != nil {
2196 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002197 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002198 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002199 omciRxCallbackPair := CallbackPair{
2200 CbKey: tid,
2201 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002202 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002203 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002204 if err != nil {
2205 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002206 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002207 }
2208 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002209 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002210 }
2211 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002212 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002213}
2214
2215// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002216func (oo *OmciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002217 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002218 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002219 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2220 "SequNo": strconv.FormatInt(int64(tid), 16),
2221 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2222
2223 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2224 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002225 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002226 if err != nil {
2227 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002228 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002229 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002230 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002231 if err != nil {
2232 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002233 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002234 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002235 omciRxCallbackPair := CallbackPair{
2236 CbKey: tid,
2237 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002238 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002239 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002240 if err != nil {
2241 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002242 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002243 }
2244 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002245 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002246 }
2247 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002248 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002249
2250}
2251
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002252// SendDeleteTD - TODO: add comment
2253func (oo *OmciCC) SendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002254 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002255 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002256 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2257 "SequNo": strconv.FormatInt(int64(tid), 16),
2258 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2259
2260 meParams := me.ParamData{EntityID: aInstID}
2261 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2262 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002263 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002264 if err != nil {
2265 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002266 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002267 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002268 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002269 if err != nil {
2270 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002271 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002272 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002273 omciRxCallbackPair := CallbackPair{
2274 CbKey: tid,
2275 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002276 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002277 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002278 if err != nil {
2279 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002280 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002281 }
2282 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002283 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002284 }
2285 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002286 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002287
2288}
2289
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002290// SendDeleteGemIWTP deletes GemInterworkingTerminationPoint ME instance
2291func (oo *OmciCC) SendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002292 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002293 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002294 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002295 "SequNo": strconv.FormatInt(int64(tid), 16),
2296 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2297
2298 meParams := me.ParamData{EntityID: aInstID}
2299 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2300 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002301 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2302 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002303 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002304 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002305 "Err": err, "device-id": oo.deviceID})
2306 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2307 // return (dual format) error code that can be used at caller for immediate error treatment
2308 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002309 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002310 }
2311
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002312 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002313 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002314 logger.Errorw(ctx, "Cannot serialize 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 }
2318
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002319 omciRxCallbackPair := CallbackPair{
2320 CbKey: tid,
2321 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002322 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002323 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002324 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002325 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002326 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002327 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002328 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002329 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002330 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002331 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002332 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002333 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002334 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002335}
2336
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002337// SendDeleteGemNCTP deletes GemPortNetworkCtp ME instance
2338func (oo *OmciCC) SendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002339 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002340 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002341 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002342 "SequNo": strconv.FormatInt(int64(tid), 16),
2343 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2344
2345 meParams := me.ParamData{EntityID: aInstID}
2346 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2347 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002348 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2349 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002350 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002351 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002352 "Err": err, "device-id": oo.deviceID})
2353 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2354 // return (dual format) error code that can be used at caller for immediate error treatment
2355 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002356 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002357 }
2358
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002359 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002360 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002361 logger.Errorw(ctx, "Cannot serialize 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 }
2365
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002366 omciRxCallbackPair := CallbackPair{
2367 CbKey: tid,
2368 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002369 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002370 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002371 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002372 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002373 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002374 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002375 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002376 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002377 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002378 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002379 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002380 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002381 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002382}
2383
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002384// SendDeleteDot1PMapper deletes Ieee8021PMapperServiceProfile ME instance
2385func (oo *OmciCC) SendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002386 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002387 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002388 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002389 "SequNo": strconv.FormatInt(int64(tid), 16),
2390 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2391
2392 meParams := me.ParamData{EntityID: aInstID}
2393 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2394 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002395 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2396 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002397 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002398 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002399 "Err": err, "device-id": oo.deviceID})
2400 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2401 // return (dual format) error code that can be used at caller for immediate error treatment
2402 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002403 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002404 }
2405
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002406 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002407 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002408 logger.Errorw(ctx, "Cannot serialize .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 }
2412
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002413 omciRxCallbackPair := CallbackPair{
2414 CbKey: tid,
2415 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002416 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002417 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002418 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002419 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002420 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002421 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002422 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002423 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002424 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002425 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002426 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002427 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002428 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002429}
2430
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002431// SendDeleteMBPConfigData deletes MacBridgePortConfigurationData ME instance
2432func (oo *OmciCC) SendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002433 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002434 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002435 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002436 "SequNo": strconv.FormatInt(int64(tid), 16),
2437 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2438
2439 meParams := me.ParamData{EntityID: aInstID}
2440 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2441 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002442 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2443 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002444 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002445 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002446 "Err": err, "device-id": oo.deviceID})
2447 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2448 // return (dual format) error code that can be used at caller for immediate error treatment
2449 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002450 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002451 }
2452
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002453 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002454 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002455 logger.Errorw(ctx, "Cannot serialize 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 }
2459
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002460 omciRxCallbackPair := CallbackPair{
2461 CbKey: tid,
2462 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002463 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002464 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002465 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002466 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002467 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002468 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002469 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002470 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002471 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002472 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002473 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002474 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002475 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002476}
2477
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002478// SendCreateMulticastGemIWTPVar creates MulticastGemInterworkingTerminationPoint ME instance
2479func (oo *OmciCC) SendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002480 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002481 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002482 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002483 "SequNo": strconv.FormatInt(int64(tid), 16),
2484 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2485
2486 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2487 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002488 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2489 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002490 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002491 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002492 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002493 }
2494
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002495 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002496 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002497 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002498 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002499 }
2500
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002501 omciRxCallbackPair := CallbackPair{CbKey: tid,
2502 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002503 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002504 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002505 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002506 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002507 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002508 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002509 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002510 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002511 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002512 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002513 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002514 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002515}
2516
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002517// SendSetMulticastGemIWTPVar sets MulticastGemInterworkingTerminationPoint ME instance
2518func (oo *OmciCC) SendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002519 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002520 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002521 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002522 "SequNo": strconv.FormatInt(int64(tid), 16),
2523 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2524
2525 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2526 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002527 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2528 oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002529 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002530 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002531 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002532 }
2533
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002534 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002535 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002536 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002537 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002538 }
2539
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002540 omciRxCallbackPair := CallbackPair{CbKey: tid,
2541 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002542 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002543 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002544 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002545 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002546 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002547 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002548 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002549 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002550 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002551 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002552 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002553 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002554}
2555
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002556// SendCreateMulticastOperationProfileVar creates MulticastOperationsProfile ME instance
2557func (oo *OmciCC) SendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002558 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002559 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002560 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002561 "SequNo": strconv.FormatInt(int64(tid), 16),
2562 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2563
2564 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2565 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002566 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2567 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002568 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002569 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002570 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002571 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002572 }
2573
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002574 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002575 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002576 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002577 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002578 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002579 }
2580
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002581 omciRxCallbackPair := CallbackPair{CbKey: tid,
2582 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002583 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002584 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002585 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002586 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002587 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002588 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002589 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002590 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002591 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002592 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002593 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002594 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002595 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002596}
2597
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002598// SendSetMulticastOperationProfileVar sets MulticastOperationsProfile ME instance
2599func (oo *OmciCC) SendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002600 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002601 tid := oo.GetNextTid(highPrio)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002602 logger.Debugw(ctx, "send MulticastOperationProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002603 "SequNo": strconv.FormatInt(int64(tid), 16),
2604 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2605
2606 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2607 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002608 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2609 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002610 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002611 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002612 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002613 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002614 }
2615
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002616 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002617 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002618 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002619 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002620 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002621 }
2622
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002623 omciRxCallbackPair := CallbackPair{CbKey: tid,
2624 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002625 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002626 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002627 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002628 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002629 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002630 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002631 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002632 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002633 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002634 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002635 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002636 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002637 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002638}
2639
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002640// SendCreateMulticastSubConfigInfoVar creates MulticastSubscriberConfigInfo ME instance
2641func (oo *OmciCC) SendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002642 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002643 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002644 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002645 "SequNo": strconv.FormatInt(int64(tid), 16),
2646 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2647
2648 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2649 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002650 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2651 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002652 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002653 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002654 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002655 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002656 }
2657
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002658 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002659 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002660 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002661 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002662 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002663 }
2664
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002665 omciRxCallbackPair := CallbackPair{CbKey: tid,
2666 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002667 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002668 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002669 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002670 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002671 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002672 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002673 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002674 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002675 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002676 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002677 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002678 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002679 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002680}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002681
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002682// SendCreateVoipVoiceCTP nolint: unused
2683func (oo *OmciCC) SendCreateVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2684 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2685 tid := oo.GetNextTid(highPrio)
2686 logger.Debugw(ctx, "send VoipVoiceCTP-create-msg:", log.Fields{"device-id": oo.deviceID,
2687 "SequNo": strconv.FormatInt(int64(tid), 16),
2688 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2689
2690 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2691 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002692 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2693 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002694 if err != nil {
2695 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for create", log.Fields{"Err": err,
2696 "device-id": oo.deviceID})
2697 return nil, err
2698 }
2699
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002700 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002701 if err != nil {
2702 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP create", log.Fields{"Err": err,
2703 "device-id": oo.deviceID})
2704 return nil, err
2705 }
2706
2707 omciRxCallbackPair := CallbackPair{CbKey: tid,
2708 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2709 }
2710 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2711 if err != nil {
2712 logger.Errorw(ctx, "Cannot send VoipVoiceCTP create", log.Fields{"Err": err,
2713 "device-id": oo.deviceID})
2714 return nil, err
2715 }
2716 logger.Debug(ctx, "send VoipVoiceCTP-create-msg done")
2717 return meInstance, nil
2718 }
2719 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2720 "device-id": oo.deviceID})
2721 return nil, omciErr.GetError()
2722}
2723
2724// SendSetVoipVoiceCTP nolint: unused
2725func (oo *OmciCC) SendSetVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2726 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2727 tid := oo.GetNextTid(highPrio)
2728 logger.Debugw(ctx, "send VoipVoiceCTP-set-msg:", log.Fields{"device-id": oo.deviceID,
2729 "SequNo": strconv.FormatInt(int64(tid), 16),
2730 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2731
2732 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2733 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002734 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2735 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002736 if err != nil {
2737 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for set", log.Fields{"Err": err,
2738 "device-id": oo.deviceID})
2739 return nil, err
2740 }
2741
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002742 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002743 if err != nil {
2744 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP set", log.Fields{"Err": err,
2745 "device-id": oo.deviceID})
2746 return nil, err
2747 }
2748
2749 omciRxCallbackPair := CallbackPair{CbKey: tid,
2750 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2751 }
2752 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2753 if err != nil {
2754 logger.Errorw(ctx, "Cannot send VoipVoiceCTP set", log.Fields{"Err": err,
2755 "device-id": oo.deviceID})
2756 return nil, err
2757 }
2758 logger.Debug(ctx, "send VoipVoiceCTP-set-msg done")
2759 return meInstance, nil
2760 }
2761 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2762 "device-id": oo.deviceID})
2763 return nil, omciErr.GetError()
2764}
2765
2766// SendDeleteVoipVoiceCTP nolint: unused
2767func (oo *OmciCC) SendDeleteVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2768 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2769 tid := oo.GetNextTid(highPrio)
2770 logger.Debugw(ctx, "send VoipVoiceCTP-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2771 "SequNo": strconv.FormatInt(int64(tid), 16),
2772 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2773
2774 meParams := me.ParamData{EntityID: aInstID}
2775 meInstance, omciErr := me.NewVoipVoiceCtp(meParams)
2776 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002777 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2778 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002779 if err != nil {
2780 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for delete", log.Fields{
2781 "Err": err, "device-id": oo.deviceID})
2782 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2783 // return (dual format) error code that can be used at caller for immediate error treatment
2784 // (relevant to all used sendXX() methods and their error conditions)
2785 return nil, err
2786 }
2787
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002788 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002789 if err != nil {
2790 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP delete", log.Fields{
2791 "Err": err, "device-id": oo.deviceID})
2792 return nil, err
2793 }
2794
2795 omciRxCallbackPair := CallbackPair{
2796 CbKey: tid,
2797 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2798 }
2799 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2800 if err != nil {
2801 logger.Errorw(ctx, "Cannot send VoipVoiceCTP delete", log.Fields{
2802 "Err": err, "device-id": oo.deviceID})
2803 return nil, err
2804 }
2805 logger.Debug(ctx, "send VoipVoiceCTP-Delete-msg done")
2806 return meInstance, nil
2807 }
2808 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance for delete", log.Fields{
2809 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2810 return nil, omciErr.GetError()
2811}
2812
2813// SendCreateVoipMediaProfile nolint: unused
2814func (oo *OmciCC) SendCreateVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2815 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2816 tid := oo.GetNextTid(highPrio)
2817 logger.Debugw(ctx, "send VoipMediaProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2818 "SequNo": strconv.FormatInt(int64(tid), 16),
2819 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2820
2821 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2822 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002823 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2824 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002825 if err != nil {
2826 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for create", log.Fields{"Err": err,
2827 "device-id": oo.deviceID})
2828 return nil, err
2829 }
2830
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002831 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002832 if err != nil {
2833 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile create", log.Fields{"Err": err,
2834 "device-id": oo.deviceID})
2835 return nil, err
2836 }
2837
2838 omciRxCallbackPair := CallbackPair{CbKey: tid,
2839 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2840 }
2841 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2842 if err != nil {
2843 logger.Errorw(ctx, "Cannot send VoipMediaProfile create", log.Fields{"Err": err,
2844 "device-id": oo.deviceID})
2845 return nil, err
2846 }
2847 logger.Debug(ctx, "send VoipMediaProfile-create-msg done")
2848 return meInstance, nil
2849 }
2850 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2851 "device-id": oo.deviceID})
2852 return nil, omciErr.GetError()
2853}
2854
2855// SendSetVoipMediaProfile nolint: unused
2856func (oo *OmciCC) SendSetVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2857 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2858 tid := oo.GetNextTid(highPrio)
2859 logger.Debugw(ctx, "send VoipMediaProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
2860 "SequNo": strconv.FormatInt(int64(tid), 16),
2861 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2862
2863 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2864 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002865 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2866 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002867 if err != nil {
2868 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for set", log.Fields{"Err": err,
2869 "device-id": oo.deviceID})
2870 return nil, err
2871 }
2872
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002873 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002874 if err != nil {
2875 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile set", log.Fields{"Err": err,
2876 "device-id": oo.deviceID})
2877 return nil, err
2878 }
2879
2880 omciRxCallbackPair := CallbackPair{CbKey: tid,
2881 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2882 }
2883 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2884 if err != nil {
2885 logger.Errorw(ctx, "Cannot send VoipMediaProfile set", log.Fields{"Err": err,
2886 "device-id": oo.deviceID})
2887 return nil, err
2888 }
2889 logger.Debug(ctx, "send VoipMediaProfile-set-msg done")
2890 return meInstance, nil
2891 }
2892 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2893 "device-id": oo.deviceID})
2894 return nil, omciErr.GetError()
2895}
2896
2897// SendDeleteVoipMediaProfile nolint: unused
2898func (oo *OmciCC) SendDeleteVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2899 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2900 tid := oo.GetNextTid(highPrio)
2901 logger.Debugw(ctx, "send VoipMediaProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2902 "SequNo": strconv.FormatInt(int64(tid), 16),
2903 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2904
2905 meParams := me.ParamData{EntityID: aInstID}
2906 meInstance, omciErr := me.NewVoipMediaProfile(meParams)
2907 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002908 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2909 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002910 if err != nil {
2911 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for delete", log.Fields{
2912 "Err": err, "device-id": oo.deviceID})
2913 return nil, err
2914 }
2915
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002916 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002917 if err != nil {
2918 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile delete", log.Fields{
2919 "Err": err, "device-id": oo.deviceID})
2920 return nil, err
2921 }
2922
2923 omciRxCallbackPair := CallbackPair{
2924 CbKey: tid,
2925 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2926 }
2927 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2928 if err != nil {
2929 logger.Errorw(ctx, "Cannot send VoipMediaProfile delete", log.Fields{
2930 "Err": err, "device-id": oo.deviceID})
2931 return nil, err
2932 }
2933 logger.Debug(ctx, "send VoipMediaProfile-Delete-msg done")
2934 return meInstance, nil
2935 }
2936 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance for delete", log.Fields{
2937 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2938 return nil, omciErr.GetError()
2939}
2940
2941// SendCreateVoiceServiceProfile nolint: unused
2942func (oo *OmciCC) SendCreateVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
2943 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2944 tid := oo.GetNextTid(highPrio)
2945 logger.Debugw(ctx, "send VoiceServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2946 "SequNo": strconv.FormatInt(int64(tid), 16),
2947 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2948
2949 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
2950 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002951 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2952 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002953 if err != nil {
2954 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for create", log.Fields{"Err": err,
2955 "device-id": oo.deviceID})
2956 return nil, err
2957 }
2958
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002959 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002960 if err != nil {
2961 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile create", log.Fields{"Err": err,
2962 "device-id": oo.deviceID})
2963 return nil, err
2964 }
2965
2966 omciRxCallbackPair := CallbackPair{CbKey: tid,
2967 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2968 }
2969 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2970 if err != nil {
2971 logger.Errorw(ctx, "Cannot send VoiceServiceProfile create", log.Fields{"Err": err,
2972 "device-id": oo.deviceID})
2973 return nil, err
2974 }
2975 logger.Debug(ctx, "send VoiceServiceProfile-create-msg done")
2976 return meInstance, nil
2977 }
2978 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
2979 "device-id": oo.deviceID})
2980 return nil, omciErr.GetError()
2981}
2982
2983// SendSetVoiceServiceProfile nolint: unused
2984func (oo *OmciCC) SendSetVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
2985 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2986 tid := oo.GetNextTid(highPrio)
2987 logger.Debugw(ctx, "send VoiceServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
2988 "SequNo": strconv.FormatInt(int64(tid), 16),
2989 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2990
2991 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
2992 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002993 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2994 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002995 if err != nil {
2996 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for set", log.Fields{"Err": err,
2997 "device-id": oo.deviceID})
2998 return nil, err
2999 }
3000
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003001 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003002 if err != nil {
3003 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile set", log.Fields{"Err": err,
3004 "device-id": oo.deviceID})
3005 return nil, err
3006 }
3007
3008 omciRxCallbackPair := CallbackPair{CbKey: tid,
3009 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3010 }
3011 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3012 if err != nil {
3013 logger.Errorw(ctx, "Cannot send VoiceServiceProfile set", log.Fields{"Err": err,
3014 "device-id": oo.deviceID})
3015 return nil, err
3016 }
3017 logger.Debug(ctx, "send VoiceServiceProfile-set-msg done")
3018 return meInstance, nil
3019 }
3020 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3021 "device-id": oo.deviceID})
3022 return nil, omciErr.GetError()
3023}
3024
3025// SendDeleteVoiceServiceProfile nolint: unused
3026func (oo *OmciCC) SendDeleteVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3027 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3028 tid := oo.GetNextTid(highPrio)
3029 logger.Debugw(ctx, "send VoiceServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3030 "SequNo": strconv.FormatInt(int64(tid), 16),
3031 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3032
3033 meParams := me.ParamData{EntityID: aInstID}
3034 meInstance, omciErr := me.NewVoiceServiceProfile(meParams)
3035 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003036 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3037 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003038 if err != nil {
3039 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for delete", log.Fields{
3040 "Err": err, "device-id": oo.deviceID})
3041 return nil, err
3042 }
3043
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003044 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003045 if err != nil {
3046 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile delete", log.Fields{
3047 "Err": err, "device-id": oo.deviceID})
3048 return nil, err
3049 }
3050
3051 omciRxCallbackPair := CallbackPair{
3052 CbKey: tid,
3053 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3054 }
3055 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3056 if err != nil {
3057 logger.Errorw(ctx, "Cannot send VoiceServiceProfile delete", log.Fields{
3058 "Err": err, "device-id": oo.deviceID})
3059 return nil, err
3060 }
3061 logger.Debug(ctx, "send VoiceServiceProfile-Delete-msg done")
3062 return meInstance, nil
3063 }
3064 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance for delete", log.Fields{
3065 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3066 return nil, omciErr.GetError()
3067}
3068
3069// SendCreateSIPUserData nolint: unused
3070func (oo *OmciCC) SendCreateSIPUserData(ctx context.Context, timeout int, highPrio bool,
3071 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3072 tid := oo.GetNextTid(highPrio)
3073 logger.Debugw(ctx, "send SIPUserData-create-msg:", log.Fields{"device-id": oo.deviceID,
3074 "SequNo": strconv.FormatInt(int64(tid), 16),
3075 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3076
3077 meInstance, omciErr := me.NewSipUserData(params[0])
3078 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003079 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3080 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003081 if err != nil {
3082 logger.Errorw(ctx, "Cannot encode SIPUserData for create", log.Fields{"Err": err,
3083 "device-id": oo.deviceID})
3084 return nil, err
3085 }
3086
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003087 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003088 if err != nil {
3089 logger.Errorw(ctx, "Cannot serialize SIPUserData create", log.Fields{"Err": err,
3090 "device-id": oo.deviceID})
3091 return nil, err
3092 }
3093
3094 omciRxCallbackPair := CallbackPair{CbKey: tid,
3095 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3096 }
3097 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3098 if err != nil {
3099 logger.Errorw(ctx, "Cannot send SIPUserData create", log.Fields{"Err": err,
3100 "device-id": oo.deviceID})
3101 return nil, err
3102 }
3103 logger.Debug(ctx, "send SIPUserData-create-msg done")
3104 return meInstance, nil
3105 }
3106 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3107 "device-id": oo.deviceID})
3108 return nil, omciErr.GetError()
3109}
3110
3111// SendSetSIPUserData nolint: unused
3112func (oo *OmciCC) SendSetSIPUserData(ctx context.Context, timeout int, highPrio bool,
3113 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3114 tid := oo.GetNextTid(highPrio)
3115 logger.Debugw(ctx, "send SIPUserData-set-msg:", log.Fields{"device-id": oo.deviceID,
3116 "SequNo": strconv.FormatInt(int64(tid), 16),
3117 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3118
3119 meInstance, omciErr := me.NewSipUserData(params[0])
3120 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003121 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3122 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003123 if err != nil {
3124 logger.Errorw(ctx, "Cannot encode SIPUserData for set", log.Fields{"Err": err,
3125 "device-id": oo.deviceID})
3126 return nil, err
3127 }
3128
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003129 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003130 if err != nil {
3131 logger.Errorw(ctx, "Cannot serialize SIPUserData set", log.Fields{"Err": err,
3132 "device-id": oo.deviceID})
3133 return nil, err
3134 }
3135
3136 omciRxCallbackPair := CallbackPair{CbKey: tid,
3137 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3138 }
3139 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3140 if err != nil {
3141 logger.Errorw(ctx, "Cannot send SIPUserData set", log.Fields{"Err": err,
3142 "device-id": oo.deviceID})
3143 return nil, err
3144 }
3145 logger.Debug(ctx, "send SIPUserData-set-msg done")
3146 return meInstance, nil
3147 }
3148 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3149 "device-id": oo.deviceID})
3150 return nil, omciErr.GetError()
3151}
3152
3153// SendDeleteSIPUserData nolint: unused
3154func (oo *OmciCC) SendDeleteSIPUserData(ctx context.Context, timeout int, highPrio bool,
3155 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3156 tid := oo.GetNextTid(highPrio)
3157 logger.Debugw(ctx, "send SIPUserData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3158 "SequNo": strconv.FormatInt(int64(tid), 16),
3159 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3160
3161 meParams := me.ParamData{EntityID: aInstID}
3162 meInstance, omciErr := me.NewSipUserData(meParams)
3163 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003164 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3165 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003166 if err != nil {
3167 logger.Errorw(ctx, "Cannot encode SIPUserData for delete", log.Fields{
3168 "Err": err, "device-id": oo.deviceID})
3169 return nil, err
3170 }
3171
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003172 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003173 if err != nil {
3174 logger.Errorw(ctx, "Cannot serialize SIPUserData delete", log.Fields{
3175 "Err": err, "device-id": oo.deviceID})
3176 return nil, err
3177 }
3178
3179 omciRxCallbackPair := CallbackPair{
3180 CbKey: tid,
3181 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3182 }
3183 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3184 if err != nil {
3185 logger.Errorw(ctx, "Cannot send SIPUserData delete", log.Fields{
3186 "Err": err, "device-id": oo.deviceID})
3187 return nil, err
3188 }
3189 logger.Debug(ctx, "send SIPUserData-Delete-msg done")
3190 return meInstance, nil
3191 }
3192 logger.Errorw(ctx, "Cannot generate SIPUserData Instance for delete", log.Fields{
3193 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3194 return nil, omciErr.GetError()
3195}
3196
3197// SendCreateVoipApplicationServiceProfile nolint: unused
3198func (oo *OmciCC) SendCreateVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3199 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3200 tid := oo.GetNextTid(highPrio)
3201 logger.Debugw(ctx, "send VoipApplicationServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3202 "SequNo": strconv.FormatInt(int64(tid), 16),
3203 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3204
3205 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3206 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003207 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3208 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003209 if err != nil {
3210 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for create", log.Fields{"Err": err,
3211 "device-id": oo.deviceID})
3212 return nil, err
3213 }
3214
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003215 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003216 if err != nil {
3217 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile create", log.Fields{"Err": err,
3218 "device-id": oo.deviceID})
3219 return nil, err
3220 }
3221
3222 omciRxCallbackPair := CallbackPair{CbKey: tid,
3223 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3224 }
3225 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3226 if err != nil {
3227 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile create", log.Fields{"Err": err,
3228 "device-id": oo.deviceID})
3229 return nil, err
3230 }
3231 logger.Debug(ctx, "send VoipApplicationServiceProfile-create-msg done")
3232 return meInstance, nil
3233 }
3234 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3235 "device-id": oo.deviceID})
3236 return nil, omciErr.GetError()
3237}
3238
3239// SendSetVoipApplicationServiceProfile nolint: unused
3240func (oo *OmciCC) SendSetVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3241 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3242 tid := oo.GetNextTid(highPrio)
3243 logger.Debugw(ctx, "send VoipApplicationServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3244 "SequNo": strconv.FormatInt(int64(tid), 16),
3245 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3246
3247 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3248 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003249 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3250 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003251 if err != nil {
3252 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for set", log.Fields{"Err": err,
3253 "device-id": oo.deviceID})
3254 return nil, err
3255 }
3256
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003257 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003258 if err != nil {
3259 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile set", log.Fields{"Err": err,
3260 "device-id": oo.deviceID})
3261 return nil, err
3262 }
3263
3264 omciRxCallbackPair := CallbackPair{CbKey: tid,
3265 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3266 }
3267 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3268 if err != nil {
3269 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile set", log.Fields{"Err": err,
3270 "device-id": oo.deviceID})
3271 return nil, err
3272 }
3273 logger.Debug(ctx, "send VoipApplicationServiceProfile-set-msg done")
3274 return meInstance, nil
3275 }
3276 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3277 "device-id": oo.deviceID})
3278 return nil, omciErr.GetError()
3279}
3280
3281// SendDeleteVoipApplicationServiceProfile nolint: unused
3282func (oo *OmciCC) SendDeleteVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3283 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3284 tid := oo.GetNextTid(highPrio)
3285 logger.Debugw(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3286 "SequNo": strconv.FormatInt(int64(tid), 16),
3287 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3288
3289 meParams := me.ParamData{EntityID: aInstID}
3290 meInstance, omciErr := me.NewVoipApplicationServiceProfile(meParams)
3291 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003292 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3293 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003294 if err != nil {
3295 logger.Errorw(ctx, "Cannot encode SIPVoipApplicationServiceProfile for delete", log.Fields{
3296 "Err": err, "device-id": oo.deviceID})
3297 return nil, err
3298 }
3299
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003300 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003301 if err != nil {
3302 logger.Errorw(ctx, "Cannot serialize SIPVoipApplicationServiceProfile delete", log.Fields{
3303 "Err": err, "device-id": oo.deviceID})
3304 return nil, err
3305 }
3306
3307 omciRxCallbackPair := CallbackPair{
3308 CbKey: tid,
3309 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3310 }
3311 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3312 if err != nil {
3313 logger.Errorw(ctx, "Cannot send SIPVoipApplicationServiceProfile delete", log.Fields{
3314 "Err": err, "device-id": oo.deviceID})
3315 return nil, err
3316 }
3317 logger.Debug(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg done")
3318 return meInstance, nil
3319 }
3320 logger.Errorw(ctx, "Cannot generate SIPVoipApplicationServiceProfile Instance for delete", log.Fields{
3321 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3322 return nil, omciErr.GetError()
3323}
3324
3325// SendCreateSIPAgentConfigData nolint: unused
3326func (oo *OmciCC) SendCreateSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3327 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3328 tid := oo.GetNextTid(highPrio)
3329 logger.Debugw(ctx, "send SIPAgentConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3330 "SequNo": strconv.FormatInt(int64(tid), 16),
3331 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3332
3333 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3334 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003335 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3336 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003337 if err != nil {
3338 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for create", log.Fields{"Err": err,
3339 "device-id": oo.deviceID})
3340 return nil, err
3341 }
3342
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003343 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003344 if err != nil {
3345 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData create", log.Fields{"Err": err,
3346 "device-id": oo.deviceID})
3347 return nil, err
3348 }
3349
3350 omciRxCallbackPair := CallbackPair{CbKey: tid,
3351 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3352 }
3353 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3354 if err != nil {
3355 logger.Errorw(ctx, "Cannot send SIPAgentConfigData create", log.Fields{"Err": err,
3356 "device-id": oo.deviceID})
3357 return nil, err
3358 }
3359 logger.Debug(ctx, "send SIPAgentConfigData-create-msg done")
3360 return meInstance, nil
3361 }
3362 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3363 "device-id": oo.deviceID})
3364 return nil, omciErr.GetError()
3365}
3366
3367// SendSetSIPAgentConfigData nolint: unused
3368func (oo *OmciCC) SendSetSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3369 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3370 tid := oo.GetNextTid(highPrio)
3371 logger.Debugw(ctx, "send SIPAgentConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3372 "SequNo": strconv.FormatInt(int64(tid), 16),
3373 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3374
3375 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3376 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003377 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3378 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003379 if err != nil {
3380 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for set", log.Fields{"Err": err,
3381 "device-id": oo.deviceID})
3382 return nil, err
3383 }
3384
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003385 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003386 if err != nil {
3387 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData set", log.Fields{"Err": err,
3388 "device-id": oo.deviceID})
3389 return nil, err
3390 }
3391
3392 omciRxCallbackPair := CallbackPair{CbKey: tid,
3393 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3394 }
3395 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3396 if err != nil {
3397 logger.Errorw(ctx, "Cannot send SIPAgentConfigData set", log.Fields{"Err": err,
3398 "device-id": oo.deviceID})
3399 return nil, err
3400 }
3401 logger.Debug(ctx, "send SIPAgentConfigData-set-msg done")
3402 return meInstance, nil
3403 }
3404 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3405 "device-id": oo.deviceID})
3406 return nil, omciErr.GetError()
3407}
3408
3409// SendDeleteSIPAgentConfigData nolint: unused
3410func (oo *OmciCC) SendDeleteSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3411 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3412 tid := oo.GetNextTid(highPrio)
3413 logger.Debugw(ctx, "send SIPAgentConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3414 "SequNo": strconv.FormatInt(int64(tid), 16),
3415 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3416
3417 meParams := me.ParamData{EntityID: aInstID}
3418 meInstance, omciErr := me.NewSipAgentConfigData(meParams)
3419 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003420 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3421 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003422 if err != nil {
3423 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for delete", log.Fields{
3424 "Err": err, "device-id": oo.deviceID})
3425 return nil, err
3426 }
3427
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003428 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003429 if err != nil {
3430 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData delete", log.Fields{
3431 "Err": err, "device-id": oo.deviceID})
3432 return nil, err
3433 }
3434
3435 omciRxCallbackPair := CallbackPair{
3436 CbKey: tid,
3437 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3438 }
3439 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3440 if err != nil {
3441 logger.Errorw(ctx, "Cannot send SIPAgentConfigData delete", log.Fields{
3442 "Err": err, "device-id": oo.deviceID})
3443 return nil, err
3444 }
3445 logger.Debug(ctx, "send SIPAgentConfigData-Delete-msg done")
3446 return meInstance, nil
3447 }
3448 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3449 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3450 return nil, omciErr.GetError()
3451}
3452
3453// SendCreateTCPUDPConfigData nolint: unused
3454func (oo *OmciCC) SendCreateTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3455 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3456 tid := oo.GetNextTid(highPrio)
3457 logger.Debugw(ctx, "send TCPUDPConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3458 "SequNo": strconv.FormatInt(int64(tid), 16),
3459 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3460
3461 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3462 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003463 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3464 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003465 if err != nil {
3466 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for create", log.Fields{"Err": err,
3467 "device-id": oo.deviceID})
3468 return nil, err
3469 }
3470
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003471 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003472 if err != nil {
3473 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData create", log.Fields{"Err": err,
3474 "device-id": oo.deviceID})
3475 return nil, err
3476 }
3477
3478 omciRxCallbackPair := CallbackPair{CbKey: tid,
3479 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3480 }
3481 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3482 if err != nil {
3483 logger.Errorw(ctx, "Cannot send TCPUDPConfigData create", log.Fields{"Err": err,
3484 "device-id": oo.deviceID})
3485 return nil, err
3486 }
3487 logger.Debug(ctx, "send TCPUDPConfigData-create-msg done")
3488 return meInstance, nil
3489 }
3490 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3491 "device-id": oo.deviceID})
3492 return nil, omciErr.GetError()
3493}
3494
3495// SendSetTCPUDPConfigData nolint: unused
3496func (oo *OmciCC) SendSetTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3497 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3498 tid := oo.GetNextTid(highPrio)
3499 logger.Debugw(ctx, "send TCPUDPConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3500 "SequNo": strconv.FormatInt(int64(tid), 16),
3501 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3502
3503 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3504 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003505 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3506 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003507 if err != nil {
3508 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for set", log.Fields{"Err": err,
3509 "device-id": oo.deviceID})
3510 return nil, err
3511 }
3512
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003513 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003514 if err != nil {
3515 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData set", log.Fields{"Err": err,
3516 "device-id": oo.deviceID})
3517 return nil, err
3518 }
3519
3520 omciRxCallbackPair := CallbackPair{CbKey: tid,
3521 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3522 }
3523 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3524 if err != nil {
3525 logger.Errorw(ctx, "Cannot send TCPUDPConfigData set", log.Fields{"Err": err,
3526 "device-id": oo.deviceID})
3527 return nil, err
3528 }
3529 logger.Debug(ctx, "send TCPUDPConfigData-set-msg done")
3530 return meInstance, nil
3531 }
3532 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3533 "device-id": oo.deviceID})
3534 return nil, omciErr.GetError()
3535}
3536
3537// SendDeleteTCPUDPConfigData nolint: unused
3538func (oo *OmciCC) SendDeleteTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3539 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3540 tid := oo.GetNextTid(highPrio)
3541 logger.Debugw(ctx, "send TCPUDPConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3542 "SequNo": strconv.FormatInt(int64(tid), 16),
3543 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3544
3545 meParams := me.ParamData{EntityID: aInstID}
3546 meInstance, omciErr := me.NewTcpUdpConfigData(meParams)
3547 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003548 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3549 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003550 if err != nil {
3551 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for delete", log.Fields{
3552 "Err": err, "device-id": oo.deviceID})
3553 return nil, err
3554 }
3555
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003556 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003557 if err != nil {
3558 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData delete", log.Fields{
3559 "Err": err, "device-id": oo.deviceID})
3560 return nil, err
3561 }
3562
3563 omciRxCallbackPair := CallbackPair{
3564 CbKey: tid,
3565 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3566 }
3567 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3568 if err != nil {
3569 logger.Errorw(ctx, "Cannot send TCPUDPConfigData delete", log.Fields{
3570 "Err": err, "device-id": oo.deviceID})
3571 return nil, err
3572 }
3573 logger.Debug(ctx, "send TCPUDPConfigData-Delete-msg done")
3574 return meInstance, nil
3575 }
3576 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3577 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3578 return nil, omciErr.GetError()
3579}
3580
3581// SendCreateIPHostConfigData nolint: unused
3582func (oo *OmciCC) SendCreateIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3583 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3584 tid := oo.GetNextTid(highPrio)
3585 logger.Debugw(ctx, "send IPHostConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3586 "SequNo": strconv.FormatInt(int64(tid), 16),
3587 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3588
3589 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3590 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003591 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3592 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003593 if err != nil {
3594 logger.Errorw(ctx, "Cannot encode IPHostConfigData for create", log.Fields{"Err": err,
3595 "device-id": oo.deviceID})
3596 return nil, err
3597 }
3598
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003599 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003600 if err != nil {
3601 logger.Errorw(ctx, "Cannot serialize IPHostConfigData create", log.Fields{"Err": err,
3602 "device-id": oo.deviceID})
3603 return nil, err
3604 }
3605
3606 omciRxCallbackPair := CallbackPair{CbKey: tid,
3607 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3608 }
3609 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3610 if err != nil {
3611 logger.Errorw(ctx, "Cannot send IPHostConfigData create", log.Fields{"Err": err,
3612 "device-id": oo.deviceID})
3613 return nil, err
3614 }
3615 logger.Debug(ctx, "send IPHostConfigData-create-msg done")
3616 return meInstance, nil
3617 }
3618 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3619 "device-id": oo.deviceID})
3620 return nil, omciErr.GetError()
3621}
3622
3623// SendSetIPHostConfigData nolint: unused
3624func (oo *OmciCC) SendSetIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3625 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3626 tid := oo.GetNextTid(highPrio)
3627 logger.Debugw(ctx, "send IPHostConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3628 "SequNo": strconv.FormatInt(int64(tid), 16),
3629 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3630
3631 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3632 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003633 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3634 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003635 if err != nil {
3636 logger.Errorw(ctx, "Cannot encode IPHostConfigData for set", log.Fields{"Err": err,
3637 "device-id": oo.deviceID})
3638 return nil, err
3639 }
3640
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003641 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003642 if err != nil {
3643 logger.Errorw(ctx, "Cannot serialize IPHostConfigData set", log.Fields{"Err": err,
3644 "device-id": oo.deviceID})
3645 return nil, err
3646 }
3647
3648 omciRxCallbackPair := CallbackPair{CbKey: tid,
3649 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3650 }
3651 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3652 if err != nil {
3653 logger.Errorw(ctx, "Cannot send IPHostConfigData set", log.Fields{"Err": err,
3654 "device-id": oo.deviceID})
3655 return nil, err
3656 }
3657 logger.Debug(ctx, "send IPHostConfigData-set-msg done")
3658 return meInstance, nil
3659 }
3660 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3661 "device-id": oo.deviceID})
3662 return nil, omciErr.GetError()
3663}
3664
3665// SendDeleteIPHostConfigData nolint: unused
3666func (oo *OmciCC) SendDeleteIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3667 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3668 tid := oo.GetNextTid(highPrio)
3669 logger.Debugw(ctx, "send IPHostConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3670 "SequNo": strconv.FormatInt(int64(tid), 16),
3671 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3672
3673 meParams := me.ParamData{EntityID: aInstID}
3674 meInstance, omciErr := me.NewIpHostConfigData(meParams)
3675 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003676 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3677 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003678 if err != nil {
3679 logger.Errorw(ctx, "Cannot encode IPHostConfigData for delete", log.Fields{
3680 "Err": err, "device-id": oo.deviceID})
3681 return nil, err
3682 }
3683
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003684 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003685 if err != nil {
3686 logger.Errorw(ctx, "Cannot serialize IPHostConfigData delete", log.Fields{
3687 "Err": err, "device-id": oo.deviceID})
3688 return nil, err
3689 }
3690
3691 omciRxCallbackPair := CallbackPair{
3692 CbKey: tid,
3693 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3694 }
3695 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3696 if err != nil {
3697 logger.Errorw(ctx, "Cannot send IPHostConfigData delete", log.Fields{
3698 "Err": err, "device-id": oo.deviceID})
3699 return nil, err
3700 }
3701 logger.Debug(ctx, "send IPHostConfigData-Delete-msg done")
3702 return meInstance, nil
3703 }
3704 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance for delete", log.Fields{
3705 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3706 return nil, omciErr.GetError()
3707}
3708
3709// SendCreateRTPProfileData nolint: unused
3710func (oo *OmciCC) SendCreateRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3711 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3712 tid := oo.GetNextTid(highPrio)
3713 logger.Debugw(ctx, "send RTPProfileData-create-msg:", log.Fields{"device-id": oo.deviceID,
3714 "SequNo": strconv.FormatInt(int64(tid), 16),
3715 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3716
3717 meInstance, omciErr := me.NewRtpProfileData(params[0])
3718 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003719 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3720 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003721 if err != nil {
3722 logger.Errorw(ctx, "Cannot encode RTPProfileData for create", log.Fields{"Err": err,
3723 "device-id": oo.deviceID})
3724 return nil, err
3725 }
3726
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003727 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003728 if err != nil {
3729 logger.Errorw(ctx, "Cannot serialize RTPProfileData create", log.Fields{"Err": err,
3730 "device-id": oo.deviceID})
3731 return nil, err
3732 }
3733
3734 omciRxCallbackPair := CallbackPair{CbKey: tid,
3735 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3736 }
3737 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3738 if err != nil {
3739 logger.Errorw(ctx, "Cannot send RTPProfileData create", log.Fields{"Err": err,
3740 "device-id": oo.deviceID})
3741 return nil, err
3742 }
3743 logger.Debug(ctx, "send RTPProfileData-create-msg done")
3744 return meInstance, nil
3745 }
3746 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3747 "device-id": oo.deviceID})
3748 return nil, omciErr.GetError()
3749}
3750
3751// SendSetRTPProfileData nolint: unused
3752func (oo *OmciCC) SendSetRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3753 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3754 tid := oo.GetNextTid(highPrio)
3755 logger.Debugw(ctx, "send RTPProfileData-set-msg:", log.Fields{"device-id": oo.deviceID,
3756 "SequNo": strconv.FormatInt(int64(tid), 16),
3757 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3758
3759 meInstance, omciErr := me.NewRtpProfileData(params[0])
3760 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003761 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3762 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003763 if err != nil {
3764 logger.Errorw(ctx, "Cannot encode RTPProfileData for set", log.Fields{"Err": err,
3765 "device-id": oo.deviceID})
3766 return nil, err
3767 }
3768
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003769 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003770 if err != nil {
3771 logger.Errorw(ctx, "Cannot serialize RTPProfileData set", log.Fields{"Err": err,
3772 "device-id": oo.deviceID})
3773 return nil, err
3774 }
3775
3776 omciRxCallbackPair := CallbackPair{CbKey: tid,
3777 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3778 }
3779 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3780 if err != nil {
3781 logger.Errorw(ctx, "Cannot send RTPProfileData set", log.Fields{"Err": err,
3782 "device-id": oo.deviceID})
3783 return nil, err
3784 }
3785 logger.Debug(ctx, "send RTPProfileData-set-msg done")
3786 return meInstance, nil
3787 }
3788 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3789 "device-id": oo.deviceID})
3790 return nil, omciErr.GetError()
3791}
3792
3793// SendDeleteRTPProfileData nolint: unused
3794func (oo *OmciCC) SendDeleteRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3795 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3796 tid := oo.GetNextTid(highPrio)
3797 logger.Debugw(ctx, "send RTPProfileData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3798 "SequNo": strconv.FormatInt(int64(tid), 16),
3799 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3800
3801 meParams := me.ParamData{EntityID: aInstID}
3802 meInstance, omciErr := me.NewRtpProfileData(meParams)
3803 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003804 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3805 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003806 if err != nil {
3807 logger.Errorw(ctx, "Cannot encode RTPProfileData for delete", log.Fields{
3808 "Err": err, "device-id": oo.deviceID})
3809 return nil, err
3810 }
3811
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003812 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003813 if err != nil {
3814 logger.Errorw(ctx, "Cannot serialize RTPProfileData delete", log.Fields{
3815 "Err": err, "device-id": oo.deviceID})
3816 return nil, err
3817 }
3818
3819 omciRxCallbackPair := CallbackPair{
3820 CbKey: tid,
3821 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3822 }
3823 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3824 if err != nil {
3825 logger.Errorw(ctx, "Cannot send RTPProfileData delete", log.Fields{
3826 "Err": err, "device-id": oo.deviceID})
3827 return nil, err
3828 }
3829 logger.Debug(ctx, "send RTPProfileData-Delete-msg done")
3830 return meInstance, nil
3831 }
3832 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance for delete", log.Fields{
3833 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3834 return nil, omciErr.GetError()
3835}
3836
3837// SendCreateNetworkDialPlanTable nolint: unused
3838func (oo *OmciCC) SendCreateNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3839 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3840 tid := oo.GetNextTid(highPrio)
3841 logger.Debugw(ctx, "send NetworkDialPlanTable-create-msg:", log.Fields{"device-id": oo.deviceID,
3842 "SequNo": strconv.FormatInt(int64(tid), 16),
3843 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3844
3845 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3846 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003847 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3848 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003849 if err != nil {
3850 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for create", log.Fields{"Err": err,
3851 "device-id": oo.deviceID})
3852 return nil, err
3853 }
3854
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003855 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003856 if err != nil {
3857 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable create", log.Fields{"Err": err,
3858 "device-id": oo.deviceID})
3859 return nil, err
3860 }
3861
3862 omciRxCallbackPair := CallbackPair{CbKey: tid,
3863 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3864 }
3865 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3866 if err != nil {
3867 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable create", log.Fields{"Err": err,
3868 "device-id": oo.deviceID})
3869 return nil, err
3870 }
3871 logger.Debug(ctx, "send NetworkDialPlanTable-create-msg done")
3872 return meInstance, nil
3873 }
3874 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3875 "device-id": oo.deviceID})
3876 return nil, omciErr.GetError()
3877}
3878
3879// SendSetNetworkDialPlanTable nolint: unused
3880func (oo *OmciCC) SendSetNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3881 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3882 tid := oo.GetNextTid(highPrio)
3883 logger.Debugw(ctx, "send NetworkDialPlanTable-set-msg:", log.Fields{"device-id": oo.deviceID,
3884 "SequNo": strconv.FormatInt(int64(tid), 16),
3885 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3886
3887 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3888 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003889 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3890 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003891 if err != nil {
3892 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for set", log.Fields{"Err": err,
3893 "device-id": oo.deviceID})
3894 return nil, err
3895 }
3896
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003897 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003898 if err != nil {
3899 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable set", log.Fields{"Err": err,
3900 "device-id": oo.deviceID})
3901 return nil, err
3902 }
3903
3904 omciRxCallbackPair := CallbackPair{CbKey: tid,
3905 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3906 }
3907 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3908 if err != nil {
3909 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable set", log.Fields{"Err": err,
3910 "device-id": oo.deviceID})
3911 return nil, err
3912 }
3913 logger.Debug(ctx, "send NetworkDialPlanTable-set-msg done")
3914 return meInstance, nil
3915 }
3916 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3917 "device-id": oo.deviceID})
3918 return nil, omciErr.GetError()
3919}
3920
3921// SendDeleteNetworkDialPlanTable nolint: unused
3922func (oo *OmciCC) SendDeleteNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3923 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3924 tid := oo.GetNextTid(highPrio)
3925 logger.Debugw(ctx, "send NetworkDialPlanTable-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3926 "SequNo": strconv.FormatInt(int64(tid), 16),
3927 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3928
3929 meParams := me.ParamData{EntityID: aInstID}
3930 meInstance, omciErr := me.NewNetworkDialPlanTable(meParams)
3931 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003932 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3933 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003934 if err != nil {
3935 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for delete", log.Fields{
3936 "Err": err, "device-id": oo.deviceID})
3937 return nil, err
3938 }
3939
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003940 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003941 if err != nil {
3942 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable delete", log.Fields{
3943 "Err": err, "device-id": oo.deviceID})
3944 return nil, err
3945 }
3946
3947 omciRxCallbackPair := CallbackPair{
3948 CbKey: tid,
3949 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3950 }
3951 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3952 if err != nil {
3953 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable delete", log.Fields{
3954 "Err": err, "device-id": oo.deviceID})
3955 return nil, err
3956 }
3957 logger.Debug(ctx, "send NetworkDialPlanTable-Delete-msg done")
3958 return meInstance, nil
3959 }
3960 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance for delete", log.Fields{
3961 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3962 return nil, omciErr.GetError()
3963}
3964
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003965// SendSyncTime sends SynchronizeTimeRequest
3966func (oo *OmciCC) SendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
3967 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08003968 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
3969 "SequNo": strconv.FormatInt(int64(tid), 16)})
3970
3971 omciLayer := &omci.OMCI{
3972 TransactionID: tid,
3973 MessageType: omci.SynchronizeTimeRequestType,
3974 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
3975 // Length: 0x28, // Optional, defaults to 40 octets
3976 }
3977 utcTime := time.Now().UTC()
3978 request := &omci.SynchronizeTimeRequest{
3979 MeBasePacket: omci.MeBasePacket{
3980 EntityClass: me.OnuGClassID,
3981 // Default Instance ID is 0
3982 },
3983 Year: uint16(utcTime.Year()),
3984 Month: uint8(utcTime.Month()),
3985 Day: uint8(utcTime.Day()),
3986 Hour: uint8(utcTime.Hour()),
3987 Minute: uint8(utcTime.Minute()),
3988 Second: uint8(utcTime.Second()),
3989 }
3990
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003991 pkt, err := SerializeOmciLayer(ctx, omciLayer, request)
Girish Gowdrae0140f02021-02-02 16:55:09 -08003992 if err != nil {
3993 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
3994 "device-id": oo.deviceID})
3995 return err
3996 }
3997
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003998 omciRxCallbackPair := CallbackPair{CbKey: tid,
3999 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004000 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004001 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004002 if err != nil {
4003 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
4004 "device-id": oo.deviceID})
4005 return err
4006 }
4007 logger.Debug(ctx, "send synchronize time request done")
4008 return nil
4009}
4010
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004011// SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME creates or deletes EthernetFramePerformanceMonitoringHistoryData ME instance
4012func (oo *OmciCC) SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004013 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004014 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004015 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4016 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4017 meParam := me.ParamData{EntityID: entityID}
4018 var meInstance *me.ManagedEntity
4019 var omciErr me.OmciErrors
4020 if upstream {
4021 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
4022 } else {
4023 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
4024 }
4025 if omciErr.GetError() == nil {
4026 var omciLayer *omci.OMCI
4027 var msgLayer gopacket.SerializableLayer
4028 var err error
4029 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004030 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4031 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004032 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004033 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4034 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004035 }
4036 if err != nil {
4037 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
4038 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004039 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004040 }
4041
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004042 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004043 if err != nil {
4044 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
4045 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004046 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004047 }
4048
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004049 omciRxCallbackPair := CallbackPair{CbKey: tid,
4050 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004051 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004052 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004053 if err != nil {
4054 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
4055 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004056 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004057 }
4058 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
4059 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004060 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004061 }
4062 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
4063 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 +03004064 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004065}
4066
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004067// SendCreateOrDeleteEthernetUniHistoryME creates or deletes EthernetPerformanceMonitoringHistoryData ME instance
4068func (oo *OmciCC) SendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004069 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004070 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004071 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4072 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4073 meParam := me.ParamData{EntityID: entityID}
4074 var meInstance *me.ManagedEntity
4075 var omciErr me.OmciErrors
4076 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
4077
4078 if omciErr.GetError() == nil {
4079 var omciLayer *omci.OMCI
4080 var msgLayer gopacket.SerializableLayer
4081 var err error
4082 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004083 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4084 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004085 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004086 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4087 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004088 }
4089 if err != nil {
4090 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
4091 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004092 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004093 }
4094
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004095 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004096 if err != nil {
4097 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
4098 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004099 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004100 }
4101
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004102 omciRxCallbackPair := CallbackPair{CbKey: tid,
4103 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004104 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004105 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004106 if err != nil {
4107 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
4108 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004109 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004110 }
4111 logger.Debugw(ctx, "send ethernet uni history data ME done",
4112 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004113 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004114 }
4115 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
4116 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004117 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004118}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004119
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004120// SendCreateOrDeleteFecHistoryME creates or deletes FecPerformanceMonitoringHistoryData ME instance
4121func (oo *OmciCC) SendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004122 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004123 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004124 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4125 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4126 meParam := me.ParamData{EntityID: entityID}
4127 var meInstance *me.ManagedEntity
4128 var omciErr me.OmciErrors
4129 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
4130
4131 if omciErr.GetError() == nil {
4132 var omciLayer *omci.OMCI
4133 var msgLayer gopacket.SerializableLayer
4134 var err error
4135 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004136 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4137 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004138 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004139 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4140 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004141 }
4142 if err != nil {
4143 logger.Errorw(ctx, "Cannot encode fec history data ME",
4144 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004145 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004146 }
4147
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004148 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004149 if err != nil {
4150 logger.Errorw(ctx, "Cannot serialize fec history data ME",
4151 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004152 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004153 }
4154
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004155 omciRxCallbackPair := CallbackPair{CbKey: tid,
4156 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004157 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004158 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004159 if err != nil {
4160 logger.Errorw(ctx, "Cannot send fec history data ME",
4161 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004162 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004163 }
4164 logger.Debugw(ctx, "send fec history data ME done",
4165 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004166 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004167 }
4168 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
4169 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004170 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004171}
4172
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004173// SendCreateOrDeleteGemPortHistoryME deletes GemPortNetworkCtpPerformanceMonitoringHistoryData ME instance
4174func (oo *OmciCC) SendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004175 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004176 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004177 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4178 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4179 meParam := me.ParamData{EntityID: entityID}
4180 var meInstance *me.ManagedEntity
4181 var omciErr me.OmciErrors
4182 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
4183
4184 if omciErr.GetError() == nil {
4185 var omciLayer *omci.OMCI
4186 var msgLayer gopacket.SerializableLayer
4187 var err error
4188 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004189 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4190 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004191 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004192 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4193 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004194 }
4195 if err != nil {
4196 logger.Errorw(ctx, "Cannot encode gemport history data ME",
4197 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004198 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004199 }
4200
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004201 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004202 if err != nil {
4203 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
4204 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004205 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004206 }
4207
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004208 omciRxCallbackPair := CallbackPair{CbKey: tid,
4209 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004210 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004211 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004212 if err != nil {
4213 logger.Errorw(ctx, "Cannot send gemport history data ME",
4214 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004215 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004216 }
4217 logger.Debugw(ctx, "send gemport history data ME done",
4218 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004219 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004220 }
4221 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
4222 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004223 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004224}
4225
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004226// SendStartSoftwareDownload sends StartSoftwareDownloadRequest
4227func (oo *OmciCC) SendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004228 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004229 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004230 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4231 "SequNo": strconv.FormatInt(int64(tid), 16),
4232 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4233
4234 omciLayer := &omci.OMCI{
4235 TransactionID: tid,
4236 MessageType: omci.StartSoftwareDownloadRequestType,
4237 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4238 // Length: 0x28, // Optional, defaults to 40 octets
4239 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004240 if aIsExtendedOmci {
4241 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4242 }
mpagenko80622a52021-02-09 16:53:23 +00004243 request := &omci.StartSoftwareDownloadRequest{
4244 MeBasePacket: omci.MeBasePacket{
4245 EntityClass: me.SoftwareImageClassID,
4246 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004247 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004248 },
4249 WindowSize: aDownloadWindowSize,
4250 ImageSize: aFileLen,
4251 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
4252 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
4253 }
4254
4255 var options gopacket.SerializeOptions
4256 options.FixLengths = true
4257 buffer := gopacket.NewSerializeBuffer()
4258 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4259 if err != nil {
4260 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
4261 "device-id": oo.deviceID})
4262 return err
4263 }
4264 outgoingPacket := buffer.Bytes()
4265
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004266 omciRxCallbackPair := CallbackPair{CbKey: tid,
4267 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004268 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004269 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004270 if err != nil {
4271 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
4272 "device-id": oo.deviceID})
4273 return err
4274 }
4275 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004276 return nil
4277}
4278
kesavand011d5162021-11-25 19:21:06 +05304279// PrepareOnuSectionsOfWindow prepares a list of sections for each window
4280//Before invoking this function the oo.mutexTid needs to be be locked so that
4281//GetOnuSwSecNextTid can be invoked without further locking
4282func (oo *OmciCC) PrepareOnuSectionsOfWindow(ctx context.Context,
4283 aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004284 omciMsgsPerWindow *ia.OmciMessages, aIsExtendedOmci bool) (OmciTransferStructure, error) {
kesavand011d5162021-11-25 19:21:06 +05304285 //onuswsections uses only low prioirity tids
4286 tid := oo.GetOnuSwSecNextTid()
4287 logger.Infow(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4288 "SequNo": strconv.FormatInt(int64(tid), 16),
4289 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest, "sectionNo": aDownloadSectionNo, "sectionData": aSection})
4290
4291 var omciTxReq OmciTransferStructure
4292 msgType := omci.DownloadSectionRequestType
4293
4294 if aAckRequest > 0 {
4295 msgType = omci.DownloadSectionRequestWithResponseType
4296
4297 }
4298 omciLayer := &omci.OMCI{
4299 TransactionID: tid,
4300 MessageType: msgType,
4301 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4302 // Length: 0x28, // Optional, defaults to 40 octets
4303 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004304 if aIsExtendedOmci {
4305 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4306 }
kesavand011d5162021-11-25 19:21:06 +05304307 localSectionData := make([]byte, len(aSection))
4308
4309 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
4310 request := &omci.DownloadSectionRequest{
4311 MeBasePacket: omci.MeBasePacket{
4312 EntityClass: me.SoftwareImageClassID,
4313 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004314 Extended: aIsExtendedOmci,
kesavand011d5162021-11-25 19:21:06 +05304315 },
4316 SectionNumber: aDownloadSectionNo,
4317 SectionData: localSectionData,
4318 }
4319
4320 var options gopacket.SerializeOptions
4321 options.FixLengths = true
4322 buffer := gopacket.NewSerializeBuffer()
4323 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4324 if err != nil {
4325 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4326 "device-id": oo.deviceID})
4327 return omciTxReq, err
4328 }
4329 outgoingPacket := buffer.Bytes()
4330
4331 omciMsgsPerWindow.Messages = append(omciMsgsPerWindow.Messages, outgoingPacket)
4332
4333 if aAckRequest > 0 {
4334 // only the last section should have a timeout as an ack is required only for the last section of the window
4335 omciTxReq = OmciTransferStructure{
4336 withFramePrint: true,
4337 OnuSwWindow: omciMsgsPerWindow,
4338 }
4339 return omciTxReq, nil
4340 }
4341
4342 return omciTxReq, nil
4343}
4344
4345//SendOnuSwSectionsWindowWithRxSupervision sends onu swd sections
4346func (oo *OmciCC) SendOnuSwSectionsWindowWithRxSupervision(ctx context.Context,
4347 aOmciTxRequest OmciTransferStructure, aTimeout int, rxChan chan Message) {
4348 if aOmciTxRequest.OnuSwWindow == nil {
4349 logger.Errorw(ctx, "SendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil",
4350 log.Fields{"device-id": oo.deviceID})
4351 return
4352
4353 }
4354
4355 tid := oo.GetOnuSwSecLastTid()
4356 logger.Debugw(ctx, "SendOnuSwSectionsWindowWithRxSupervision tid for the last segment is ", log.Fields{"TID": tid})
4357 omciRxCallbackPair := CallbackPair{CbKey: tid,
4358 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4359 }
4360
4361 aOmciTxRequest.cbPair = omciRxCallbackPair
4362 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": aOmciTxRequest.cbPair.CbKey})
4363 oo.mutexRxSchedMap.Lock()
4364 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
4365 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4366 oo.mutexRxSchedMap.Unlock()
4367
4368 chSuccess := make(chan bool)
4369 aOmciTxRequest.chSuccess = chSuccess
4370 aOmciTxRequest.timeout = aTimeout
4371 aOmciTxRequest.retries = CDefaultRetries
4372
4373 //tid := aOmciTxRequest.cbPair.CbKey
4374 oo.mutexMonReq.Lock()
4375 oo.monitoredRequests[tid] = aOmciTxRequest
4376 oo.mutexMonReq.Unlock()
4377
4378 retries := aOmciTxRequest.retries
4379 retryCounter := 0
4380 if aTimeout == 0 {
4381 logger.Errorw(ctx, "no timeout present for last section of window", log.Fields{"device-id": oo.deviceID})
4382 return
4383 }
4384loop:
4385 for retryCounter <= retries {
4386 // the onu sw sections are enqueued only to the low priority queue
4387 oo.mutexLowPrioTxQueue.Lock()
4388 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4389 oo.mutexLowPrioTxQueue.Unlock()
4390
4391 go oo.sendQueuedRequests(ctx)
4392
4393 select {
4394 case success := <-chSuccess:
4395 if success {
4396 logger.Debugw(ctx, "reqMon: response received in time",
4397 log.Fields{"tid": tid, "device-id": oo.deviceID})
4398 } else {
4399 logger.Debugw(ctx, "reqMon: wait for response aborted",
4400 log.Fields{"tid": tid, "device-id": oo.deviceID})
4401 }
4402 break loop
4403 case <-time.After(time.Duration(aTimeout) * time.Second):
4404 if retryCounter == retries {
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004405 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
kesavand011d5162021-11-25 19:21:06 +05304406 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004407 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureSwUpgrade, OnuOmciCommunicationFailureSwUpgradeDesc)
Holger Hildebrandtb42e11f2022-09-15 08:49:00 +00004408 oo.mutexConsecutiveOmciTimeouts.Lock()
4409 if oo.consecutiveOmciTimeouts < cMaxConsecutiveOmciTimeouts {
4410 oo.consecutiveOmciTimeouts++
4411 oo.mutexConsecutiveOmciTimeouts.Unlock()
4412 } else {
4413 oo.consecutiveOmciTimeouts = 0
4414 oo.mutexConsecutiveOmciTimeouts.Unlock()
4415 oo.mutexOmciAbortInProgress.Lock()
4416 if !oo.omciAbortInProgress {
4417 oo.omciAbortInProgress = true
4418 oo.mutexOmciAbortInProgress.Unlock()
4419 logger.Errorw(ctx, "reqMon: communication aborted - no of max consecutive timeouts reached - stopping device and send ONU device event!",
4420 log.Fields{"tid": tid, "device-id": oo.deviceID})
4421 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationAbortSwUpgrade, OnuOmciCommunicationAbortSwUpgradeDesc)
4422 // stop all running FSM processing
4423 _ = oo.pBaseDeviceHandler.UpdateInterface(ctx)
4424 oo.mutexOmciAbortInProgress.Lock()
4425 oo.omciAbortInProgress = false
4426 oo.mutexOmciAbortInProgress.Unlock()
4427 } else {
4428 oo.mutexOmciAbortInProgress.Unlock()
4429 logger.Infow(ctx, "reqMon: communication aborted - corresponding processing already running",
4430 log.Fields{"tid": tid, "device-id": oo.deviceID})
4431 }
4432 }
kesavand011d5162021-11-25 19:21:06 +05304433 break loop
4434 } else {
4435 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4436 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4437 }
4438 }
4439 retryCounter++
4440 }
4441 oo.mutexMonReq.Lock()
4442 delete(oo.monitoredRequests, tid)
4443 oo.mutexMonReq.Unlock()
4444}
4445
4446func (oo *OmciCC) sendOnuSwSectionsOfWindow(ctx context.Context, omciTxRequest OmciTransferStructure) error {
4447 if omciTxRequest.withFramePrint && omciTxRequest.OnuSwWindow != nil {
4448 lastSection := omciTxRequest.OnuSwWindow.Messages[len(omciTxRequest.OnuSwWindow.Messages)-1]
4449 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
4450 "TxOmciMessage": hex.EncodeToString(lastSection),
4451 "device-id": oo.deviceID,
4452 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
4453 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
4454 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
4455 }
4456 sendErr := oo.pBaseDeviceHandler.SendOnuSwSectionsOfWindow(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciTxRequest.OnuSwWindow)
4457 if sendErr != nil {
4458 logger.Errorw(ctx, "send onu sw sections omci request error", log.Fields{"ChildId": oo.deviceID, "error": sendErr})
4459 return sendErr
4460 }
4461 return nil
4462}
4463
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004464// SendDownloadSection sends DownloadSectionRequestWithResponse
4465func (oo *OmciCC) SendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004466 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004467 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004468 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4469 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00004470 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00004471
4472 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
4473 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00004474 msgType := omci.DownloadSectionRequestType
mpagenkoc26d4c02021-05-06 14:27:57 +00004475 var timeout int = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00004476 if aAckRequest > 0 {
4477 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00004478 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00004479 }
mpagenko80622a52021-02-09 16:53:23 +00004480 omciLayer := &omci.OMCI{
4481 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004482 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00004483 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4484 // Length: 0x28, // Optional, defaults to 40 octets
4485 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004486 if aIsExtendedOmci {
4487 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4488 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05304489 localSectionData := make([]byte, len(aSection))
4490
mpagenko15ff4a52021-03-02 10:09:20 +00004491 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00004492 request := &omci.DownloadSectionRequest{
4493 MeBasePacket: omci.MeBasePacket{
4494 EntityClass: me.SoftwareImageClassID,
4495 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004496 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004497 },
4498 SectionNumber: aDownloadSectionNo,
4499 SectionData: localSectionData,
4500 }
4501
4502 var options gopacket.SerializeOptions
4503 options.FixLengths = true
4504 buffer := gopacket.NewSerializeBuffer()
4505 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4506 if err != nil {
4507 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4508 "device-id": oo.deviceID})
4509 return err
4510 }
4511 outgoingPacket := buffer.Bytes()
4512
mpagenko15ff4a52021-03-02 10:09:20 +00004513 //for initial debug purpose overrule the requested print state for some frames
4514 printFrame := aPrint
4515 if aAckRequest > 0 || aDownloadSectionNo == 0 {
4516 printFrame = true
4517 }
4518
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004519 omciRxCallbackPair := CallbackPair{CbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00004520 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
4521 // (used to avoid retransmission of frames with the same TID)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004522 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00004523 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004524 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004525 if err != nil {
4526 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
4527 "device-id": oo.deviceID})
4528 return err
4529 }
4530 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004531 return nil
4532}
4533
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004534//SendEndSoftwareDownload sends EndSoftwareDownloadRequest
4535func (oo *OmciCC) SendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004536 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004537 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004538 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4539 "SequNo": strconv.FormatInt(int64(tid), 16),
4540 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4541
mpagenko15ff4a52021-03-02 10:09:20 +00004542 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004543 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004544 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004545 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4546 // Length: 0x28, // Optional, defaults to 40 octets
4547 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004548 if aIsExtendedOmci {
4549 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4550 }
mpagenko15ff4a52021-03-02 10:09:20 +00004551 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00004552 MeBasePacket: omci.MeBasePacket{
4553 EntityClass: me.SoftwareImageClassID,
4554 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004555 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004556 },
mpagenko15ff4a52021-03-02 10:09:20 +00004557 CRC32: aImageCrc,
4558 ImageSize: aFileLen,
4559 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
4560 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00004561 }
mpagenko15ff4a52021-03-02 10:09:20 +00004562
4563 var options gopacket.SerializeOptions
4564 options.FixLengths = true
4565 buffer := gopacket.NewSerializeBuffer()
4566 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4567 if err != nil {
4568 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004569 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004570 return err
mpagenko80622a52021-02-09 16:53:23 +00004571 }
mpagenko15ff4a52021-03-02 10:09:20 +00004572 outgoingPacket := buffer.Bytes()
4573
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004574 omciRxCallbackPair := CallbackPair{CbKey: tid,
4575 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004576 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004577 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004578 if err != nil {
4579 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
4580 "device-id": oo.deviceID})
4581 return err
4582 }
4583 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004584 return nil
4585}
4586
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004587// SendActivateSoftware sends ActivateSoftwareRequest
4588func (oo *OmciCC) SendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004589 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004590 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004591 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
4592 "SequNo": strconv.FormatInt(int64(tid), 16),
4593 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4594
4595 omciLayer := &omci.OMCI{
4596 TransactionID: tid,
4597 MessageType: omci.ActivateSoftwareRequestType,
4598 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4599 // Length: 0x28, // Optional, defaults to 40 octets
4600 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004601 if aIsExtendedOmci {
4602 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4603 }
mpagenko80622a52021-02-09 16:53:23 +00004604 request := &omci.ActivateSoftwareRequest{
4605 MeBasePacket: omci.MeBasePacket{
4606 EntityClass: me.SoftwareImageClassID,
4607 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004608 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004609 },
4610 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
4611 }
4612
4613 var options gopacket.SerializeOptions
4614 options.FixLengths = true
4615 buffer := gopacket.NewSerializeBuffer()
4616 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4617 if err != nil {
4618 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
4619 "device-id": oo.deviceID})
4620 return err
4621 }
4622 outgoingPacket := buffer.Bytes()
4623
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004624 omciRxCallbackPair := CallbackPair{CbKey: tid,
4625 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004626 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004627 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004628 if err != nil {
4629 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
4630 "device-id": oo.deviceID})
4631 return err
4632 }
4633 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00004634 return nil
4635}
mpagenko80622a52021-02-09 16:53:23 +00004636
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004637// SendCommitSoftware sends CommitSoftwareRequest
4638func (oo *OmciCC) SendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004639 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004640 tid := oo.GetNextTid(highPrio)
mpagenko15ff4a52021-03-02 10:09:20 +00004641 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
4642 "SequNo": strconv.FormatInt(int64(tid), 16),
4643 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4644
4645 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004646 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004647 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004648 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4649 // Length: 0x28, // Optional, defaults to 40 octets
4650 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004651 if aIsExtendedOmci {
4652 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4653 }
mpagenko15ff4a52021-03-02 10:09:20 +00004654 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00004655 MeBasePacket: omci.MeBasePacket{
4656 EntityClass: me.SoftwareImageClassID,
4657 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004658 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004659 },
mpagenko80622a52021-02-09 16:53:23 +00004660 }
mpagenko15ff4a52021-03-02 10:09:20 +00004661
4662 var options gopacket.SerializeOptions
4663 options.FixLengths = true
4664 buffer := gopacket.NewSerializeBuffer()
4665 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4666 if err != nil {
4667 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004668 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004669 return err
mpagenko80622a52021-02-09 16:53:23 +00004670 }
mpagenko15ff4a52021-03-02 10:09:20 +00004671 outgoingPacket := buffer.Bytes()
4672
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004673 omciRxCallbackPair := CallbackPair{CbKey: tid,
4674 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004675 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004676 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004677 if err != nil {
4678 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
4679 "device-id": oo.deviceID})
4680 return err
4681 }
4682 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004683 return nil
4684}
4685
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004686//SendSelfTestReq sends TestRequest
4687func (oo *OmciCC) SendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
4688 tid := oo.GetNextTid(highPrio)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004689 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
4690 "SequNo": strconv.FormatInt(int64(tid), 16),
4691 "InstId": strconv.FormatInt(int64(instdID), 16)})
4692 omciLayer := &omci.OMCI{
4693 TransactionID: tid,
4694 MessageType: omci.TestRequestType,
4695 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4696 // Length: 0x28, // Optional, defaults to 40 octets
4697 }
4698
4699 var request *omci.OpticalLineSupervisionTestRequest
4700 switch classID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004701 case me.AniGClassID:
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004702 request = &omci.OpticalLineSupervisionTestRequest{
4703 MeBasePacket: omci.MeBasePacket{
4704 EntityClass: classID,
4705 EntityInstance: instdID,
4706 },
4707 SelectTest: uint8(7), // self test
4708 GeneralPurposeBuffer: uint16(0),
4709 VendorSpecificParameters: uint16(0),
4710 }
4711 default:
4712 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
4713 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
4714 }
4715 // Test serialization back to former string
4716 var options gopacket.SerializeOptions
4717 options.FixLengths = true
4718
4719 buffer := gopacket.NewSerializeBuffer()
4720 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4721 if err != nil {
4722 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
4723 "device-id": oo.deviceID})
4724 return err
4725 }
4726 outgoingPacket := buffer.Bytes()
4727
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004728 omciRxCallbackPair := CallbackPair{CbKey: tid,
4729 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004730 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004731 err = oo.Send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004732 if err != nil {
4733 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
4734 "device-id": oo.deviceID})
4735 return err
4736 }
4737 logger.Debug(ctx, "send self test request done")
4738 return nil
4739}
4740
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004741//nolint: gocyclo
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004742func (oo *OmciCC) isSuccessfulResponseWithMibDataSync(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) (bool, error) {
4743
4744 nextLayer, err := omci.MsgTypeToNextLayer(omciMsg.MessageType, false)
4745 if err != nil {
4746 logger.Errorw(ctx, "omci-message: could not map msgType to nextLayer", log.Fields{"device-id": oo.deviceID})
4747 return false, fmt.Errorf("could not map msgType to nextLayer - %s", oo.deviceID)
4748 }
4749 msgLayer := (*packet).Layer(nextLayer)
4750 if msgLayer != nil {
4751 // Note: Due to relaxed decoding, you may now still have a decoding error attached to the layers
4752 if failure := (*packet).ErrorLayer(); failure != nil {
4753 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4754 // In the case of MibUploadNextResponse, we let the packet pass so that later processing
4755 // can examine for UnkonwnMEs and UnknownAttributes
4756 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with ErrorLayer - let it pass",
4757 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4758 return false, nil
4759 } else if nextLayer == omci.LayerTypeGetResponse {
4760 if resp := msgLayer.(*omci.GetResponse); resp != nil {
4761 if resp.NextLayerType() == omci.LayerTypeUnknownAttributes {
4762 unknownAttrLayer := (*packet).Layer(omci.LayerTypeUnknownAttributes)
4763 if unknownAttrLayer != nil {
4764 logger.Errorw(ctx, "omci-message: GetResponse packet contains unknownAttrLayer - skip it!",
4765 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "unknownAttrLayer": unknownAttrLayer})
4766 return false, fmt.Errorf("packet contains unknownAttrLayer - %s", oo.deviceID)
4767 }
4768 }
4769 }
4770 }
4771 // Try to decode any further error information
4772 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
4773 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer with further info - skip it!",
4774 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": decodeFailure.String()})
4775 return false, fmt.Errorf("packet contains ErrorLayer with further info - %s", oo.deviceID)
4776 }
4777 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer - skip it!",
4778 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4779 return false, fmt.Errorf("packet contains ErrorLayer - %s", oo.deviceID)
4780 }
4781 } else if failure := (*packet).ErrorLayer(); failure != nil {
4782 // message layer could not be decoded, but at least check if additional failure information is available
4783 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004784 errMsg := decodeFailure.String()
4785 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4786 if strings.Contains(strings.ToLower(errMsg), "table decode") {
4787 // In the case of MibUploadNextResponse with non-standard table attributes, we let the packet pass
4788 // so that later processing can deal with it
4789 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with table attributes - let it pass",
4790 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4791 return false, nil
4792 }
4793 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004794 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, further info available - skip it!",
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004795 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": errMsg})
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004796 return false, fmt.Errorf("could not decode msgLayer of packet, further info available - %s", oo.deviceID)
4797 }
4798 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, ErrorLayer available",
4799 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4800 return false, fmt.Errorf("could not decode msgLayer of packet, ErrorLayer available - %s", oo.deviceID)
4801 } else {
4802 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet", log.Fields{"device-id": oo.deviceID})
4803 return false, fmt.Errorf("could not decode msgLayer of packet - %s", oo.deviceID)
4804 }
4805
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004806 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004807 if v == omciMsg.MessageType {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004808 switch nextLayer {
4809 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004810 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
4811 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004812 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004813 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004814 }
4815 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004816 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
4817 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004818 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004819 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004820 }
4821 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004822 if resp := msgLayer.(*omci.SetResponse); resp != nil {
4823 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004824 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004825 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004826 }
4827 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004828 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
4829 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004830 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004831 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004832 }
4833 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004834 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
4835 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004836 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004837 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004838 }
4839 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004840 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
4841 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004842 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004843 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004844 }
4845 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004846 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
4847 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004848 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004849 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004850 }
4851 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004852 }
4853 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004854 return false, nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004855}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004856
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004857func (oo *OmciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest OmciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004858 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00004859 if timeout == 0 {
4860 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt34555512021-10-01 16:26:59 +00004861 // enqueue
4862 if aOmciTxRequest.highPrio {
4863 oo.mutexHighPrioTxQueue.Lock()
4864 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4865 oo.mutexHighPrioTxQueue.Unlock()
4866 } else {
4867 oo.mutexLowPrioTxQueue.Lock()
4868 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4869 oo.mutexLowPrioTxQueue.Unlock()
4870 }
4871 go oo.sendQueuedRequests(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00004872 } else {
mpagenko7455fd42021-06-10 16:25:55 +00004873 //the supervised sending with waiting on the response (based on TID) is called in background
4874 // to avoid blocking of the sender for the complete OMCI handshake procedure
4875 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
4876 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
4877 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004878 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004879}
4880
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004881func (oo *OmciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest OmciTransferStructure, aTimeout int) {
mpagenko7455fd42021-06-10 16:25:55 +00004882 chSuccess := make(chan bool)
4883 aOmciTxRequest.chSuccess = chSuccess
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004884 tid := aOmciTxRequest.cbPair.CbKey
mpagenko7455fd42021-06-10 16:25:55 +00004885 oo.mutexMonReq.Lock()
4886 oo.monitoredRequests[tid] = aOmciTxRequest
4887 oo.mutexMonReq.Unlock()
4888
4889 retries := aOmciTxRequest.retries
4890 retryCounter := 0
4891loop:
4892 for retryCounter <= retries {
Holger Hildebrandt34555512021-10-01 16:26:59 +00004893 // enqueue
4894 if aOmciTxRequest.highPrio {
4895 oo.mutexHighPrioTxQueue.Lock()
4896 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4897 oo.mutexHighPrioTxQueue.Unlock()
4898 } else {
4899 oo.mutexLowPrioTxQueue.Lock()
4900 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4901 oo.mutexLowPrioTxQueue.Unlock()
4902 }
4903 go oo.sendQueuedRequests(ctx)
mpagenko7455fd42021-06-10 16:25:55 +00004904
4905 select {
4906 case success := <-chSuccess:
4907 if success {
4908 logger.Debugw(ctx, "reqMon: response received in time",
4909 log.Fields{"tid": tid, "device-id": oo.deviceID})
4910 } else {
4911 logger.Debugw(ctx, "reqMon: wait for response aborted",
4912 log.Fields{"tid": tid, "device-id": oo.deviceID})
4913 }
4914 break loop
4915 case <-time.After(time.Duration(aTimeout) * time.Second):
4916 if retryCounter == retries {
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004917 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
mpagenko7455fd42021-06-10 16:25:55 +00004918 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004919 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureConfig, OnuOmciCommunicationFailureConfigDesc)
Holger Hildebrandtb42e11f2022-09-15 08:49:00 +00004920 oo.mutexConsecutiveOmciTimeouts.Lock()
4921 if oo.consecutiveOmciTimeouts < cMaxConsecutiveOmciTimeouts {
4922 oo.consecutiveOmciTimeouts++
4923 oo.mutexConsecutiveOmciTimeouts.Unlock()
4924 } else {
4925 oo.consecutiveOmciTimeouts = 0
4926 oo.mutexConsecutiveOmciTimeouts.Unlock()
4927 oo.mutexOmciAbortInProgress.Lock()
4928 if !oo.omciAbortInProgress {
4929 oo.omciAbortInProgress = true
4930 oo.mutexOmciAbortInProgress.Unlock()
4931 logger.Errorw(ctx, "reqMon: communication aborted - no of max consecutive timeouts reached - stopping device and send ONU device event!",
4932 log.Fields{"tid": tid, "device-id": oo.deviceID})
4933 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationAbortConfig, OnuOmciCommunicationAbortConfigDesc)
4934 // stop all running FSM processing
4935 _ = oo.pBaseDeviceHandler.UpdateInterface(ctx)
4936 oo.mutexOmciAbortInProgress.Lock()
4937 oo.omciAbortInProgress = false
4938 oo.mutexOmciAbortInProgress.Unlock()
4939 } else {
4940 oo.mutexOmciAbortInProgress.Unlock()
4941 logger.Infow(ctx, "reqMon: communication aborted - corresponding processing already running",
4942 log.Fields{"tid": tid, "device-id": oo.deviceID})
4943 }
4944 }
mpagenko7455fd42021-06-10 16:25:55 +00004945 break loop
4946 } else {
4947 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4948 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
4949 }
4950 }
4951 retryCounter++
4952 }
4953 oo.mutexMonReq.Lock()
4954 delete(oo.monitoredRequests, tid)
4955 oo.mutexMonReq.Unlock()
4956}
4957
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004958//CancelRequestMonitoring terminates monitoring of outstanding omci requests
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004959func (oo *OmciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00004960 logger.Debugw(ctx, "CancelRequestMonitoring entered", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004961 oo.mutexMonReq.RLock()
4962 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00004963 //implement non-blocking channel send to avoid blocking on mutexMonReq later
4964 select {
4965 case oo.monitoredRequests[k].chSuccess <- false:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00004966 logger.Debugw(ctx, "send cancellation on omciRespChannel",
4967 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00004968 default:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00004969 logger.Debugw(ctx, "cancellation could not be send on omciRespChannel (no receiver)",
4970 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00004971 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004972 }
4973 oo.mutexMonReq.RUnlock()
4974}
4975
4976//GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
4977//time consumed for retry processing of a particular OMCI-request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004978func (oo *OmciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
4979 return time.Duration((CDefaultRetries+1)*oo.pBaseDeviceHandler.GetOmciTimeout() + 1)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004980}
Himani Chawla43f95ff2021-06-03 00:24:12 +05304981
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004982// SendCreateOrDeleteEthernetFrameExtendedPMME deletes EthernetFrameExtendedPm ME instance
4983func (oo *OmciCC) SendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
Himani Chawla43f95ff2021-06-03 00:24:12 +05304984 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004985 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05304986 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
4987 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4988
4989 meParam := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00004990 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawla43f95ff2021-06-03 00:24:12 +05304991 }
4992 var meInstance *me.ManagedEntity
4993 var omciErr me.OmciErrors
4994 if classID == me.EthernetFrameExtendedPmClassID {
4995 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
4996 } else {
4997 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
4998 }
4999
5000 if omciErr.GetError() == nil {
5001 var omciLayer *omci.OMCI
5002 var msgLayer gopacket.SerializableLayer
5003 var err error
5004 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00005005 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
5006 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305007 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00005008 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
5009 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305010 }
5011 if err != nil {
5012 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5013 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5014 return nil, err
5015 }
5016
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005017 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305018 if err != nil {
5019 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
5020 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5021 return nil, err
5022 }
5023
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005024 omciRxCallbackPair := CallbackPair{CbKey: tid,
5025 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305026 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005027 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305028 if err != nil {
5029 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5030 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5031 return nil, err
5032 }
5033 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
5034 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5035 return meInstance, nil
5036 }
5037 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5038 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5039 return nil, omciErr.GetError()
5040}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005041
5042// RLockMutexMonReq lock read access to monitoredRequests
5043func (oo *OmciCC) RLockMutexMonReq() {
5044 oo.mutexMonReq.RLock()
5045}
5046
5047// RUnlockMutexMonReq unlock read access to monitoredRequests
5048func (oo *OmciCC) RUnlockMutexMonReq() {
5049 oo.mutexMonReq.RUnlock()
5050}
5051
5052// GetMonitoredRequest get OmciTransferStructure for an omciTransID
5053func (oo *OmciCC) GetMonitoredRequest(omciTransID uint16) (value OmciTransferStructure, exist bool) {
5054 value, exist = oo.monitoredRequests[omciTransID]
5055 return value, exist
5056}
5057
5058// SetChMonitoredRequest sets chSuccess to indicate whether response was received or not
5059func (oo *OmciCC) SetChMonitoredRequest(omciTransID uint16, chVal bool) {
5060 oo.monitoredRequests[omciTransID].chSuccess <- chVal
5061}
Himani Chawlaee10b542021-09-20 16:46:40 +05305062
5063// SendSetEthernetFrameExtendedPMME sends the set request for ethernet frame extended type me
5064func (oo *OmciCC) SendSetEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
5065 rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
5066 tid := oo.GetNextTid(highPrio)
5067 logger.Debugw(ctx, "send-set-ethernet-frame-extended-pm-me-control-block:", log.Fields{"device-id": oo.deviceID,
5068 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16)})
5069
5070 meParams := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005071 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawlaee10b542021-09-20 16:46:40 +05305072 }
5073 var meInstance *me.ManagedEntity
5074 var omciErr me.OmciErrors
5075 if classID == me.EthernetFrameExtendedPmClassID {
5076 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParams)
5077 } else {
5078 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParams)
5079 }
5080
5081 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00005082 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Himani Chawlaee10b542021-09-20 16:46:40 +05305083 if err != nil {
5084 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5085 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5086 return nil, err
5087 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005088 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawlaee10b542021-09-20 16:46:40 +05305089 if err != nil {
5090 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me-set-msg",
5091 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5092 return nil, err
5093 }
5094 omciRxCallbackPair := CallbackPair{
5095 CbKey: tid,
5096 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
5097 }
5098 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
5099 if err != nil {
5100 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5101 log.Fields{"Err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5102 return nil, err
5103 }
5104 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-set-msg-done",
5105 log.Fields{"device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5106 return meInstance, nil
5107 }
5108 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5109 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5110 return nil, omciErr.GetError()
5111}
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00005112
5113// PrepareForGarbageCollection - remove references to prepare for garbage collection
5114func (oo *OmciCC) PrepareForGarbageCollection(ctx context.Context, aDeviceID string) {
5115 logger.Debugw(ctx, "prepare for garbage collection", log.Fields{"device-id": aDeviceID})
5116 oo.pBaseDeviceHandler = nil
5117 oo.pOnuDeviceEntry = nil
5118 oo.pOnuAlarmManager = nil
5119}