blob: 551f389b95725a836e06b092f7dae78684114837 [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"
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +000043 "github.com/opencord/voltha-protos/v5/go/extension"
khenaidoo42dcdfd2021-10-19 17:34:12 -040044 ia "github.com/opencord/voltha-protos/v5/go/inter_adapter"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000045)
46
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000047// ### OMCI related definitions - retrieved from Python adapter code/trace ####
Himani Chawla6d2ae152020-09-02 13:11:20 +053048
Holger Hildebrandt9b64e0b2022-04-21 08:02:00 +000049const maxGemPayloadSize = uint16(2048)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000050const connectivityModeValue = uint8(5)
Himani Chawla4d908332020-08-31 12:30:20 +053051
52//const defaultTPID = uint16(0x8100)
53//const broadComDefaultVID = uint16(4091)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000054
55// UnusedTcontAllocID - TODO: add comment
56const UnusedTcontAllocID = uint16(0xFFFF) //common unused AllocId for G.984 and G.987 systems
mpagenko8b07c1b2020-11-26 10:36:31 +000057
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +000058const cOmciDeviceIdentifierPos = 3
mpagenkoc8bba412021-01-15 15:38:44 +000059const cOmciBaseMessageTrailerLen = 40
60
61// tOmciReceiveError - enum type for detected problems/errors in the received OMCI message (format)
62type tOmciReceiveError uint8
63
64const (
65 // cOmciMessageReceiveNoError - default start state
66 cOmciMessageReceiveNoError tOmciReceiveError = iota
67 // Error indication wrong trailer length within the message
68 cOmciMessageReceiveErrorTrailerLen
69 // Error indication missing trailer within the message
70 cOmciMessageReceiveErrorMissTrailer
71)
72
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000073// CDefaultRetries - TODO: add comment
74const CDefaultRetries = 2
Holger Hildebrandt366ef192021-05-05 11:07:44 +000075
Holger Hildebrandt68854a82022-09-05 07:00:21 +000076const cMaxConsecutiveOmciTimeouts = 3
77
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000078// ### OMCI related definitions - end
79
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000080//CallbackPairEntry to be used for OMCI send/receive correlation
81type CallbackPairEntry struct {
82 CbRespChannel chan Message
83 CbFunction func(context.Context, *omci.OMCI, *gp.Packet, chan Message) error
84 FramePrint bool //true for printing
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000085}
86
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000087//CallbackPair to be used for ReceiveCallback init
88type CallbackPair struct {
89 CbKey uint16
90 CbEntry CallbackPairEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +000091}
92
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000093// OmciTransferStructure - TODO: add comment
94type OmciTransferStructure struct {
mpagenko80622a52021-02-09 16:53:23 +000095 txFrame []byte
96 timeout int
Holger Hildebrandt366ef192021-05-05 11:07:44 +000097 retries int
mpagenko80622a52021-02-09 16:53:23 +000098 highPrio bool
99 withFramePrint bool
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000100 cbPair CallbackPair
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000101 chSuccess chan bool
kesavand011d5162021-11-25 19:21:06 +0530102 OnuSwWindow *ia.OmciMessages
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000103}
104
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000105type txRxCounters struct {
106 txArFrames uint32
107 txNoArFrames uint32
108 rxAkFrames uint32
109 rxNoAkFrames uint32
110}
111
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000112//OmciCC structure holds information needed for OMCI communication (to/from OLT Adapter)
113type OmciCC struct {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000114 enabled bool
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000115 pBaseDeviceHandler IdeviceHandler
116 pOnuDeviceEntry IonuDeviceEntry
117 pOnuAlarmManager IonuAlarmManager
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000118 deviceID string
khenaidoo7d3c5582021-08-11 18:09:44 -0400119 coreClient *vgrpc.Client
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000120 supportExtMsg bool
mpagenkoc8bba412021-01-15 15:38:44 +0000121 rxOmciFrameError tOmciReceiveError
122
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000123 mutexCounters sync.RWMutex
124 countersBase txRxCounters
125 countersExt txRxCounters
126 txRetries uint32
127 txTimeouts uint32
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000128
129 // OMCI params
130 mutexTid sync.Mutex
131 tid uint16
132 mutexHpTid sync.Mutex
133 hpTid uint16
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000134 UploadSequNo uint16
135 UploadNoOfCmds uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000136
Holger Hildebrandt68854a82022-09-05 07:00:21 +0000137 mutexSendQueuedRequests sync.Mutex
138 mutexLowPrioTxQueue sync.Mutex
139 lowPrioTxQueue *list.List
140 mutexHighPrioTxQueue sync.Mutex
141 highPrioTxQueue *list.List
142 mutexRxSchedMap sync.Mutex
143 rxSchedulerMap map[uint16]CallbackPairEntry
144 mutexMonReq sync.RWMutex
145 monitoredRequests map[uint16]OmciTransferStructure
146 mutexConsecutiveOmciTimeouts sync.RWMutex
147 consecutiveOmciTimeouts uint8
148 mutexOmciAbortInProgress sync.RWMutex
149 omciAbortInProgress bool
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000150}
151
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000152var responsesWithMibDataSync = []omci.MessageType{
153 omci.CreateResponseType,
154 omci.DeleteResponseType,
155 omci.SetResponseType,
156 omci.StartSoftwareDownloadResponseType,
157 omci.EndSoftwareDownloadResponseType,
158 omci.ActivateSoftwareResponseType,
159 omci.CommitSoftwareResponseType,
160}
161
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000162//NewOmciCC constructor returns a new instance of a OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000163//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000164func NewOmciCC(ctx context.Context, deviceID string, deviceHandler IdeviceHandler,
165 onuDeviceEntry IonuDeviceEntry, onuAlarmManager IonuAlarmManager,
166 coreClient *vgrpc.Client) *OmciCC {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000167 logger.Debugw(ctx, "init-omciCC", log.Fields{"device-id": deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000168 var omciCC OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000169 omciCC.enabled = false
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000170 omciCC.pBaseDeviceHandler = deviceHandler
171 omciCC.pOnuAlarmManager = onuAlarmManager
Himani Chawla4d908332020-08-31 12:30:20 +0530172 omciCC.pOnuDeviceEntry = onuDeviceEntry
173 omciCC.deviceID = deviceID
khenaidoo7d3c5582021-08-11 18:09:44 -0400174 omciCC.coreClient = coreClient
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000175 omciCC.supportExtMsg = false
mpagenkoc8bba412021-01-15 15:38:44 +0000176 omciCC.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000177 omciCC.countersBase = txRxCounters{0, 0, 0, 0}
178 omciCC.countersExt = txRxCounters{0, 0, 0, 0}
179 omciCC.txRetries = 0
180 omciCC.txTimeouts = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000181 omciCC.tid = 0x1
182 omciCC.hpTid = 0x8000
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000183 omciCC.UploadSequNo = 0
184 omciCC.UploadNoOfCmds = 0
Holger Hildebrandt34555512021-10-01 16:26:59 +0000185 omciCC.lowPrioTxQueue = list.New()
186 omciCC.highPrioTxQueue = list.New()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000187 omciCC.rxSchedulerMap = make(map[uint16]CallbackPairEntry)
188 omciCC.monitoredRequests = make(map[uint16]OmciTransferStructure)
Holger Hildebrandt68854a82022-09-05 07:00:21 +0000189 omciCC.consecutiveOmciTimeouts = 0
190 omciCC.omciAbortInProgress = false
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000191 return &omciCC
192}
193
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000194//Stop stops/resets the omciCC
195func (oo *OmciCC) Stop(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000196 logger.Debugw(ctx, "omciCC-stopping", log.Fields{"device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000197 //reseting all internal data, which might also be helpful for discarding any lingering tx/rx requests
mpagenko8cd1bf72021-06-22 10:11:19 +0000198 oo.CancelRequestMonitoring(ctx)
Holger Hildebrandt34555512021-10-01 16:26:59 +0000199 // clear the tx queues
200 oo.mutexHighPrioTxQueue.Lock()
201 oo.highPrioTxQueue.Init()
202 oo.mutexHighPrioTxQueue.Unlock()
203 oo.mutexLowPrioTxQueue.Lock()
204 oo.lowPrioTxQueue.Init()
205 oo.mutexLowPrioTxQueue.Unlock()
206 //clear the scheduler map
mpagenko900ee4b2020-10-12 11:56:34 +0000207 oo.mutexRxSchedMap.Lock()
208 for k := range oo.rxSchedulerMap {
Holger Hildebrandt34555512021-10-01 16:26:59 +0000209 delete(oo.rxSchedulerMap, k)
mpagenko900ee4b2020-10-12 11:56:34 +0000210 }
211 oo.mutexRxSchedMap.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000212 //reset the high prio transactionId
mpagenko900ee4b2020-10-12 11:56:34 +0000213 oo.mutexHpTid.Lock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000214 oo.hpTid = 0x8000
mpagenko900ee4b2020-10-12 11:56:34 +0000215 oo.mutexHpTid.Unlock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000216 //reset the low prio transactionId
mpagenko900ee4b2020-10-12 11:56:34 +0000217 oo.mutexTid.Lock()
Holger Hildebrandt34555512021-10-01 16:26:59 +0000218 oo.tid = 1
mpagenko900ee4b2020-10-12 11:56:34 +0000219 oo.mutexTid.Unlock()
220 //reset control values
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000221 oo.UploadSequNo = 0
222 oo.UploadNoOfCmds = 0
mpagenkoc8bba412021-01-15 15:38:44 +0000223 oo.rxOmciFrameError = cOmciMessageReceiveNoError
mpagenko900ee4b2020-10-12 11:56:34 +0000224
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000225 //reset the stats counter
226 oo.mutexCounters.Lock()
227 oo.countersBase = txRxCounters{0, 0, 0, 0}
228 oo.countersExt = txRxCounters{0, 0, 0, 0}
229 oo.txRetries = 0
230 oo.txTimeouts = 0
231 oo.mutexCounters.Unlock()
mpagenko900ee4b2020-10-12 11:56:34 +0000232 return nil
233}
234
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000235// Rx handler for omci messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000236func (oo *OmciCC) receiveOnuMessage(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000237 logger.Debugw(ctx, "rx-onu-autonomous-message", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000238 "payload": hex.EncodeToString(omciMsg.Payload)})
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530239 switch omciMsg.MessageType {
240 case omci.AlarmNotificationType:
241 data := OmciMessage{
242 OmciMsg: omciMsg,
243 OmciPacket: packet,
244 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000245 go oo.pOnuAlarmManager.HandleOmciAlarmNotificationMessage(ctx, data)
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530246 return nil
247 default:
248 return fmt.Errorf("receiveOnuMessageType %s unimplemented", omciMsg.MessageType.String())
249 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000250 /*
251 msgType = rxFrame.fields["message_type"] //assumed OmciOperationsValue
252 rxOnuFrames++
253
254 switch msgType {
255 case AlarmNotification:
256 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000257 logger.Info("Unhandled: received-onu-alarm-message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000258 // python code was:
259 //if msg_type == EntityOperations.AlarmNotification.value:
260 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Alarm_Notification)
261 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
262 //
263 return errors.New("RxAlarmNotification unimplemented")
264 }
265 case AttributeValueChange:
266 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000267 logger.Info("Unhandled: received-attribute-value-change")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000268 // python code was:
269 //elif msg_type == EntityOperations.AttributeValueChange.value:
270 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.AVC_Notification)
271 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
272 //
273 return errors.New("RxAttributeValueChange unimplemented")
274 }
275 case TestResult:
276 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000277 logger.Info("Unhandled: received-test-result")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000278 // python code was:
279 //elif msg_type == EntityOperations.TestResult.value:
280 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Test_Result)
281 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
282 //
283 return errors.New("RxTestResult unimplemented")
284 }
285 default:
286 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000287 logger.Errorw(ctx,"rx-onu-unsupported-autonomous-message", log.Fields{"msgType": msgType})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000288 rxOnuDiscards++
289 return errors.New("RxOnuMsgType unimplemented")
290 }
291 }
292 */
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000293}
294
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000295func (oo *OmciCC) printRxMessage(ctx context.Context, rxMsg []byte) {
mpagenko80622a52021-02-09 16:53:23 +0000296 //assuming omci message content is hex coded!
297 // with restricted output of 16bytes would be ...rxMsg[:16]
298 logger.Debugw(ctx, "omci-message-received:", log.Fields{
299 "RxOmciMessage": hex.EncodeToString(rxMsg),
300 "device-id": oo.deviceID})
301}
302
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000303// ReceiveMessage - Rx handler for onu messages
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000304// e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000305// nolint: gocyclo
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000306func (oo *OmciCC) ReceiveMessage(ctx context.Context, rxMsg []byte) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000307 //logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000308
309 if len(rxMsg) < 10 {
310 logger.Errorw(ctx, "rxOmciMessage has wrong length in general - abort",
311 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
312 if len(rxMsg) > 0 {
313 oo.printRxMessage(ctx, rxMsg)
mpagenkoc8bba412021-01-15 15:38:44 +0000314 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000315 return fmt.Errorf("rxOmciMessage has wrong length in general - abort %s", oo.deviceID)
316 }
317 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
318 if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
319 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
320 // (an extendedFormat message could be destroyed this way!)
321 trailerLenData := rxMsg[42:44]
322 trailerLen := binary.BigEndian.Uint16(trailerLenData)
323 //logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
324 if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
325 binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
326 if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
327 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
328 logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
329 log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
330 oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
331 }
332 }
333 } else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
334 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
335 // (an extendedFormat message could be destroyed this way!)
336 // extend/overwrite with trailer
337 trailer := make([]byte, 8)
338 binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
339 rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
340 if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
341 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
342 logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
343 log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
344 oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
345 }
346 } else {
347 logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
348 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
349 oo.printRxMessage(ctx, rxMsg)
350 return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
351 }
352 } else if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.ExtendedIdent) {
353 if len(rxMsg) > 1980 {
354 logger.Errorw(ctx, "rxOmciMessage has wrong length for OmciExtendedFormat - abort",
355 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
356 oo.printRxMessage(ctx, rxMsg)
357 return fmt.Errorf("rxOmciMessage has wrong length for OmciExtendedFormat %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000358 }
359 } else {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000360 logger.Errorw(ctx, "rxOmciMessage has wrong Device Identifier - abort",
mpagenkoc8bba412021-01-15 15:38:44 +0000361 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000362 oo.printRxMessage(ctx, rxMsg)
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000363 return fmt.Errorf("rxOmciMessage has wrong Device Identifier %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000364 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000365 decodeOptions := gopacket.DecodeOptions{
366 Lazy: true,
367 NoCopy: true,
368 }
369 packet := gopacket.NewPacket(rxMsg, omci.LayerTypeOMCI, decodeOptions)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000370 if packet == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000371 logger.Errorw(ctx, "omci-message could not be decoded", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000372 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200373 return fmt.Errorf("could not decode rxMsg as OMCI %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000374 }
375 omciLayer := packet.Layer(omci.LayerTypeOMCI)
376 if omciLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000377 logger.Errorw(ctx, "omci-message could not decode omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000378 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200379 return fmt.Errorf("could not decode omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000380 }
mpagenko836a1fd2021-11-01 16:12:42 +0000381 // insert some check on detected OMCI decoding issues and log them
382 // e.g. should indicate problems when detecting some unknown attribute mask content (independent from message type)
383 // even though allowed from omci-lib due to set relaxed decoding
384 // application may dig into further details if wanted/needed on their own [but info is not transferred from here so far]
385 // (compare mib_sync.go unknownAttrLayer)
386 errLayer := packet.Layer(gopacket.LayerTypeDecodeFailure)
387 if failure, decodeOk := errLayer.(*gopacket.DecodeFailure); decodeOk {
388 errMsg := failure.Error()
389 logger.Warnw(ctx, "Detected decode issue on received OMCI frame", log.Fields{
390 "device-id": oo.deviceID, "issue": errMsg})
391 }
392 //anyway try continue OMCI decoding further on message type layer
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000393 omciMsg, ok := omciLayer.(*omci.OMCI)
394 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000395 logger.Errorw(ctx, "omci-message could not assign omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000396 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200397 return fmt.Errorf("could not assign omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000398 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000399 logger.Debugw(ctx, "omci-message-decoded:", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000400 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16),
401 "DeviceIdent": omciMsg.DeviceIdentifier, "device-id": oo.deviceID})
mpagenko836a1fd2021-11-01 16:12:42 +0000402
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700403 // TestResult is asynchronous indication that carries the same TID as the TestResponse.
404 // We expect to find the TID in the oo.rxSchedulerMap
405 if byte(omciMsg.MessageType)&me.AK == 0 && omciMsg.MessageType != omci.TestResultType {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000406 // Not a response
mpagenko80622a52021-02-09 16:53:23 +0000407 oo.printRxMessage(ctx, rxMsg)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000408 logger.Debugw(ctx, "RxMsg is no Omci Response Message", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000409 if omciMsg.TransactionID == 0 {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000410 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
411 oo.incrementBaseRxNoAkFrames()
412 } else {
413 oo.incrementExtRxNoAkFrames()
414 }
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530415 return oo.receiveOnuMessage(ctx, omciMsg, &packet)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000416 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000417 logger.Errorw(ctx, "Unexpected TransCorrId != 0 not accepted for autonomous messages",
Andrea Campanella6515c582020-10-05 11:25:00 +0200418 log.Fields{"msgType": omciMsg.MessageType, "payload": hex.EncodeToString(omciMsg.Payload),
mpagenko8b07c1b2020-11-26 10:36:31 +0000419 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200420 return fmt.Errorf("autonomous Omci Message with TranSCorrId != 0 not acccepted %s", oo.deviceID)
Himani Chawla4d908332020-08-31 12:30:20 +0530421 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000422 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530423 oo.mutexRxSchedMap.Lock()
424 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000425 if ok && rxCallbackEntry.CbFunction != nil {
Holger Hildebrandt68854a82022-09-05 07:00:21 +0000426
427 // valid OMCI Response Message received - reset counter of consecutive OMCI timeouts
428 oo.mutexConsecutiveOmciTimeouts.Lock()
429 oo.consecutiveOmciTimeouts = 0
430 oo.mutexConsecutiveOmciTimeouts.Unlock()
431
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000432 if rxCallbackEntry.FramePrint {
mpagenko80622a52021-02-09 16:53:23 +0000433 oo.printRxMessage(ctx, rxMsg)
434 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000435 if rxMsg[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
436 oo.incrementBaseRxAkFrames()
437 } else {
438 oo.incrementExtRxAkFrames()
439 }
Himani Chawla4d908332020-08-31 12:30:20 +0530440 //disadvantage of decoupling: error verification made difficult, but anyway the question is
441 // how to react on erroneous frame reception, maybe can simply be ignored
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000442 go rxCallbackEntry.CbFunction(ctx, omciMsg, &packet, rxCallbackEntry.CbRespChannel)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000443 isSuccessfulResponse, err := oo.isSuccessfulResponseWithMibDataSync(ctx, omciMsg, &packet)
444 if err != nil {
445 // qualified error logging already done in function above
446 if !rxCallbackEntry.FramePrint {
447 oo.printRxMessage(ctx, rxMsg)
448 }
449 return fmt.Errorf("could not decode further layers %s", oo.deviceID)
450 }
451 if isSuccessfulResponse {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000452 oo.pOnuDeviceEntry.IncrementMibDataSync(ctx)
Holger Hildebrandt36747fd2022-03-14 09:47:17 +0000453 } else {
454 logger.Debugw(ctx, "mibDataSync counter not to be updated for this message type",
455 log.Fields{"omciMsg.MessageType": omciMsg.MessageType, "device-id": oo.deviceID})
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000456 }
mpagenkoc8bba412021-01-15 15:38:44 +0000457
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700458 // If omciMsg.MessageType is omci.TestResponseType, we still expect the TestResult OMCI message,
459 // so do not clean up the TransactionID in that case.
460 if omciMsg.MessageType != omci.TestResponseType {
461 // having posted the response the request is regarded as 'done'
462 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
463 }
Himani Chawla4d908332020-08-31 12:30:20 +0530464 oo.mutexRxSchedMap.Unlock()
mpagenko80622a52021-02-09 16:53:23 +0000465 return nil
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000466 }
mpagenko80622a52021-02-09 16:53:23 +0000467 oo.mutexRxSchedMap.Unlock()
468 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID})
469 oo.printRxMessage(ctx, rxMsg)
470 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000471
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000472 /* py code was:
473 Receive and OMCI message from the proxy channel to the OLT.
474
475 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
476 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
477 """
478 if not self.enabled:
479 return
480
481 try:
482 now = arrow.utcnow()
483 d = None
484
485 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
486 # save the current value of the entity_id_to_class_map, then
487 # replace it with our custom one before decode, and then finally
488 # restore it later. Tried other ways but really made the code messy.
489 saved_me_map = omci_entities.entity_id_to_class_map
490 omci_entities.entity_id_to_class_map = self._me_map
491
492 try:
493 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000494 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000495 except KeyError as e:
496 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000497 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000498 rx_frame = self._decode_unknown_me(msg)
499 self._rx_unknown_me += 1
500
501 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000502 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000503 return
504
505 finally:
506 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
507
508 rx_tid = rx_frame.fields['transaction_id']
509 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000510 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000511 # Filter the Test Result frame and route through receive onu
512 # message method.
513 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000514 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000515 return self._receive_onu_message(rx_frame)
516
517 # Previously unreachable if this is the very first round-trip Rx or we
518 # have been running consecutive errors
519 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000520 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000521 self.reactor.callLater(0, self._publish_connectivity_event, True)
522
523 self._rx_frames += 1
524 self._consecutive_errors = 0
525
526 try:
527 high_priority = self._tid_is_high_priority(rx_tid)
528 index = self._get_priority_index(high_priority)
529
530 # (timestamp, defer, frame, timeout, retry, delayedCall)
531 last_tx_tuple = self._tx_request[index]
532
533 if last_tx_tuple is None or \
534 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
535 # Possible late Rx on a message that timed-out
536 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000537 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000538 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
539 self._rx_unknown_tid += 1
540 self._rx_late += 1
541 return
542
543 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
544 if dc is not None and not dc.cancelled and not dc.called:
545 dc.cancel()
546
547 _secs = self._update_rx_tx_stats(now, ts)
548
549 # Late arrival already serviced by a timeout?
550 if d.called:
551 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000552 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000553 return
554
555 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000556 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000557 if d is not None:
558 return d.errback(failure.Failure(e))
559 return
560
561 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000562 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000563 tx_tid = tx_frame.fields['transaction_id'])
564 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
565
566 # begin success callback chain (will cancel timeout and queue next Tx message)
567 self._rx_response[index] = rx_frame
568 d.callback(rx_frame)
569
570 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000571 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000572 */
573}
574
Himani Chawla6d2ae152020-09-02 13:11:20 +0530575/*
576func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530577 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530578 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000579}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530580*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000581
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700582// ReleaseTid releases OMCI transaction identifier from rxSchedulerMap
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000583func (oo *OmciCC) ReleaseTid(ctx context.Context, tid uint16) {
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700584 logger.Debugw(ctx, "releasing tid from rxSchedulerMap", log.Fields{"tid": tid})
585 delete(oo.rxSchedulerMap, tid)
586}
587
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000588// Send - Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
589func (oo *OmciCC) Send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
590 receiveCallbackPair CallbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000591
mpagenkoc26d4c02021-05-06 14:27:57 +0000592 if timeout != 0 {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000593 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TransCorrId": receiveCallbackPair.CbKey})
mpagenkoc26d4c02021-05-06 14:27:57 +0000594 oo.mutexRxSchedMap.Lock()
595 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000596 oo.rxSchedulerMap[receiveCallbackPair.CbKey] = receiveCallbackPair.CbEntry
mpagenkoc26d4c02021-05-06 14:27:57 +0000597 oo.mutexRxSchedMap.Unlock()
598 } //else timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000599
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000600 printFrame := receiveCallbackPair.CbEntry.FramePrint //printFrame true means debug print of frame is requested
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000601 //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 +0000602 omciTxRequest := OmciTransferStructure{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000603 txFrame,
604 timeout,
605 retry,
606 highPrio,
mpagenko80622a52021-02-09 16:53:23 +0000607 printFrame,
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000608 receiveCallbackPair,
609 nil,
kesavand011d5162021-11-25 19:21:06 +0530610 nil,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000611 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000612 oo.mutexMonReq.Lock()
613 defer oo.mutexMonReq.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000614 if _, exist := oo.monitoredRequests[receiveCallbackPair.CbKey]; !exist {
mpagenko7455fd42021-06-10 16:25:55 +0000615 // do not call processRequestMonitoring in background here to ensure correct sequencing
616 // of requested messages into txQueue (especially for non-response-supervised messages)
617 oo.processRequestMonitoring(ctx, omciTxRequest)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000618 return nil
619 }
620 logger.Errorw(ctx, "A message with this tid is processed already!",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000621 log.Fields{"tid": receiveCallbackPair.CbKey, "device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000622 return fmt.Errorf("message with tid is processed already %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000623}
624
Holger Hildebrandt34555512021-10-01 16:26:59 +0000625func (oo *OmciCC) sendQueuedRequests(ctx context.Context) {
626 // Avoid accessing the txQueues from parallel send routines to block
627 // parallel omci send requests at least until SendIAP is 'committed'.
628 // To guarantee window size 1 for one ONU it would be necessary to wait
629 // for the corresponding response too (t.b.d.).
630 oo.mutexSendQueuedRequests.Lock()
631 defer oo.mutexSendQueuedRequests.Unlock()
632 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
633 logger.Errorw(ctx, "Error during sending high prio requests!",
634 log.Fields{"err": err, "device-id": oo.deviceID})
635 return
636 }
637 if err := oo.sendQueuedLowPrioRequests(ctx); err != nil {
638 logger.Errorw(ctx, "Error during sending low prio requests!",
639 log.Fields{"err": err, "device-id": oo.deviceID})
640 return
641 }
642}
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000643
Holger Hildebrandt34555512021-10-01 16:26:59 +0000644func (oo *OmciCC) sendQueuedHighPrioRequests(ctx context.Context) error {
645 oo.mutexHighPrioTxQueue.Lock()
646 defer oo.mutexHighPrioTxQueue.Unlock()
647 for oo.highPrioTxQueue.Len() > 0 {
648 queueElement := oo.highPrioTxQueue.Front() // First element
649 if err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure)); err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000650 // Element will be removed from the queue regardless of the send success, to prevent
651 // an accumulation of send requests for the same message in the event of an error.
652 // In this case, resend attempts for the message are ensured by our retry
653 // mechanism after omci-timeout.
654 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
Holger Hildebrandt34555512021-10-01 16:26:59 +0000655 return err
mpagenko80622a52021-02-09 16:53:23 +0000656 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000657 oo.highPrioTxQueue.Remove(queueElement) // Dequeue
658 }
659 return nil
660}
661
662func (oo *OmciCC) sendQueuedLowPrioRequests(ctx context.Context) error {
663 oo.mutexLowPrioTxQueue.Lock()
664 for oo.lowPrioTxQueue.Len() > 0 {
665 queueElement := oo.lowPrioTxQueue.Front() // First element
kesavand011d5162021-11-25 19:21:06 +0530666 // check if the element is for onu sw section
667 aOmciTxReq := queueElement.Value.(OmciTransferStructure)
668 if aOmciTxReq.OnuSwWindow != nil {
669 if err := oo.sendOnuSwSectionsOfWindow(ctx, aOmciTxReq); err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000670 // Element will be removed from the queue regardless of the send success, to prevent
671 // an accumulation of send requests for the same message in the event of an error.
672 // In this case, resend attempts for the message are ensured by our retry
673 // mechanism after omci-timeout.
674 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
kesavand011d5162021-11-25 19:21:06 +0530675 oo.mutexLowPrioTxQueue.Unlock()
676 return err
677 }
678 } else {
679 err := oo.sendOMCIRequest(ctx, queueElement.Value.(OmciTransferStructure))
680 if err != nil {
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000681 // Element will be removed from the queue regardless of the send success, to prevent
682 // an accumulation of send requests for the same message in the event of an error.
683 // In this case, resend attempts for the message are ensured by our retry
684 // mechanism after omci-timeout.
685 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
kesavand011d5162021-11-25 19:21:06 +0530686 oo.mutexLowPrioTxQueue.Unlock()
687 return err
688 }
amit.ghosh58b704b2021-06-18 03:45:52 +0200689 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000690 oo.lowPrioTxQueue.Remove(queueElement) // Dequeue
691 // Interrupt the sending of low priority requests to process any high priority requests
692 // that may have arrived in the meantime
693 oo.mutexLowPrioTxQueue.Unlock()
694 if err := oo.sendQueuedHighPrioRequests(ctx); err != nil {
695 return err
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000696 }
Holger Hildebrandt34555512021-10-01 16:26:59 +0000697 oo.mutexLowPrioTxQueue.Lock()
698 }
699
700 oo.mutexLowPrioTxQueue.Unlock()
701 return nil
702}
703
704func (oo *OmciCC) sendOMCIRequest(ctx context.Context, omciTxRequest OmciTransferStructure) error {
705 if omciTxRequest.withFramePrint {
706 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
707 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
708 "device-id": oo.deviceID,
709 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
710 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
711 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
712 }
khenaidoo42dcdfd2021-10-19 17:34:12 -0400713 omciMsg := &ia.OmciMessage{
Holger Hildebrandt34555512021-10-01 16:26:59 +0000714 ParentDeviceId: oo.pBaseDeviceHandler.GetProxyAddressID(),
715 ChildDeviceId: oo.deviceID,
716 Message: omciTxRequest.txFrame,
717 ProxyAddress: oo.pBaseDeviceHandler.GetProxyAddress(),
718 ConnectStatus: common.ConnectStatus_REACHABLE, // If we are sending OMCI messages means we are connected, else we should not be here
719 }
720 sendErr := oo.pBaseDeviceHandler.SendOMCIRequest(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciMsg)
721 if sendErr != nil {
Holger Hildebrandtabfef032022-02-25 12:40:20 +0000722 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 +0000723 return sendErr
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000724 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +0000725 if omciTxRequest.txFrame[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
726 oo.incrementBaseTxArFrames()
727 } else {
728 oo.incrementExtTxArFrames()
729 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000730 return nil
731}
732
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000733// GetNextTid - TODO: add comment
734func (oo *OmciCC) GetNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000735 var next uint16
736 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000737 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000738 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530739 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000740 if oo.hpTid < 0x8000 {
741 oo.hpTid = 0x8000
742 }
mpagenko900ee4b2020-10-12 11:56:34 +0000743 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000744 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000745 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000746 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530747 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000748 if oo.tid >= 0x8000 {
749 oo.tid = 1
750 }
mpagenko900ee4b2020-10-12 11:56:34 +0000751 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000752 }
753 return next
754}
755
kesavand011d5162021-11-25 19:21:06 +0530756//GetOnuSwSecNextTid get the next low prio tid for the onu sw sections
757//onu sw sections uses only low priority tids
758//The mutexTid lock should be taken prior to using this function
759func (oo *OmciCC) GetOnuSwSecNextTid() uint16 {
760 next := oo.tid
761 oo.tid++
762 if oo.tid >= 0x8000 {
763 oo.tid = 1
764 }
765 return next
766}
767
768//GetOnuSwSecLastTid gets the last allocated tid
769//The mutexTid lock should be taken prior to using this function
770func (oo *OmciCC) GetOnuSwSecLastTid() uint16 {
771 next := oo.tid
772 lastAllocatedTid := next - 1
773 return lastAllocatedTid
774}
775
776//LockMutexTID locks mutexTid
777func (oo *OmciCC) LockMutexTID() {
778 oo.mutexTid.Lock()
779}
780
781//UnLockMutexTID unlocks mutexTid
782func (oo *OmciCC) UnLockMutexTID() {
783 oo.mutexTid.Unlock()
784}
785
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000786// ###################################################################################
787// # utility methods provided to work on OMCI messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000788
789// Serialize - TODO: add comment
790func Serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000791 omciLayer := &omci.OMCI{
792 TransactionID: tid,
793 MessageType: msgType,
794 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000795 return SerializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000796}
797
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +0000798// SerializeOmciLayer - TODO: add comment
799func SerializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000800 var options gopacket.SerializeOptions
801 options.FixLengths = true
802
803 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530804 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000805 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000806 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000807 return nil, err
808 }
809 return buffer.Bytes(), nil
810}
811
Himani Chawla4d908332020-08-31 12:30:20 +0530812/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000813func hexEncode(omciPkt []byte) ([]byte, error) {
814 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
815 hex.Encode(dst, omciPkt)
816 return dst, nil
817}
Himani Chawla4d908332020-08-31 12:30:20 +0530818*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000819
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000820//supply a response handler for omci response messages to be transferred to the requested FSM
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000821func (oo *OmciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000822
dbainbri4d3a0dc2020-12-02 00:33:42 +0000823 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000824 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000825
826 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000827 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000828 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200829 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000830 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000831 oo.mutexMonReq.RLock()
832 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000833 //implement non-blocking channel send to avoid blocking on mutexMonReq later
834 select {
835 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
836 default:
837 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
838 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
839 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000840 } else {
841 logger.Infow(ctx, "reqMon: map entry does not exist!",
842 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
843 }
844 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000845
846 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
847 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000848 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000849 Type: OMCI,
850 Data: OmciMessage{
851 OmciMsg: omciMsg,
852 OmciPacket: packet,
853 },
854 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000855 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000856 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000857
858 return nil
859}
860
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000861// SendMibReset sends MibResetRequest
862func (oo *OmciCC) SendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000863
dbainbri4d3a0dc2020-12-02 00:33:42 +0000864 logger.Debugw(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000865 request := &omci.MibResetRequest{
866 MeBasePacket: omci.MeBasePacket{
867 EntityClass: me.OnuDataClassID,
868 },
869 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000870 tid := oo.GetNextTid(highPrio)
871 pkt, err := Serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000872 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000873 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000874 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000875 return err
876 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000877 omciRxCallbackPair := CallbackPair{
878 CbKey: tid,
879 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000880 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000881 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000882}
883
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000884// SendReboot sends RebootRequest
885func (oo *OmciCC) SendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
886 logger.Debugw(ctx, "send reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300887 request := &omci.RebootRequest{
888 MeBasePacket: omci.MeBasePacket{
889 EntityClass: me.OnuGClassID,
890 },
891 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000892 tid := oo.GetNextTid(highPrio)
893 pkt, err := Serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300894 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000895 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000896 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300897 return err
898 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000899 omciRxCallbackPair := CallbackPair{
900 CbKey: tid,
901 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetOmciRebootMsgRevChan(), oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300902 }
903
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000904 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300905 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000906 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000907 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300908 return err
909 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000910 err = oo.pOnuDeviceEntry.WaitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300911 if err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000912 logger.Errorw(ctx, "aborting ONU reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200913 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300914 return err
915 }
916 return nil
917}
918
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000919// SendMibUpload sends MibUploadRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000920func (oo *OmciCC) SendMibUpload(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000921 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000922
923 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000924
925 omciLayer := &omci.OMCI{
926 TransactionID: tid,
927 MessageType: omci.MibUploadRequestType,
928 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000929 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000930 omciLayer.DeviceIdentifier = omci.ExtendedIdent
931 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000932 request := &omci.MibUploadRequest{
933 MeBasePacket: omci.MeBasePacket{
934 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000935 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000936 },
937 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000938 var options gopacket.SerializeOptions
939 options.FixLengths = true
940
941 buffer := gopacket.NewSerializeBuffer()
942 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000943 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000944 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000945 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000946 return err
947 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000948 oo.UploadSequNo = 0
949 oo.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000950
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000951 omciRxCallbackPair := CallbackPair{
952 CbKey: tid,
953 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000954 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000955 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000956}
957
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000958// SendMibUploadNext sends MibUploadNextRequest
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000959func (oo *OmciCC) SendMibUploadNext(ctx context.Context, timeout int, highPrio bool, isExtOmciSupported bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000960 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "UploadSequNo": oo.UploadSequNo})
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000961
962 tid := oo.GetNextTid(highPrio)
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000963
964 omciLayer := &omci.OMCI{
965 TransactionID: tid,
966 MessageType: omci.MibUploadNextRequestType,
967 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000968 if isExtOmciSupported {
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000969 omciLayer.DeviceIdentifier = omci.ExtendedIdent
970 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000971 request := &omci.MibUploadNextRequest{
972 MeBasePacket: omci.MeBasePacket{
973 EntityClass: me.OnuDataClassID,
Holger Hildebrandt5458d892022-05-31 09:52:06 +0000974 Extended: isExtOmciSupported,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000975 },
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000976 CommandSequenceNumber: oo.UploadSequNo,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000977 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000978 var options gopacket.SerializeOptions
979 options.FixLengths = true
980
981 buffer := gopacket.NewSerializeBuffer()
982 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000983 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000984 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000985 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000986 return err
987 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000988 oo.UploadSequNo++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000989
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000990 omciRxCallbackPair := CallbackPair{
991 CbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000992 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
993 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
994 // compare also software upgrade download section handling
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000995 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000996 }
Holger Hildebrandt0edf5b02022-05-04 14:19:43 +0000997 return oo.Send(ctx, buffer.Bytes(), timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000998}
999
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001000// SendGetAllAlarm gets all alarm ME instances
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001001func (oo *OmciCC) SendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool, isExtendedOmci bool) error {
Himani Chawlad3dac422021-03-13 02:31:31 +05301002 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001003
1004 tid := oo.GetNextTid(highPrio)
1005 omciLayer := &omci.OMCI{
1006 TransactionID: tid,
1007 MessageType: omci.GetAllAlarmsRequestType,
1008 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1009 }
1010 if isExtendedOmci {
1011 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1012 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301013 request := &omci.GetAllAlarmsRequest{
1014 MeBasePacket: omci.MeBasePacket{
1015 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001016 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301017 },
1018 AlarmRetrievalMode: byte(alarmRetreivalMode),
1019 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001020 var options gopacket.SerializeOptions
1021 options.FixLengths = true
1022 buffer := gopacket.NewSerializeBuffer()
1023 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301024 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001025 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{"Err": err,
1026 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301027 return err
1028 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001029 outgoingPacket := buffer.Bytes()
1030
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001031 oo.pOnuAlarmManager.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +05301032
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001033 omciRxCallbackPair := CallbackPair{
1034 CbKey: tid,
1035 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301036 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001037 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1038 if err != nil {
1039 logger.Errorw(ctx, "Cannot send GetAllAlarmsRequest", log.Fields{"Err": err,
1040 "device-id": oo.deviceID})
1041 return err
1042 }
1043 logger.Debug(ctx, "send GetAllAlarmsRequest done")
1044 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301045}
1046
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001047// SendGetAllAlarmNext gets next alarm ME instance
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001048func (oo *OmciCC) SendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool, isExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001049 alarmUploadSeqNo := oo.pOnuAlarmManager.GetAlarmUploadSeqNo()
1050 logger.Debugw(ctx, "send SendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
Himani Chawlad3dac422021-03-13 02:31:31 +05301051 "alarmUploadSeqNo": alarmUploadSeqNo})
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001052
1053 tid := oo.GetNextTid(highPrio)
1054 omciLayer := &omci.OMCI{
1055 TransactionID: tid,
1056 MessageType: omci.GetAllAlarmsNextRequestType,
1057 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
1058 }
1059 if isExtendedOmci {
1060 omciLayer.DeviceIdentifier = omci.ExtendedIdent
1061 }
Himani Chawlad3dac422021-03-13 02:31:31 +05301062 request := &omci.GetAllAlarmsNextRequest{
1063 MeBasePacket: omci.MeBasePacket{
1064 EntityClass: me.OnuDataClassID,
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001065 Extended: isExtendedOmci,
Himani Chawlad3dac422021-03-13 02:31:31 +05301066 },
1067 CommandSequenceNumber: alarmUploadSeqNo,
1068 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001069 var options gopacket.SerializeOptions
1070 options.FixLengths = true
1071 buffer := gopacket.NewSerializeBuffer()
1072 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
Himani Chawlad3dac422021-03-13 02:31:31 +05301073 if err != nil {
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001074 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{"Err": err,
1075 "device-id": oo.deviceID})
Himani Chawlad3dac422021-03-13 02:31:31 +05301076 return err
1077 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001078 outgoingPacket := buffer.Bytes()
1079
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001080 oo.pOnuAlarmManager.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +05301081
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001082 omciRxCallbackPair := CallbackPair{
1083 CbKey: tid,
1084 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +05301085 }
Holger Hildebrandt3b29a8a2022-07-11 05:55:13 +00001086 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
1087 if err != nil {
1088 logger.Errorw(ctx, "Cannot send GetAllAlarmsNextRequest", log.Fields{"Err": err,
1089 "device-id": oo.deviceID})
1090 return err
1091 }
1092 logger.Debug(ctx, "send GetAllAlarmsNextRequest done")
1093 return nil
Himani Chawlad3dac422021-03-13 02:31:31 +05301094}
1095
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001096// SendCreateGalEthernetProfile creates GalEthernetProfile ME instance
1097func (oo *OmciCC) SendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1098 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001099 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001100 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001101
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001102 meParams := me.ParamData{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001103 EntityID: GalEthernetEID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001104 Attributes: me.AttributeValueMap{me.GalEthernetProfile_MaximumGemPayloadSize: maxGemPayloadSize},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001105 }
1106 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
1107 if omciErr.GetError() == nil {
1108 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001109 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001110 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001111 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001112 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001113 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001114 }
1115
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001116 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001117 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001118 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001119 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001120 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001121 }
1122
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001123 omciRxCallbackPair := CallbackPair{
1124 CbKey: tid,
1125 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001126 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001127 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001128 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001129 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001130 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001131 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001132 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001133 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001134 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001135 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001136 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001137 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001138 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001139}
1140
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001141// SendSetOnu2g sets Onu2G ME instance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001142// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001143func (oo *OmciCC) SendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1144 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001145 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001146 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001147
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001148 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
1149 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001150 // By now we just use fix values to fire - this is anyway what the python adapter does
1151 // read ONU-2G from DB ???? //TODO!!!
1152 meParams := me.ParamData{
1153 EntityID: 0,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001154 Attributes: me.AttributeValueMap{me.Onu2G_CurrentConnectivityMode: connectivityModeValue},
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001155 }
1156 meInstance, omciErr := me.NewOnu2G(meParams)
1157 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001158 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001159 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001160 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001161 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001162 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001163 }
1164
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001165 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001166 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001167 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001168 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001169 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001170 }
1171
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001172 omciRxCallbackPair := CallbackPair{
1173 CbKey: tid,
1174 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001175 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001176 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001177 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001178 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001179 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001180 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001181 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001182 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001183 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001184 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001185 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001186 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001187 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001188}
1189
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001190// SendCreateMBServiceProfile creates MacBridgeServiceProfile ME instance
1191func (oo *OmciCC) SendCreateMBServiceProfile(ctx context.Context,
1192 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1193 tid := oo.GetNextTid(highPrio)
1194 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001195 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001196 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001197
1198 meParams := me.ParamData{
1199 EntityID: instID,
1200 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001201 me.MacBridgeServiceProfile_Priority: 0x8000,
1202 me.MacBridgeServiceProfile_MaxAge: 20 * 256, //20s
1203 me.MacBridgeServiceProfile_HelloTime: 2 * 256, //2s
1204 me.MacBridgeServiceProfile_ForwardDelay: 15 * 256, //15s
1205 me.MacBridgeServiceProfile_DynamicFilteringAgeingTime: 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001206 },
1207 }
1208
1209 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
1210 if omciErr.GetError() == nil {
1211 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001212 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1213 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001214 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001215 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001216 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001217 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001218 }
1219
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001220 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001221 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001222 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001223 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001224 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001225 }
1226
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001227 omciRxCallbackPair := CallbackPair{
1228 CbKey: tid,
1229 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001230 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001231 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001232 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001233 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001234 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001235 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001236 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001237 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001238 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001239 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001240 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001241 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001242 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001243}
1244
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001245// SendCreateMBPConfigDataUniSide creates MacBridgePortConfigurationData ME instance
1246func (oo *OmciCC) SendCreateMBPConfigDataUniSide(ctx context.Context,
1247 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1248 tid := oo.GetNextTid(highPrio)
1249 instID, idErr := GenerateUNISideMBPCDEID(uint16(aPUniPort.MacBpNo))
Mahir Gunyel6781f962021-05-16 23:30:08 -07001250 if idErr != nil {
1251 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1252 "Err": idErr, "device-id": oo.deviceID})
1253 return nil, idErr
1254 }
1255 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001256 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.MacBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001257
1258 meParams := me.ParamData{
1259 EntityID: instID,
1260 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001261 me.MacBridgePortConfigurationData_BridgeIdPointer: MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo),
1262 me.MacBridgePortConfigurationData_PortNum: aPUniPort.MacBpNo,
1263 me.MacBridgePortConfigurationData_TpType: uint8(aPUniPort.PortType),
1264 me.MacBridgePortConfigurationData_TpPointer: aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001265 },
1266 }
1267 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1268 if omciErr.GetError() == nil {
1269 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001270 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1271 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001272 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001273 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001274 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001275 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001276 }
1277
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001278 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001279 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001280 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001281 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001282 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001283 }
1284
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001285 omciRxCallbackPair := CallbackPair{
1286 CbKey: tid,
1287 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001288 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001289 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001290 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001291 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001292 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001293 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001294 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001295 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001296 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001297 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001298 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001299 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001300 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001301}
1302
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001303// SendCreateEVTOConfigData creates ExtendedVlanTaggingOperationConfigurationData ME instance
1304func (oo *OmciCC) SendCreateEVTOConfigData(ctx context.Context,
1305 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1306 tid := oo.GetNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001307 //same entityId is used as for MBSP (see there), but just arbitrary ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001308 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001309 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001310 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001311
1312 // compare python adapter code WA VOL-1311: this is not done here!
1313 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1314 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1315 assType := uint8(2) // default AssociationType is PPTPEthUni
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001316 if aPUniPort.PortType == UniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001317 assType = uint8(10) // for VEIP
1318 }
1319 meParams := me.ParamData{
1320 EntityID: instID,
1321 Attributes: me.AttributeValueMap{
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001322 me.ExtendedVlanTaggingOperationConfigurationData_AssociationType: assType,
1323 me.ExtendedVlanTaggingOperationConfigurationData_AssociatedMePointer: aPUniPort.EntityID,
mpagenko836a1fd2021-11-01 16:12:42 +00001324 //EnhancedMode not yet supported, used with default options
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001325 },
1326 }
1327 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1328 if omciErr.GetError() == nil {
1329 //all setByCreate parameters already set, no default option required ...
mpagenko836a1fd2021-11-01 16:12:42 +00001330 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1331 oframe.TransactionID(tid), oframe.AddDefaults(true))
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001332 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001333 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001334 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001335 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001336 }
1337
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001338 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001339 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001340 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001341 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001342 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001343 }
1344
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001345 omciRxCallbackPair := CallbackPair{
1346 CbKey: tid,
1347 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001348 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001349 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001350 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001351 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001352 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001353 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001354 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001355 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001356 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001357 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001358 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001359 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001360 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001361}
1362
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001363// SendSetOnuGLS sets OnuG ME instance
1364func (oo *OmciCC) SendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001365 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001366 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001367 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001368 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001369
1370 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1371 meParams := me.ParamData{
1372 EntityID: 0,
1373 Attributes: requestedAttributes,
1374 }
1375 meInstance, omciErr := me.NewOnuG(meParams)
1376 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001377 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001378 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001379 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001380 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001381 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001382 }
1383
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001384 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001385 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001386 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001387 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001388 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001389 }
1390
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001391 omciRxCallbackPair := CallbackPair{
1392 CbKey: tid,
1393 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001394 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001395 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001396 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001397 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001398 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001399 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001400 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001401 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001402 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001403 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001404 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001405 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001406 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001407}
1408
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001409// SendSetPptpEthUniLS sets PhysicalPathTerminationPointEthernetUni ME instance
1410func (oo *OmciCC) SendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001411 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001412 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001413 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001414 "SequNo": strconv.FormatInt(int64(tid), 16)})
1415
1416 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1417 meParams := me.ParamData{
1418 EntityID: aInstNo,
1419 Attributes: requestedAttributes,
1420 }
1421 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1422 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001423 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001424 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001425 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001426 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001427 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001428 }
1429
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001430 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001431 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001432 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001433 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001434 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001435 }
1436
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001437 omciRxCallbackPair := CallbackPair{
1438 CbKey: tid,
1439 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001440 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001441 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001442 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001443 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001444 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001445 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001446 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001447 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001448 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001449 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001450 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001451 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001452 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001453}
1454
1455/* UniG obsolete by now, left here in case it should be needed once again
1456 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301457func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001458 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001459 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001460 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001461 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001462
1463 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1464 meParams := me.ParamData{
1465 EntityID: aInstNo,
1466 Attributes: requestedAttributes,
1467 }
1468 meInstance, omciErr := me.NewUniG(meParams)
1469 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001470 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001471 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001472 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001473 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001474 return nil
1475 }
1476
1477 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1478 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001479 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001480 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001481 return nil
1482 }
1483
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001484 omciRxCallbackPair := CallbackPair{
1485 CbKey: tid,
1486 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001487 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001488 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001489 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001490 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001491 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001492 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001493 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001494 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001495 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001496 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001497 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001498 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001499 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001500}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001501*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001502
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001503// SendSetVeipLS sets VirtualEthernetInterfacePoint ME instance
1504func (oo *OmciCC) SendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001505 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001506 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001507 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001508 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001509
1510 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1511 meParams := me.ParamData{
1512 EntityID: aInstNo,
1513 Attributes: requestedAttributes,
1514 }
1515 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1516 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001517 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001518 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001519 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001520 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001521 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001522 }
1523
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001524 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001525 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001526 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001527 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001528 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001529 }
1530
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001531 omciRxCallbackPair := CallbackPair{
1532 CbKey: tid,
1533 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001534 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001535 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001536 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001537 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001538 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001539 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001540 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001541 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001542 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001543 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001544 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001545 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001546 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001547}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001548
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001549// SendGetMe gets ME instance
1550func (oo *OmciCC) SendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001551 timeout int, highPrio bool, rxChan chan Message, isExtendedOmci bool) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001552
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001553 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001554 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001555 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001556
1557 meParams := me.ParamData{
1558 EntityID: entityID,
1559 Attributes: requestedAttributes,
1560 }
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001561 var messageSet omci.DeviceIdent = omci.BaselineIdent
1562 if isExtendedOmci {
1563 messageSet = omci.ExtendedIdent
1564 }
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001565 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1566 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301567 meClassIDName := meInstance.GetName()
Holger Hildebrandtd930cb22022-06-17 09:24:50 +00001568 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.GetRequestType, oframe.TransactionID(tid), oframe.FrameFormat(messageSet))
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001569 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001570 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 +03001571 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001572 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001573 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001574 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001575 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001576 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001577 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001578 omciRxCallbackPair := CallbackPair{
1579 CbKey: tid,
1580 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001581 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001582 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001583 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001584 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001585 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001586 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001587 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001588 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001589 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001590 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001591 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001592}
1593
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001594// SendGetMeWithAttributeMask gets ME instance with attribute mask
1595func (oo *OmciCC) SendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
Himani Chawla43f95ff2021-06-03 00:24:12 +05301596 timeout int, highPrio bool, rxChan chan Message) error {
1597
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001598 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301599 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1600 "SequNo": strconv.FormatInt(int64(tid), 16)})
1601
1602 request := &omci.GetRequest{
1603 MeBasePacket: omci.MeBasePacket{
1604 EntityInstance: entityID,
1605 EntityClass: classID,
1606 },
1607 AttributeMask: requestedAttributesMask,
1608 }
1609
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001610 pkt, err := Serialize(ctx, omci.GetRequestType, request, tid)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301611 if err != nil {
1612 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1613 return err
1614 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001615 omciRxCallbackPair := CallbackPair{
1616 CbKey: tid,
1617 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05301618 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001619 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301620 if err != nil {
1621 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1622 return err
1623 }
1624 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1625 return nil
1626}
1627
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001628// SendCreateDot1PMapper creates Ieee8021PMapperServiceProfile ME instance
1629func (oo *OmciCC) SendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001630 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001631 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001632 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001633 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1634
1635 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001636 EntityID: aInstID,
1637 Attributes: me.AttributeValueMap{
1638 //workaround for unsuitable omci-lib default values, cmp VOL-3729
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00001639 me.Ieee8021PMapperServiceProfile_TpPointer: 0xFFFF,
1640 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority0: 0xFFFF,
1641 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority1: 0xFFFF,
1642 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority2: 0xFFFF,
1643 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority3: 0xFFFF,
1644 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority4: 0xFFFF,
1645 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority5: 0xFFFF,
1646 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority6: 0xFFFF,
1647 me.Ieee8021PMapperServiceProfile_InterworkTpPointerForPBitPriority7: 0xFFFF,
mpagenko8b5fdd22020-12-17 17:58:32 +00001648 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001649 }
1650 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1651 if omciErr.GetError() == nil {
1652 //we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001653 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1654 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001655 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001656 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001657 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001658 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001659 }
1660
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001661 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001662 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001663 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001664 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001665 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001666 }
1667
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001668 omciRxCallbackPair := CallbackPair{
1669 CbKey: tid,
1670 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001671 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001672 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001673 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001674 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001675 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001676 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001677 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001678 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001679 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001680 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001681 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001682 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001683 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001684}
1685
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001686// SendCreateMBPConfigDataVar creates MacBridgePortConfigurationData ME instance
1687func (oo *OmciCC) SendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001688 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001689 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001690 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001691 "SequNo": strconv.FormatInt(int64(tid), 16),
1692 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1693
1694 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1695 if omciErr.GetError() == nil {
1696 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001697 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1698 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001699 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001700 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001701 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001702 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001703 }
1704
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001705 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001706 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001707 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001708 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001709 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001710 }
1711
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001712 omciRxCallbackPair := CallbackPair{
1713 CbKey: tid,
1714 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001715 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001716 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001717 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001718 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001719 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001720 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001721 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001722 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001723 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001724 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001725 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001726 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001727 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001728}
1729
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001730// SendCreateGemNCTPVar creates GemPortNetworkCtp ME instance
1731func (oo *OmciCC) SendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001732 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001733 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001734 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001735 "SequNo": strconv.FormatInt(int64(tid), 16),
1736 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1737
1738 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1739 if omciErr.GetError() == nil {
1740 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001741 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1742 oframe.TransactionID(tid), oframe.AddDefaults(true))
mpagenko3dbcdd22020-07-22 07:38:45 +00001743 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001744 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001745 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001746 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001747 }
1748
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001749 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001750 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001751 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001752 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001753 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001754 }
1755
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001756 omciRxCallbackPair := CallbackPair{
1757 CbKey: tid,
1758 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001759 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001760 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001761 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001762 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001763 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001764 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001765 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001766 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001767 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001768 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001769 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001770 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001771 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001772}
1773
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001774// SendSetGemNCTPVar sets GemPortNetworkCtp ME instance
1775func (oo *OmciCC) SendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1776 tid := oo.GetNextTid(highPrio)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001777 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1778 "SequNo": strconv.FormatInt(int64(tid), 16),
1779 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1780
1781 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1782 if omciErr.GetError() == nil {
1783 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
mpagenko836a1fd2021-11-01 16:12:42 +00001784 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
1785 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsia82b91a62021-05-21 18:54:49 +03001786 if err != nil {
1787 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1788 "Err": err, "device-id": oo.deviceID})
1789 return nil, err
1790 }
1791
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001792 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001793 if err != nil {
1794 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1795 "Err": err, "device-id": oo.deviceID})
1796 return nil, err
1797 }
1798
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001799 omciRxCallbackPair := CallbackPair{
1800 CbKey: tid,
1801 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia82b91a62021-05-21 18:54:49 +03001802 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001803 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001804 if err != nil {
1805 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1806 "Err": err, "device-id": oo.deviceID})
1807 return nil, err
1808 }
1809 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1810 return meInstance, nil
1811 }
1812 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1813 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1814 return nil, omciErr.GetError()
1815}
1816
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001817// SendCreateGemIWTPVar creates GemInterworkingTerminationPoint ME instance
1818func (oo *OmciCC) SendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001819 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001820 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001821 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001822 "SequNo": strconv.FormatInt(int64(tid), 16),
1823 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1824
1825 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1826 if omciErr.GetError() == nil {
1827 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001828 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1829 oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001830 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001831 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001832 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001833 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001834 }
1835
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001836 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001837 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001838 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001839 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001840 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001841 }
1842
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001843 omciRxCallbackPair := CallbackPair{
1844 CbKey: tid,
1845 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001846 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001847 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001848 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001849 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001850 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001851 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001852 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001853 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001854 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001855 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001856 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001857 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001858 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001859}
1860
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001861// SendSetTcontVar sets TCont ME instance
1862func (oo *OmciCC) SendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001863 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001864 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001865 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001866 "SequNo": strconv.FormatInt(int64(tid), 16),
1867 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1868
1869 meInstance, omciErr := me.NewTCont(params[0])
1870 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001871 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001872 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001873 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001874 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001875 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001876 }
1877
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001878 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001879 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001880 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001881 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001882 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001883 }
1884
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001885 omciRxCallbackPair := CallbackPair{
1886 CbKey: tid,
1887 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001888 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001889 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001890 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001891 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001892 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001893 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001894 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001895 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001896 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001897 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001898 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001899 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001900 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001901}
1902
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001903// SendSetPrioQueueVar sets PriorityQueue ME instance
1904func (oo *OmciCC) SendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001905 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001906 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001907 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001908 "SequNo": strconv.FormatInt(int64(tid), 16),
1909 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1910
1911 meInstance, omciErr := me.NewPriorityQueue(params[0])
1912 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001913 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001914 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001915 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001916 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001917 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001918 }
1919
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001920 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001921 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001922 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001923 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001924 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001925 }
1926
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001927 omciRxCallbackPair := CallbackPair{
1928 CbKey: tid,
1929 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001930 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001931 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001932 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001933 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001934 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001935 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001936 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001937 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001938 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001939 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001940 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001941 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001942 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001943}
1944
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001945// SendSetDot1PMapperVar sets Ieee8021PMapperServiceProfile ME instance
1946func (oo *OmciCC) SendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001947 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001948 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001949 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001950 "SequNo": strconv.FormatInt(int64(tid), 16),
1951 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1952
1953 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1954 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00001955 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenko3dbcdd22020-07-22 07:38:45 +00001956 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001957 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001958 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001959 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001960 }
1961
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00001962 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001963 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001964 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001965 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001966 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001967 }
1968
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001969 omciRxCallbackPair := CallbackPair{
1970 CbKey: tid,
1971 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001972 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001973 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001974 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001975 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001976 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001977 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001978 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001979 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001980 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001981 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001982 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001983 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001984 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001985}
mpagenkodff5dda2020-08-28 11:52:01 +00001986
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001987// SendCreateVtfdVar creates VlanTaggingFilterData ME instance
1988func (oo *OmciCC) SendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001989 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001990 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001991 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001992 "SequNo": strconv.FormatInt(int64(tid), 16),
1993 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1994
1995 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1996 if omciErr.GetError() == nil {
1997 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
mpagenko836a1fd2021-11-01 16:12:42 +00001998 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
1999 oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002000 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002001 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002002 "Err": err, "device-id": oo.deviceID})
2003 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2004 // return (dual format) error code that can be used at caller for immediate error treatment
2005 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002006 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002007 }
2008
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002009 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002010 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002011 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002012 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002013 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002014 }
2015
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002016 omciRxCallbackPair := CallbackPair{
2017 CbKey: tid,
2018 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002019 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002020 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002021 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002022 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002023 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002024 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002025 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002026 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002027 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002028 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002029 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002030 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002031 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002032}
2033
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002034// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002035func (oo *OmciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002036 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002037 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002038 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002039 "SequNo": strconv.FormatInt(int64(tid), 16),
2040 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2041
2042 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
2043 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002044 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType,
2045 oframe.TransactionID(tid))
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002046 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002047 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002048 "Err": err, "device-id": oo.deviceID})
2049 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2050 // return (dual format) error code that can be used at caller for immediate error treatment
2051 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002052 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002053 }
2054
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002055 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002056 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002057 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002058 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002059 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002060 }
2061
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002062 omciRxCallbackPair := CallbackPair{
2063 CbKey: tid,
2064 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002065 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002066 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002067 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002068 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002069 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002070 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002071 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002072 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002073 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002074 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002075 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002076 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002077 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00002078}
2079
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002080// SendCreateEvtocdVar creates ExtendedVlanTaggingOperationConfigurationData ME instance
2081func (oo *OmciCC) SendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002082 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002083 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002084 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002085 "SequNo": strconv.FormatInt(int64(tid), 16),
2086 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2087
2088 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2089 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002090 //EnhancedMode not yet supported, used with default options
2091 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType,
2092 oframe.TransactionID(tid), oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002093 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002094 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002095 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002096 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002097 }
2098
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002099 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002100 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002101 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002102 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002103 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002104 }
2105
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002106 omciRxCallbackPair := CallbackPair{
2107 CbKey: tid,
2108 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002109 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002110 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002111 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002112 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002113 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002114 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002115 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002116 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002117 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002118 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002119 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002120 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002121 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002122}
2123
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002124// SendSetEvtocdVar sets ExtendedVlanTaggingOperationConfigurationData ME instance
2125func (oo *OmciCC) SendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002126 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002127 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002128 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00002129 "SequNo": strconv.FormatInt(int64(tid), 16),
2130 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2131
2132 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2133 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002134 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
mpagenkodff5dda2020-08-28 11:52:01 +00002135 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002136 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002137 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002138 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002139 }
2140
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002141 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00002142 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002143 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002144 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002145 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002146 }
2147
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002148 omciRxCallbackPair := CallbackPair{
2149 CbKey: tid,
2150 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00002151 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002152 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00002153 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002154 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002155 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002156 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00002157 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002158 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002159 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00002160 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002161 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00002162 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002163 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00002164}
mpagenko01e726e2020-10-23 09:45:29 +00002165
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002166// SendDeleteEvtocd deletes ExtendedVlanTaggingOperationConfigurationData ME instance
2167func (oo *OmciCC) SendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002168 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002169 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002170 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002171 "SequNo": strconv.FormatInt(int64(tid), 16),
2172 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2173
2174 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
2175 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002176 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002177 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002178 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002179 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002180 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002181 }
2182
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002183 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002184 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002185 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002186 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002187 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002188 }
2189
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002190 omciRxCallbackPair := CallbackPair{
2191 CbKey: tid,
2192 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002193 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002194 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002195 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002196 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002197 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002198 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002199 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002200 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002201 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002202 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002203 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002204 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002205 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002206}
2207
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002208// SendDeleteVtfd deletes VlanTaggingFilterData ME instance
2209func (oo *OmciCC) SendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002210 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002211 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002212 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00002213 "SequNo": strconv.FormatInt(int64(tid), 16),
2214 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2215
2216 meParams := me.ParamData{EntityID: aInstID}
2217 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
2218 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002219 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2220 oframe.TransactionID(tid))
mpagenko01e726e2020-10-23 09:45:29 +00002221 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002222 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002223 "Err": err, "device-id": oo.deviceID})
2224 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2225 // return (dual format) error code that can be used at caller for immediate error treatment
2226 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002227 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002228 }
2229
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002230 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00002231 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002232 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002233 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002234 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002235 }
2236
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002237 omciRxCallbackPair := CallbackPair{
2238 CbKey: tid,
2239 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00002240 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002241 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00002242 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002243 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002244 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002245 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002246 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002247 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002248 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00002249 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002250 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002251 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002252 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00002253}
ozgecanetsia422dbf32020-10-28 14:07:19 +03002254
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002255// SendCreateTDVar creates TrafficDescriptor ME instance
2256func (oo *OmciCC) SendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2257 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002258 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
2259 "SequNo": strconv.FormatInt(int64(tid), 16),
2260 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2261 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2262 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002263 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002264 if err != nil {
2265 logger.Errorw(ctx, "Cannot encode TD for create", 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 create", 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 create", 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-Create-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// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002290func (oo *OmciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002291 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002292 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002293 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2294 "SequNo": strconv.FormatInt(int64(tid), 16),
2295 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2296
2297 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2298 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002299 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002300 if err != nil {
2301 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002302 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002303 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002304 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002305 if err != nil {
2306 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002307 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002308 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002309 omciRxCallbackPair := CallbackPair{
2310 CbKey: tid,
2311 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002312 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002313 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002314 if err != nil {
2315 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002316 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002317 }
2318 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002319 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002320 }
2321 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002322 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002323
2324}
2325
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002326// SendDeleteTD - TODO: add comment
2327func (oo *OmciCC) SendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002328 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002329 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002330 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2331 "SequNo": strconv.FormatInt(int64(tid), 16),
2332 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2333
2334 meParams := me.ParamData{EntityID: aInstID}
2335 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2336 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002337 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid))
ozgecanetsiab6441962021-03-10 10:58:48 +03002338 if err != nil {
2339 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002340 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002341 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002342 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab6441962021-03-10 10:58:48 +03002343 if err != nil {
2344 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002345 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002346 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002347 omciRxCallbackPair := CallbackPair{
2348 CbKey: tid,
2349 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002350 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002351 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002352 if err != nil {
2353 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002354 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002355 }
2356 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002357 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002358 }
2359 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002360 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002361
2362}
2363
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002364// SendDeleteGemIWTP deletes GemInterworkingTerminationPoint ME instance
2365func (oo *OmciCC) SendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002366 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002367 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002368 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002369 "SequNo": strconv.FormatInt(int64(tid), 16),
2370 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2371
2372 meParams := me.ParamData{EntityID: aInstID}
2373 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2374 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002375 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2376 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002377 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002378 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002379 "Err": err, "device-id": oo.deviceID})
2380 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2381 // return (dual format) error code that can be used at caller for immediate error treatment
2382 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002383 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002384 }
2385
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002386 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002387 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002388 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002389 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002390 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002391 }
2392
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002393 omciRxCallbackPair := CallbackPair{
2394 CbKey: tid,
2395 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002396 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002397 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002398 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002399 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002400 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002401 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002402 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002403 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002404 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002405 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002406 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002407 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002408 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002409}
2410
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002411// SendDeleteGemNCTP deletes GemPortNetworkCtp ME instance
2412func (oo *OmciCC) SendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002413 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002414 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002415 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002416 "SequNo": strconv.FormatInt(int64(tid), 16),
2417 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2418
2419 meParams := me.ParamData{EntityID: aInstID}
2420 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2421 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002422 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2423 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002424 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002425 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002426 "Err": err, "device-id": oo.deviceID})
2427 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2428 // return (dual format) error code that can be used at caller for immediate error treatment
2429 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002430 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002431 }
2432
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002433 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002434 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002435 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002436 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002437 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002438 }
2439
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002440 omciRxCallbackPair := CallbackPair{
2441 CbKey: tid,
2442 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002443 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002444 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002445 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002446 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002447 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002448 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002449 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002450 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002451 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002452 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002453 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002454 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002455 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002456}
2457
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002458// SendDeleteDot1PMapper deletes Ieee8021PMapperServiceProfile ME instance
2459func (oo *OmciCC) SendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002460 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002461 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002462 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002463 "SequNo": strconv.FormatInt(int64(tid), 16),
2464 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2465
2466 meParams := me.ParamData{EntityID: aInstID}
2467 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2468 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002469 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2470 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002471 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002472 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002473 "Err": err, "device-id": oo.deviceID})
2474 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2475 // return (dual format) error code that can be used at caller for immediate error treatment
2476 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002477 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002478 }
2479
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002480 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002481 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002482 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002483 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002484 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002485 }
2486
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002487 omciRxCallbackPair := CallbackPair{
2488 CbKey: tid,
2489 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002490 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002491 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002492 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002493 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002494 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002495 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002496 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002497 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002498 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002499 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002500 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002501 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002502 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002503}
2504
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002505// SendDeleteMBPConfigData deletes MacBridgePortConfigurationData ME instance
2506func (oo *OmciCC) SendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002507 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002508 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002509 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002510 "SequNo": strconv.FormatInt(int64(tid), 16),
2511 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2512
2513 meParams := me.ParamData{EntityID: aInstID}
2514 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2515 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002516 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2517 oframe.TransactionID(tid))
mpagenko8b07c1b2020-11-26 10:36:31 +00002518 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002519 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002520 "Err": err, "device-id": oo.deviceID})
2521 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2522 // return (dual format) error code that can be used at caller for immediate error treatment
2523 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002524 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002525 }
2526
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002527 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002528 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002529 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002530 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002531 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002532 }
2533
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002534 omciRxCallbackPair := CallbackPair{
2535 CbKey: tid,
2536 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002537 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002538 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002539 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002540 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002541 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002542 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002543 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002544 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002545 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002546 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002547 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002548 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002549 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002550}
2551
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002552// SendCreateMulticastGemIWTPVar creates MulticastGemInterworkingTerminationPoint ME instance
2553func (oo *OmciCC) SendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002554 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002555 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002556 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002557 "SequNo": strconv.FormatInt(int64(tid), 16),
2558 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2559
2560 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2561 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002562 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2563 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002564 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002565 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002566 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002567 }
2568
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002569 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002570 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002571 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002572 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002573 }
2574
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002575 omciRxCallbackPair := CallbackPair{CbKey: tid,
2576 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002577 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002578 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002579 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002580 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002581 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002582 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002583 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002584 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002585 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002586 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002587 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002588 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002589}
2590
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002591// SendSetMulticastGemIWTPVar sets MulticastGemInterworkingTerminationPoint ME instance
2592func (oo *OmciCC) SendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002593 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002594 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002595 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002596 "SequNo": strconv.FormatInt(int64(tid), 16),
2597 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2598
2599 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2600 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002601 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2602 oframe.AddDefaults(true))
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002603 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002604 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002605 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002606 }
2607
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002608 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002609 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002610 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002611 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002612 }
2613
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002614 omciRxCallbackPair := CallbackPair{CbKey: tid,
2615 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002616 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002617 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002618 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002619 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002620 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002621 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002622 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002623 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002624 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002625 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002626 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002627 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002628}
2629
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002630// SendCreateMulticastOperationProfileVar creates MulticastOperationsProfile ME instance
2631func (oo *OmciCC) SendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002632 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002633 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002634 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002635 "SequNo": strconv.FormatInt(int64(tid), 16),
2636 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2637
2638 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2639 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002640 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2641 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002642 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002643 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002644 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002645 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002646 }
2647
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002648 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002649 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002650 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002651 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002652 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002653 }
2654
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002655 omciRxCallbackPair := CallbackPair{CbKey: tid,
2656 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002657 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002658 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002659 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002660 logger.Errorw(ctx, "Cannot send MulticastOperationProfile 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 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002664 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002665 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002666 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002667 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002668 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002669 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002670}
2671
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002672// SendSetMulticastOperationProfileVar sets MulticastOperationsProfile ME instance
2673func (oo *OmciCC) SendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002674 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002675 tid := oo.GetNextTid(highPrio)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002676 logger.Debugw(ctx, "send MulticastOperationProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002677 "SequNo": strconv.FormatInt(int64(tid), 16),
2678 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2679
2680 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2681 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002682 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2683 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002684 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002685 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002686 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002687 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002688 }
2689
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002690 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002691 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002692 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002693 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002694 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002695 }
2696
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002697 omciRxCallbackPair := CallbackPair{CbKey: tid,
2698 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002699 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002700 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002701 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002702 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002703 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002704 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002705 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002706 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002707 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002708 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002709 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002710 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002711 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002712}
2713
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002714// SendCreateMulticastSubConfigInfoVar creates MulticastSubscriberConfigInfo ME instance
2715func (oo *OmciCC) SendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002716 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002717 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002718 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002719 "SequNo": strconv.FormatInt(int64(tid), 16),
2720 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2721
2722 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2723 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002724 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2725 oframe.AddDefaults(true))
ozgecanetsia422dbf32020-10-28 14:07:19 +03002726 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002727 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002728 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002729 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002730 }
2731
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002732 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002733 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002734 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002735 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002736 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002737 }
2738
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002739 omciRxCallbackPair := CallbackPair{CbKey: tid,
2740 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002741 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002742 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002743 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002744 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002745 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002746 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002747 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002748 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002749 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002750 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002751 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002752 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002753 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002754}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002755
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002756// SendCreateVoipVoiceCTP nolint: unused
2757func (oo *OmciCC) SendCreateVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2758 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2759 tid := oo.GetNextTid(highPrio)
2760 logger.Debugw(ctx, "send VoipVoiceCTP-create-msg:", log.Fields{"device-id": oo.deviceID,
2761 "SequNo": strconv.FormatInt(int64(tid), 16),
2762 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2763
2764 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2765 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002766 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2767 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002768 if err != nil {
2769 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for create", log.Fields{"Err": err,
2770 "device-id": oo.deviceID})
2771 return nil, err
2772 }
2773
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002774 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002775 if err != nil {
2776 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP create", log.Fields{"Err": err,
2777 "device-id": oo.deviceID})
2778 return nil, err
2779 }
2780
2781 omciRxCallbackPair := CallbackPair{CbKey: tid,
2782 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2783 }
2784 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2785 if err != nil {
2786 logger.Errorw(ctx, "Cannot send VoipVoiceCTP create", log.Fields{"Err": err,
2787 "device-id": oo.deviceID})
2788 return nil, err
2789 }
2790 logger.Debug(ctx, "send VoipVoiceCTP-create-msg done")
2791 return meInstance, nil
2792 }
2793 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2794 "device-id": oo.deviceID})
2795 return nil, omciErr.GetError()
2796}
2797
2798// SendSetVoipVoiceCTP nolint: unused
2799func (oo *OmciCC) SendSetVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2800 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2801 tid := oo.GetNextTid(highPrio)
2802 logger.Debugw(ctx, "send VoipVoiceCTP-set-msg:", log.Fields{"device-id": oo.deviceID,
2803 "SequNo": strconv.FormatInt(int64(tid), 16),
2804 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2805
2806 meInstance, omciErr := me.NewVoipVoiceCtp(params[0])
2807 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002808 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2809 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002810 if err != nil {
2811 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for set", log.Fields{"Err": err,
2812 "device-id": oo.deviceID})
2813 return nil, err
2814 }
2815
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002816 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002817 if err != nil {
2818 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP set", log.Fields{"Err": err,
2819 "device-id": oo.deviceID})
2820 return nil, err
2821 }
2822
2823 omciRxCallbackPair := CallbackPair{CbKey: tid,
2824 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2825 }
2826 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2827 if err != nil {
2828 logger.Errorw(ctx, "Cannot send VoipVoiceCTP set", log.Fields{"Err": err,
2829 "device-id": oo.deviceID})
2830 return nil, err
2831 }
2832 logger.Debug(ctx, "send VoipVoiceCTP-set-msg done")
2833 return meInstance, nil
2834 }
2835 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance", log.Fields{"Err": omciErr.GetError(),
2836 "device-id": oo.deviceID})
2837 return nil, omciErr.GetError()
2838}
2839
2840// SendDeleteVoipVoiceCTP nolint: unused
2841func (oo *OmciCC) SendDeleteVoipVoiceCTP(ctx context.Context, timeout int, highPrio bool,
2842 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2843 tid := oo.GetNextTid(highPrio)
2844 logger.Debugw(ctx, "send VoipVoiceCTP-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2845 "SequNo": strconv.FormatInt(int64(tid), 16),
2846 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2847
2848 meParams := me.ParamData{EntityID: aInstID}
2849 meInstance, omciErr := me.NewVoipVoiceCtp(meParams)
2850 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002851 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2852 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002853 if err != nil {
2854 logger.Errorw(ctx, "Cannot encode VoipVoiceCTP for delete", log.Fields{
2855 "Err": err, "device-id": oo.deviceID})
2856 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2857 // return (dual format) error code that can be used at caller for immediate error treatment
2858 // (relevant to all used sendXX() methods and their error conditions)
2859 return nil, err
2860 }
2861
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002862 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002863 if err != nil {
2864 logger.Errorw(ctx, "Cannot serialize VoipVoiceCTP delete", log.Fields{
2865 "Err": err, "device-id": oo.deviceID})
2866 return nil, err
2867 }
2868
2869 omciRxCallbackPair := CallbackPair{
2870 CbKey: tid,
2871 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2872 }
2873 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2874 if err != nil {
2875 logger.Errorw(ctx, "Cannot send VoipVoiceCTP delete", log.Fields{
2876 "Err": err, "device-id": oo.deviceID})
2877 return nil, err
2878 }
2879 logger.Debug(ctx, "send VoipVoiceCTP-Delete-msg done")
2880 return meInstance, nil
2881 }
2882 logger.Errorw(ctx, "Cannot generate VoipVoiceCTP Instance for delete", log.Fields{
2883 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2884 return nil, omciErr.GetError()
2885}
2886
2887// SendCreateVoipMediaProfile nolint: unused
2888func (oo *OmciCC) SendCreateVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2889 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2890 tid := oo.GetNextTid(highPrio)
2891 logger.Debugw(ctx, "send VoipMediaProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
2892 "SequNo": strconv.FormatInt(int64(tid), 16),
2893 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2894
2895 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2896 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002897 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
2898 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002899 if err != nil {
2900 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for create", log.Fields{"Err": err,
2901 "device-id": oo.deviceID})
2902 return nil, err
2903 }
2904
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002905 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002906 if err != nil {
2907 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile create", log.Fields{"Err": err,
2908 "device-id": oo.deviceID})
2909 return nil, err
2910 }
2911
2912 omciRxCallbackPair := CallbackPair{CbKey: tid,
2913 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2914 }
2915 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2916 if err != nil {
2917 logger.Errorw(ctx, "Cannot send VoipMediaProfile create", log.Fields{"Err": err,
2918 "device-id": oo.deviceID})
2919 return nil, err
2920 }
2921 logger.Debug(ctx, "send VoipMediaProfile-create-msg done")
2922 return meInstance, nil
2923 }
2924 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2925 "device-id": oo.deviceID})
2926 return nil, omciErr.GetError()
2927}
2928
2929// SendSetVoipMediaProfile nolint: unused
2930func (oo *OmciCC) SendSetVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2931 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2932 tid := oo.GetNextTid(highPrio)
2933 logger.Debugw(ctx, "send VoipMediaProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
2934 "SequNo": strconv.FormatInt(int64(tid), 16),
2935 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2936
2937 meInstance, omciErr := me.NewVoipMediaProfile(params[0])
2938 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002939 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
2940 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002941 if err != nil {
2942 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for set", log.Fields{"Err": err,
2943 "device-id": oo.deviceID})
2944 return nil, err
2945 }
2946
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002947 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002948 if err != nil {
2949 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile set", log.Fields{"Err": err,
2950 "device-id": oo.deviceID})
2951 return nil, err
2952 }
2953
2954 omciRxCallbackPair := CallbackPair{CbKey: tid,
2955 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2956 }
2957 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
2958 if err != nil {
2959 logger.Errorw(ctx, "Cannot send VoipMediaProfile set", log.Fields{"Err": err,
2960 "device-id": oo.deviceID})
2961 return nil, err
2962 }
2963 logger.Debug(ctx, "send VoipMediaProfile-set-msg done")
2964 return meInstance, nil
2965 }
2966 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance", log.Fields{"Err": omciErr.GetError(),
2967 "device-id": oo.deviceID})
2968 return nil, omciErr.GetError()
2969}
2970
2971// SendDeleteVoipMediaProfile nolint: unused
2972func (oo *OmciCC) SendDeleteVoipMediaProfile(ctx context.Context, timeout int, highPrio bool,
2973 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
2974 tid := oo.GetNextTid(highPrio)
2975 logger.Debugw(ctx, "send VoipMediaProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2976 "SequNo": strconv.FormatInt(int64(tid), 16),
2977 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2978
2979 meParams := me.ParamData{EntityID: aInstID}
2980 meInstance, omciErr := me.NewVoipMediaProfile(meParams)
2981 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00002982 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
2983 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002984 if err != nil {
2985 logger.Errorw(ctx, "Cannot encode VoipMediaProfile for delete", log.Fields{
2986 "Err": err, "device-id": oo.deviceID})
2987 return nil, err
2988 }
2989
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00002990 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03002991 if err != nil {
2992 logger.Errorw(ctx, "Cannot serialize VoipMediaProfile delete", log.Fields{
2993 "Err": err, "device-id": oo.deviceID})
2994 return nil, err
2995 }
2996
2997 omciRxCallbackPair := CallbackPair{
2998 CbKey: tid,
2999 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3000 }
3001 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3002 if err != nil {
3003 logger.Errorw(ctx, "Cannot send VoipMediaProfile delete", log.Fields{
3004 "Err": err, "device-id": oo.deviceID})
3005 return nil, err
3006 }
3007 logger.Debug(ctx, "send VoipMediaProfile-Delete-msg done")
3008 return meInstance, nil
3009 }
3010 logger.Errorw(ctx, "Cannot generate VoipMediaProfile Instance for delete", log.Fields{
3011 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3012 return nil, omciErr.GetError()
3013}
3014
3015// SendCreateVoiceServiceProfile nolint: unused
3016func (oo *OmciCC) SendCreateVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3017 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3018 tid := oo.GetNextTid(highPrio)
3019 logger.Debugw(ctx, "send VoiceServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3020 "SequNo": strconv.FormatInt(int64(tid), 16),
3021 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3022
3023 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3024 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003025 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3026 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003027 if err != nil {
3028 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for create", log.Fields{"Err": err,
3029 "device-id": oo.deviceID})
3030 return nil, err
3031 }
3032
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003033 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003034 if err != nil {
3035 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile create", log.Fields{"Err": err,
3036 "device-id": oo.deviceID})
3037 return nil, err
3038 }
3039
3040 omciRxCallbackPair := CallbackPair{CbKey: tid,
3041 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3042 }
3043 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3044 if err != nil {
3045 logger.Errorw(ctx, "Cannot send VoiceServiceProfile create", log.Fields{"Err": err,
3046 "device-id": oo.deviceID})
3047 return nil, err
3048 }
3049 logger.Debug(ctx, "send VoiceServiceProfile-create-msg done")
3050 return meInstance, nil
3051 }
3052 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3053 "device-id": oo.deviceID})
3054 return nil, omciErr.GetError()
3055}
3056
3057// SendSetVoiceServiceProfile nolint: unused
3058func (oo *OmciCC) SendSetVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3059 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3060 tid := oo.GetNextTid(highPrio)
3061 logger.Debugw(ctx, "send VoiceServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3062 "SequNo": strconv.FormatInt(int64(tid), 16),
3063 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3064
3065 meInstance, omciErr := me.NewVoiceServiceProfile(params[0])
3066 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003067 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3068 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003069 if err != nil {
3070 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for set", log.Fields{"Err": err,
3071 "device-id": oo.deviceID})
3072 return nil, err
3073 }
3074
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003075 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003076 if err != nil {
3077 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile set", log.Fields{"Err": err,
3078 "device-id": oo.deviceID})
3079 return nil, err
3080 }
3081
3082 omciRxCallbackPair := CallbackPair{CbKey: tid,
3083 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3084 }
3085 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3086 if err != nil {
3087 logger.Errorw(ctx, "Cannot send VoiceServiceProfile set", log.Fields{"Err": err,
3088 "device-id": oo.deviceID})
3089 return nil, err
3090 }
3091 logger.Debug(ctx, "send VoiceServiceProfile-set-msg done")
3092 return meInstance, nil
3093 }
3094 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3095 "device-id": oo.deviceID})
3096 return nil, omciErr.GetError()
3097}
3098
3099// SendDeleteVoiceServiceProfile nolint: unused
3100func (oo *OmciCC) SendDeleteVoiceServiceProfile(ctx context.Context, timeout int, highPrio bool,
3101 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3102 tid := oo.GetNextTid(highPrio)
3103 logger.Debugw(ctx, "send VoiceServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3104 "SequNo": strconv.FormatInt(int64(tid), 16),
3105 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3106
3107 meParams := me.ParamData{EntityID: aInstID}
3108 meInstance, omciErr := me.NewVoiceServiceProfile(meParams)
3109 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003110 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3111 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003112 if err != nil {
3113 logger.Errorw(ctx, "Cannot encode VoiceServiceProfile for delete", log.Fields{
3114 "Err": err, "device-id": oo.deviceID})
3115 return nil, err
3116 }
3117
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003118 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003119 if err != nil {
3120 logger.Errorw(ctx, "Cannot serialize VoiceServiceProfile delete", log.Fields{
3121 "Err": err, "device-id": oo.deviceID})
3122 return nil, err
3123 }
3124
3125 omciRxCallbackPair := CallbackPair{
3126 CbKey: tid,
3127 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3128 }
3129 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3130 if err != nil {
3131 logger.Errorw(ctx, "Cannot send VoiceServiceProfile delete", log.Fields{
3132 "Err": err, "device-id": oo.deviceID})
3133 return nil, err
3134 }
3135 logger.Debug(ctx, "send VoiceServiceProfile-Delete-msg done")
3136 return meInstance, nil
3137 }
3138 logger.Errorw(ctx, "Cannot generate VoiceServiceProfile Instance for delete", log.Fields{
3139 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3140 return nil, omciErr.GetError()
3141}
3142
3143// SendCreateSIPUserData nolint: unused
3144func (oo *OmciCC) SendCreateSIPUserData(ctx context.Context, timeout int, highPrio bool,
3145 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3146 tid := oo.GetNextTid(highPrio)
3147 logger.Debugw(ctx, "send SIPUserData-create-msg:", log.Fields{"device-id": oo.deviceID,
3148 "SequNo": strconv.FormatInt(int64(tid), 16),
3149 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3150
3151 meInstance, omciErr := me.NewSipUserData(params[0])
3152 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003153 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3154 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003155 if err != nil {
3156 logger.Errorw(ctx, "Cannot encode SIPUserData for create", log.Fields{"Err": err,
3157 "device-id": oo.deviceID})
3158 return nil, err
3159 }
3160
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003161 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003162 if err != nil {
3163 logger.Errorw(ctx, "Cannot serialize SIPUserData create", log.Fields{"Err": err,
3164 "device-id": oo.deviceID})
3165 return nil, err
3166 }
3167
3168 omciRxCallbackPair := CallbackPair{CbKey: tid,
3169 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3170 }
3171 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3172 if err != nil {
3173 logger.Errorw(ctx, "Cannot send SIPUserData create", log.Fields{"Err": err,
3174 "device-id": oo.deviceID})
3175 return nil, err
3176 }
3177 logger.Debug(ctx, "send SIPUserData-create-msg done")
3178 return meInstance, nil
3179 }
3180 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3181 "device-id": oo.deviceID})
3182 return nil, omciErr.GetError()
3183}
3184
3185// SendSetSIPUserData nolint: unused
3186func (oo *OmciCC) SendSetSIPUserData(ctx context.Context, timeout int, highPrio bool,
3187 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3188 tid := oo.GetNextTid(highPrio)
3189 logger.Debugw(ctx, "send SIPUserData-set-msg:", log.Fields{"device-id": oo.deviceID,
3190 "SequNo": strconv.FormatInt(int64(tid), 16),
3191 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3192
3193 meInstance, omciErr := me.NewSipUserData(params[0])
3194 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003195 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3196 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003197 if err != nil {
3198 logger.Errorw(ctx, "Cannot encode SIPUserData for set", log.Fields{"Err": err,
3199 "device-id": oo.deviceID})
3200 return nil, err
3201 }
3202
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003203 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003204 if err != nil {
3205 logger.Errorw(ctx, "Cannot serialize SIPUserData set", log.Fields{"Err": err,
3206 "device-id": oo.deviceID})
3207 return nil, err
3208 }
3209
3210 omciRxCallbackPair := CallbackPair{CbKey: tid,
3211 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3212 }
3213 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3214 if err != nil {
3215 logger.Errorw(ctx, "Cannot send SIPUserData set", log.Fields{"Err": err,
3216 "device-id": oo.deviceID})
3217 return nil, err
3218 }
3219 logger.Debug(ctx, "send SIPUserData-set-msg done")
3220 return meInstance, nil
3221 }
3222 logger.Errorw(ctx, "Cannot generate SIPUserData Instance", log.Fields{"Err": omciErr.GetError(),
3223 "device-id": oo.deviceID})
3224 return nil, omciErr.GetError()
3225}
3226
3227// SendDeleteSIPUserData nolint: unused
3228func (oo *OmciCC) SendDeleteSIPUserData(ctx context.Context, timeout int, highPrio bool,
3229 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3230 tid := oo.GetNextTid(highPrio)
3231 logger.Debugw(ctx, "send SIPUserData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3232 "SequNo": strconv.FormatInt(int64(tid), 16),
3233 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3234
3235 meParams := me.ParamData{EntityID: aInstID}
3236 meInstance, omciErr := me.NewSipUserData(meParams)
3237 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003238 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3239 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003240 if err != nil {
3241 logger.Errorw(ctx, "Cannot encode SIPUserData for delete", log.Fields{
3242 "Err": err, "device-id": oo.deviceID})
3243 return nil, err
3244 }
3245
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003246 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003247 if err != nil {
3248 logger.Errorw(ctx, "Cannot serialize SIPUserData delete", log.Fields{
3249 "Err": err, "device-id": oo.deviceID})
3250 return nil, err
3251 }
3252
3253 omciRxCallbackPair := CallbackPair{
3254 CbKey: tid,
3255 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3256 }
3257 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3258 if err != nil {
3259 logger.Errorw(ctx, "Cannot send SIPUserData delete", log.Fields{
3260 "Err": err, "device-id": oo.deviceID})
3261 return nil, err
3262 }
3263 logger.Debug(ctx, "send SIPUserData-Delete-msg done")
3264 return meInstance, nil
3265 }
3266 logger.Errorw(ctx, "Cannot generate SIPUserData Instance for delete", log.Fields{
3267 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3268 return nil, omciErr.GetError()
3269}
3270
3271// SendCreateVoipApplicationServiceProfile nolint: unused
3272func (oo *OmciCC) SendCreateVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3273 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3274 tid := oo.GetNextTid(highPrio)
3275 logger.Debugw(ctx, "send VoipApplicationServiceProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
3276 "SequNo": strconv.FormatInt(int64(tid), 16),
3277 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3278
3279 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3280 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003281 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3282 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003283 if err != nil {
3284 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for create", log.Fields{"Err": err,
3285 "device-id": oo.deviceID})
3286 return nil, err
3287 }
3288
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003289 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003290 if err != nil {
3291 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile create", log.Fields{"Err": err,
3292 "device-id": oo.deviceID})
3293 return nil, err
3294 }
3295
3296 omciRxCallbackPair := CallbackPair{CbKey: tid,
3297 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3298 }
3299 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3300 if err != nil {
3301 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile create", log.Fields{"Err": err,
3302 "device-id": oo.deviceID})
3303 return nil, err
3304 }
3305 logger.Debug(ctx, "send VoipApplicationServiceProfile-create-msg done")
3306 return meInstance, nil
3307 }
3308 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3309 "device-id": oo.deviceID})
3310 return nil, omciErr.GetError()
3311}
3312
3313// SendSetVoipApplicationServiceProfile nolint: unused
3314func (oo *OmciCC) SendSetVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3315 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3316 tid := oo.GetNextTid(highPrio)
3317 logger.Debugw(ctx, "send VoipApplicationServiceProfile-set-msg:", log.Fields{"device-id": oo.deviceID,
3318 "SequNo": strconv.FormatInt(int64(tid), 16),
3319 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3320
3321 meInstance, omciErr := me.NewVoipApplicationServiceProfile(params[0])
3322 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003323 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3324 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003325 if err != nil {
3326 logger.Errorw(ctx, "Cannot encode VoipApplicationServiceProfile for set", log.Fields{"Err": err,
3327 "device-id": oo.deviceID})
3328 return nil, err
3329 }
3330
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003331 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003332 if err != nil {
3333 logger.Errorw(ctx, "Cannot serialize VoipApplicationServiceProfile set", log.Fields{"Err": err,
3334 "device-id": oo.deviceID})
3335 return nil, err
3336 }
3337
3338 omciRxCallbackPair := CallbackPair{CbKey: tid,
3339 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3340 }
3341 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3342 if err != nil {
3343 logger.Errorw(ctx, "Cannot send VoipApplicationServiceProfile set", log.Fields{"Err": err,
3344 "device-id": oo.deviceID})
3345 return nil, err
3346 }
3347 logger.Debug(ctx, "send VoipApplicationServiceProfile-set-msg done")
3348 return meInstance, nil
3349 }
3350 logger.Errorw(ctx, "Cannot generate VoipApplicationServiceProfile Instance", log.Fields{"Err": omciErr.GetError(),
3351 "device-id": oo.deviceID})
3352 return nil, omciErr.GetError()
3353}
3354
3355// SendDeleteVoipApplicationServiceProfile nolint: unused
3356func (oo *OmciCC) SendDeleteVoipApplicationServiceProfile(ctx context.Context, timeout int, highPrio bool,
3357 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3358 tid := oo.GetNextTid(highPrio)
3359 logger.Debugw(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3360 "SequNo": strconv.FormatInt(int64(tid), 16),
3361 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3362
3363 meParams := me.ParamData{EntityID: aInstID}
3364 meInstance, omciErr := me.NewVoipApplicationServiceProfile(meParams)
3365 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003366 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3367 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003368 if err != nil {
3369 logger.Errorw(ctx, "Cannot encode SIPVoipApplicationServiceProfile for delete", log.Fields{
3370 "Err": err, "device-id": oo.deviceID})
3371 return nil, err
3372 }
3373
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003374 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003375 if err != nil {
3376 logger.Errorw(ctx, "Cannot serialize SIPVoipApplicationServiceProfile delete", log.Fields{
3377 "Err": err, "device-id": oo.deviceID})
3378 return nil, err
3379 }
3380
3381 omciRxCallbackPair := CallbackPair{
3382 CbKey: tid,
3383 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3384 }
3385 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3386 if err != nil {
3387 logger.Errorw(ctx, "Cannot send SIPVoipApplicationServiceProfile delete", log.Fields{
3388 "Err": err, "device-id": oo.deviceID})
3389 return nil, err
3390 }
3391 logger.Debug(ctx, "send SIPVoipApplicationServiceProfile-Delete-msg done")
3392 return meInstance, nil
3393 }
3394 logger.Errorw(ctx, "Cannot generate SIPVoipApplicationServiceProfile Instance for delete", log.Fields{
3395 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3396 return nil, omciErr.GetError()
3397}
3398
3399// SendCreateSIPAgentConfigData nolint: unused
3400func (oo *OmciCC) SendCreateSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3401 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3402 tid := oo.GetNextTid(highPrio)
3403 logger.Debugw(ctx, "send SIPAgentConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3404 "SequNo": strconv.FormatInt(int64(tid), 16),
3405 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3406
3407 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3408 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003409 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3410 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003411 if err != nil {
3412 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for create", log.Fields{"Err": err,
3413 "device-id": oo.deviceID})
3414 return nil, err
3415 }
3416
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003417 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003418 if err != nil {
3419 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData create", log.Fields{"Err": err,
3420 "device-id": oo.deviceID})
3421 return nil, err
3422 }
3423
3424 omciRxCallbackPair := CallbackPair{CbKey: tid,
3425 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3426 }
3427 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3428 if err != nil {
3429 logger.Errorw(ctx, "Cannot send SIPAgentConfigData create", log.Fields{"Err": err,
3430 "device-id": oo.deviceID})
3431 return nil, err
3432 }
3433 logger.Debug(ctx, "send SIPAgentConfigData-create-msg done")
3434 return meInstance, nil
3435 }
3436 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3437 "device-id": oo.deviceID})
3438 return nil, omciErr.GetError()
3439}
3440
3441// SendSetSIPAgentConfigData nolint: unused
3442func (oo *OmciCC) SendSetSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3443 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3444 tid := oo.GetNextTid(highPrio)
3445 logger.Debugw(ctx, "send SIPAgentConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3446 "SequNo": strconv.FormatInt(int64(tid), 16),
3447 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3448
3449 meInstance, omciErr := me.NewSipAgentConfigData(params[0])
3450 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003451 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3452 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003453 if err != nil {
3454 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for set", log.Fields{"Err": err,
3455 "device-id": oo.deviceID})
3456 return nil, err
3457 }
3458
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003459 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003460 if err != nil {
3461 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData set", log.Fields{"Err": err,
3462 "device-id": oo.deviceID})
3463 return nil, err
3464 }
3465
3466 omciRxCallbackPair := CallbackPair{CbKey: tid,
3467 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3468 }
3469 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3470 if err != nil {
3471 logger.Errorw(ctx, "Cannot send SIPAgentConfigData set", log.Fields{"Err": err,
3472 "device-id": oo.deviceID})
3473 return nil, err
3474 }
3475 logger.Debug(ctx, "send SIPAgentConfigData-set-msg done")
3476 return meInstance, nil
3477 }
3478 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3479 "device-id": oo.deviceID})
3480 return nil, omciErr.GetError()
3481}
3482
3483// SendDeleteSIPAgentConfigData nolint: unused
3484func (oo *OmciCC) SendDeleteSIPAgentConfigData(ctx context.Context, timeout int, highPrio bool,
3485 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3486 tid := oo.GetNextTid(highPrio)
3487 logger.Debugw(ctx, "send SIPAgentConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3488 "SequNo": strconv.FormatInt(int64(tid), 16),
3489 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3490
3491 meParams := me.ParamData{EntityID: aInstID}
3492 meInstance, omciErr := me.NewSipAgentConfigData(meParams)
3493 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003494 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3495 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003496 if err != nil {
3497 logger.Errorw(ctx, "Cannot encode SIPAgentConfigData for delete", log.Fields{
3498 "Err": err, "device-id": oo.deviceID})
3499 return nil, err
3500 }
3501
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003502 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003503 if err != nil {
3504 logger.Errorw(ctx, "Cannot serialize SIPAgentConfigData delete", log.Fields{
3505 "Err": err, "device-id": oo.deviceID})
3506 return nil, err
3507 }
3508
3509 omciRxCallbackPair := CallbackPair{
3510 CbKey: tid,
3511 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3512 }
3513 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3514 if err != nil {
3515 logger.Errorw(ctx, "Cannot send SIPAgentConfigData delete", log.Fields{
3516 "Err": err, "device-id": oo.deviceID})
3517 return nil, err
3518 }
3519 logger.Debug(ctx, "send SIPAgentConfigData-Delete-msg done")
3520 return meInstance, nil
3521 }
3522 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3523 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3524 return nil, omciErr.GetError()
3525}
3526
3527// SendCreateTCPUDPConfigData nolint: unused
3528func (oo *OmciCC) SendCreateTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3529 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3530 tid := oo.GetNextTid(highPrio)
3531 logger.Debugw(ctx, "send TCPUDPConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3532 "SequNo": strconv.FormatInt(int64(tid), 16),
3533 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3534
3535 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3536 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003537 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3538 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003539 if err != nil {
3540 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for create", log.Fields{"Err": err,
3541 "device-id": oo.deviceID})
3542 return nil, err
3543 }
3544
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003545 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003546 if err != nil {
3547 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData create", log.Fields{"Err": err,
3548 "device-id": oo.deviceID})
3549 return nil, err
3550 }
3551
3552 omciRxCallbackPair := CallbackPair{CbKey: tid,
3553 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3554 }
3555 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3556 if err != nil {
3557 logger.Errorw(ctx, "Cannot send TCPUDPConfigData create", log.Fields{"Err": err,
3558 "device-id": oo.deviceID})
3559 return nil, err
3560 }
3561 logger.Debug(ctx, "send TCPUDPConfigData-create-msg done")
3562 return meInstance, nil
3563 }
3564 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3565 "device-id": oo.deviceID})
3566 return nil, omciErr.GetError()
3567}
3568
3569// SendSetTCPUDPConfigData nolint: unused
3570func (oo *OmciCC) SendSetTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3571 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3572 tid := oo.GetNextTid(highPrio)
3573 logger.Debugw(ctx, "send TCPUDPConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3574 "SequNo": strconv.FormatInt(int64(tid), 16),
3575 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3576
3577 meInstance, omciErr := me.NewTcpUdpConfigData(params[0])
3578 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003579 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3580 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003581 if err != nil {
3582 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for set", log.Fields{"Err": err,
3583 "device-id": oo.deviceID})
3584 return nil, err
3585 }
3586
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003587 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003588 if err != nil {
3589 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData set", log.Fields{"Err": err,
3590 "device-id": oo.deviceID})
3591 return nil, err
3592 }
3593
3594 omciRxCallbackPair := CallbackPair{CbKey: tid,
3595 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3596 }
3597 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3598 if err != nil {
3599 logger.Errorw(ctx, "Cannot send TCPUDPConfigData set", log.Fields{"Err": err,
3600 "device-id": oo.deviceID})
3601 return nil, err
3602 }
3603 logger.Debug(ctx, "send TCPUDPConfigData-set-msg done")
3604 return meInstance, nil
3605 }
3606 logger.Errorw(ctx, "Cannot generate TCPUDPConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3607 "device-id": oo.deviceID})
3608 return nil, omciErr.GetError()
3609}
3610
3611// SendDeleteTCPUDPConfigData nolint: unused
3612func (oo *OmciCC) SendDeleteTCPUDPConfigData(ctx context.Context, timeout int, highPrio bool,
3613 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3614 tid := oo.GetNextTid(highPrio)
3615 logger.Debugw(ctx, "send TCPUDPConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3616 "SequNo": strconv.FormatInt(int64(tid), 16),
3617 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3618
3619 meParams := me.ParamData{EntityID: aInstID}
3620 meInstance, omciErr := me.NewTcpUdpConfigData(meParams)
3621 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003622 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3623 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003624 if err != nil {
3625 logger.Errorw(ctx, "Cannot encode TCPUDPConfigData for delete", log.Fields{
3626 "Err": err, "device-id": oo.deviceID})
3627 return nil, err
3628 }
3629
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003630 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003631 if err != nil {
3632 logger.Errorw(ctx, "Cannot serialize TCPUDPConfigData delete", log.Fields{
3633 "Err": err, "device-id": oo.deviceID})
3634 return nil, err
3635 }
3636
3637 omciRxCallbackPair := CallbackPair{
3638 CbKey: tid,
3639 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3640 }
3641 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3642 if err != nil {
3643 logger.Errorw(ctx, "Cannot send TCPUDPConfigData delete", log.Fields{
3644 "Err": err, "device-id": oo.deviceID})
3645 return nil, err
3646 }
3647 logger.Debug(ctx, "send TCPUDPConfigData-Delete-msg done")
3648 return meInstance, nil
3649 }
3650 logger.Errorw(ctx, "Cannot generate SIPAgentConfigData Instance for delete", log.Fields{
3651 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3652 return nil, omciErr.GetError()
3653}
3654
3655// SendCreateIPHostConfigData nolint: unused
3656func (oo *OmciCC) SendCreateIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3657 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3658 tid := oo.GetNextTid(highPrio)
3659 logger.Debugw(ctx, "send IPHostConfigData-create-msg:", log.Fields{"device-id": oo.deviceID,
3660 "SequNo": strconv.FormatInt(int64(tid), 16),
3661 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3662
3663 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3664 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003665 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3666 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003667 if err != nil {
3668 logger.Errorw(ctx, "Cannot encode IPHostConfigData for create", log.Fields{"Err": err,
3669 "device-id": oo.deviceID})
3670 return nil, err
3671 }
3672
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003673 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003674 if err != nil {
3675 logger.Errorw(ctx, "Cannot serialize IPHostConfigData create", log.Fields{"Err": err,
3676 "device-id": oo.deviceID})
3677 return nil, err
3678 }
3679
3680 omciRxCallbackPair := CallbackPair{CbKey: tid,
3681 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3682 }
3683 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3684 if err != nil {
3685 logger.Errorw(ctx, "Cannot send IPHostConfigData create", log.Fields{"Err": err,
3686 "device-id": oo.deviceID})
3687 return nil, err
3688 }
3689 logger.Debug(ctx, "send IPHostConfigData-create-msg done")
3690 return meInstance, nil
3691 }
3692 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3693 "device-id": oo.deviceID})
3694 return nil, omciErr.GetError()
3695}
3696
3697// SendSetIPHostConfigData nolint: unused
3698func (oo *OmciCC) SendSetIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3699 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3700 tid := oo.GetNextTid(highPrio)
3701 logger.Debugw(ctx, "send IPHostConfigData-set-msg:", log.Fields{"device-id": oo.deviceID,
3702 "SequNo": strconv.FormatInt(int64(tid), 16),
3703 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3704
3705 meInstance, omciErr := me.NewIpHostConfigData(params[0])
3706 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003707 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3708 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003709 if err != nil {
3710 logger.Errorw(ctx, "Cannot encode IPHostConfigData for set", log.Fields{"Err": err,
3711 "device-id": oo.deviceID})
3712 return nil, err
3713 }
3714
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003715 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003716 if err != nil {
3717 logger.Errorw(ctx, "Cannot serialize IPHostConfigData set", log.Fields{"Err": err,
3718 "device-id": oo.deviceID})
3719 return nil, err
3720 }
3721
3722 omciRxCallbackPair := CallbackPair{CbKey: tid,
3723 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3724 }
3725 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3726 if err != nil {
3727 logger.Errorw(ctx, "Cannot send IPHostConfigData set", log.Fields{"Err": err,
3728 "device-id": oo.deviceID})
3729 return nil, err
3730 }
3731 logger.Debug(ctx, "send IPHostConfigData-set-msg done")
3732 return meInstance, nil
3733 }
3734 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance", log.Fields{"Err": omciErr.GetError(),
3735 "device-id": oo.deviceID})
3736 return nil, omciErr.GetError()
3737}
3738
3739// SendDeleteIPHostConfigData nolint: unused
3740func (oo *OmciCC) SendDeleteIPHostConfigData(ctx context.Context, timeout int, highPrio bool,
3741 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3742 tid := oo.GetNextTid(highPrio)
3743 logger.Debugw(ctx, "send IPHostConfigData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3744 "SequNo": strconv.FormatInt(int64(tid), 16),
3745 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3746
3747 meParams := me.ParamData{EntityID: aInstID}
3748 meInstance, omciErr := me.NewIpHostConfigData(meParams)
3749 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003750 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3751 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003752 if err != nil {
3753 logger.Errorw(ctx, "Cannot encode IPHostConfigData for delete", log.Fields{
3754 "Err": err, "device-id": oo.deviceID})
3755 return nil, err
3756 }
3757
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003758 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003759 if err != nil {
3760 logger.Errorw(ctx, "Cannot serialize IPHostConfigData delete", log.Fields{
3761 "Err": err, "device-id": oo.deviceID})
3762 return nil, err
3763 }
3764
3765 omciRxCallbackPair := CallbackPair{
3766 CbKey: tid,
3767 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3768 }
3769 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3770 if err != nil {
3771 logger.Errorw(ctx, "Cannot send IPHostConfigData delete", log.Fields{
3772 "Err": err, "device-id": oo.deviceID})
3773 return nil, err
3774 }
3775 logger.Debug(ctx, "send IPHostConfigData-Delete-msg done")
3776 return meInstance, nil
3777 }
3778 logger.Errorw(ctx, "Cannot generate IPHostConfigData Instance for delete", log.Fields{
3779 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3780 return nil, omciErr.GetError()
3781}
3782
3783// SendCreateRTPProfileData nolint: unused
3784func (oo *OmciCC) SendCreateRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3785 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3786 tid := oo.GetNextTid(highPrio)
3787 logger.Debugw(ctx, "send RTPProfileData-create-msg:", log.Fields{"device-id": oo.deviceID,
3788 "SequNo": strconv.FormatInt(int64(tid), 16),
3789 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3790
3791 meInstance, omciErr := me.NewRtpProfileData(params[0])
3792 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003793 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3794 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003795 if err != nil {
3796 logger.Errorw(ctx, "Cannot encode RTPProfileData for create", log.Fields{"Err": err,
3797 "device-id": oo.deviceID})
3798 return nil, err
3799 }
3800
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003801 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003802 if err != nil {
3803 logger.Errorw(ctx, "Cannot serialize RTPProfileData create", log.Fields{"Err": err,
3804 "device-id": oo.deviceID})
3805 return nil, err
3806 }
3807
3808 omciRxCallbackPair := CallbackPair{CbKey: tid,
3809 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3810 }
3811 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3812 if err != nil {
3813 logger.Errorw(ctx, "Cannot send RTPProfileData create", log.Fields{"Err": err,
3814 "device-id": oo.deviceID})
3815 return nil, err
3816 }
3817 logger.Debug(ctx, "send RTPProfileData-create-msg done")
3818 return meInstance, nil
3819 }
3820 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3821 "device-id": oo.deviceID})
3822 return nil, omciErr.GetError()
3823}
3824
3825// SendSetRTPProfileData nolint: unused
3826func (oo *OmciCC) SendSetRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3827 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3828 tid := oo.GetNextTid(highPrio)
3829 logger.Debugw(ctx, "send RTPProfileData-set-msg:", log.Fields{"device-id": oo.deviceID,
3830 "SequNo": strconv.FormatInt(int64(tid), 16),
3831 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3832
3833 meInstance, omciErr := me.NewRtpProfileData(params[0])
3834 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003835 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3836 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003837 if err != nil {
3838 logger.Errorw(ctx, "Cannot encode RTPProfileData for set", log.Fields{"Err": err,
3839 "device-id": oo.deviceID})
3840 return nil, err
3841 }
3842
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003843 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003844 if err != nil {
3845 logger.Errorw(ctx, "Cannot serialize RTPProfileData set", log.Fields{"Err": err,
3846 "device-id": oo.deviceID})
3847 return nil, err
3848 }
3849
3850 omciRxCallbackPair := CallbackPair{CbKey: tid,
3851 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3852 }
3853 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3854 if err != nil {
3855 logger.Errorw(ctx, "Cannot send RTPProfileData set", log.Fields{"Err": err,
3856 "device-id": oo.deviceID})
3857 return nil, err
3858 }
3859 logger.Debug(ctx, "send RTPProfileData-set-msg done")
3860 return meInstance, nil
3861 }
3862 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance", log.Fields{"Err": omciErr.GetError(),
3863 "device-id": oo.deviceID})
3864 return nil, omciErr.GetError()
3865}
3866
3867// SendDeleteRTPProfileData nolint: unused
3868func (oo *OmciCC) SendDeleteRTPProfileData(ctx context.Context, timeout int, highPrio bool,
3869 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3870 tid := oo.GetNextTid(highPrio)
3871 logger.Debugw(ctx, "send RTPProfileData-Delete-msg:", log.Fields{"device-id": oo.deviceID,
3872 "SequNo": strconv.FormatInt(int64(tid), 16),
3873 "InstId": strconv.FormatInt(int64(aInstID), 16)})
3874
3875 meParams := me.ParamData{EntityID: aInstID}
3876 meInstance, omciErr := me.NewRtpProfileData(meParams)
3877 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003878 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
3879 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003880 if err != nil {
3881 logger.Errorw(ctx, "Cannot encode RTPProfileData for delete", log.Fields{
3882 "Err": err, "device-id": oo.deviceID})
3883 return nil, err
3884 }
3885
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003886 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003887 if err != nil {
3888 logger.Errorw(ctx, "Cannot serialize RTPProfileData delete", log.Fields{
3889 "Err": err, "device-id": oo.deviceID})
3890 return nil, err
3891 }
3892
3893 omciRxCallbackPair := CallbackPair{
3894 CbKey: tid,
3895 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3896 }
3897 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3898 if err != nil {
3899 logger.Errorw(ctx, "Cannot send RTPProfileData delete", log.Fields{
3900 "Err": err, "device-id": oo.deviceID})
3901 return nil, err
3902 }
3903 logger.Debug(ctx, "send RTPProfileData-Delete-msg done")
3904 return meInstance, nil
3905 }
3906 logger.Errorw(ctx, "Cannot generate RTPProfileData Instance for delete", log.Fields{
3907 "Err": omciErr.GetError(), "device-id": oo.deviceID})
3908 return nil, omciErr.GetError()
3909}
3910
3911// SendCreateNetworkDialPlanTable nolint: unused
3912func (oo *OmciCC) SendCreateNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3913 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3914 tid := oo.GetNextTid(highPrio)
3915 logger.Debugw(ctx, "send NetworkDialPlanTable-create-msg:", log.Fields{"device-id": oo.deviceID,
3916 "SequNo": strconv.FormatInt(int64(tid), 16),
3917 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3918
3919 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3920 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003921 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
3922 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003923 if err != nil {
3924 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for create", log.Fields{"Err": err,
3925 "device-id": oo.deviceID})
3926 return nil, err
3927 }
3928
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003929 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003930 if err != nil {
3931 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable create", log.Fields{"Err": err,
3932 "device-id": oo.deviceID})
3933 return nil, err
3934 }
3935
3936 omciRxCallbackPair := CallbackPair{CbKey: tid,
3937 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3938 }
3939 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3940 if err != nil {
3941 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable create", log.Fields{"Err": err,
3942 "device-id": oo.deviceID})
3943 return nil, err
3944 }
3945 logger.Debug(ctx, "send NetworkDialPlanTable-create-msg done")
3946 return meInstance, nil
3947 }
3948 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3949 "device-id": oo.deviceID})
3950 return nil, omciErr.GetError()
3951}
3952
3953// SendSetNetworkDialPlanTable nolint: unused
3954func (oo *OmciCC) SendSetNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3955 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
3956 tid := oo.GetNextTid(highPrio)
3957 logger.Debugw(ctx, "send NetworkDialPlanTable-set-msg:", log.Fields{"device-id": oo.deviceID,
3958 "SequNo": strconv.FormatInt(int64(tid), 16),
3959 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
3960
3961 meInstance, omciErr := me.NewNetworkDialPlanTable(params[0])
3962 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00003963 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid),
3964 oframe.AddDefaults(true))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003965 if err != nil {
3966 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for set", log.Fields{"Err": err,
3967 "device-id": oo.deviceID})
3968 return nil, err
3969 }
3970
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00003971 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03003972 if err != nil {
3973 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable set", log.Fields{"Err": err,
3974 "device-id": oo.deviceID})
3975 return nil, err
3976 }
3977
3978 omciRxCallbackPair := CallbackPair{CbKey: tid,
3979 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3980 }
3981 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
3982 if err != nil {
3983 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable set", log.Fields{"Err": err,
3984 "device-id": oo.deviceID})
3985 return nil, err
3986 }
3987 logger.Debug(ctx, "send NetworkDialPlanTable-set-msg done")
3988 return meInstance, nil
3989 }
3990 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance", log.Fields{"Err": omciErr.GetError(),
3991 "device-id": oo.deviceID})
3992 return nil, omciErr.GetError()
3993}
3994
3995// SendDeleteNetworkDialPlanTable nolint: unused
3996func (oo *OmciCC) SendDeleteNetworkDialPlanTable(ctx context.Context, timeout int, highPrio bool,
3997 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
3998 tid := oo.GetNextTid(highPrio)
3999 logger.Debugw(ctx, "send NetworkDialPlanTable-Delete-msg:", log.Fields{"device-id": oo.deviceID,
4000 "SequNo": strconv.FormatInt(int64(tid), 16),
4001 "InstId": strconv.FormatInt(int64(aInstID), 16)})
4002
4003 meParams := me.ParamData{EntityID: aInstID}
4004 meInstance, omciErr := me.NewNetworkDialPlanTable(meParams)
4005 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00004006 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.DeleteRequestType,
4007 oframe.TransactionID(tid))
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004008 if err != nil {
4009 logger.Errorw(ctx, "Cannot encode NetworkDialPlanTable for delete", log.Fields{
4010 "Err": err, "device-id": oo.deviceID})
4011 return nil, err
4012 }
4013
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004014 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia0e3111f2021-10-19 18:04:15 +03004015 if err != nil {
4016 logger.Errorw(ctx, "Cannot serialize NetworkDialPlanTable delete", log.Fields{
4017 "Err": err, "device-id": oo.deviceID})
4018 return nil, err
4019 }
4020
4021 omciRxCallbackPair := CallbackPair{
4022 CbKey: tid,
4023 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4024 }
4025 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
4026 if err != nil {
4027 logger.Errorw(ctx, "Cannot send NetworkDialPlanTable delete", log.Fields{
4028 "Err": err, "device-id": oo.deviceID})
4029 return nil, err
4030 }
4031 logger.Debug(ctx, "send NetworkDialPlanTable-Delete-msg done")
4032 return meInstance, nil
4033 }
4034 logger.Errorw(ctx, "Cannot generate NetworkDialPlanTable Instance for delete", log.Fields{
4035 "Err": omciErr.GetError(), "device-id": oo.deviceID})
4036 return nil, omciErr.GetError()
4037}
4038
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004039// SendSyncTime sends SynchronizeTimeRequest
4040func (oo *OmciCC) SendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
4041 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004042 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
4043 "SequNo": strconv.FormatInt(int64(tid), 16)})
4044
4045 omciLayer := &omci.OMCI{
4046 TransactionID: tid,
4047 MessageType: omci.SynchronizeTimeRequestType,
4048 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4049 // Length: 0x28, // Optional, defaults to 40 octets
4050 }
4051 utcTime := time.Now().UTC()
4052 request := &omci.SynchronizeTimeRequest{
4053 MeBasePacket: omci.MeBasePacket{
4054 EntityClass: me.OnuGClassID,
4055 // Default Instance ID is 0
4056 },
4057 Year: uint16(utcTime.Year()),
4058 Month: uint8(utcTime.Month()),
4059 Day: uint8(utcTime.Day()),
4060 Hour: uint8(utcTime.Hour()),
4061 Minute: uint8(utcTime.Minute()),
4062 Second: uint8(utcTime.Second()),
4063 }
4064
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004065 pkt, err := SerializeOmciLayer(ctx, omciLayer, request)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004066 if err != nil {
4067 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
4068 "device-id": oo.deviceID})
4069 return err
4070 }
4071
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004072 omciRxCallbackPair := CallbackPair{CbKey: tid,
4073 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004074 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004075 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004076 if err != nil {
4077 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
4078 "device-id": oo.deviceID})
4079 return err
4080 }
4081 logger.Debug(ctx, "send synchronize time request done")
4082 return nil
4083}
4084
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004085// SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME creates or deletes EthernetFramePerformanceMonitoringHistoryData ME instance
4086func (oo *OmciCC) SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004087 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004088 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004089 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4090 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
4091 meParam := me.ParamData{EntityID: entityID}
4092 var meInstance *me.ManagedEntity
4093 var omciErr me.OmciErrors
4094 if upstream {
4095 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
4096 } else {
4097 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
4098 }
4099 if omciErr.GetError() == nil {
4100 var omciLayer *omci.OMCI
4101 var msgLayer gopacket.SerializableLayer
4102 var err error
4103 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004104 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4105 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004106 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004107 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4108 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004109 }
4110 if err != nil {
4111 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
4112 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004113 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004114 }
4115
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004116 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004117 if err != nil {
4118 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
4119 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004120 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004121 }
4122
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004123 omciRxCallbackPair := CallbackPair{CbKey: tid,
4124 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004125 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004126 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004127 if err != nil {
4128 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
4129 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004130 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004131 }
4132 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
4133 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004134 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004135 }
4136 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
4137 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 +03004138 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004139}
4140
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004141// SendCreateOrDeleteEthernetUniHistoryME creates or deletes EthernetPerformanceMonitoringHistoryData ME instance
4142func (oo *OmciCC) SendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004143 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004144 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004145 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4146 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4147 meParam := me.ParamData{EntityID: entityID}
4148 var meInstance *me.ManagedEntity
4149 var omciErr me.OmciErrors
4150 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
4151
4152 if omciErr.GetError() == nil {
4153 var omciLayer *omci.OMCI
4154 var msgLayer gopacket.SerializableLayer
4155 var err error
4156 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004157 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4158 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004159 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004160 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4161 oframe.AddDefaults(true))
Girish Gowdrae0140f02021-02-02 16:55:09 -08004162 }
4163 if err != nil {
4164 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
4165 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004166 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004167 }
4168
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004169 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004170 if err != nil {
4171 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
4172 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004173 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004174 }
4175
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004176 omciRxCallbackPair := CallbackPair{CbKey: tid,
4177 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08004178 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004179 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08004180 if err != nil {
4181 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
4182 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004183 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08004184 }
4185 logger.Debugw(ctx, "send ethernet uni history data ME done",
4186 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004187 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08004188 }
4189 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
4190 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004191 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08004192}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004193
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004194// SendCreateOrDeleteFecHistoryME creates or deletes FecPerformanceMonitoringHistoryData ME instance
4195func (oo *OmciCC) SendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004196 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004197 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004198 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4199 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4200 meParam := me.ParamData{EntityID: entityID}
4201 var meInstance *me.ManagedEntity
4202 var omciErr me.OmciErrors
4203 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
4204
4205 if omciErr.GetError() == nil {
4206 var omciLayer *omci.OMCI
4207 var msgLayer gopacket.SerializableLayer
4208 var err error
4209 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004210 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4211 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004212 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004213 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4214 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004215 }
4216 if err != nil {
4217 logger.Errorw(ctx, "Cannot encode fec history data ME",
4218 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004219 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004220 }
4221
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004222 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004223 if err != nil {
4224 logger.Errorw(ctx, "Cannot serialize fec history data ME",
4225 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004226 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004227 }
4228
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004229 omciRxCallbackPair := CallbackPair{CbKey: tid,
4230 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004231 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004232 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004233 if err != nil {
4234 logger.Errorw(ctx, "Cannot send fec history data ME",
4235 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004236 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004237 }
4238 logger.Debugw(ctx, "send fec history data ME done",
4239 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004240 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004241 }
4242 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
4243 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004244 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004245}
4246
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004247// SendCreateOrDeleteGemPortHistoryME deletes GemPortNetworkCtpPerformanceMonitoringHistoryData ME instance
4248func (oo *OmciCC) SendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03004249 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004250 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004251 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
4252 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
4253 meParam := me.ParamData{EntityID: entityID}
4254 var meInstance *me.ManagedEntity
4255 var omciErr me.OmciErrors
4256 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
4257
4258 if omciErr.GetError() == nil {
4259 var omciLayer *omci.OMCI
4260 var msgLayer gopacket.SerializableLayer
4261 var err error
4262 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00004263 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
4264 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004265 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00004266 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
4267 oframe.AddDefaults(true))
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004268 }
4269 if err != nil {
4270 logger.Errorw(ctx, "Cannot encode gemport history data ME",
4271 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004272 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004273 }
4274
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00004275 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004276 if err != nil {
4277 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
4278 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004279 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004280 }
4281
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004282 omciRxCallbackPair := CallbackPair{CbKey: tid,
4283 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004284 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004285 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004286 if err != nil {
4287 logger.Errorw(ctx, "Cannot send gemport history data ME",
4288 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004289 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004290 }
4291 logger.Debugw(ctx, "send gemport history data ME done",
4292 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004293 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004294 }
4295 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
4296 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03004297 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08004298}
4299
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004300// SendStartSoftwareDownload sends StartSoftwareDownloadRequest
4301func (oo *OmciCC) SendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004302 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004303 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004304 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4305 "SequNo": strconv.FormatInt(int64(tid), 16),
4306 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4307
4308 omciLayer := &omci.OMCI{
4309 TransactionID: tid,
4310 MessageType: omci.StartSoftwareDownloadRequestType,
4311 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4312 // Length: 0x28, // Optional, defaults to 40 octets
4313 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004314 if aIsExtendedOmci {
4315 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4316 }
mpagenko80622a52021-02-09 16:53:23 +00004317 request := &omci.StartSoftwareDownloadRequest{
4318 MeBasePacket: omci.MeBasePacket{
4319 EntityClass: me.SoftwareImageClassID,
4320 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004321 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004322 },
4323 WindowSize: aDownloadWindowSize,
4324 ImageSize: aFileLen,
4325 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
4326 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
4327 }
4328
4329 var options gopacket.SerializeOptions
4330 options.FixLengths = true
4331 buffer := gopacket.NewSerializeBuffer()
4332 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4333 if err != nil {
4334 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
4335 "device-id": oo.deviceID})
4336 return err
4337 }
4338 outgoingPacket := buffer.Bytes()
4339
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004340 omciRxCallbackPair := CallbackPair{CbKey: tid,
4341 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004342 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004343 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004344 if err != nil {
4345 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
4346 "device-id": oo.deviceID})
4347 return err
4348 }
4349 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004350 return nil
4351}
4352
kesavand011d5162021-11-25 19:21:06 +05304353// PrepareOnuSectionsOfWindow prepares a list of sections for each window
4354//Before invoking this function the oo.mutexTid needs to be be locked so that
4355//GetOnuSwSecNextTid can be invoked without further locking
4356func (oo *OmciCC) PrepareOnuSectionsOfWindow(ctx context.Context,
4357 aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004358 omciMsgsPerWindow *ia.OmciMessages, aIsExtendedOmci bool) (OmciTransferStructure, error) {
kesavand011d5162021-11-25 19:21:06 +05304359 //onuswsections uses only low prioirity tids
4360 tid := oo.GetOnuSwSecNextTid()
4361 logger.Infow(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4362 "SequNo": strconv.FormatInt(int64(tid), 16),
4363 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest, "sectionNo": aDownloadSectionNo, "sectionData": aSection})
4364
4365 var omciTxReq OmciTransferStructure
4366 msgType := omci.DownloadSectionRequestType
4367
4368 if aAckRequest > 0 {
4369 msgType = omci.DownloadSectionRequestWithResponseType
4370
4371 }
4372 omciLayer := &omci.OMCI{
4373 TransactionID: tid,
4374 MessageType: msgType,
4375 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4376 // Length: 0x28, // Optional, defaults to 40 octets
4377 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004378 if aIsExtendedOmci {
4379 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4380 }
kesavand011d5162021-11-25 19:21:06 +05304381 localSectionData := make([]byte, len(aSection))
4382
4383 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
4384 request := &omci.DownloadSectionRequest{
4385 MeBasePacket: omci.MeBasePacket{
4386 EntityClass: me.SoftwareImageClassID,
4387 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004388 Extended: aIsExtendedOmci,
kesavand011d5162021-11-25 19:21:06 +05304389 },
4390 SectionNumber: aDownloadSectionNo,
4391 SectionData: localSectionData,
4392 }
4393
4394 var options gopacket.SerializeOptions
4395 options.FixLengths = true
4396 buffer := gopacket.NewSerializeBuffer()
4397 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4398 if err != nil {
4399 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4400 "device-id": oo.deviceID})
4401 return omciTxReq, err
4402 }
4403 outgoingPacket := buffer.Bytes()
4404
4405 omciMsgsPerWindow.Messages = append(omciMsgsPerWindow.Messages, outgoingPacket)
4406
4407 if aAckRequest > 0 {
4408 // only the last section should have a timeout as an ack is required only for the last section of the window
4409 omciTxReq = OmciTransferStructure{
4410 withFramePrint: true,
4411 OnuSwWindow: omciMsgsPerWindow,
4412 }
4413 return omciTxReq, nil
4414 }
4415
4416 return omciTxReq, nil
4417}
4418
4419//SendOnuSwSectionsWindowWithRxSupervision sends onu swd sections
4420func (oo *OmciCC) SendOnuSwSectionsWindowWithRxSupervision(ctx context.Context,
4421 aOmciTxRequest OmciTransferStructure, aTimeout int, rxChan chan Message) {
4422 if aOmciTxRequest.OnuSwWindow == nil {
4423 logger.Errorw(ctx, "SendOnuSwSectionsWindowWithRxSupervision: omciTxRequest.OnuSwWindow is nil",
4424 log.Fields{"device-id": oo.deviceID})
4425 return
4426
4427 }
4428
4429 tid := oo.GetOnuSwSecLastTid()
4430 logger.Debugw(ctx, "SendOnuSwSectionsWindowWithRxSupervision tid for the last segment is ", log.Fields{"TID": tid})
4431 omciRxCallbackPair := CallbackPair{CbKey: tid,
4432 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
4433 }
4434
4435 aOmciTxRequest.cbPair = omciRxCallbackPair
4436 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": aOmciTxRequest.cbPair.CbKey})
4437 oo.mutexRxSchedMap.Lock()
4438 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
4439 oo.rxSchedulerMap[aOmciTxRequest.cbPair.CbKey] = aOmciTxRequest.cbPair.CbEntry
4440 oo.mutexRxSchedMap.Unlock()
4441
4442 chSuccess := make(chan bool)
4443 aOmciTxRequest.chSuccess = chSuccess
4444 aOmciTxRequest.timeout = aTimeout
4445 aOmciTxRequest.retries = CDefaultRetries
4446
4447 //tid := aOmciTxRequest.cbPair.CbKey
4448 oo.mutexMonReq.Lock()
4449 oo.monitoredRequests[tid] = aOmciTxRequest
4450 oo.mutexMonReq.Unlock()
4451
4452 retries := aOmciTxRequest.retries
4453 retryCounter := 0
4454 if aTimeout == 0 {
4455 logger.Errorw(ctx, "no timeout present for last section of window", log.Fields{"device-id": oo.deviceID})
4456 return
4457 }
4458loop:
4459 for retryCounter <= retries {
4460 // the onu sw sections are enqueued only to the low priority queue
4461 oo.mutexLowPrioTxQueue.Lock()
4462 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4463 oo.mutexLowPrioTxQueue.Unlock()
4464
4465 go oo.sendQueuedRequests(ctx)
4466
4467 select {
4468 case success := <-chSuccess:
4469 if success {
4470 logger.Debugw(ctx, "reqMon: response received in time",
4471 log.Fields{"tid": tid, "device-id": oo.deviceID})
4472 } else {
4473 logger.Debugw(ctx, "reqMon: wait for response aborted",
4474 log.Fields{"tid": tid, "device-id": oo.deviceID})
4475 }
4476 break loop
4477 case <-time.After(time.Duration(aTimeout) * time.Second):
4478 if retryCounter == retries {
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004479 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
kesavand011d5162021-11-25 19:21:06 +05304480 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00004481 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureSwUpgrade, OnuOmciCommunicationFailureSwUpgradeDesc)
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004482 oo.incrementTxTimesouts()
Holger Hildebrandt68854a82022-09-05 07:00:21 +00004483 oo.mutexConsecutiveOmciTimeouts.Lock()
4484 if oo.consecutiveOmciTimeouts < cMaxConsecutiveOmciTimeouts {
4485 oo.consecutiveOmciTimeouts++
4486 oo.mutexConsecutiveOmciTimeouts.Unlock()
4487 } else {
4488 oo.consecutiveOmciTimeouts = 0
4489 oo.mutexConsecutiveOmciTimeouts.Unlock()
4490 oo.mutexOmciAbortInProgress.Lock()
4491 if !oo.omciAbortInProgress {
4492 oo.omciAbortInProgress = true
4493 oo.mutexOmciAbortInProgress.Unlock()
4494 logger.Errorw(ctx, "reqMon: communication aborted - no of max consecutive timeouts reached - stopping device and send ONU device event!",
4495 log.Fields{"tid": tid, "device-id": oo.deviceID})
4496 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationAbortSwUpgrade, OnuOmciCommunicationAbortSwUpgradeDesc)
4497 // stop all running FSM processing
4498 _ = oo.pBaseDeviceHandler.UpdateInterface(ctx)
4499 oo.mutexOmciAbortInProgress.Lock()
4500 oo.omciAbortInProgress = false
4501 oo.mutexOmciAbortInProgress.Unlock()
4502 } else {
4503 oo.mutexOmciAbortInProgress.Unlock()
4504 logger.Infow(ctx, "reqMon: communication aborted - corresponding processing already running",
4505 log.Fields{"tid": tid, "device-id": oo.deviceID})
4506 }
4507 }
kesavand011d5162021-11-25 19:21:06 +05304508 break loop
4509 } else {
4510 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
4511 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004512 oo.incrementTxRetries()
kesavand011d5162021-11-25 19:21:06 +05304513 }
4514 }
4515 retryCounter++
4516 }
4517 oo.mutexMonReq.Lock()
4518 delete(oo.monitoredRequests, tid)
4519 oo.mutexMonReq.Unlock()
4520}
4521
4522func (oo *OmciCC) sendOnuSwSectionsOfWindow(ctx context.Context, omciTxRequest OmciTransferStructure) error {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004523 var lastSection []byte
4524 if omciTxRequest.OnuSwWindow != nil {
4525 lastSection = omciTxRequest.OnuSwWindow.Messages[len(omciTxRequest.OnuSwWindow.Messages)-1]
4526 } else {
4527 logger.Errorw(ctx, "invalid sw window received", log.Fields{"device-id": oo.deviceID})
4528 return fmt.Errorf("invalid sw window received")
4529 }
4530 if omciTxRequest.withFramePrint {
4531 logger.Debugw(ctx, "sw-section-omci-message-to-send:", log.Fields{
kesavand011d5162021-11-25 19:21:06 +05304532 "TxOmciMessage": hex.EncodeToString(lastSection),
4533 "device-id": oo.deviceID,
4534 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
4535 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
4536 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
4537 }
4538 sendErr := oo.pBaseDeviceHandler.SendOnuSwSectionsOfWindow(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciTxRequest.OnuSwWindow)
4539 if sendErr != nil {
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004540 logger.Errorw(ctx, "send onu sw sections omci request error", log.Fields{"device-id": oo.deviceID, "error": sendErr})
kesavand011d5162021-11-25 19:21:06 +05304541 return sendErr
4542 }
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00004543 numberOfNoArSections := len(omciTxRequest.OnuSwWindow.Messages) - 1 // last section of window is sent with AR expected
4544 if lastSection[cOmciDeviceIdentifierPos] == byte(omci.BaselineIdent) {
4545 oo.increaseBaseTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4546 oo.incrementBaseTxArFrames()
4547 } else {
4548 oo.increaseExtTxNoArFramesBy(ctx, uint32(numberOfNoArSections))
4549 oo.incrementExtTxArFrames()
4550 }
kesavand011d5162021-11-25 19:21:06 +05304551 return nil
4552}
4553
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004554// SendDownloadSection sends DownloadSectionRequestWithResponse
4555func (oo *OmciCC) SendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004556 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004557 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004558 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
4559 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00004560 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00004561
4562 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
4563 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00004564 msgType := omci.DownloadSectionRequestType
mpagenkoc26d4c02021-05-06 14:27:57 +00004565 var timeout int = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00004566 if aAckRequest > 0 {
4567 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00004568 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00004569 }
mpagenko80622a52021-02-09 16:53:23 +00004570 omciLayer := &omci.OMCI{
4571 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004572 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00004573 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4574 // Length: 0x28, // Optional, defaults to 40 octets
4575 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004576 if aIsExtendedOmci {
4577 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4578 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05304579 localSectionData := make([]byte, len(aSection))
4580
mpagenko15ff4a52021-03-02 10:09:20 +00004581 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00004582 request := &omci.DownloadSectionRequest{
4583 MeBasePacket: omci.MeBasePacket{
4584 EntityClass: me.SoftwareImageClassID,
4585 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004586 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004587 },
4588 SectionNumber: aDownloadSectionNo,
4589 SectionData: localSectionData,
4590 }
4591
4592 var options gopacket.SerializeOptions
4593 options.FixLengths = true
4594 buffer := gopacket.NewSerializeBuffer()
4595 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4596 if err != nil {
4597 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
4598 "device-id": oo.deviceID})
4599 return err
4600 }
4601 outgoingPacket := buffer.Bytes()
4602
mpagenko15ff4a52021-03-02 10:09:20 +00004603 //for initial debug purpose overrule the requested print state for some frames
4604 printFrame := aPrint
4605 if aAckRequest > 0 || aDownloadSectionNo == 0 {
4606 printFrame = true
4607 }
4608
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004609 omciRxCallbackPair := CallbackPair{CbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00004610 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
4611 // (used to avoid retransmission of frames with the same TID)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004612 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00004613 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004614 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004615 if err != nil {
4616 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
4617 "device-id": oo.deviceID})
4618 return err
4619 }
4620 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004621 return nil
4622}
4623
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004624//SendEndSoftwareDownload sends EndSoftwareDownloadRequest
4625func (oo *OmciCC) SendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004626 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004627 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004628 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
4629 "SequNo": strconv.FormatInt(int64(tid), 16),
4630 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4631
mpagenko15ff4a52021-03-02 10:09:20 +00004632 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004633 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004634 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004635 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4636 // Length: 0x28, // Optional, defaults to 40 octets
4637 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004638 if aIsExtendedOmci {
4639 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4640 }
mpagenko15ff4a52021-03-02 10:09:20 +00004641 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00004642 MeBasePacket: omci.MeBasePacket{
4643 EntityClass: me.SoftwareImageClassID,
4644 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004645 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004646 },
mpagenko15ff4a52021-03-02 10:09:20 +00004647 CRC32: aImageCrc,
4648 ImageSize: aFileLen,
4649 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
4650 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00004651 }
mpagenko15ff4a52021-03-02 10:09:20 +00004652
4653 var options gopacket.SerializeOptions
4654 options.FixLengths = true
4655 buffer := gopacket.NewSerializeBuffer()
4656 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4657 if err != nil {
4658 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004659 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004660 return err
mpagenko80622a52021-02-09 16:53:23 +00004661 }
mpagenko15ff4a52021-03-02 10:09:20 +00004662 outgoingPacket := buffer.Bytes()
4663
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004664 omciRxCallbackPair := CallbackPair{CbKey: tid,
4665 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004666 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004667 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004668 if err != nil {
4669 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
4670 "device-id": oo.deviceID})
4671 return err
4672 }
4673 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004674 return nil
4675}
4676
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004677// SendActivateSoftware sends ActivateSoftwareRequest
4678func (oo *OmciCC) SendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004679 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004680 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00004681 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
4682 "SequNo": strconv.FormatInt(int64(tid), 16),
4683 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4684
4685 omciLayer := &omci.OMCI{
4686 TransactionID: tid,
4687 MessageType: omci.ActivateSoftwareRequestType,
4688 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4689 // Length: 0x28, // Optional, defaults to 40 octets
4690 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004691 if aIsExtendedOmci {
4692 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4693 }
mpagenko80622a52021-02-09 16:53:23 +00004694 request := &omci.ActivateSoftwareRequest{
4695 MeBasePacket: omci.MeBasePacket{
4696 EntityClass: me.SoftwareImageClassID,
4697 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004698 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004699 },
4700 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
4701 }
4702
4703 var options gopacket.SerializeOptions
4704 options.FixLengths = true
4705 buffer := gopacket.NewSerializeBuffer()
4706 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4707 if err != nil {
4708 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
4709 "device-id": oo.deviceID})
4710 return err
4711 }
4712 outgoingPacket := buffer.Bytes()
4713
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004714 omciRxCallbackPair := CallbackPair{CbKey: tid,
4715 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00004716 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004717 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00004718 if err != nil {
4719 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
4720 "device-id": oo.deviceID})
4721 return err
4722 }
4723 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00004724 return nil
4725}
mpagenko80622a52021-02-09 16:53:23 +00004726
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004727// SendCommitSoftware sends CommitSoftwareRequest
4728func (oo *OmciCC) SendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004729 rxChan chan Message, aImageMeID uint16, aIsExtendedOmci bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004730 tid := oo.GetNextTid(highPrio)
mpagenko15ff4a52021-03-02 10:09:20 +00004731 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
4732 "SequNo": strconv.FormatInt(int64(tid), 16),
4733 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
4734
4735 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00004736 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00004737 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00004738 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4739 // Length: 0x28, // Optional, defaults to 40 octets
4740 }
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004741 if aIsExtendedOmci {
4742 omciLayer.DeviceIdentifier = omci.ExtendedIdent
4743 }
mpagenko15ff4a52021-03-02 10:09:20 +00004744 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00004745 MeBasePacket: omci.MeBasePacket{
4746 EntityClass: me.SoftwareImageClassID,
4747 EntityInstance: aImageMeID, //inactive image
Holger Hildebrandt5458d892022-05-31 09:52:06 +00004748 Extended: aIsExtendedOmci,
mpagenko80622a52021-02-09 16:53:23 +00004749 },
mpagenko80622a52021-02-09 16:53:23 +00004750 }
mpagenko15ff4a52021-03-02 10:09:20 +00004751
4752 var options gopacket.SerializeOptions
4753 options.FixLengths = true
4754 buffer := gopacket.NewSerializeBuffer()
4755 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4756 if err != nil {
4757 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00004758 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00004759 return err
mpagenko80622a52021-02-09 16:53:23 +00004760 }
mpagenko15ff4a52021-03-02 10:09:20 +00004761 outgoingPacket := buffer.Bytes()
4762
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004763 omciRxCallbackPair := CallbackPair{CbKey: tid,
4764 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00004765 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004766 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00004767 if err != nil {
4768 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
4769 "device-id": oo.deviceID})
4770 return err
4771 }
4772 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00004773 return nil
4774}
4775
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004776//SendSelfTestReq sends TestRequest
4777func (oo *OmciCC) SendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
4778 tid := oo.GetNextTid(highPrio)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004779 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
4780 "SequNo": strconv.FormatInt(int64(tid), 16),
4781 "InstId": strconv.FormatInt(int64(instdID), 16)})
4782 omciLayer := &omci.OMCI{
4783 TransactionID: tid,
4784 MessageType: omci.TestRequestType,
4785 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
4786 // Length: 0x28, // Optional, defaults to 40 octets
4787 }
4788
4789 var request *omci.OpticalLineSupervisionTestRequest
4790 switch classID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004791 case me.AniGClassID:
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004792 request = &omci.OpticalLineSupervisionTestRequest{
4793 MeBasePacket: omci.MeBasePacket{
4794 EntityClass: classID,
4795 EntityInstance: instdID,
4796 },
4797 SelectTest: uint8(7), // self test
4798 GeneralPurposeBuffer: uint16(0),
4799 VendorSpecificParameters: uint16(0),
4800 }
4801 default:
4802 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
4803 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
4804 }
4805 // Test serialization back to former string
4806 var options gopacket.SerializeOptions
4807 options.FixLengths = true
4808
4809 buffer := gopacket.NewSerializeBuffer()
4810 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
4811 if err != nil {
4812 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
4813 "device-id": oo.deviceID})
4814 return err
4815 }
4816 outgoingPacket := buffer.Bytes()
4817
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004818 omciRxCallbackPair := CallbackPair{CbKey: tid,
4819 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004820 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004821 err = oo.Send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07004822 if err != nil {
4823 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
4824 "device-id": oo.deviceID})
4825 return err
4826 }
4827 logger.Debug(ctx, "send self test request done")
4828 return nil
4829}
4830
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004831//nolint: gocyclo
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004832func (oo *OmciCC) isSuccessfulResponseWithMibDataSync(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) (bool, error) {
4833
4834 nextLayer, err := omci.MsgTypeToNextLayer(omciMsg.MessageType, false)
4835 if err != nil {
4836 logger.Errorw(ctx, "omci-message: could not map msgType to nextLayer", log.Fields{"device-id": oo.deviceID})
4837 return false, fmt.Errorf("could not map msgType to nextLayer - %s", oo.deviceID)
4838 }
4839 msgLayer := (*packet).Layer(nextLayer)
4840 if msgLayer != nil {
4841 // Note: Due to relaxed decoding, you may now still have a decoding error attached to the layers
4842 if failure := (*packet).ErrorLayer(); failure != nil {
4843 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4844 // In the case of MibUploadNextResponse, we let the packet pass so that later processing
4845 // can examine for UnkonwnMEs and UnknownAttributes
4846 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with ErrorLayer - let it pass",
4847 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4848 return false, nil
4849 } else if nextLayer == omci.LayerTypeGetResponse {
4850 if resp := msgLayer.(*omci.GetResponse); resp != nil {
4851 if resp.NextLayerType() == omci.LayerTypeUnknownAttributes {
4852 unknownAttrLayer := (*packet).Layer(omci.LayerTypeUnknownAttributes)
4853 if unknownAttrLayer != nil {
4854 logger.Errorw(ctx, "omci-message: GetResponse packet contains unknownAttrLayer - skip it!",
4855 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "unknownAttrLayer": unknownAttrLayer})
4856 return false, fmt.Errorf("packet contains unknownAttrLayer - %s", oo.deviceID)
4857 }
4858 }
4859 }
4860 }
4861 // Try to decode any further error information
4862 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
4863 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer with further info - skip it!",
4864 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": decodeFailure.String()})
4865 return false, fmt.Errorf("packet contains ErrorLayer with further info - %s", oo.deviceID)
4866 }
4867 logger.Errorw(ctx, "omci-message: packet contains ErrorLayer - skip it!",
4868 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4869 return false, fmt.Errorf("packet contains ErrorLayer - %s", oo.deviceID)
4870 }
4871 } else if failure := (*packet).ErrorLayer(); failure != nil {
4872 // message layer could not be decoded, but at least check if additional failure information is available
4873 if decodeFailure, ok := failure.(*gopacket.DecodeFailure); ok && decodeFailure != nil {
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004874 errMsg := decodeFailure.String()
4875 if nextLayer == omci.LayerTypeMibUploadNextResponse {
4876 if strings.Contains(strings.ToLower(errMsg), "table decode") {
4877 // In the case of MibUploadNextResponse with non-standard table attributes, we let the packet pass
4878 // so that later processing can deal with it
4879 logger.Infow(ctx, "omci-message: MibUploadNextResponse packet with table attributes - let it pass",
4880 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4881 return false, nil
4882 }
4883 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004884 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, further info available - skip it!",
Holger Hildebrandt93d183f2022-04-22 15:50:26 +00004885 log.Fields{"device-id": oo.deviceID, "error": failure.Error(), "decodeFailure": errMsg})
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004886 return false, fmt.Errorf("could not decode msgLayer of packet, further info available - %s", oo.deviceID)
4887 }
4888 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet, ErrorLayer available",
4889 log.Fields{"device-id": oo.deviceID, "error": failure.Error()})
4890 return false, fmt.Errorf("could not decode msgLayer of packet, ErrorLayer available - %s", oo.deviceID)
4891 } else {
4892 logger.Errorw(ctx, "omci-message: could not decode msgLayer of packet", log.Fields{"device-id": oo.deviceID})
4893 return false, fmt.Errorf("could not decode msgLayer of packet - %s", oo.deviceID)
4894 }
4895
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004896 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004897 if v == omciMsg.MessageType {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004898 switch nextLayer {
4899 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004900 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
4901 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004902 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004903 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004904 }
4905 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004906 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
4907 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004908 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004909 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004910 }
4911 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004912 if resp := msgLayer.(*omci.SetResponse); resp != nil {
4913 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004914 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004915 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004916 }
4917 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004918 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
4919 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004920 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004921 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004922 }
4923 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004924 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
4925 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004926 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004927 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004928 }
4929 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004930 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
4931 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004932 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004933 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004934 }
4935 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004936 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
4937 if resp.Result == me.Success {
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004938 return true, nil
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00004939 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00004940 }
4941 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004942 }
4943 }
Holger Hildebrandt36747fd2022-03-14 09:47:17 +00004944 return false, nil
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00004945}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004946
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004947func (oo *OmciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest OmciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004948 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00004949 if timeout == 0 {
4950 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt34555512021-10-01 16:26:59 +00004951 // enqueue
4952 if aOmciTxRequest.highPrio {
4953 oo.mutexHighPrioTxQueue.Lock()
4954 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4955 oo.mutexHighPrioTxQueue.Unlock()
4956 } else {
4957 oo.mutexLowPrioTxQueue.Lock()
4958 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4959 oo.mutexLowPrioTxQueue.Unlock()
4960 }
4961 go oo.sendQueuedRequests(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00004962 } else {
mpagenko7455fd42021-06-10 16:25:55 +00004963 //the supervised sending with waiting on the response (based on TID) is called in background
4964 // to avoid blocking of the sender for the complete OMCI handshake procedure
4965 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
4966 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
4967 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004968 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00004969}
4970
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004971func (oo *OmciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest OmciTransferStructure, aTimeout int) {
mpagenko7455fd42021-06-10 16:25:55 +00004972 chSuccess := make(chan bool)
4973 aOmciTxRequest.chSuccess = chSuccess
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00004974 tid := aOmciTxRequest.cbPair.CbKey
mpagenko7455fd42021-06-10 16:25:55 +00004975 oo.mutexMonReq.Lock()
4976 oo.monitoredRequests[tid] = aOmciTxRequest
4977 oo.mutexMonReq.Unlock()
4978
4979 retries := aOmciTxRequest.retries
4980 retryCounter := 0
4981loop:
4982 for retryCounter <= retries {
Holger Hildebrandt34555512021-10-01 16:26:59 +00004983 // enqueue
4984 if aOmciTxRequest.highPrio {
4985 oo.mutexHighPrioTxQueue.Lock()
4986 oo.highPrioTxQueue.PushBack(aOmciTxRequest)
4987 oo.mutexHighPrioTxQueue.Unlock()
4988 } else {
4989 oo.mutexLowPrioTxQueue.Lock()
4990 oo.lowPrioTxQueue.PushBack(aOmciTxRequest)
4991 oo.mutexLowPrioTxQueue.Unlock()
4992 }
4993 go oo.sendQueuedRequests(ctx)
mpagenko7455fd42021-06-10 16:25:55 +00004994
4995 select {
4996 case success := <-chSuccess:
4997 if success {
4998 logger.Debugw(ctx, "reqMon: response received in time",
4999 log.Fields{"tid": tid, "device-id": oo.deviceID})
5000 } else {
5001 logger.Debugw(ctx, "reqMon: wait for response aborted",
5002 log.Fields{"tid": tid, "device-id": oo.deviceID})
5003 }
5004 break loop
5005 case <-time.After(time.Duration(aTimeout) * time.Second):
5006 if retryCounter == retries {
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00005007 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached - send ONU device event!",
mpagenko7455fd42021-06-10 16:25:55 +00005008 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandtc56febd2022-02-09 13:23:30 +00005009 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationFailureConfig, OnuOmciCommunicationFailureConfigDesc)
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005010 oo.incrementTxTimesouts()
Holger Hildebrandt68854a82022-09-05 07:00:21 +00005011 oo.mutexConsecutiveOmciTimeouts.Lock()
5012 if oo.consecutiveOmciTimeouts < cMaxConsecutiveOmciTimeouts {
5013 oo.consecutiveOmciTimeouts++
5014 oo.mutexConsecutiveOmciTimeouts.Unlock()
5015 } else {
5016 oo.consecutiveOmciTimeouts = 0
5017 oo.mutexConsecutiveOmciTimeouts.Unlock()
5018 oo.mutexOmciAbortInProgress.Lock()
5019 if !oo.omciAbortInProgress {
5020 oo.omciAbortInProgress = true
5021 oo.mutexOmciAbortInProgress.Unlock()
5022 logger.Errorw(ctx, "reqMon: communication aborted - no of max consecutive timeouts reached - stopping device and send ONU device event!",
5023 log.Fields{"tid": tid, "device-id": oo.deviceID})
5024 oo.pOnuDeviceEntry.SendOnuDeviceEvent(ctx, OnuOmciCommunicationAbortConfig, OnuOmciCommunicationAbortConfigDesc)
5025 // stop all running FSM processing
5026 _ = oo.pBaseDeviceHandler.UpdateInterface(ctx)
5027 oo.mutexOmciAbortInProgress.Lock()
5028 oo.omciAbortInProgress = false
5029 oo.mutexOmciAbortInProgress.Unlock()
5030 } else {
5031 oo.mutexOmciAbortInProgress.Unlock()
5032 logger.Infow(ctx, "reqMon: communication aborted - corresponding processing already running",
5033 log.Fields{"tid": tid, "device-id": oo.deviceID})
5034 }
5035 }
mpagenko7455fd42021-06-10 16:25:55 +00005036 break loop
5037 } else {
5038 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
5039 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005040 oo.incrementTxRetries()
mpagenko7455fd42021-06-10 16:25:55 +00005041 }
5042 }
5043 retryCounter++
5044 }
5045 oo.mutexMonReq.Lock()
5046 delete(oo.monitoredRequests, tid)
5047 oo.mutexMonReq.Unlock()
5048}
5049
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005050//CancelRequestMonitoring terminates monitoring of outstanding omci requests
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005051func (oo *OmciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005052 logger.Debugw(ctx, "CancelRequestMonitoring entered", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005053 oo.mutexMonReq.RLock()
5054 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00005055 //implement non-blocking channel send to avoid blocking on mutexMonReq later
5056 select {
5057 case oo.monitoredRequests[k].chSuccess <- false:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005058 logger.Debugw(ctx, "send cancellation on omciRespChannel",
5059 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005060 default:
Holger Hildebrandt12609a12022-03-25 13:23:25 +00005061 logger.Debugw(ctx, "cancellation could not be send on omciRespChannel (no receiver)",
5062 log.Fields{"index": k, "device-id": oo.deviceID})
mpagenko8cd1bf72021-06-22 10:11:19 +00005063 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005064 }
5065 oo.mutexMonReq.RUnlock()
5066}
5067
5068//GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
5069//time consumed for retry processing of a particular OMCI-request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005070func (oo *OmciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
5071 return time.Duration((CDefaultRetries+1)*oo.pBaseDeviceHandler.GetOmciTimeout() + 1)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00005072}
Himani Chawla43f95ff2021-06-03 00:24:12 +05305073
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005074// SendCreateOrDeleteEthernetFrameExtendedPMME deletes EthernetFrameExtendedPm ME instance
5075func (oo *OmciCC) SendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
Himani Chawla43f95ff2021-06-03 00:24:12 +05305076 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005077 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305078 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
5079 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
5080
5081 meParam := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005082 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305083 }
5084 var meInstance *me.ManagedEntity
5085 var omciErr me.OmciErrors
5086 if classID == me.EthernetFrameExtendedPmClassID {
5087 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
5088 } else {
5089 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
5090 }
5091
5092 if omciErr.GetError() == nil {
5093 var omciLayer *omci.OMCI
5094 var msgLayer gopacket.SerializableLayer
5095 var err error
5096 if create {
mpagenko836a1fd2021-11-01 16:12:42 +00005097 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.CreateRequestType, oframe.TransactionID(tid),
5098 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305099 } else {
mpagenko836a1fd2021-11-01 16:12:42 +00005100 omciLayer, msgLayer, err = oframe.EncodeFrame(meInstance, omci.DeleteRequestType, oframe.TransactionID(tid),
5101 oframe.AddDefaults(true))
Himani Chawla43f95ff2021-06-03 00:24:12 +05305102 }
5103 if err != nil {
5104 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5105 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5106 return nil, err
5107 }
5108
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005109 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305110 if err != nil {
5111 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
5112 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5113 return nil, err
5114 }
5115
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005116 omciRxCallbackPair := CallbackPair{CbKey: tid,
5117 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05305118 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005119 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05305120 if err != nil {
5121 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5122 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5123 return nil, err
5124 }
5125 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
5126 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5127 return meInstance, nil
5128 }
5129 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5130 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5131 return nil, omciErr.GetError()
5132}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00005133
5134// RLockMutexMonReq lock read access to monitoredRequests
5135func (oo *OmciCC) RLockMutexMonReq() {
5136 oo.mutexMonReq.RLock()
5137}
5138
5139// RUnlockMutexMonReq unlock read access to monitoredRequests
5140func (oo *OmciCC) RUnlockMutexMonReq() {
5141 oo.mutexMonReq.RUnlock()
5142}
5143
5144// GetMonitoredRequest get OmciTransferStructure for an omciTransID
5145func (oo *OmciCC) GetMonitoredRequest(omciTransID uint16) (value OmciTransferStructure, exist bool) {
5146 value, exist = oo.monitoredRequests[omciTransID]
5147 return value, exist
5148}
5149
5150// SetChMonitoredRequest sets chSuccess to indicate whether response was received or not
5151func (oo *OmciCC) SetChMonitoredRequest(omciTransID uint16, chVal bool) {
5152 oo.monitoredRequests[omciTransID].chSuccess <- chVal
5153}
Himani Chawlaee10b542021-09-20 16:46:40 +05305154
5155// SendSetEthernetFrameExtendedPMME sends the set request for ethernet frame extended type me
5156func (oo *OmciCC) SendSetEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
5157 rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
5158 tid := oo.GetNextTid(highPrio)
5159 logger.Debugw(ctx, "send-set-ethernet-frame-extended-pm-me-control-block:", log.Fields{"device-id": oo.deviceID,
5160 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16)})
5161
5162 meParams := me.ParamData{EntityID: entityID,
Holger Hildebrandt3ac49bd2022-02-07 17:46:43 +00005163 Attributes: me.AttributeValueMap{me.EthernetFrameExtendedPm_ControlBlock: controlBlock},
Himani Chawlaee10b542021-09-20 16:46:40 +05305164 }
5165 var meInstance *me.ManagedEntity
5166 var omciErr me.OmciErrors
5167 if classID == me.EthernetFrameExtendedPmClassID {
5168 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParams)
5169 } else {
5170 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParams)
5171 }
5172
5173 if omciErr.GetError() == nil {
mpagenko836a1fd2021-11-01 16:12:42 +00005174 omciLayer, msgLayer, err := oframe.EncodeFrame(meInstance, omci.SetRequestType, oframe.TransactionID(tid))
Himani Chawlaee10b542021-09-20 16:46:40 +05305175 if err != nil {
5176 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
5177 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5178 return nil, err
5179 }
Holger Hildebrandta6ef0e82022-04-06 13:11:32 +00005180 pkt, err := SerializeOmciLayer(ctx, omciLayer, msgLayer)
Himani Chawlaee10b542021-09-20 16:46:40 +05305181 if err != nil {
5182 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me-set-msg",
5183 log.Fields{"err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5184 return nil, err
5185 }
5186 omciRxCallbackPair := CallbackPair{
5187 CbKey: tid,
5188 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
5189 }
5190 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
5191 if err != nil {
5192 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
5193 log.Fields{"Err": err, "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5194 return nil, err
5195 }
5196 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-set-msg-done",
5197 log.Fields{"device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5198 return meInstance, nil
5199 }
5200 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
5201 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "inst-id": strconv.FormatInt(int64(entityID), 16)})
5202 return nil, omciErr.GetError()
5203}
Holger Hildebrandte7cc6092022-02-01 11:37:03 +00005204
5205// PrepareForGarbageCollection - remove references to prepare for garbage collection
5206func (oo *OmciCC) PrepareForGarbageCollection(ctx context.Context, aDeviceID string) {
5207 logger.Debugw(ctx, "prepare for garbage collection", log.Fields{"device-id": aDeviceID})
5208 oo.pBaseDeviceHandler = nil
5209 oo.pOnuDeviceEntry = nil
5210 oo.pOnuAlarmManager = nil
5211}
Holger Hildebrandt66af5ce2022-09-07 13:38:02 +00005212
5213// GetOmciCounters - TODO: add comment
5214func (oo *OmciCC) GetOmciCounters() *extension.SingleGetValueResponse {
5215 oo.mutexCounters.RLock()
5216 defer oo.mutexCounters.RUnlock()
5217 resp := extension.SingleGetValueResponse{
5218 Response: &extension.GetValueResponse{
5219 Status: extension.GetValueResponse_OK,
5220 Response: &extension.GetValueResponse_OnuOmciStats{
5221 OnuOmciStats: &extension.GetOnuOmciTxRxStatsResponse{},
5222 },
5223 },
5224 }
5225 resp.Response.GetOnuOmciStats().BaseTxArFrames = oo.countersBase.txArFrames
5226 resp.Response.GetOnuOmciStats().BaseTxNoArFrames = oo.countersBase.txNoArFrames
5227 resp.Response.GetOnuOmciStats().BaseRxAkFrames = oo.countersBase.rxAkFrames
5228 resp.Response.GetOnuOmciStats().BaseRxNoAkFrames = oo.countersBase.rxNoAkFrames
5229 resp.Response.GetOnuOmciStats().ExtTxArFrames = oo.countersExt.txArFrames
5230 resp.Response.GetOnuOmciStats().ExtTxNoArFrames = oo.countersExt.txNoArFrames
5231 resp.Response.GetOnuOmciStats().ExtRxAkFrames = oo.countersExt.rxAkFrames
5232 resp.Response.GetOnuOmciStats().ExtRxNoAkFrames = oo.countersExt.rxNoAkFrames
5233 resp.Response.GetOnuOmciStats().TxOmciCounterRetries = oo.txRetries
5234 resp.Response.GetOnuOmciStats().TxOmciCounterTimeouts = oo.txTimeouts
5235 return &resp
5236}
5237
5238// For more speed, separate functions for each counter
5239
5240func (oo *OmciCC) incrementBaseTxArFrames() {
5241 oo.mutexCounters.Lock()
5242 defer oo.mutexCounters.Unlock()
5243 oo.countersBase.txArFrames++
5244}
5245
5246func (oo *OmciCC) incrementExtTxArFrames() {
5247 oo.mutexCounters.Lock()
5248 defer oo.mutexCounters.Unlock()
5249 oo.countersExt.txArFrames++
5250}
5251
5252func (oo *OmciCC) incrementBaseRxAkFrames() {
5253 oo.mutexCounters.Lock()
5254 defer oo.mutexCounters.Unlock()
5255 oo.countersBase.rxAkFrames++
5256}
5257
5258func (oo *OmciCC) incrementExtRxAkFrames() {
5259 oo.mutexCounters.Lock()
5260 defer oo.mutexCounters.Unlock()
5261 oo.countersExt.rxAkFrames++
5262}
5263
5264func (oo *OmciCC) increaseBaseTxNoArFramesBy(ctx context.Context, value uint32) {
5265 oo.mutexCounters.Lock()
5266 defer oo.mutexCounters.Unlock()
5267 oo.countersBase.txNoArFrames += value
5268}
5269
5270func (oo *OmciCC) increaseExtTxNoArFramesBy(ctx context.Context, value uint32) {
5271 oo.mutexCounters.Lock()
5272 defer oo.mutexCounters.Unlock()
5273 oo.countersExt.txNoArFrames += value
5274}
5275
5276func (oo *OmciCC) incrementBaseRxNoAkFrames() {
5277 oo.mutexCounters.Lock()
5278 defer oo.mutexCounters.Unlock()
5279 oo.countersBase.rxNoAkFrames++
5280}
5281
5282func (oo *OmciCC) incrementExtRxNoAkFrames() {
5283 oo.mutexCounters.Lock()
5284 defer oo.mutexCounters.Unlock()
5285 oo.countersExt.rxNoAkFrames++
5286}
5287
5288func (oo *OmciCC) incrementTxRetries() {
5289 oo.mutexCounters.Lock()
5290 defer oo.mutexCounters.Unlock()
5291 oo.txRetries++
5292}
5293
5294func (oo *OmciCC) incrementTxTimesouts() {
5295 oo.mutexCounters.Lock()
5296 defer oo.mutexCounters.Unlock()
5297 oo.txTimeouts++
5298}