blob: 363a59f8d8fa893c9019fcfd8e4348afddac1d30 [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 Hildebrandtfa074992020-03-27 15:42:06 +000027 "sync"
mpagenko80622a52021-02-09 16:53:23 +000028 "time" //by now for testing
Holger Hildebrandtfa074992020-03-27 15:42:06 +000029
30 "github.com/google/gopacket"
31 // TODO!!! Some references could be resolved auto, but some need specific context ....
32 gp "github.com/google/gopacket"
33
34 "github.com/opencord/omci-lib-go"
35 me "github.com/opencord/omci-lib-go/generated"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000036
khenaidoo7d3c5582021-08-11 18:09:44 -040037 vgrpc "github.com/opencord/voltha-lib-go/v7/pkg/grpc"
38
39 "github.com/opencord/voltha-protos/v5/go/common"
40 //"github.com/opencord/voltha-lib-go/v7/pkg/kafka"
41 "github.com/opencord/voltha-lib-go/v7/pkg/log"
42 ic "github.com/opencord/voltha-protos/v5/go/inter_container"
43 //"github.com/opencord/voltha-protos/v5/go/openflow_13"
44 //"github.com/opencord/voltha-protos/v5/go/voltha"
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 Hildebrandtdd23cc22020-05-19 13:32:18 +000049const maxGemPayloadSize = uint16(48)
50const 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
mpagenkoc8bba412021-01-15 15:38:44 +000058const cOmciBaseMessageTrailerLen = 40
59
60// tOmciReceiveError - enum type for detected problems/errors in the received OMCI message (format)
61type tOmciReceiveError uint8
62
63const (
64 // cOmciMessageReceiveNoError - default start state
65 cOmciMessageReceiveNoError tOmciReceiveError = iota
66 // Error indication wrong trailer length within the message
67 cOmciMessageReceiveErrorTrailerLen
68 // Error indication missing trailer within the message
69 cOmciMessageReceiveErrorMissTrailer
70)
71
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000072// CDefaultRetries - TODO: add comment
73const CDefaultRetries = 2
Holger Hildebrandt366ef192021-05-05 11:07:44 +000074
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000075// ### OMCI related definitions - end
76
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000077//CallbackPairEntry to be used for OMCI send/receive correlation
78type CallbackPairEntry struct {
79 CbRespChannel chan Message
80 CbFunction func(context.Context, *omci.OMCI, *gp.Packet, chan Message) error
81 FramePrint bool //true for printing
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000082}
83
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000084//CallbackPair to be used for ReceiveCallback init
85type CallbackPair struct {
86 CbKey uint16
87 CbEntry CallbackPairEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +000088}
89
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000090// OmciTransferStructure - TODO: add comment
91type OmciTransferStructure struct {
mpagenko80622a52021-02-09 16:53:23 +000092 txFrame []byte
93 timeout int
Holger Hildebrandt366ef192021-05-05 11:07:44 +000094 retries int
mpagenko80622a52021-02-09 16:53:23 +000095 highPrio bool
96 withFramePrint bool
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +000097 cbPair CallbackPair
Holger Hildebrandt366ef192021-05-05 11:07:44 +000098 chSuccess chan bool
Holger Hildebrandtfa074992020-03-27 15:42:06 +000099}
100
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000101//OmciCC structure holds information needed for OMCI communication (to/from OLT Adapter)
102type OmciCC struct {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000103 enabled bool
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000104 pBaseDeviceHandler IdeviceHandler
105 pOnuDeviceEntry IonuDeviceEntry
106 pOnuAlarmManager IonuAlarmManager
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000107 deviceID string
khenaidoo7d3c5582021-08-11 18:09:44 -0400108 coreClient *vgrpc.Client
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000109 supportExtMsg bool
mpagenkoc8bba412021-01-15 15:38:44 +0000110 rxOmciFrameError tOmciReceiveError
111
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000112 txFrames, txOnuFrames uint32
113 rxFrames, rxOnuFrames, rxOnuDiscards uint32
114
115 // OMCI params
116 mutexTid sync.Mutex
117 tid uint16
118 mutexHpTid sync.Mutex
119 hpTid uint16
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000120 UploadSequNo uint16
121 UploadNoOfCmds uint16
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000122
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000123 mutexTxQueue sync.Mutex
124 txQueue *list.List
125 mutexRxSchedMap sync.Mutex
126 rxSchedulerMap map[uint16]CallbackPairEntry
127 mutexMonReq sync.RWMutex
128 monitoredRequests map[uint16]OmciTransferStructure
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000129}
130
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000131var responsesWithMibDataSync = []omci.MessageType{
132 omci.CreateResponseType,
133 omci.DeleteResponseType,
134 omci.SetResponseType,
135 omci.StartSoftwareDownloadResponseType,
136 omci.EndSoftwareDownloadResponseType,
137 omci.ActivateSoftwareResponseType,
138 omci.CommitSoftwareResponseType,
139}
140
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000141//NewOmciCC constructor returns a new instance of a OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000142//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000143func NewOmciCC(ctx context.Context, deviceID string, deviceHandler IdeviceHandler,
144 onuDeviceEntry IonuDeviceEntry, onuAlarmManager IonuAlarmManager,
145 coreClient *vgrpc.Client) *OmciCC {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000146 logger.Debugw(ctx, "init-omciCC", log.Fields{"device-id": deviceID})
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000147 var omciCC OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000148 omciCC.enabled = false
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000149 omciCC.pBaseDeviceHandler = deviceHandler
150 omciCC.pOnuAlarmManager = onuAlarmManager
Himani Chawla4d908332020-08-31 12:30:20 +0530151 omciCC.pOnuDeviceEntry = onuDeviceEntry
152 omciCC.deviceID = deviceID
khenaidoo7d3c5582021-08-11 18:09:44 -0400153 omciCC.coreClient = coreClient
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000154 omciCC.supportExtMsg = false
mpagenkoc8bba412021-01-15 15:38:44 +0000155 omciCC.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000156 omciCC.txFrames = 0
157 omciCC.txOnuFrames = 0
158 omciCC.rxFrames = 0
159 omciCC.rxOnuFrames = 0
160 omciCC.rxOnuDiscards = 0
161 omciCC.tid = 0x1
162 omciCC.hpTid = 0x8000
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000163 omciCC.UploadSequNo = 0
164 omciCC.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000165 omciCC.txQueue = list.New()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000166 omciCC.rxSchedulerMap = make(map[uint16]CallbackPairEntry)
167 omciCC.monitoredRequests = make(map[uint16]OmciTransferStructure)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000168
169 return &omciCC
170}
171
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000172//Stop stops/resets the omciCC
173func (oo *OmciCC) Stop(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000174 logger.Debugw(ctx, "omciCC-stopping", log.Fields{"device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000175 //reseting all internal data, which might also be helpful for discarding any lingering tx/rx requests
mpagenko8cd1bf72021-06-22 10:11:19 +0000176 oo.CancelRequestMonitoring(ctx)
mpagenko900ee4b2020-10-12 11:56:34 +0000177 oo.mutexTxQueue.Lock()
178 oo.txQueue.Init() // clear the tx queue
179 oo.mutexTxQueue.Unlock()
180 oo.mutexRxSchedMap.Lock()
181 for k := range oo.rxSchedulerMap {
182 delete(oo.rxSchedulerMap, k) //clear the scheduler map
183 }
184 oo.mutexRxSchedMap.Unlock()
185 oo.mutexHpTid.Lock()
186 oo.hpTid = 0x8000 //reset the high prio transactionId
187 oo.mutexHpTid.Unlock()
188 oo.mutexTid.Lock()
189 oo.tid = 1 //reset the low prio transactionId
190 oo.mutexTid.Unlock()
191 //reset control values
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000192 oo.UploadSequNo = 0
193 oo.UploadNoOfCmds = 0
mpagenkoc8bba412021-01-15 15:38:44 +0000194 oo.rxOmciFrameError = cOmciMessageReceiveNoError
mpagenko900ee4b2020-10-12 11:56:34 +0000195 //reset the stats counter - which might be topic of discussion ...
196 oo.txFrames = 0
197 oo.txOnuFrames = 0
198 oo.rxFrames = 0
199 oo.rxOnuFrames = 0
200 oo.rxOnuDiscards = 0
201
202 return nil
203}
204
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000205// Rx handler for omci messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000206func (oo *OmciCC) receiveOnuMessage(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000207 logger.Debugw(ctx, "rx-onu-autonomous-message", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000208 "payload": hex.EncodeToString(omciMsg.Payload)})
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530209 switch omciMsg.MessageType {
210 case omci.AlarmNotificationType:
211 data := OmciMessage{
212 OmciMsg: omciMsg,
213 OmciPacket: packet,
214 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000215 go oo.pOnuAlarmManager.HandleOmciAlarmNotificationMessage(ctx, data)
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530216 return nil
217 default:
218 return fmt.Errorf("receiveOnuMessageType %s unimplemented", omciMsg.MessageType.String())
219 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000220 /*
221 msgType = rxFrame.fields["message_type"] //assumed OmciOperationsValue
222 rxOnuFrames++
223
224 switch msgType {
225 case AlarmNotification:
226 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000227 logger.Info("Unhandled: received-onu-alarm-message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000228 // python code was:
229 //if msg_type == EntityOperations.AlarmNotification.value:
230 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Alarm_Notification)
231 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
232 //
233 return errors.New("RxAlarmNotification unimplemented")
234 }
235 case AttributeValueChange:
236 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000237 logger.Info("Unhandled: received-attribute-value-change")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000238 // python code was:
239 //elif msg_type == EntityOperations.AttributeValueChange.value:
240 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.AVC_Notification)
241 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
242 //
243 return errors.New("RxAttributeValueChange unimplemented")
244 }
245 case TestResult:
246 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000247 logger.Info("Unhandled: received-test-result")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000248 // python code was:
249 //elif msg_type == EntityOperations.TestResult.value:
250 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Test_Result)
251 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
252 //
253 return errors.New("RxTestResult unimplemented")
254 }
255 default:
256 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000257 logger.Errorw(ctx,"rx-onu-unsupported-autonomous-message", log.Fields{"msgType": msgType})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000258 rxOnuDiscards++
259 return errors.New("RxOnuMsgType unimplemented")
260 }
261 }
262 */
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000263}
264
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000265func (oo *OmciCC) printRxMessage(ctx context.Context, rxMsg []byte) {
mpagenko80622a52021-02-09 16:53:23 +0000266 //assuming omci message content is hex coded!
267 // with restricted output of 16bytes would be ...rxMsg[:16]
268 logger.Debugw(ctx, "omci-message-received:", log.Fields{
269 "RxOmciMessage": hex.EncodeToString(rxMsg),
270 "device-id": oo.deviceID})
271}
272
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000273// ReceiveMessage - Rx handler for onu messages
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000274// e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000275func (oo *OmciCC) ReceiveMessage(ctx context.Context, rxMsg []byte) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000276 //logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000277 if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
278 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
mpagenkoc8bba412021-01-15 15:38:44 +0000279 // (an extendedFormat message could be destroyed this way!)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000280 trailerLenData := rxMsg[42:44]
281 trailerLen := binary.BigEndian.Uint16(trailerLenData)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000282 //logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
mpagenkoc8bba412021-01-15 15:38:44 +0000283 if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
284 binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
285 if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
286 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
287 logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
288 log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
289 oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
290 }
291 }
292 } else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
293 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
294 // (an extendedFormat message could be destroyed this way!)
295 // extend/overwrite with trailer
296 trailer := make([]byte, 8)
297 binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
298 rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
299 if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
300 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
301 logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
302 log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
303 oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000304 }
305 } else {
mpagenkoc8bba412021-01-15 15:38:44 +0000306 logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
307 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000308 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200309 return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000310 }
311
312 packet := gopacket.NewPacket(rxMsg, omci.LayerTypeOMCI, gopacket.NoCopy)
313 if packet == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000314 logger.Errorw(ctx, "omci-message could not be decoded", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000315 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200316 return fmt.Errorf("could not decode rxMsg as OMCI %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000317 }
318 omciLayer := packet.Layer(omci.LayerTypeOMCI)
319 if omciLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000320 logger.Errorw(ctx, "omci-message could not decode omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000321 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200322 return fmt.Errorf("could not decode omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000323 }
324 omciMsg, ok := omciLayer.(*omci.OMCI)
325 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000326 logger.Errorw(ctx, "omci-message could not assign omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000327 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200328 return fmt.Errorf("could not assign omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000329 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000330 logger.Debugw(ctx, "omci-message-decoded:", log.Fields{"omciMsgType": omciMsg.MessageType,
mpagenko3dbcdd22020-07-22 07:38:45 +0000331 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "DeviceIdent": omciMsg.DeviceIdentifier})
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700332 // TestResult is asynchronous indication that carries the same TID as the TestResponse.
333 // We expect to find the TID in the oo.rxSchedulerMap
334 if byte(omciMsg.MessageType)&me.AK == 0 && omciMsg.MessageType != omci.TestResultType {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000335 // Not a response
mpagenko80622a52021-02-09 16:53:23 +0000336 oo.printRxMessage(ctx, rxMsg)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000337 logger.Debug(ctx, "RxMsg is no Omci Response Message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000338 if omciMsg.TransactionID == 0 {
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530339 return oo.receiveOnuMessage(ctx, omciMsg, &packet)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000340 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000341 logger.Errorw(ctx, "Unexpected TransCorrId != 0 not accepted for autonomous messages",
Andrea Campanella6515c582020-10-05 11:25:00 +0200342 log.Fields{"msgType": omciMsg.MessageType, "payload": hex.EncodeToString(omciMsg.Payload),
mpagenko8b07c1b2020-11-26 10:36:31 +0000343 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200344 return fmt.Errorf("autonomous Omci Message with TranSCorrId != 0 not acccepted %s", oo.deviceID)
Himani Chawla4d908332020-08-31 12:30:20 +0530345 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000346 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530347 oo.mutexRxSchedMap.Lock()
348 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000349 if ok && rxCallbackEntry.CbFunction != nil {
350 if rxCallbackEntry.FramePrint {
mpagenko80622a52021-02-09 16:53:23 +0000351 oo.printRxMessage(ctx, rxMsg)
352 }
Himani Chawla4d908332020-08-31 12:30:20 +0530353 //disadvantage of decoupling: error verification made difficult, but anyway the question is
354 // how to react on erroneous frame reception, maybe can simply be ignored
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000355 go rxCallbackEntry.CbFunction(ctx, omciMsg, &packet, rxCallbackEntry.CbRespChannel)
Holger Hildebrandt3124e302021-03-23 12:47:03 +0000356 if isSuccessfulResponseWithMibDataSync(omciMsg, &packet) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000357 oo.pOnuDeviceEntry.IncrementMibDataSync(ctx)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000358 }
mpagenkoc8bba412021-01-15 15:38:44 +0000359
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700360 // If omciMsg.MessageType is omci.TestResponseType, we still expect the TestResult OMCI message,
361 // so do not clean up the TransactionID in that case.
362 if omciMsg.MessageType != omci.TestResponseType {
363 // having posted the response the request is regarded as 'done'
364 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
365 }
Himani Chawla4d908332020-08-31 12:30:20 +0530366 oo.mutexRxSchedMap.Unlock()
mpagenko80622a52021-02-09 16:53:23 +0000367 return nil
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000368 }
mpagenko80622a52021-02-09 16:53:23 +0000369 oo.mutexRxSchedMap.Unlock()
370 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID})
371 oo.printRxMessage(ctx, rxMsg)
372 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000373
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000374 /* py code was:
375 Receive and OMCI message from the proxy channel to the OLT.
376
377 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
378 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
379 """
380 if not self.enabled:
381 return
382
383 try:
384 now = arrow.utcnow()
385 d = None
386
387 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
388 # save the current value of the entity_id_to_class_map, then
389 # replace it with our custom one before decode, and then finally
390 # restore it later. Tried other ways but really made the code messy.
391 saved_me_map = omci_entities.entity_id_to_class_map
392 omci_entities.entity_id_to_class_map = self._me_map
393
394 try:
395 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000396 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000397 except KeyError as e:
398 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000399 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000400 rx_frame = self._decode_unknown_me(msg)
401 self._rx_unknown_me += 1
402
403 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000404 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000405 return
406
407 finally:
408 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
409
410 rx_tid = rx_frame.fields['transaction_id']
411 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000412 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000413 # Filter the Test Result frame and route through receive onu
414 # message method.
415 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000416 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000417 return self._receive_onu_message(rx_frame)
418
419 # Previously unreachable if this is the very first round-trip Rx or we
420 # have been running consecutive errors
421 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000422 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000423 self.reactor.callLater(0, self._publish_connectivity_event, True)
424
425 self._rx_frames += 1
426 self._consecutive_errors = 0
427
428 try:
429 high_priority = self._tid_is_high_priority(rx_tid)
430 index = self._get_priority_index(high_priority)
431
432 # (timestamp, defer, frame, timeout, retry, delayedCall)
433 last_tx_tuple = self._tx_request[index]
434
435 if last_tx_tuple is None or \
436 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
437 # Possible late Rx on a message that timed-out
438 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000439 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000440 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
441 self._rx_unknown_tid += 1
442 self._rx_late += 1
443 return
444
445 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
446 if dc is not None and not dc.cancelled and not dc.called:
447 dc.cancel()
448
449 _secs = self._update_rx_tx_stats(now, ts)
450
451 # Late arrival already serviced by a timeout?
452 if d.called:
453 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000454 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000455 return
456
457 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000458 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000459 if d is not None:
460 return d.errback(failure.Failure(e))
461 return
462
463 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000464 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000465 tx_tid = tx_frame.fields['transaction_id'])
466 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
467
468 # begin success callback chain (will cancel timeout and queue next Tx message)
469 self._rx_response[index] = rx_frame
470 d.callback(rx_frame)
471
472 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000473 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000474 */
475}
476
Himani Chawla6d2ae152020-09-02 13:11:20 +0530477/*
478func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530479 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530480 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000481}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530482*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000483
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700484// ReleaseTid releases OMCI transaction identifier from rxSchedulerMap
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000485func (oo *OmciCC) ReleaseTid(ctx context.Context, tid uint16) {
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700486 logger.Debugw(ctx, "releasing tid from rxSchedulerMap", log.Fields{"tid": tid})
487 delete(oo.rxSchedulerMap, tid)
488}
489
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000490// Send - Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
491func (oo *OmciCC) Send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
492 receiveCallbackPair CallbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000493
mpagenkoc26d4c02021-05-06 14:27:57 +0000494 if timeout != 0 {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000495 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": receiveCallbackPair.CbKey})
mpagenkoc26d4c02021-05-06 14:27:57 +0000496 oo.mutexRxSchedMap.Lock()
497 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000498 oo.rxSchedulerMap[receiveCallbackPair.CbKey] = receiveCallbackPair.CbEntry
mpagenkoc26d4c02021-05-06 14:27:57 +0000499 oo.mutexRxSchedMap.Unlock()
500 } //else timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000501
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000502 printFrame := receiveCallbackPair.CbEntry.FramePrint //printFrame true means debug print of frame is requested
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000503 //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 +0000504 omciTxRequest := OmciTransferStructure{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000505 txFrame,
506 timeout,
507 retry,
508 highPrio,
mpagenko80622a52021-02-09 16:53:23 +0000509 printFrame,
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000510 receiveCallbackPair,
511 nil,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000512 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000513 oo.mutexMonReq.Lock()
514 defer oo.mutexMonReq.Unlock()
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000515 if _, exist := oo.monitoredRequests[receiveCallbackPair.CbKey]; !exist {
mpagenko7455fd42021-06-10 16:25:55 +0000516 // do not call processRequestMonitoring in background here to ensure correct sequencing
517 // of requested messages into txQueue (especially for non-response-supervised messages)
518 oo.processRequestMonitoring(ctx, omciTxRequest)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000519 return nil
520 }
521 logger.Errorw(ctx, "A message with this tid is processed already!",
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000522 log.Fields{"tid": receiveCallbackPair.CbKey, "device-id": oo.deviceID})
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000523 return fmt.Errorf("message with tid is processed already %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000524}
525
526//Pull next tx request and send it
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000527func (oo *OmciCC) sendNextRequest(ctx context.Context) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000528 // return errors.New("sendNextRequest unimplemented")
529
530 // just try to get something transferred !!
531 // avoid accessing the txQueue from parallel send requests
532 // block parallel omci send requests at least until SendIAP is 'committed'
533 // that should be feasible for an onu instance as on OMCI anyway window size 1 is assumed
534 oo.mutexTxQueue.Lock()
mpagenkodff5dda2020-08-28 11:52:01 +0000535 defer oo.mutexTxQueue.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000536 for oo.txQueue.Len() > 0 {
537 queueElement := oo.txQueue.Front() // First element
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000538 omciTxRequest := queueElement.Value.(OmciTransferStructure)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000539 /* compare olt device handler code:
540 func (dh *DeviceHandler) omciIndication(omciInd *oop.OmciIndication) {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000541 logger.Debugw(ctx,"omci indication", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000542 var deviceType string
543 var deviceID string
544 var proxyDeviceID string
545
546 onuKey := dh.formOnuKey(omciInd.IntfId, omciInd.OnuId)
547
548 if onuInCache, ok := dh.onus.Load(onuKey); !ok {
549
dbainbri4d3a0dc2020-12-02 00:33:42 +0000550 logger.Debugw(ctx,"omci indication for a device not in cache.", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000551 ponPort := IntfIDToPortNo(omciInd.GetIntfId(), voltha.Port_PON_OLT)
552 kwargs := make(map[string]interface{})
553 kwargs["onu_id"] = omciInd.OnuId
554 kwargs["parent_port_no"] = ponPort
555
dbainbri4d3a0dc2020-12-02 00:33:42 +0000556 onuDevice, err := dh.coreProxy.GetChildDevice(log.WithSpanFromContext(context.TODO(), ctx), dh.device.Id, kwargs)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000557 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000558 logger.Errorw(ctx,"onu not found", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId, "error": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000559 return
560 }
561 deviceType = onuDevice.Type
562 deviceID = onuDevice.Id
563 proxyDeviceID = onuDevice.ProxyAddress.DeviceId
564 //if not exist in cache, then add to cache.
565 dh.onus.Store(onuKey, NewOnuDevice(deviceID, deviceType, onuDevice.SerialNumber, omciInd.OnuId, omciInd.IntfId, proxyDeviceID))
566 } else {
567 //found in cache
dbainbri4d3a0dc2020-12-02 00:33:42 +0000568 logger.Debugw(ctx,"omci indication for a device in cache.", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000569 deviceType = onuInCache.(*OnuDevice).deviceType
570 deviceID = onuInCache.(*OnuDevice).deviceID
571 proxyDeviceID = onuInCache.(*OnuDevice).proxyDeviceID
572 }
573 */
574 /* and compare onu_adapter py code:
575 omci_msg = InterAdapterOmciMessage(
576 message=bytes(frame),
577 proxy_address=self._proxy_address,
578 connect_status=self._device.connect_status)
579
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000580 self.logger.debug('sent-omci-msg', tid=tx_tid, omci_msg=hexlify(bytes(frame)))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000581
582 yield self._adapter_proxy.send_inter_adapter_message(
583 msg=omci_msg,
584 type=InterAdapterMessageType.OMCI_REQUEST,
585 from_adapter=self._device.type,
586 to_adapter=self._proxy_address.device_type,
587 to_device_id=self._device_id,
588 proxy_device_id=self._proxy_address.device_id
589 )
590 */
mpagenko80622a52021-02-09 16:53:23 +0000591 if omciTxRequest.withFramePrint {
592 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
593 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
594 "device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000595 "toDeviceType": oo.pBaseDeviceHandler.GetProxyAddressType(),
596 "proxyDeviceID": oo.pBaseDeviceHandler.GetProxyAddressID(),
597 "proxyAddress": oo.pBaseDeviceHandler.GetProxyAddress()})
mpagenko80622a52021-02-09 16:53:23 +0000598 }
khenaidoo7d3c5582021-08-11 18:09:44 -0400599 omciMsg := &ic.OmciMessage{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000600 ParentDeviceId: oo.pBaseDeviceHandler.GetProxyAddressID(),
khenaidoo7d3c5582021-08-11 18:09:44 -0400601 ChildDeviceId: oo.deviceID,
602 Message: omciTxRequest.txFrame,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000603 ProxyAddress: oo.pBaseDeviceHandler.GetProxyAddress(),
khenaidoo7d3c5582021-08-11 18:09:44 -0400604 ConnectStatus: common.ConnectStatus_REACHABLE, // If we are sending OMCI messages means we are connected, else we should not be here
amit.ghosh58b704b2021-06-18 03:45:52 +0200605 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000606 sendErr := oo.pBaseDeviceHandler.SendOMCIRequest(ctx, oo.pBaseDeviceHandler.GetProxyAddress().AdapterEndpoint, omciMsg)
khenaidoo7d3c5582021-08-11 18:09:44 -0400607 if sendErr != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000608 logger.Errorw(ctx, "send omci request error", log.Fields{"ChildId": oo.deviceID, "error": sendErr})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000609 return sendErr
610 }
611 oo.txQueue.Remove(queueElement) // Dequeue
612 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000613 return nil
614}
615
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000616// GetNextTid - TODO: add comment
617func (oo *OmciCC) GetNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000618 var next uint16
619 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000620 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000621 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530622 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000623 if oo.hpTid < 0x8000 {
624 oo.hpTid = 0x8000
625 }
mpagenko900ee4b2020-10-12 11:56:34 +0000626 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000627 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000628 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000629 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530630 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000631 if oo.tid >= 0x8000 {
632 oo.tid = 1
633 }
mpagenko900ee4b2020-10-12 11:56:34 +0000634 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000635 }
636 return next
637}
638
639// ###################################################################################
640// # utility methods provided to work on OMCI messages
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000641
642// Serialize - TODO: add comment
643func Serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000644 omciLayer := &omci.OMCI{
645 TransactionID: tid,
646 MessageType: msgType,
647 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000648 return serializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000649}
650
dbainbri4d3a0dc2020-12-02 00:33:42 +0000651func serializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000652 var options gopacket.SerializeOptions
653 options.FixLengths = true
654
655 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530656 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000657 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000658 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000659 return nil, err
660 }
661 return buffer.Bytes(), nil
662}
663
Himani Chawla4d908332020-08-31 12:30:20 +0530664/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000665func hexEncode(omciPkt []byte) ([]byte, error) {
666 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
667 hex.Encode(dst, omciPkt)
668 return dst, nil
669}
Himani Chawla4d908332020-08-31 12:30:20 +0530670*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000671
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000672//supply a response handler for omci response messages to be transferred to the requested FSM
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000673func (oo *OmciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000674
dbainbri4d3a0dc2020-12-02 00:33:42 +0000675 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000676 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000677
678 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000679 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000680 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200681 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000682 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000683 oo.mutexMonReq.RLock()
684 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000685 //implement non-blocking channel send to avoid blocking on mutexMonReq later
686 select {
687 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
688 default:
689 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
690 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
691 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000692 } else {
693 logger.Infow(ctx, "reqMon: map entry does not exist!",
694 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
695 }
696 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000697
698 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
699 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000700 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000701 Type: OMCI,
702 Data: OmciMessage{
703 OmciMsg: omciMsg,
704 OmciPacket: packet,
705 },
706 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000707 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000708 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000709
710 return nil
711}
712
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000713// SendMibReset sends MibResetRequest
714func (oo *OmciCC) SendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000715
dbainbri4d3a0dc2020-12-02 00:33:42 +0000716 logger.Debugw(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000717 request := &omci.MibResetRequest{
718 MeBasePacket: omci.MeBasePacket{
719 EntityClass: me.OnuDataClassID,
720 },
721 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000722 tid := oo.GetNextTid(highPrio)
723 pkt, err := Serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000724 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000725 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000726 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000727 return err
728 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000729 omciRxCallbackPair := CallbackPair{
730 CbKey: tid,
731 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000732 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000733 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000734}
735
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000736// SendReboot sends RebootRequest
737func (oo *OmciCC) SendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
738 logger.Debugw(ctx, "send reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300739 request := &omci.RebootRequest{
740 MeBasePacket: omci.MeBasePacket{
741 EntityClass: me.OnuGClassID,
742 },
743 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000744 tid := oo.GetNextTid(highPrio)
745 pkt, err := Serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300746 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000747 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000748 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300749 return err
750 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000751 omciRxCallbackPair := CallbackPair{
752 CbKey: tid,
753 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetOmciRebootMsgRevChan(), oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300754 }
755
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000756 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300757 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000758 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000759 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300760 return err
761 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000762 err = oo.pOnuDeviceEntry.WaitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300763 if err != nil {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000764 logger.Errorw(ctx, "aborting ONU reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200765 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300766 return err
767 }
768 return nil
769}
770
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000771// SendMibUpload sends MibUploadRequest
772func (oo *OmciCC) SendMibUpload(ctx context.Context, timeout int, highPrio bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000773 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000774 request := &omci.MibUploadRequest{
775 MeBasePacket: omci.MeBasePacket{
776 EntityClass: me.OnuDataClassID,
777 },
778 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000779 tid := oo.GetNextTid(highPrio)
780 pkt, err := Serialize(ctx, omci.MibUploadRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000781 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000782 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000783 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000784 return err
785 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000786 oo.UploadSequNo = 0
787 oo.UploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000788
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000789 omciRxCallbackPair := CallbackPair{
790 CbKey: tid,
791 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000792 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000793 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000794}
795
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000796// SendMibUploadNext sends MibUploadNextRequest
797func (oo *OmciCC) SendMibUploadNext(ctx context.Context, timeout int, highPrio bool) error {
798 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "UploadSequNo": oo.UploadSequNo})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000799 request := &omci.MibUploadNextRequest{
800 MeBasePacket: omci.MeBasePacket{
801 EntityClass: me.OnuDataClassID,
802 },
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000803 CommandSequenceNumber: oo.UploadSequNo,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000804 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000805 tid := oo.GetNextTid(highPrio)
806 pkt, err := Serialize(ctx, omci.MibUploadNextRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000807 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000808 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000809 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000810 return err
811 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000812 oo.UploadSequNo++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000813
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000814 omciRxCallbackPair := CallbackPair{
815 CbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000816 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
817 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
818 // compare also software upgrade download section handling
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000819 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibUploadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000820 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000821 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000822}
823
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000824// SendGetAllAlarm gets all alarm ME instances
825func (oo *OmciCC) SendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool) error {
Himani Chawlad3dac422021-03-13 02:31:31 +0530826 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
827 request := &omci.GetAllAlarmsRequest{
828 MeBasePacket: omci.MeBasePacket{
829 EntityClass: me.OnuDataClassID,
830 },
831 AlarmRetrievalMode: byte(alarmRetreivalMode),
832 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000833 tid := oo.GetNextTid(highPrio)
834 pkt, err := Serialize(ctx, omci.GetAllAlarmsRequestType, request, tid)
Himani Chawlad3dac422021-03-13 02:31:31 +0530835 if err != nil {
836 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{
837 "Err": err, "device-id": oo.deviceID})
838 return err
839 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000840 oo.pOnuAlarmManager.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +0530841
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000842 omciRxCallbackPair := CallbackPair{
843 CbKey: tid,
844 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +0530845 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000846 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +0530847}
848
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000849// SendGetAllAlarmNext gets next alarm ME instance
850func (oo *OmciCC) SendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool) error {
851 alarmUploadSeqNo := oo.pOnuAlarmManager.GetAlarmUploadSeqNo()
852 logger.Debugw(ctx, "send SendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
Himani Chawlad3dac422021-03-13 02:31:31 +0530853 "alarmUploadSeqNo": alarmUploadSeqNo})
854 request := &omci.GetAllAlarmsNextRequest{
855 MeBasePacket: omci.MeBasePacket{
856 EntityClass: me.OnuDataClassID,
857 },
858 CommandSequenceNumber: alarmUploadSeqNo,
859 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000860 tid := oo.GetNextTid(highPrio)
861 pkt, err := Serialize(ctx, omci.GetAllAlarmsNextRequestType, request, tid)
Himani Chawlad3dac422021-03-13 02:31:31 +0530862 if err != nil {
863 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{
864 "Err": err, "device-id": oo.deviceID})
865 return err
866 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000867 oo.pOnuAlarmManager.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +0530868
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000869 omciRxCallbackPair := CallbackPair{
870 CbKey: tid,
871 CbEntry: CallbackPairEntry{oo.pOnuAlarmManager.GetAlarmMgrEventChannel(), oo.receiveOmciResponse, true},
Himani Chawlad3dac422021-03-13 02:31:31 +0530872 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000873 return oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +0530874}
875
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000876// SendCreateGalEthernetProfile creates GalEthernetProfile ME instance
877func (oo *OmciCC) SendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
878 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000879 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000880 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000881
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000882 meParams := me.ParamData{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000883 EntityID: GalEthernetEID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000884 Attributes: me.AttributeValueMap{"MaximumGemPayloadSize": maxGemPayloadSize},
885 }
886 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
887 if omciErr.GetError() == nil {
888 //all setByCreate parameters already set, no default option required ...
889 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
890 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000891 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000892 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300893 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000894 }
895
dbainbri4d3a0dc2020-12-02 00:33:42 +0000896 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000897 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000898 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000899 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300900 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000901 }
902
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000903 omciRxCallbackPair := CallbackPair{
904 CbKey: tid,
905 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000906 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000907 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000908 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000909 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000910 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300911 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000912 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000913 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +0300914 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000915 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000916 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000917 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300918 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000919}
920
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000921// SendSetOnu2g sets Onu2G ME instance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000922// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000923func (oo *OmciCC) SendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
924 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000925 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000926 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000927
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000928 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
929 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000930 // By now we just use fix values to fire - this is anyway what the python adapter does
931 // read ONU-2G from DB ???? //TODO!!!
932 meParams := me.ParamData{
933 EntityID: 0,
934 Attributes: me.AttributeValueMap{"CurrentConnectivityMode": connectivityModeValue},
935 }
936 meInstance, omciErr := me.NewOnu2G(meParams)
937 if omciErr.GetError() == nil {
938 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
939 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000940 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000941 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300942 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000943 }
944
dbainbri4d3a0dc2020-12-02 00:33:42 +0000945 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000946 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000947 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000948 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300949 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000950 }
951
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000952 omciRxCallbackPair := CallbackPair{
953 CbKey: tid,
954 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000955 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000956 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000957 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000958 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000959 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300960 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000961 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000962 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +0300963 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000964 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000965 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000966 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300967 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000968}
969
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +0000970// SendCreateMBServiceProfile creates MacBridgeServiceProfile ME instance
971func (oo *OmciCC) SendCreateMBServiceProfile(ctx context.Context,
972 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
973 tid := oo.GetNextTid(highPrio)
974 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000975 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000976 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000977
978 meParams := me.ParamData{
979 EntityID: instID,
980 Attributes: me.AttributeValueMap{
ozgecanetsiab5000ef2020-11-27 14:38:20 +0300981 "Priority": 0x8000,
982 "MaxAge": 20 * 256, //20s
983 "HelloTime": 2 * 256, //2s
984 "ForwardDelay": 15 * 256, //15s
985 "DynamicFilteringAgeingTime": 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000986 },
987 }
988
989 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
990 if omciErr.GetError() == nil {
991 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
992 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
993 omci.TransactionID(tid), omci.AddDefaults(true))
994 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000995 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000996 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300997 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000998 }
999
dbainbri4d3a0dc2020-12-02 00:33:42 +00001000 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001001 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001002 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001003 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001004 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001005 }
1006
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001007 omciRxCallbackPair := CallbackPair{
1008 CbKey: tid,
1009 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001010 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001011 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001012 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001013 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001014 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001015 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001016 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001017 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001018 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001019 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001020 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001021 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001022 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001023}
1024
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001025// SendCreateMBPConfigDataUniSide creates MacBridgePortConfigurationData ME instance
1026func (oo *OmciCC) SendCreateMBPConfigDataUniSide(ctx context.Context,
1027 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1028 tid := oo.GetNextTid(highPrio)
1029 instID, idErr := GenerateUNISideMBPCDEID(uint16(aPUniPort.MacBpNo))
Mahir Gunyel6781f962021-05-16 23:30:08 -07001030 if idErr != nil {
1031 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1032 "Err": idErr, "device-id": oo.deviceID})
1033 return nil, idErr
1034 }
1035 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001036 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.MacBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001037
1038 meParams := me.ParamData{
1039 EntityID: instID,
1040 Attributes: me.AttributeValueMap{
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001041 "BridgeIdPointer": MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo),
1042 "PortNum": aPUniPort.MacBpNo,
1043 "TpType": uint8(aPUniPort.PortType),
1044 "TpPointer": aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001045 },
1046 }
1047 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1048 if omciErr.GetError() == nil {
1049 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1050 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1051 omci.TransactionID(tid), omci.AddDefaults(true))
1052 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001053 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001054 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001055 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001056 }
1057
dbainbri4d3a0dc2020-12-02 00:33:42 +00001058 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001059 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001060 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001061 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001062 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001063 }
1064
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001065 omciRxCallbackPair := CallbackPair{
1066 CbKey: tid,
1067 CbEntry: CallbackPairEntry{oo.pOnuDeviceEntry.GetMibDownloadFsmCommChan(), oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001068 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001069 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001070 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001071 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001072 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001073 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001074 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001075 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001076 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001077 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001078 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001079 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001080 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001081}
1082
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001083// SendCreateEVTOConfigData creates ExtendedVlanTaggingOperationConfigurationData ME instance
1084func (oo *OmciCC) SendCreateEVTOConfigData(ctx context.Context,
1085 aPUniPort *OnuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
1086 tid := oo.GetNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001087 //same entityId is used as for MBSP (see there), but just arbitrary ...
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001088 instID := MacBridgeServiceProfileEID + uint16(aPUniPort.MacBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001089 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001090 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001091
1092 // compare python adapter code WA VOL-1311: this is not done here!
1093 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1094 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1095 assType := uint8(2) // default AssociationType is PPTPEthUni
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001096 if aPUniPort.PortType == UniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001097 assType = uint8(10) // for VEIP
1098 }
1099 meParams := me.ParamData{
1100 EntityID: instID,
1101 Attributes: me.AttributeValueMap{
1102 "AssociationType": assType,
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001103 "AssociatedMePointer": aPUniPort.EntityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001104 },
1105 }
1106 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1107 if omciErr.GetError() == nil {
1108 //all setByCreate parameters already set, no default option required ...
1109 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1110 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001111 logger.Errorw(ctx, "Cannot encode EVTOCD 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
dbainbri4d3a0dc2020-12-02 00:33:42 +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 EVTOCD 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 EVTOCD 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 EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001134 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001135 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001136 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", 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 Hildebrandtccd390c2020-05-29 13:49:04 +00001139}
1140
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001141// SendSetOnuGLS sets OnuG ME instance
1142func (oo *OmciCC) SendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001143 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001144 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001145 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001146 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001147
1148 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1149 meParams := me.ParamData{
1150 EntityID: 0,
1151 Attributes: requestedAttributes,
1152 }
1153 meInstance, omciErr := me.NewOnuG(meParams)
1154 if omciErr.GetError() == nil {
1155 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1156 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001157 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001158 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001159 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001160 }
1161
dbainbri4d3a0dc2020-12-02 00:33:42 +00001162 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001163 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001164 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001165 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001166 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001167 }
1168
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001169 omciRxCallbackPair := CallbackPair{
1170 CbKey: tid,
1171 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001172 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001173 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001174 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001175 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001176 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001177 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001178 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001179 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001180 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001181 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001182 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001183 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001184 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001185}
1186
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001187// SendSetPptpEthUniLS sets PhysicalPathTerminationPointEthernetUni ME instance
1188func (oo *OmciCC) SendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001189 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001190 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001191 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001192 "SequNo": strconv.FormatInt(int64(tid), 16)})
1193
1194 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1195 meParams := me.ParamData{
1196 EntityID: aInstNo,
1197 Attributes: requestedAttributes,
1198 }
1199 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1200 if omciErr.GetError() == nil {
1201 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1202 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001203 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001204 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001205 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001206 }
1207
dbainbri4d3a0dc2020-12-02 00:33:42 +00001208 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001209 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001210 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001211 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001212 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001213 }
1214
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001215 omciRxCallbackPair := CallbackPair{
1216 CbKey: tid,
1217 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001218 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001219 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001220 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001221 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001222 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001223 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001224 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001225 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001226 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001227 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001228 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001229 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001230 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001231}
1232
1233/* UniG obsolete by now, left here in case it should be needed once again
1234 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301235func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001236 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001237 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001238 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001239 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001240
1241 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1242 meParams := me.ParamData{
1243 EntityID: aInstNo,
1244 Attributes: requestedAttributes,
1245 }
1246 meInstance, omciErr := me.NewUniG(meParams)
1247 if omciErr.GetError() == nil {
1248 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1249 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001250 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001251 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001252 return nil
1253 }
1254
1255 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1256 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001257 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001258 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001259 return nil
1260 }
1261
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001262 omciRxCallbackPair := CallbackPair{
1263 CbKey: tid,
1264 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001265 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001266 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001267 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001268 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001269 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001270 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001271 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001272 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001273 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001274 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001275 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001276 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001277 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001278}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001279*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001280
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001281// SendSetVeipLS sets VirtualEthernetInterfacePoint ME instance
1282func (oo *OmciCC) SendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001283 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001284 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001285 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001286 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001287
1288 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1289 meParams := me.ParamData{
1290 EntityID: aInstNo,
1291 Attributes: requestedAttributes,
1292 }
1293 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1294 if omciErr.GetError() == nil {
1295 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1296 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001297 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001298 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001299 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001300 }
1301
dbainbri4d3a0dc2020-12-02 00:33:42 +00001302 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001303 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001304 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001305 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001306 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001307 }
1308
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001309 omciRxCallbackPair := CallbackPair{
1310 CbKey: tid,
1311 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001312 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001313 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001314 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001315 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001316 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001317 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001318 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001319 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001320 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001321 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001322 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001323 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001324 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001325}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001326
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001327// SendGetMe gets ME instance
1328func (oo *OmciCC) SendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001329 timeout int, highPrio bool, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001330
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001331 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001332 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001333 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001334
1335 meParams := me.ParamData{
1336 EntityID: entityID,
1337 Attributes: requestedAttributes,
1338 }
1339 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1340 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301341 meClassIDName := meInstance.GetName()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001342 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.GetRequestType, omci.TransactionID(tid))
1343 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001344 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 +03001345 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001346 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001347 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001348 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001349 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001350 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001351 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001352 omciRxCallbackPair := CallbackPair{
1353 CbKey: tid,
1354 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001355 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001356 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001357 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001358 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001359 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001360 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001361 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001362 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001363 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001364 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001365 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001366}
1367
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001368// SendGetMeWithAttributeMask gets ME instance with attribute mask
1369func (oo *OmciCC) SendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
Himani Chawla43f95ff2021-06-03 00:24:12 +05301370 timeout int, highPrio bool, rxChan chan Message) error {
1371
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001372 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301373 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1374 "SequNo": strconv.FormatInt(int64(tid), 16)})
1375
1376 request := &omci.GetRequest{
1377 MeBasePacket: omci.MeBasePacket{
1378 EntityInstance: entityID,
1379 EntityClass: classID,
1380 },
1381 AttributeMask: requestedAttributesMask,
1382 }
1383
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001384 pkt, err := Serialize(ctx, omci.GetRequestType, request, tid)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301385 if err != nil {
1386 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1387 return err
1388 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001389 omciRxCallbackPair := CallbackPair{
1390 CbKey: tid,
1391 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05301392 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001393 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05301394 if err != nil {
1395 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1396 return err
1397 }
1398 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1399 return nil
1400}
1401
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001402// SendCreateDot1PMapper creates Ieee8021PMapperServiceProfile ME instance
1403func (oo *OmciCC) SendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001404 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001405 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001406 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001407 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1408
1409 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001410 EntityID: aInstID,
1411 Attributes: me.AttributeValueMap{
1412 //workaround for unsuitable omci-lib default values, cmp VOL-3729
1413 "TpPointer": 0xFFFF,
1414 "InterworkTpPointerForPBitPriority0": 0xFFFF,
1415 "InterworkTpPointerForPBitPriority1": 0xFFFF,
1416 "InterworkTpPointerForPBitPriority2": 0xFFFF,
1417 "InterworkTpPointerForPBitPriority3": 0xFFFF,
1418 "InterworkTpPointerForPBitPriority4": 0xFFFF,
1419 "InterworkTpPointerForPBitPriority5": 0xFFFF,
1420 "InterworkTpPointerForPBitPriority6": 0xFFFF,
1421 "InterworkTpPointerForPBitPriority7": 0xFFFF,
1422 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001423 }
1424 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1425 if omciErr.GetError() == nil {
1426 //we have to set all 'untouched' parameters to default by some additional option parameter!!
1427 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1428 omci.TransactionID(tid), omci.AddDefaults(true))
1429 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001430 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001431 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001432 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001433 }
1434
dbainbri4d3a0dc2020-12-02 00:33:42 +00001435 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001436 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001437 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001438 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001439 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001440 }
1441
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001442 omciRxCallbackPair := CallbackPair{
1443 CbKey: tid,
1444 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001445 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001446 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001447 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001448 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001449 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001450 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001451 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001452 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001453 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001454 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001455 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001456 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001457 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001458}
1459
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001460// SendCreateMBPConfigDataVar creates MacBridgePortConfigurationData ME instance
1461func (oo *OmciCC) SendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001462 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001463 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001464 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001465 "SequNo": strconv.FormatInt(int64(tid), 16),
1466 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1467
1468 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1469 if omciErr.GetError() == nil {
1470 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1471 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1472 omci.TransactionID(tid), omci.AddDefaults(true))
1473 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001474 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001475 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001476 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001477 }
1478
dbainbri4d3a0dc2020-12-02 00:33:42 +00001479 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001480 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001481 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001482 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001483 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001484 }
1485
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001486 omciRxCallbackPair := CallbackPair{
1487 CbKey: tid,
1488 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001489 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001490 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001491 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001492 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001493 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001494 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001495 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001496 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001497 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001498 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001499 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001500 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001501 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001502}
1503
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001504// SendCreateGemNCTPVar creates GemPortNetworkCtp ME instance
1505func (oo *OmciCC) SendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001506 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001507 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001508 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001509 "SequNo": strconv.FormatInt(int64(tid), 16),
1510 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1511
1512 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1513 if omciErr.GetError() == nil {
1514 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1515 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1516 omci.TransactionID(tid), omci.AddDefaults(true))
1517 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001518 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001519 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001520 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001521 }
1522
dbainbri4d3a0dc2020-12-02 00:33:42 +00001523 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001524 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001525 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001526 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001527 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001528 }
1529
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001530 omciRxCallbackPair := CallbackPair{
1531 CbKey: tid,
1532 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001533 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001534 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001535 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001536 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001537 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001538 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001539 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001540 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001541 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001542 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001543 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001544 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001545 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001546}
1547
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001548// SendSetGemNCTPVar sets GemPortNetworkCtp ME instance
1549func (oo *OmciCC) SendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1550 tid := oo.GetNextTid(highPrio)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001551 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1552 "SequNo": strconv.FormatInt(int64(tid), 16),
1553 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1554
1555 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1556 if omciErr.GetError() == nil {
1557 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1558 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType,
1559 omci.TransactionID(tid), omci.AddDefaults(true))
1560 if err != nil {
1561 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1562 "Err": err, "device-id": oo.deviceID})
1563 return nil, err
1564 }
1565
1566 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
1567 if err != nil {
1568 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1569 "Err": err, "device-id": oo.deviceID})
1570 return nil, err
1571 }
1572
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001573 omciRxCallbackPair := CallbackPair{
1574 CbKey: tid,
1575 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia82b91a62021-05-21 18:54:49 +03001576 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001577 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia82b91a62021-05-21 18:54:49 +03001578 if err != nil {
1579 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1580 "Err": err, "device-id": oo.deviceID})
1581 return nil, err
1582 }
1583 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1584 return meInstance, nil
1585 }
1586 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1587 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1588 return nil, omciErr.GetError()
1589}
1590
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001591// SendCreateGemIWTPVar creates GemInterworkingTerminationPoint ME instance
1592func (oo *OmciCC) SendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001593 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001594 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001595 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001596 "SequNo": strconv.FormatInt(int64(tid), 16),
1597 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1598
1599 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1600 if omciErr.GetError() == nil {
1601 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
1602 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1603 omci.TransactionID(tid))
1604 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001605 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001606 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001607 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001608 }
1609
dbainbri4d3a0dc2020-12-02 00:33:42 +00001610 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001611 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001612 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001613 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001614 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001615 }
1616
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001617 omciRxCallbackPair := CallbackPair{
1618 CbKey: tid,
1619 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001620 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001621 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001622 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001623 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001624 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001625 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001626 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001627 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001628 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001629 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001630 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001631 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001632 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001633}
1634
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001635// SendSetTcontVar sets TCont ME instance
1636func (oo *OmciCC) SendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001637 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001638 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001639 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001640 "SequNo": strconv.FormatInt(int64(tid), 16),
1641 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1642
1643 meInstance, omciErr := me.NewTCont(params[0])
1644 if omciErr.GetError() == nil {
1645 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1646 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001647 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001648 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001649 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001650 }
1651
dbainbri4d3a0dc2020-12-02 00:33:42 +00001652 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001653 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001654 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001655 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001656 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001657 }
1658
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001659 omciRxCallbackPair := CallbackPair{
1660 CbKey: tid,
1661 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001662 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001663 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001664 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001665 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001666 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001667 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001668 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001669 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001670 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001671 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001672 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001673 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001674 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001675}
1676
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001677// SendSetPrioQueueVar sets PriorityQueue ME instance
1678func (oo *OmciCC) SendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001679 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001680 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001681 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001682 "SequNo": strconv.FormatInt(int64(tid), 16),
1683 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1684
1685 meInstance, omciErr := me.NewPriorityQueue(params[0])
1686 if omciErr.GetError() == nil {
1687 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1688 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001689 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001690 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001691 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001692 }
1693
dbainbri4d3a0dc2020-12-02 00:33:42 +00001694 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001695 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001696 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001697 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001698 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001699 }
1700
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001701 omciRxCallbackPair := CallbackPair{
1702 CbKey: tid,
1703 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001704 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001705 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001706 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001707 logger.Errorw(ctx, "Cannot send PrioQueue set", 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 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001711 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001712 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001713 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001714 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001715 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001716 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001717}
1718
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001719// SendSetDot1PMapperVar sets Ieee8021PMapperServiceProfile ME instance
1720func (oo *OmciCC) SendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001721 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001722 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001723 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001724 "SequNo": strconv.FormatInt(int64(tid), 16),
1725 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1726
1727 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1728 if omciErr.GetError() == nil {
1729 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1730 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001731 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001732 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001733 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001734 }
1735
dbainbri4d3a0dc2020-12-02 00:33:42 +00001736 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001737 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001738 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001739 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001740 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001741 }
1742
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001743 omciRxCallbackPair := CallbackPair{
1744 CbKey: tid,
1745 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001746 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001747 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001748 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001749 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001750 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001751 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001752 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001753 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001754 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001755 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001756 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001757 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001758 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001759}
mpagenkodff5dda2020-08-28 11:52:01 +00001760
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001761// SendCreateVtfdVar creates VlanTaggingFilterData ME instance
1762func (oo *OmciCC) SendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001763 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001764 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001765 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001766 "SequNo": strconv.FormatInt(int64(tid), 16),
1767 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1768
1769 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1770 if omciErr.GetError() == nil {
1771 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
1772 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1773 omci.TransactionID(tid))
1774 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001775 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001776 "Err": err, "device-id": oo.deviceID})
1777 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1778 // return (dual format) error code that can be used at caller for immediate error treatment
1779 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001780 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001781 }
1782
dbainbri4d3a0dc2020-12-02 00:33:42 +00001783 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001784 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001785 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001786 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001787 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001788 }
1789
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001790 omciRxCallbackPair := CallbackPair{
1791 CbKey: tid,
1792 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001793 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001794 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001795 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001796 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001797 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001798 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001799 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001800 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001801 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00001802 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001803 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001804 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001805 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00001806}
1807
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001808// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001809func (oo *OmciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001810 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001811 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001812 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001813 "SequNo": strconv.FormatInt(int64(tid), 16),
1814 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1815
1816 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1817 if omciErr.GetError() == nil {
1818 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType,
1819 omci.TransactionID(tid))
1820 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001821 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001822 "Err": err, "device-id": oo.deviceID})
1823 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1824 // return (dual format) error code that can be used at caller for immediate error treatment
1825 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001826 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001827 }
1828
dbainbri4d3a0dc2020-12-02 00:33:42 +00001829 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001830 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001831 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001832 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001833 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001834 }
1835
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001836 omciRxCallbackPair := CallbackPair{
1837 CbKey: tid,
1838 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001839 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001840 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001841 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001842 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001843 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001844 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001845 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001846 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001847 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001848 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001849 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001850 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001851 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001852}
1853
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001854// SendCreateEvtocdVar creates ExtendedVlanTaggingOperationConfigurationData ME instance
1855func (oo *OmciCC) SendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001856 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001857 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001858 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001859 "SequNo": strconv.FormatInt(int64(tid), 16),
1860 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1861
1862 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1863 if omciErr.GetError() == nil {
1864 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1865 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001866 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001867 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001868 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001869 }
1870
dbainbri4d3a0dc2020-12-02 00:33:42 +00001871 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001872 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001873 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001874 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001875 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001876 }
1877
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001878 omciRxCallbackPair := CallbackPair{
1879 CbKey: tid,
1880 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001881 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001882 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001883 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001884 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001885 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001886 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001887 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001888 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001889 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001890 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001891 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001892 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001893 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001894}
1895
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001896// SendSetEvtocdVar sets ExtendedVlanTaggingOperationConfigurationData ME instance
1897func (oo *OmciCC) SendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001898 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001899 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001900 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001901 "SequNo": strconv.FormatInt(int64(tid), 16),
1902 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1903
1904 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1905 if omciErr.GetError() == nil {
1906 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1907 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001908 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001909 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001910 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001911 }
1912
dbainbri4d3a0dc2020-12-02 00:33:42 +00001913 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001914 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001915 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001916 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001917 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001918 }
1919
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001920 omciRxCallbackPair := CallbackPair{
1921 CbKey: tid,
1922 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001923 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001924 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001925 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001926 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001927 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001928 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001929 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001930 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001931 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00001932 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001933 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001934 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001935 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00001936}
mpagenko01e726e2020-10-23 09:45:29 +00001937
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001938// SendDeleteEvtocd deletes ExtendedVlanTaggingOperationConfigurationData ME instance
1939func (oo *OmciCC) SendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001940 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001941 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001942 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001943 "SequNo": strconv.FormatInt(int64(tid), 16),
1944 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1945
1946 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1947 if omciErr.GetError() == nil {
1948 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid))
1949 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001950 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001951 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001952 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001953 }
1954
dbainbri4d3a0dc2020-12-02 00:33:42 +00001955 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001956 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001957 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001958 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001959 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001960 }
1961
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001962 omciRxCallbackPair := CallbackPair{
1963 CbKey: tid,
1964 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001965 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001966 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001967 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001968 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001969 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001970 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001971 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001972 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001973 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001974 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001975 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001976 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001977 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001978}
1979
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001980// SendDeleteVtfd deletes VlanTaggingFilterData ME instance
1981func (oo *OmciCC) SendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001982 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00001983 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001984 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00001985 "SequNo": strconv.FormatInt(int64(tid), 16),
1986 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1987
1988 meParams := me.ParamData{EntityID: aInstID}
1989 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
1990 if omciErr.GetError() == nil {
1991 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
1992 omci.TransactionID(tid))
1993 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001994 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001995 "Err": err, "device-id": oo.deviceID})
1996 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1997 // return (dual format) error code that can be used at caller for immediate error treatment
1998 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001999 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002000 }
2001
dbainbri4d3a0dc2020-12-02 00:33:42 +00002002 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00002003 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002004 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002005 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002006 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002007 }
2008
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002009 omciRxCallbackPair := CallbackPair{
2010 CbKey: tid,
2011 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00002012 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002013 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00002014 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002015 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002016 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002017 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00002018 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002019 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002020 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00002021 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002022 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00002023 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002024 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00002025}
ozgecanetsia422dbf32020-10-28 14:07:19 +03002026
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002027// SendCreateTDVar creates TrafficDescriptor ME instance
2028func (oo *OmciCC) SendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
2029 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002030 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
2031 "SequNo": strconv.FormatInt(int64(tid), 16),
2032 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2033 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2034 if omciErr.GetError() == nil {
2035 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
2036 if err != nil {
2037 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002038 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002039 }
2040 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2041 if err != nil {
2042 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002043 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002044 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002045 omciRxCallbackPair := CallbackPair{
2046 CbKey: tid,
2047 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002048 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002049 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002050 if err != nil {
2051 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002052 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002053 }
2054 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002055 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002056 }
2057 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002058 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002059}
2060
2061// nolint: unused
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002062func (oo *OmciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002063 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002064 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002065 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2066 "SequNo": strconv.FormatInt(int64(tid), 16),
2067 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2068
2069 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2070 if omciErr.GetError() == nil {
2071 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
2072 if err != nil {
2073 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002074 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002075 }
2076 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2077 if err != nil {
2078 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002079 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002080 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002081 omciRxCallbackPair := CallbackPair{
2082 CbKey: tid,
2083 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002084 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002085 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002086 if err != nil {
2087 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002088 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002089 }
2090 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002091 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002092 }
2093 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002094 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002095
2096}
2097
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002098// SendDeleteTD - TODO: add comment
2099func (oo *OmciCC) SendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002100 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002101 tid := oo.GetNextTid(highPrio)
ozgecanetsiab6441962021-03-10 10:58:48 +03002102 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2103 "SequNo": strconv.FormatInt(int64(tid), 16),
2104 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2105
2106 meParams := me.ParamData{EntityID: aInstID}
2107 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2108 if omciErr.GetError() == nil {
2109 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid))
2110 if err != nil {
2111 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002112 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002113 }
2114 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2115 if err != nil {
2116 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002117 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002118 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002119 omciRxCallbackPair := CallbackPair{
2120 CbKey: tid,
2121 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab6441962021-03-10 10:58:48 +03002122 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002123 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002124 if err != nil {
2125 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002126 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002127 }
2128 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002129 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002130 }
2131 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002132 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002133
2134}
2135
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002136// SendDeleteGemIWTP deletes GemInterworkingTerminationPoint ME instance
2137func (oo *OmciCC) SendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002138 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002139 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002140 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002141 "SequNo": strconv.FormatInt(int64(tid), 16),
2142 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2143
2144 meParams := me.ParamData{EntityID: aInstID}
2145 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2146 if omciErr.GetError() == nil {
2147 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2148 omci.TransactionID(tid))
2149 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002150 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002151 "Err": err, "device-id": oo.deviceID})
2152 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2153 // return (dual format) error code that can be used at caller for immediate error treatment
2154 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002155 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002156 }
2157
dbainbri4d3a0dc2020-12-02 00:33:42 +00002158 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002159 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002160 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002161 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002162 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002163 }
2164
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002165 omciRxCallbackPair := CallbackPair{
2166 CbKey: tid,
2167 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002168 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002169 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002170 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002171 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002172 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002173 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002174 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002175 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002176 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002177 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002178 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002179 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002180 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002181}
2182
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002183// SendDeleteGemNCTP deletes GemPortNetworkCtp ME instance
2184func (oo *OmciCC) SendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002185 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002186 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002187 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002188 "SequNo": strconv.FormatInt(int64(tid), 16),
2189 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2190
2191 meParams := me.ParamData{EntityID: aInstID}
2192 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2193 if omciErr.GetError() == nil {
2194 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2195 omci.TransactionID(tid))
2196 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002197 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002198 "Err": err, "device-id": oo.deviceID})
2199 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2200 // return (dual format) error code that can be used at caller for immediate error treatment
2201 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002202 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002203 }
2204
dbainbri4d3a0dc2020-12-02 00:33:42 +00002205 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002206 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002207 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002208 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002209 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002210 }
2211
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002212 omciRxCallbackPair := CallbackPair{
2213 CbKey: tid,
2214 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002215 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002216 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002217 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002218 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002219 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002220 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002221 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002222 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002223 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002224 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002225 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002226 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002227 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002228}
2229
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002230// SendDeleteDot1PMapper deletes Ieee8021PMapperServiceProfile ME instance
2231func (oo *OmciCC) SendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002232 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002233 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002234 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002235 "SequNo": strconv.FormatInt(int64(tid), 16),
2236 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2237
2238 meParams := me.ParamData{EntityID: aInstID}
2239 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2240 if omciErr.GetError() == nil {
2241 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2242 omci.TransactionID(tid))
2243 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002244 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002245 "Err": err, "device-id": oo.deviceID})
2246 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2247 // return (dual format) error code that can be used at caller for immediate error treatment
2248 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002249 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002250 }
2251
dbainbri4d3a0dc2020-12-02 00:33:42 +00002252 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002253 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002254 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002255 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002256 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002257 }
2258
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002259 omciRxCallbackPair := CallbackPair{
2260 CbKey: tid,
2261 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002262 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002263 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002264 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002265 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002266 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002267 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002268 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002269 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002270 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002271 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002272 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002273 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002274 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002275}
2276
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002277// SendDeleteMBPConfigData deletes MacBridgePortConfigurationData ME instance
2278func (oo *OmciCC) SendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002279 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002280 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002281 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002282 "SequNo": strconv.FormatInt(int64(tid), 16),
2283 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2284
2285 meParams := me.ParamData{EntityID: aInstID}
2286 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2287 if omciErr.GetError() == nil {
2288 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2289 omci.TransactionID(tid))
2290 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002291 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002292 "Err": err, "device-id": oo.deviceID})
2293 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2294 // return (dual format) error code that can be used at caller for immediate error treatment
2295 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002296 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002297 }
2298
dbainbri4d3a0dc2020-12-02 00:33:42 +00002299 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002300 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002301 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002302 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002303 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002304 }
2305
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002306 omciRxCallbackPair := CallbackPair{
2307 CbKey: tid,
2308 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002309 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002310 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002311 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002312 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002313 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002314 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002315 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002316 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002317 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002318 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002319 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002320 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002321 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002322}
2323
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002324// SendCreateMulticastGemIWTPVar creates MulticastGemInterworkingTerminationPoint ME instance
2325func (oo *OmciCC) SendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002326 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002327 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002328 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002329 "SequNo": strconv.FormatInt(int64(tid), 16),
2330 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2331
2332 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2333 if omciErr.GetError() == nil {
2334 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2335 omci.AddDefaults(true))
2336 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002337 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002338 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002339 }
2340
dbainbri4d3a0dc2020-12-02 00:33:42 +00002341 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002342 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002343 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002344 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002345 }
2346
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002347 omciRxCallbackPair := CallbackPair{CbKey: tid,
2348 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002349 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002350 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002351 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002352 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002353 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002354 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002355 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002356 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002357 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002358 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002359 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002360 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002361}
2362
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002363// SendSetMulticastGemIWTPVar sets MulticastGemInterworkingTerminationPoint ME instance
2364func (oo *OmciCC) SendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002365 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002366 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002367 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002368 "SequNo": strconv.FormatInt(int64(tid), 16),
2369 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2370
2371 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2372 if omciErr.GetError() == nil {
2373 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid),
2374 omci.AddDefaults(true))
2375 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002376 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002377 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002378 }
2379
dbainbri4d3a0dc2020-12-02 00:33:42 +00002380 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002381 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002382 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002383 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002384 }
2385
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002386 omciRxCallbackPair := CallbackPair{CbKey: tid,
2387 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002388 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002389 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002390 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002391 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002392 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002393 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002394 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002395 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002396 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002397 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002398 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002399 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002400}
2401
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002402// SendCreateMulticastOperationProfileVar creates MulticastOperationsProfile ME instance
2403func (oo *OmciCC) SendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002404 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002405 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002406 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002407 "SequNo": strconv.FormatInt(int64(tid), 16),
2408 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2409
2410 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2411 if omciErr.GetError() == nil {
2412 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2413 omci.AddDefaults(true))
2414 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002415 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002416 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002417 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002418 }
2419
dbainbri4d3a0dc2020-12-02 00:33:42 +00002420 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002421 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002422 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002423 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002424 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002425 }
2426
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002427 omciRxCallbackPair := CallbackPair{CbKey: tid,
2428 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002429 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002430 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002431 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002432 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002433 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002434 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002435 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002436 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002437 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002438 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002439 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002440 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002441 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002442}
2443
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002444// SendSetMulticastOperationProfileVar sets MulticastOperationsProfile ME instance
2445func (oo *OmciCC) SendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002446 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002447 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002448 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002449 "SequNo": strconv.FormatInt(int64(tid), 16),
2450 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2451
2452 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2453 if omciErr.GetError() == nil {
2454 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid),
2455 omci.AddDefaults(true))
2456 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002457 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002458 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002459 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002460 }
2461
dbainbri4d3a0dc2020-12-02 00:33:42 +00002462 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002463 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002464 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002465 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002466 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002467 }
2468
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002469 omciRxCallbackPair := CallbackPair{CbKey: tid,
2470 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002471 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002472 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002473 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002474 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002475 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002476 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002477 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002478 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002479 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002480 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002481 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002482 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002483 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002484}
2485
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002486// SendCreateMulticastSubConfigInfoVar creates MulticastSubscriberConfigInfo ME instance
2487func (oo *OmciCC) SendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002488 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002489 tid := oo.GetNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002490 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002491 "SequNo": strconv.FormatInt(int64(tid), 16),
2492 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2493
2494 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2495 if omciErr.GetError() == nil {
2496 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2497 omci.AddDefaults(true))
2498 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002499 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002500 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002501 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002502 }
2503
dbainbri4d3a0dc2020-12-02 00:33:42 +00002504 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002505 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002506 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002507 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002508 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002509 }
2510
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002511 omciRxCallbackPair := CallbackPair{CbKey: tid,
2512 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002513 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002514 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002515 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002516 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002517 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002518 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002519 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002520 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002521 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002522 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002523 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002524 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002525 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002526}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002527
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002528// SendSyncTime sends SynchronizeTimeRequest
2529func (oo *OmciCC) SendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
2530 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002531 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
2532 "SequNo": strconv.FormatInt(int64(tid), 16)})
2533
2534 omciLayer := &omci.OMCI{
2535 TransactionID: tid,
2536 MessageType: omci.SynchronizeTimeRequestType,
2537 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2538 // Length: 0x28, // Optional, defaults to 40 octets
2539 }
2540 utcTime := time.Now().UTC()
2541 request := &omci.SynchronizeTimeRequest{
2542 MeBasePacket: omci.MeBasePacket{
2543 EntityClass: me.OnuGClassID,
2544 // Default Instance ID is 0
2545 },
2546 Year: uint16(utcTime.Year()),
2547 Month: uint8(utcTime.Month()),
2548 Day: uint8(utcTime.Day()),
2549 Hour: uint8(utcTime.Hour()),
2550 Minute: uint8(utcTime.Minute()),
2551 Second: uint8(utcTime.Second()),
2552 }
2553
2554 pkt, err := serializeOmciLayer(ctx, omciLayer, request)
2555 if err != nil {
2556 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
2557 "device-id": oo.deviceID})
2558 return err
2559 }
2560
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002561 omciRxCallbackPair := CallbackPair{CbKey: tid,
2562 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002563 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002564 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002565 if err != nil {
2566 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
2567 "device-id": oo.deviceID})
2568 return err
2569 }
2570 logger.Debug(ctx, "send synchronize time request done")
2571 return nil
2572}
2573
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002574// SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME creates or deletes EthernetFramePerformanceMonitoringHistoryData ME instance
2575func (oo *OmciCC) SendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002576 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002577 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002578 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2579 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
2580 meParam := me.ParamData{EntityID: entityID}
2581 var meInstance *me.ManagedEntity
2582 var omciErr me.OmciErrors
2583 if upstream {
2584 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
2585 } else {
2586 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
2587 }
2588 if omciErr.GetError() == nil {
2589 var omciLayer *omci.OMCI
2590 var msgLayer gopacket.SerializableLayer
2591 var err error
2592 if create {
2593 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2594 omci.AddDefaults(true))
2595 } else {
2596 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2597 omci.AddDefaults(true))
2598 }
2599 if err != nil {
2600 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
2601 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002602 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002603 }
2604
2605 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2606 if err != nil {
2607 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
2608 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002609 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002610 }
2611
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002612 omciRxCallbackPair := CallbackPair{CbKey: tid,
2613 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002614 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002615 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002616 if err != nil {
2617 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
2618 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002619 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002620 }
2621 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
2622 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002623 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08002624 }
2625 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
2626 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 +03002627 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08002628}
2629
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002630// SendCreateOrDeleteEthernetUniHistoryME creates or deletes EthernetPerformanceMonitoringHistoryData ME instance
2631func (oo *OmciCC) SendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002632 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002633 tid := oo.GetNextTid(highPrio)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002634 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2635 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2636 meParam := me.ParamData{EntityID: entityID}
2637 var meInstance *me.ManagedEntity
2638 var omciErr me.OmciErrors
2639 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
2640
2641 if omciErr.GetError() == nil {
2642 var omciLayer *omci.OMCI
2643 var msgLayer gopacket.SerializableLayer
2644 var err error
2645 if create {
2646 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2647 omci.AddDefaults(true))
2648 } else {
2649 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2650 omci.AddDefaults(true))
2651 }
2652 if err != nil {
2653 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
2654 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002655 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002656 }
2657
2658 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2659 if err != nil {
2660 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
2661 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002662 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002663 }
2664
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002665 omciRxCallbackPair := CallbackPair{CbKey: tid,
2666 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002667 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002668 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002669 if err != nil {
2670 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
2671 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002672 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002673 }
2674 logger.Debugw(ctx, "send ethernet uni history data ME done",
2675 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002676 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08002677 }
2678 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
2679 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002680 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08002681}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002682
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002683// SendCreateOrDeleteFecHistoryME creates or deletes FecPerformanceMonitoringHistoryData ME instance
2684func (oo *OmciCC) SendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002685 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002686 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002687 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2688 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2689 meParam := me.ParamData{EntityID: entityID}
2690 var meInstance *me.ManagedEntity
2691 var omciErr me.OmciErrors
2692 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
2693
2694 if omciErr.GetError() == nil {
2695 var omciLayer *omci.OMCI
2696 var msgLayer gopacket.SerializableLayer
2697 var err error
2698 if create {
2699 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2700 omci.AddDefaults(true))
2701 } else {
2702 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2703 omci.AddDefaults(true))
2704 }
2705 if err != nil {
2706 logger.Errorw(ctx, "Cannot encode fec history data ME",
2707 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002708 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002709 }
2710
2711 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2712 if err != nil {
2713 logger.Errorw(ctx, "Cannot serialize fec history data ME",
2714 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002715 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002716 }
2717
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002718 omciRxCallbackPair := CallbackPair{CbKey: tid,
2719 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002720 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002721 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002722 if err != nil {
2723 logger.Errorw(ctx, "Cannot send fec history data ME",
2724 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002725 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002726 }
2727 logger.Debugw(ctx, "send fec history data ME done",
2728 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002729 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002730 }
2731 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
2732 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002733 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002734}
2735
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002736// SendCreateOrDeleteGemPortHistoryME deletes GemPortNetworkCtpPerformanceMonitoringHistoryData ME instance
2737func (oo *OmciCC) SendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002738 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002739 tid := oo.GetNextTid(highPrio)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002740 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2741 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2742 meParam := me.ParamData{EntityID: entityID}
2743 var meInstance *me.ManagedEntity
2744 var omciErr me.OmciErrors
2745 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
2746
2747 if omciErr.GetError() == nil {
2748 var omciLayer *omci.OMCI
2749 var msgLayer gopacket.SerializableLayer
2750 var err error
2751 if create {
2752 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2753 omci.AddDefaults(true))
2754 } else {
2755 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2756 omci.AddDefaults(true))
2757 }
2758 if err != nil {
2759 logger.Errorw(ctx, "Cannot encode gemport history data ME",
2760 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002761 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002762 }
2763
2764 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2765 if err != nil {
2766 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
2767 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002768 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002769 }
2770
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002771 omciRxCallbackPair := CallbackPair{CbKey: tid,
2772 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002773 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002774 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002775 if err != nil {
2776 logger.Errorw(ctx, "Cannot send gemport history data ME",
2777 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002778 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002779 }
2780 logger.Debugw(ctx, "send gemport history data ME done",
2781 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002782 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002783 }
2784 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
2785 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002786 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002787}
2788
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002789// SendStartSoftwareDownload sends StartSoftwareDownloadRequest
2790func (oo *OmciCC) SendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
mpagenko80622a52021-02-09 16:53:23 +00002791 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002792 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00002793 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
2794 "SequNo": strconv.FormatInt(int64(tid), 16),
2795 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2796
2797 omciLayer := &omci.OMCI{
2798 TransactionID: tid,
2799 MessageType: omci.StartSoftwareDownloadRequestType,
2800 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2801 // Length: 0x28, // Optional, defaults to 40 octets
2802 }
2803 request := &omci.StartSoftwareDownloadRequest{
2804 MeBasePacket: omci.MeBasePacket{
2805 EntityClass: me.SoftwareImageClassID,
2806 EntityInstance: aImageMeID, //inactive image
2807 },
2808 WindowSize: aDownloadWindowSize,
2809 ImageSize: aFileLen,
2810 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
2811 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
2812 }
2813
2814 var options gopacket.SerializeOptions
2815 options.FixLengths = true
2816 buffer := gopacket.NewSerializeBuffer()
2817 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2818 if err != nil {
2819 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
2820 "device-id": oo.deviceID})
2821 return err
2822 }
2823 outgoingPacket := buffer.Bytes()
2824
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002825 omciRxCallbackPair := CallbackPair{CbKey: tid,
2826 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00002827 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002828 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00002829 if err != nil {
2830 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
2831 "device-id": oo.deviceID})
2832 return err
2833 }
2834 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002835 return nil
2836}
2837
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002838// SendDownloadSection sends DownloadSectionRequestWithResponse
2839func (oo *OmciCC) SendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
mpagenko80622a52021-02-09 16:53:23 +00002840 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002841 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00002842 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
2843 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00002844 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00002845
2846 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
2847 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00002848 msgType := omci.DownloadSectionRequestType
mpagenkoc26d4c02021-05-06 14:27:57 +00002849 var timeout int = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00002850 if aAckRequest > 0 {
2851 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00002852 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00002853 }
mpagenko80622a52021-02-09 16:53:23 +00002854 omciLayer := &omci.OMCI{
2855 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002856 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00002857 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2858 // Length: 0x28, // Optional, defaults to 40 octets
2859 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05302860 localSectionData := make([]byte, len(aSection))
2861
mpagenko15ff4a52021-03-02 10:09:20 +00002862 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00002863 request := &omci.DownloadSectionRequest{
2864 MeBasePacket: omci.MeBasePacket{
2865 EntityClass: me.SoftwareImageClassID,
2866 EntityInstance: aImageMeID, //inactive image
2867 },
2868 SectionNumber: aDownloadSectionNo,
2869 SectionData: localSectionData,
2870 }
2871
2872 var options gopacket.SerializeOptions
2873 options.FixLengths = true
2874 buffer := gopacket.NewSerializeBuffer()
2875 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2876 if err != nil {
2877 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
2878 "device-id": oo.deviceID})
2879 return err
2880 }
2881 outgoingPacket := buffer.Bytes()
2882
mpagenko15ff4a52021-03-02 10:09:20 +00002883 //for initial debug purpose overrule the requested print state for some frames
2884 printFrame := aPrint
2885 if aAckRequest > 0 || aDownloadSectionNo == 0 {
2886 printFrame = true
2887 }
2888
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002889 omciRxCallbackPair := CallbackPair{CbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00002890 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
2891 // (used to avoid retransmission of frames with the same TID)
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002892 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00002893 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002894 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00002895 if err != nil {
2896 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
2897 "device-id": oo.deviceID})
2898 return err
2899 }
2900 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002901 return nil
2902}
2903
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002904//SendEndSoftwareDownload sends EndSoftwareDownloadRequest
2905func (oo *OmciCC) SendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
mpagenko80622a52021-02-09 16:53:23 +00002906 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002907 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00002908 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
2909 "SequNo": strconv.FormatInt(int64(tid), 16),
2910 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2911
mpagenko15ff4a52021-03-02 10:09:20 +00002912 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00002913 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002914 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00002915 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2916 // Length: 0x28, // Optional, defaults to 40 octets
2917 }
mpagenko15ff4a52021-03-02 10:09:20 +00002918 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00002919 MeBasePacket: omci.MeBasePacket{
2920 EntityClass: me.SoftwareImageClassID,
2921 EntityInstance: aImageMeID, //inactive image
2922 },
mpagenko15ff4a52021-03-02 10:09:20 +00002923 CRC32: aImageCrc,
2924 ImageSize: aFileLen,
2925 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
2926 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00002927 }
mpagenko15ff4a52021-03-02 10:09:20 +00002928
2929 var options gopacket.SerializeOptions
2930 options.FixLengths = true
2931 buffer := gopacket.NewSerializeBuffer()
2932 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2933 if err != nil {
2934 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00002935 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002936 return err
mpagenko80622a52021-02-09 16:53:23 +00002937 }
mpagenko15ff4a52021-03-02 10:09:20 +00002938 outgoingPacket := buffer.Bytes()
2939
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002940 omciRxCallbackPair := CallbackPair{CbKey: tid,
2941 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00002942 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002943 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00002944 if err != nil {
2945 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
2946 "device-id": oo.deviceID})
2947 return err
2948 }
2949 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002950 return nil
2951}
2952
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002953// SendActivateSoftware sends ActivateSoftwareRequest
2954func (oo *OmciCC) SendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
mpagenko80622a52021-02-09 16:53:23 +00002955 rxChan chan Message, aImageMeID uint16) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002956 tid := oo.GetNextTid(highPrio)
mpagenko80622a52021-02-09 16:53:23 +00002957 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
2958 "SequNo": strconv.FormatInt(int64(tid), 16),
2959 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2960
2961 omciLayer := &omci.OMCI{
2962 TransactionID: tid,
2963 MessageType: omci.ActivateSoftwareRequestType,
2964 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2965 // Length: 0x28, // Optional, defaults to 40 octets
2966 }
2967 request := &omci.ActivateSoftwareRequest{
2968 MeBasePacket: omci.MeBasePacket{
2969 EntityClass: me.SoftwareImageClassID,
2970 EntityInstance: aImageMeID, //inactive image
2971 },
2972 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
2973 }
2974
2975 var options gopacket.SerializeOptions
2976 options.FixLengths = true
2977 buffer := gopacket.NewSerializeBuffer()
2978 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2979 if err != nil {
2980 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
2981 "device-id": oo.deviceID})
2982 return err
2983 }
2984 outgoingPacket := buffer.Bytes()
2985
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002986 omciRxCallbackPair := CallbackPair{CbKey: tid,
2987 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko80622a52021-02-09 16:53:23 +00002988 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002989 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00002990 if err != nil {
2991 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
2992 "device-id": oo.deviceID})
2993 return err
2994 }
2995 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00002996 return nil
2997}
mpagenko80622a52021-02-09 16:53:23 +00002998
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00002999// SendCommitSoftware sends CommitSoftwareRequest
3000func (oo *OmciCC) SendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
mpagenko15ff4a52021-03-02 10:09:20 +00003001 rxChan chan Message, aImageMeID uint16) error {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003002 tid := oo.GetNextTid(highPrio)
mpagenko15ff4a52021-03-02 10:09:20 +00003003 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
3004 "SequNo": strconv.FormatInt(int64(tid), 16),
3005 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
3006
3007 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00003008 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00003009 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00003010 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
3011 // Length: 0x28, // Optional, defaults to 40 octets
3012 }
mpagenko15ff4a52021-03-02 10:09:20 +00003013 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00003014 MeBasePacket: omci.MeBasePacket{
3015 EntityClass: me.SoftwareImageClassID,
3016 EntityInstance: aImageMeID, //inactive image
3017 },
mpagenko80622a52021-02-09 16:53:23 +00003018 }
mpagenko15ff4a52021-03-02 10:09:20 +00003019
3020 var options gopacket.SerializeOptions
3021 options.FixLengths = true
3022 buffer := gopacket.NewSerializeBuffer()
3023 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
3024 if err != nil {
3025 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00003026 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00003027 return err
mpagenko80622a52021-02-09 16:53:23 +00003028 }
mpagenko15ff4a52021-03-02 10:09:20 +00003029 outgoingPacket := buffer.Bytes()
3030
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003031 omciRxCallbackPair := CallbackPair{CbKey: tid,
3032 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko15ff4a52021-03-02 10:09:20 +00003033 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003034 err = oo.Send(ctx, outgoingPacket, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00003035 if err != nil {
3036 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
3037 "device-id": oo.deviceID})
3038 return err
3039 }
3040 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00003041 return nil
3042}
3043
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003044//SendSelfTestReq sends TestRequest
3045func (oo *OmciCC) SendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
3046 tid := oo.GetNextTid(highPrio)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07003047 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
3048 "SequNo": strconv.FormatInt(int64(tid), 16),
3049 "InstId": strconv.FormatInt(int64(instdID), 16)})
3050 omciLayer := &omci.OMCI{
3051 TransactionID: tid,
3052 MessageType: omci.TestRequestType,
3053 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
3054 // Length: 0x28, // Optional, defaults to 40 octets
3055 }
3056
3057 var request *omci.OpticalLineSupervisionTestRequest
3058 switch classID {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003059 case me.AniGClassID:
Girish Gowdra6afb56a2021-04-27 17:47:57 -07003060 request = &omci.OpticalLineSupervisionTestRequest{
3061 MeBasePacket: omci.MeBasePacket{
3062 EntityClass: classID,
3063 EntityInstance: instdID,
3064 },
3065 SelectTest: uint8(7), // self test
3066 GeneralPurposeBuffer: uint16(0),
3067 VendorSpecificParameters: uint16(0),
3068 }
3069 default:
3070 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
3071 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
3072 }
3073 // Test serialization back to former string
3074 var options gopacket.SerializeOptions
3075 options.FixLengths = true
3076
3077 buffer := gopacket.NewSerializeBuffer()
3078 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
3079 if err != nil {
3080 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
3081 "device-id": oo.deviceID})
3082 return err
3083 }
3084 outgoingPacket := buffer.Bytes()
3085
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003086 omciRxCallbackPair := CallbackPair{CbKey: tid,
3087 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra6afb56a2021-04-27 17:47:57 -07003088 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003089 err = oo.Send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
Girish Gowdra6afb56a2021-04-27 17:47:57 -07003090 if err != nil {
3091 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
3092 "device-id": oo.deviceID})
3093 return err
3094 }
3095 logger.Debug(ctx, "send self test request done")
3096 return nil
3097}
3098
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003099//nolint: gocyclo
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003100func isSuccessfulResponseWithMibDataSync(omciMsg *omci.OMCI, packet *gp.Packet) bool {
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00003101 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003102 if v == omciMsg.MessageType {
Girish Gowdra6afb56a2021-04-27 17:47:57 -07003103 nextLayer, _ := omci.MsgTypeToNextLayer(v, false)
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003104 msgLayer := (*packet).Layer(nextLayer)
3105 switch nextLayer {
3106 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003107 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
3108 if resp.Result == me.Success {
3109 return true
3110 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003111 }
3112 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003113 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
3114 if resp.Result == me.Success {
3115 return true
3116 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003117 }
3118 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003119 if resp := msgLayer.(*omci.SetResponse); resp != nil {
3120 if resp.Result == me.Success {
3121 return true
3122 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003123 }
3124 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003125 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
3126 if resp.Result == me.Success {
3127 return true
3128 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003129 }
3130 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003131 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
3132 if resp.Result == me.Success {
3133 return true
3134 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003135 }
3136 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003137 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
3138 if resp.Result == me.Success {
3139 return true
3140 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003141 }
3142 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003143 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
3144 if resp.Result == me.Success {
3145 return true
3146 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003147 }
3148 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00003149 }
3150 }
3151 return false
3152}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003153
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003154func (oo *OmciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest OmciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003155 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00003156 if timeout == 0 {
3157 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003158 oo.mutexTxQueue.Lock()
3159 oo.txQueue.PushBack(aOmciTxRequest) // enqueue
3160 oo.mutexTxQueue.Unlock()
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003161 go oo.sendNextRequest(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00003162 } else {
mpagenko7455fd42021-06-10 16:25:55 +00003163 //the supervised sending with waiting on the response (based on TID) is called in background
3164 // to avoid blocking of the sender for the complete OMCI handshake procedure
3165 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
3166 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
3167 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003168 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003169}
3170
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003171func (oo *OmciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest OmciTransferStructure, aTimeout int) {
mpagenko7455fd42021-06-10 16:25:55 +00003172 chSuccess := make(chan bool)
3173 aOmciTxRequest.chSuccess = chSuccess
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003174 tid := aOmciTxRequest.cbPair.CbKey
mpagenko7455fd42021-06-10 16:25:55 +00003175 oo.mutexMonReq.Lock()
3176 oo.monitoredRequests[tid] = aOmciTxRequest
3177 oo.mutexMonReq.Unlock()
3178
3179 retries := aOmciTxRequest.retries
3180 retryCounter := 0
3181loop:
3182 for retryCounter <= retries {
3183
3184 oo.mutexTxQueue.Lock()
3185 oo.txQueue.PushBack(aOmciTxRequest) // enqueue
3186 oo.mutexTxQueue.Unlock()
3187 go oo.sendNextRequest(ctx)
3188
3189 select {
3190 case success := <-chSuccess:
3191 if success {
3192 logger.Debugw(ctx, "reqMon: response received in time",
3193 log.Fields{"tid": tid, "device-id": oo.deviceID})
3194 } else {
3195 logger.Debugw(ctx, "reqMon: wait for response aborted",
3196 log.Fields{"tid": tid, "device-id": oo.deviceID})
3197 }
3198 break loop
3199 case <-time.After(time.Duration(aTimeout) * time.Second):
3200 if retryCounter == retries {
3201 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached!",
3202 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
3203 break loop
3204 } else {
3205 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
3206 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
3207 }
3208 }
3209 retryCounter++
3210 }
3211 oo.mutexMonReq.Lock()
3212 delete(oo.monitoredRequests, tid)
3213 oo.mutexMonReq.Unlock()
3214}
3215
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003216//CancelRequestMonitoring terminates monitoring of outstanding omci requests
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003217func (oo *OmciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003218 oo.mutexMonReq.RLock()
3219 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00003220 //implement non-blocking channel send to avoid blocking on mutexMonReq later
3221 select {
3222 case oo.monitoredRequests[k].chSuccess <- false:
3223 default:
3224 logger.Debugw(ctx, "cancel not send on omciRespChannel (no receiver)", log.Fields{
3225 "index": k, "device-id": oo.deviceID})
3226 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003227 }
3228 oo.mutexMonReq.RUnlock()
3229}
3230
3231//GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
3232//time consumed for retry processing of a particular OMCI-request
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003233func (oo *OmciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
3234 return time.Duration((CDefaultRetries+1)*oo.pBaseDeviceHandler.GetOmciTimeout() + 1)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003235}
Himani Chawla43f95ff2021-06-03 00:24:12 +05303236
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003237// SendCreateOrDeleteEthernetFrameExtendedPMME deletes EthernetFrameExtendedPm ME instance
3238func (oo *OmciCC) SendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
Himani Chawla43f95ff2021-06-03 00:24:12 +05303239 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003240 tid := oo.GetNextTid(highPrio)
Himani Chawla43f95ff2021-06-03 00:24:12 +05303241 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
3242 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
3243
3244 meParam := me.ParamData{EntityID: entityID,
3245 Attributes: me.AttributeValueMap{"ControlBlock": controlBlock},
3246 }
3247 var meInstance *me.ManagedEntity
3248 var omciErr me.OmciErrors
3249 if classID == me.EthernetFrameExtendedPmClassID {
3250 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
3251 } else {
3252 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
3253 }
3254
3255 if omciErr.GetError() == nil {
3256 var omciLayer *omci.OMCI
3257 var msgLayer gopacket.SerializableLayer
3258 var err error
3259 if create {
3260 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
3261 omci.AddDefaults(true))
3262 } else {
3263 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
3264 omci.AddDefaults(true))
3265 }
3266 if err != nil {
3267 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
3268 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
3269 return nil, err
3270 }
3271
3272 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
3273 if err != nil {
3274 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
3275 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
3276 return nil, err
3277 }
3278
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003279 omciRxCallbackPair := CallbackPair{CbKey: tid,
3280 CbEntry: CallbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Himani Chawla43f95ff2021-06-03 00:24:12 +05303281 }
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003282 err = oo.Send(ctx, pkt, timeout, CDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawla43f95ff2021-06-03 00:24:12 +05303283 if err != nil {
3284 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
3285 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
3286 return nil, err
3287 }
3288 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
3289 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
3290 return meInstance, nil
3291 }
3292 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
3293 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
3294 return nil, omciErr.GetError()
3295}
Holger Hildebrandt4b5e73f2021-08-19 06:51:21 +00003296
3297// RLockMutexMonReq lock read access to monitoredRequests
3298func (oo *OmciCC) RLockMutexMonReq() {
3299 oo.mutexMonReq.RLock()
3300}
3301
3302// RUnlockMutexMonReq unlock read access to monitoredRequests
3303func (oo *OmciCC) RUnlockMutexMonReq() {
3304 oo.mutexMonReq.RUnlock()
3305}
3306
3307// GetMonitoredRequest get OmciTransferStructure for an omciTransID
3308func (oo *OmciCC) GetMonitoredRequest(omciTransID uint16) (value OmciTransferStructure, exist bool) {
3309 value, exist = oo.monitoredRequests[omciTransID]
3310 return value, exist
3311}
3312
3313// SetChMonitoredRequest sets chSuccess to indicate whether response was received or not
3314func (oo *OmciCC) SetChMonitoredRequest(omciTransID uint16, chVal bool) {
3315 oo.monitoredRequests[omciTransID].chSuccess <- chVal
3316}