blob: be930b8e582301a088152eb6276c3c6bc9d5b409 [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 Hildebrandt0f9b88d2020-04-20 13:33:25 +000017//Package adaptercoreonu provides the utility for onu devices, flows and statistics
18package adaptercoreonu
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)
mpagenko8b07c1b2020-11-26 10:36:31 +000054const unusedTcontAllocID = uint16(0xFFFF) //common unused AllocId for G.984 and G.987 systems
55
mpagenkoc8bba412021-01-15 15:38:44 +000056const cOmciBaseMessageTrailerLen = 40
57
58// tOmciReceiveError - enum type for detected problems/errors in the received OMCI message (format)
59type tOmciReceiveError uint8
60
61const (
62 // cOmciMessageReceiveNoError - default start state
63 cOmciMessageReceiveNoError tOmciReceiveError = iota
64 // Error indication wrong trailer length within the message
65 cOmciMessageReceiveErrorTrailerLen
66 // Error indication missing trailer within the message
67 cOmciMessageReceiveErrorMissTrailer
68)
69
Holger Hildebrandt366ef192021-05-05 11:07:44 +000070const cDefaultRetries = 2
71
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000072// ### OMCI related definitions - end
73
Himani Chawla6d2ae152020-09-02 13:11:20 +053074//callbackPairEntry to be used for OMCI send/receive correlation
75type callbackPairEntry struct {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000076 cbRespChannel chan Message
dbainbri4d3a0dc2020-12-02 00:33:42 +000077 cbFunction func(context.Context, *omci.OMCI, *gp.Packet, chan Message) error
mpagenko80622a52021-02-09 16:53:23 +000078 framePrint bool //true for printing
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000079}
80
Himani Chawla6d2ae152020-09-02 13:11:20 +053081//callbackPair to be used for ReceiveCallback init
82type callbackPair struct {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000083 cbKey uint16
Himani Chawla6d2ae152020-09-02 13:11:20 +053084 cbEntry callbackPairEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +000085}
86
87type omciTransferStructure struct {
mpagenko80622a52021-02-09 16:53:23 +000088 txFrame []byte
89 timeout int
Holger Hildebrandt366ef192021-05-05 11:07:44 +000090 retries int
mpagenko80622a52021-02-09 16:53:23 +000091 highPrio bool
92 withFramePrint bool
Holger Hildebrandt366ef192021-05-05 11:07:44 +000093 cbPair callbackPair
94 chSuccess chan bool
Holger Hildebrandtfa074992020-03-27 15:42:06 +000095}
96
Himani Chawla6d2ae152020-09-02 13:11:20 +053097//omciCC structure holds information needed for OMCI communication (to/from OLT Adapter)
98type omciCC struct {
Holger Hildebrandtfa074992020-03-27 15:42:06 +000099 enabled bool
100 pOnuDeviceEntry *OnuDeviceEntry
101 deviceID string
Himani Chawla6d2ae152020-09-02 13:11:20 +0530102 pBaseDeviceHandler *deviceHandler
khenaidoo7d3c5582021-08-11 18:09:44 -0400103 coreClient *vgrpc.Client
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000104 supportExtMsg bool
mpagenkoc8bba412021-01-15 15:38:44 +0000105 rxOmciFrameError tOmciReceiveError
106
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000107 txFrames, txOnuFrames uint32
108 rxFrames, rxOnuFrames, rxOnuDiscards uint32
109
110 // OMCI params
111 mutexTid sync.Mutex
112 tid uint16
113 mutexHpTid sync.Mutex
114 hpTid uint16
115 uploadSequNo uint16
116 uploadNoOfCmds uint16
117
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000118 mutexTxQueue sync.Mutex
119 txQueue *list.List
120 mutexRxSchedMap sync.Mutex
121 rxSchedulerMap map[uint16]callbackPairEntry
122 mutexMonReq sync.RWMutex
123 monitoredRequests map[uint16]omciTransferStructure
124 mutexPLastTxMeInstance sync.RWMutex
125 pLastTxMeInstance *me.ManagedEntity
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000126}
127
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000128var responsesWithMibDataSync = []omci.MessageType{
129 omci.CreateResponseType,
130 omci.DeleteResponseType,
131 omci.SetResponseType,
132 omci.StartSoftwareDownloadResponseType,
133 omci.EndSoftwareDownloadResponseType,
134 omci.ActivateSoftwareResponseType,
135 omci.CommitSoftwareResponseType,
136}
137
Himani Chawla6d2ae152020-09-02 13:11:20 +0530138//newOmciCC constructor returns a new instance of a OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000139//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Himani Chawla6d2ae152020-09-02 13:11:20 +0530140func newOmciCC(ctx context.Context, onuDeviceEntry *OnuDeviceEntry,
141 deviceID string, deviceHandler *deviceHandler,
khenaidoo7d3c5582021-08-11 18:09:44 -0400142 coreClient *vgrpc.Client) *omciCC {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000143 logger.Debugw(ctx, "init-omciCC", log.Fields{"device-id": deviceID})
Himani Chawla6d2ae152020-09-02 13:11:20 +0530144 var omciCC omciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000145 omciCC.enabled = false
Himani Chawla4d908332020-08-31 12:30:20 +0530146 omciCC.pOnuDeviceEntry = onuDeviceEntry
147 omciCC.deviceID = deviceID
148 omciCC.pBaseDeviceHandler = deviceHandler
khenaidoo7d3c5582021-08-11 18:09:44 -0400149 omciCC.coreClient = coreClient
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000150 omciCC.supportExtMsg = false
mpagenkoc8bba412021-01-15 15:38:44 +0000151 omciCC.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000152 omciCC.txFrames = 0
153 omciCC.txOnuFrames = 0
154 omciCC.rxFrames = 0
155 omciCC.rxOnuFrames = 0
156 omciCC.rxOnuDiscards = 0
157 omciCC.tid = 0x1
158 omciCC.hpTid = 0x8000
159 omciCC.uploadSequNo = 0
160 omciCC.uploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000161 omciCC.txQueue = list.New()
Himani Chawla6d2ae152020-09-02 13:11:20 +0530162 omciCC.rxSchedulerMap = make(map[uint16]callbackPairEntry)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000163 omciCC.monitoredRequests = make(map[uint16]omciTransferStructure)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000164
165 return &omciCC
166}
167
mpagenko900ee4b2020-10-12 11:56:34 +0000168//stop stops/resets the omciCC
169func (oo *omciCC) stop(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000170 logger.Debugw(ctx, "omciCC-stopping", log.Fields{"device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000171 //reseting all internal data, which might also be helpful for discarding any lingering tx/rx requests
mpagenko8cd1bf72021-06-22 10:11:19 +0000172 oo.CancelRequestMonitoring(ctx)
mpagenko900ee4b2020-10-12 11:56:34 +0000173 oo.mutexTxQueue.Lock()
174 oo.txQueue.Init() // clear the tx queue
175 oo.mutexTxQueue.Unlock()
176 oo.mutexRxSchedMap.Lock()
177 for k := range oo.rxSchedulerMap {
178 delete(oo.rxSchedulerMap, k) //clear the scheduler map
179 }
180 oo.mutexRxSchedMap.Unlock()
181 oo.mutexHpTid.Lock()
182 oo.hpTid = 0x8000 //reset the high prio transactionId
183 oo.mutexHpTid.Unlock()
184 oo.mutexTid.Lock()
185 oo.tid = 1 //reset the low prio transactionId
186 oo.mutexTid.Unlock()
187 //reset control values
188 oo.uploadSequNo = 0
189 oo.uploadNoOfCmds = 0
mpagenkoc8bba412021-01-15 15:38:44 +0000190 oo.rxOmciFrameError = cOmciMessageReceiveNoError
mpagenko900ee4b2020-10-12 11:56:34 +0000191 //reset the stats counter - which might be topic of discussion ...
192 oo.txFrames = 0
193 oo.txOnuFrames = 0
194 oo.rxFrames = 0
195 oo.rxOnuFrames = 0
196 oo.rxOnuDiscards = 0
197
198 return nil
199}
200
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000201// Rx handler for omci messages
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530202func (oo *omciCC) receiveOnuMessage(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000203 logger.Debugw(ctx, "rx-onu-autonomous-message", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000204 "payload": hex.EncodeToString(omciMsg.Payload)})
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530205 switch omciMsg.MessageType {
206 case omci.AlarmNotificationType:
207 data := OmciMessage{
208 OmciMsg: omciMsg,
209 OmciPacket: packet,
210 }
211 go oo.pBaseDeviceHandler.pAlarmMgr.handleOmciAlarmNotificationMessage(ctx, data)
212 return nil
213 default:
214 return fmt.Errorf("receiveOnuMessageType %s unimplemented", omciMsg.MessageType.String())
215 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000216 /*
217 msgType = rxFrame.fields["message_type"] //assumed OmciOperationsValue
218 rxOnuFrames++
219
220 switch msgType {
221 case AlarmNotification:
222 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000223 logger.Info("Unhandled: received-onu-alarm-message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000224 // python code was:
225 //if msg_type == EntityOperations.AlarmNotification.value:
226 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Alarm_Notification)
227 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
228 //
229 return errors.New("RxAlarmNotification unimplemented")
230 }
231 case AttributeValueChange:
232 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000233 logger.Info("Unhandled: received-attribute-value-change")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000234 // python code was:
235 //elif msg_type == EntityOperations.AttributeValueChange.value:
236 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.AVC_Notification)
237 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
238 //
239 return errors.New("RxAttributeValueChange unimplemented")
240 }
241 case TestResult:
242 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000243 logger.Info("Unhandled: received-test-result")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000244 // python code was:
245 //elif msg_type == EntityOperations.TestResult.value:
246 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Test_Result)
247 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
248 //
249 return errors.New("RxTestResult unimplemented")
250 }
251 default:
252 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000253 logger.Errorw(ctx,"rx-onu-unsupported-autonomous-message", log.Fields{"msgType": msgType})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000254 rxOnuDiscards++
255 return errors.New("RxOnuMsgType unimplemented")
256 }
257 }
258 */
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000259}
260
mpagenko80622a52021-02-09 16:53:23 +0000261func (oo *omciCC) printRxMessage(ctx context.Context, rxMsg []byte) {
262 //assuming omci message content is hex coded!
263 // with restricted output of 16bytes would be ...rxMsg[:16]
264 logger.Debugw(ctx, "omci-message-received:", log.Fields{
265 "RxOmciMessage": hex.EncodeToString(rxMsg),
266 "device-id": oo.deviceID})
267}
268
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000269// Rx handler for onu messages
270// e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
Himani Chawla6d2ae152020-09-02 13:11:20 +0530271func (oo *omciCC) receiveMessage(ctx context.Context, rxMsg []byte) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000272 //logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000273 if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
274 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
mpagenkoc8bba412021-01-15 15:38:44 +0000275 // (an extendedFormat message could be destroyed this way!)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000276 trailerLenData := rxMsg[42:44]
277 trailerLen := binary.BigEndian.Uint16(trailerLenData)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000278 //logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
mpagenkoc8bba412021-01-15 15:38:44 +0000279 if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
280 binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
281 if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
282 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
283 logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
284 log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
285 oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
286 }
287 }
288 } else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
289 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
290 // (an extendedFormat message could be destroyed this way!)
291 // extend/overwrite with trailer
292 trailer := make([]byte, 8)
293 binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
294 rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
295 if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
296 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
297 logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
298 log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
299 oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000300 }
301 } else {
mpagenkoc8bba412021-01-15 15:38:44 +0000302 logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
303 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000304 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200305 return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000306 }
307
308 packet := gopacket.NewPacket(rxMsg, omci.LayerTypeOMCI, gopacket.NoCopy)
309 if packet == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000310 logger.Errorw(ctx, "omci-message could not be decoded", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000311 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200312 return fmt.Errorf("could not decode rxMsg as OMCI %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000313 }
314 omciLayer := packet.Layer(omci.LayerTypeOMCI)
315 if omciLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000316 logger.Errorw(ctx, "omci-message could not decode omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000317 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200318 return fmt.Errorf("could not decode omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000319 }
320 omciMsg, ok := omciLayer.(*omci.OMCI)
321 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000322 logger.Errorw(ctx, "omci-message could not assign omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000323 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200324 return fmt.Errorf("could not assign omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000325 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000326 logger.Debugw(ctx, "omci-message-decoded:", log.Fields{"omciMsgType": omciMsg.MessageType,
mpagenko3dbcdd22020-07-22 07:38:45 +0000327 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "DeviceIdent": omciMsg.DeviceIdentifier})
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700328 // TestResult is asynchronous indication that carries the same TID as the TestResponse.
329 // We expect to find the TID in the oo.rxSchedulerMap
330 if byte(omciMsg.MessageType)&me.AK == 0 && omciMsg.MessageType != omci.TestResultType {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000331 // Not a response
mpagenko80622a52021-02-09 16:53:23 +0000332 oo.printRxMessage(ctx, rxMsg)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000333 logger.Debug(ctx, "RxMsg is no Omci Response Message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000334 if omciMsg.TransactionID == 0 {
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530335 return oo.receiveOnuMessage(ctx, omciMsg, &packet)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000336 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000337 logger.Errorw(ctx, "Unexpected TransCorrId != 0 not accepted for autonomous messages",
Andrea Campanella6515c582020-10-05 11:25:00 +0200338 log.Fields{"msgType": omciMsg.MessageType, "payload": hex.EncodeToString(omciMsg.Payload),
mpagenko8b07c1b2020-11-26 10:36:31 +0000339 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200340 return fmt.Errorf("autonomous Omci Message with TranSCorrId != 0 not acccepted %s", oo.deviceID)
Himani Chawla4d908332020-08-31 12:30:20 +0530341 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000342 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530343 oo.mutexRxSchedMap.Lock()
344 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
345 if ok && rxCallbackEntry.cbFunction != nil {
mpagenko80622a52021-02-09 16:53:23 +0000346 if rxCallbackEntry.framePrint {
347 oo.printRxMessage(ctx, rxMsg)
348 }
Himani Chawla4d908332020-08-31 12:30:20 +0530349 //disadvantage of decoupling: error verification made difficult, but anyway the question is
350 // how to react on erroneous frame reception, maybe can simply be ignored
dbainbri4d3a0dc2020-12-02 00:33:42 +0000351 go rxCallbackEntry.cbFunction(ctx, omciMsg, &packet, rxCallbackEntry.cbRespChannel)
Holger Hildebrandt3124e302021-03-23 12:47:03 +0000352 if isSuccessfulResponseWithMibDataSync(omciMsg, &packet) {
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000353 oo.pOnuDeviceEntry.incrementMibDataSync(ctx)
354 }
mpagenkoc8bba412021-01-15 15:38:44 +0000355
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700356 // If omciMsg.MessageType is omci.TestResponseType, we still expect the TestResult OMCI message,
357 // so do not clean up the TransactionID in that case.
358 if omciMsg.MessageType != omci.TestResponseType {
359 // having posted the response the request is regarded as 'done'
360 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
361 }
Himani Chawla4d908332020-08-31 12:30:20 +0530362 oo.mutexRxSchedMap.Unlock()
mpagenko80622a52021-02-09 16:53:23 +0000363 return nil
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000364 }
mpagenko80622a52021-02-09 16:53:23 +0000365 oo.mutexRxSchedMap.Unlock()
366 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID})
367 oo.printRxMessage(ctx, rxMsg)
368 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000369
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000370 /* py code was:
371 Receive and OMCI message from the proxy channel to the OLT.
372
373 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
374 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
375 """
376 if not self.enabled:
377 return
378
379 try:
380 now = arrow.utcnow()
381 d = None
382
383 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
384 # save the current value of the entity_id_to_class_map, then
385 # replace it with our custom one before decode, and then finally
386 # restore it later. Tried other ways but really made the code messy.
387 saved_me_map = omci_entities.entity_id_to_class_map
388 omci_entities.entity_id_to_class_map = self._me_map
389
390 try:
391 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000392 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000393 except KeyError as e:
394 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000395 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000396 rx_frame = self._decode_unknown_me(msg)
397 self._rx_unknown_me += 1
398
399 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000400 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000401 return
402
403 finally:
404 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
405
406 rx_tid = rx_frame.fields['transaction_id']
407 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000408 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000409 # Filter the Test Result frame and route through receive onu
410 # message method.
411 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000412 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000413 return self._receive_onu_message(rx_frame)
414
415 # Previously unreachable if this is the very first round-trip Rx or we
416 # have been running consecutive errors
417 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000418 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000419 self.reactor.callLater(0, self._publish_connectivity_event, True)
420
421 self._rx_frames += 1
422 self._consecutive_errors = 0
423
424 try:
425 high_priority = self._tid_is_high_priority(rx_tid)
426 index = self._get_priority_index(high_priority)
427
428 # (timestamp, defer, frame, timeout, retry, delayedCall)
429 last_tx_tuple = self._tx_request[index]
430
431 if last_tx_tuple is None or \
432 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
433 # Possible late Rx on a message that timed-out
434 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000435 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000436 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
437 self._rx_unknown_tid += 1
438 self._rx_late += 1
439 return
440
441 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
442 if dc is not None and not dc.cancelled and not dc.called:
443 dc.cancel()
444
445 _secs = self._update_rx_tx_stats(now, ts)
446
447 # Late arrival already serviced by a timeout?
448 if d.called:
449 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000450 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000451 return
452
453 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000454 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000455 if d is not None:
456 return d.errback(failure.Failure(e))
457 return
458
459 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000460 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000461 tx_tid = tx_frame.fields['transaction_id'])
462 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
463
464 # begin success callback chain (will cancel timeout and queue next Tx message)
465 self._rx_response[index] = rx_frame
466 d.callback(rx_frame)
467
468 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000469 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000470 */
471}
472
Himani Chawla6d2ae152020-09-02 13:11:20 +0530473/*
474func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530475 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530476 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000477}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530478*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000479
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700480// ReleaseTid releases OMCI transaction identifier from rxSchedulerMap
481func (oo *omciCC) ReleaseTid(ctx context.Context, tid uint16) {
482 logger.Debugw(ctx, "releasing tid from rxSchedulerMap", log.Fields{"tid": tid})
483 delete(oo.rxSchedulerMap, tid)
484}
485
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000486//Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
Himani Chawla6d2ae152020-09-02 13:11:20 +0530487func (oo *omciCC) send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
488 receiveCallbackPair callbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000489
mpagenkoc26d4c02021-05-06 14:27:57 +0000490 if timeout != 0 {
491 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": receiveCallbackPair.cbKey})
492 oo.mutexRxSchedMap.Lock()
493 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
494 oo.rxSchedulerMap[receiveCallbackPair.cbKey] = receiveCallbackPair.cbEntry
495 oo.mutexRxSchedMap.Unlock()
496 } //else timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000497
mpagenkoc26d4c02021-05-06 14:27:57 +0000498 printFrame := receiveCallbackPair.cbEntry.framePrint //printFrame true means debug print of frame is requested
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000499 //just use a simple list for starting - might need some more effort, especially for multi source write access
500 omciTxRequest := omciTransferStructure{
501 txFrame,
502 timeout,
503 retry,
504 highPrio,
mpagenko80622a52021-02-09 16:53:23 +0000505 printFrame,
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000506 receiveCallbackPair,
507 nil,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000508 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000509 oo.mutexMonReq.Lock()
510 defer oo.mutexMonReq.Unlock()
511 if _, exist := oo.monitoredRequests[receiveCallbackPair.cbKey]; !exist {
mpagenko7455fd42021-06-10 16:25:55 +0000512 // do not call processRequestMonitoring in background here to ensure correct sequencing
513 // of requested messages into txQueue (especially for non-response-supervised messages)
514 oo.processRequestMonitoring(ctx, omciTxRequest)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000515 return nil
516 }
517 logger.Errorw(ctx, "A message with this tid is processed already!",
518 log.Fields{"tid": receiveCallbackPair.cbKey, "device-id": oo.deviceID})
519 return fmt.Errorf("message with tid is processed already %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000520}
521
522//Pull next tx request and send it
Himani Chawla6d2ae152020-09-02 13:11:20 +0530523func (oo *omciCC) sendNextRequest(ctx context.Context) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000524 // return errors.New("sendNextRequest unimplemented")
525
526 // just try to get something transferred !!
527 // avoid accessing the txQueue from parallel send requests
528 // block parallel omci send requests at least until SendIAP is 'committed'
529 // that should be feasible for an onu instance as on OMCI anyway window size 1 is assumed
530 oo.mutexTxQueue.Lock()
mpagenkodff5dda2020-08-28 11:52:01 +0000531 defer oo.mutexTxQueue.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000532 for oo.txQueue.Len() > 0 {
533 queueElement := oo.txQueue.Front() // First element
534 omciTxRequest := queueElement.Value.(omciTransferStructure)
535 /* compare olt device handler code:
536 func (dh *DeviceHandler) omciIndication(omciInd *oop.OmciIndication) {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000537 logger.Debugw(ctx,"omci indication", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000538 var deviceType string
539 var deviceID string
540 var proxyDeviceID string
541
542 onuKey := dh.formOnuKey(omciInd.IntfId, omciInd.OnuId)
543
544 if onuInCache, ok := dh.onus.Load(onuKey); !ok {
545
dbainbri4d3a0dc2020-12-02 00:33:42 +0000546 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 +0000547 ponPort := IntfIDToPortNo(omciInd.GetIntfId(), voltha.Port_PON_OLT)
548 kwargs := make(map[string]interface{})
549 kwargs["onu_id"] = omciInd.OnuId
550 kwargs["parent_port_no"] = ponPort
551
dbainbri4d3a0dc2020-12-02 00:33:42 +0000552 onuDevice, err := dh.coreProxy.GetChildDevice(log.WithSpanFromContext(context.TODO(), ctx), dh.device.Id, kwargs)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000553 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000554 logger.Errorw(ctx,"onu not found", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId, "error": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000555 return
556 }
557 deviceType = onuDevice.Type
558 deviceID = onuDevice.Id
559 proxyDeviceID = onuDevice.ProxyAddress.DeviceId
560 //if not exist in cache, then add to cache.
561 dh.onus.Store(onuKey, NewOnuDevice(deviceID, deviceType, onuDevice.SerialNumber, omciInd.OnuId, omciInd.IntfId, proxyDeviceID))
562 } else {
563 //found in cache
dbainbri4d3a0dc2020-12-02 00:33:42 +0000564 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 +0000565 deviceType = onuInCache.(*OnuDevice).deviceType
566 deviceID = onuInCache.(*OnuDevice).deviceID
567 proxyDeviceID = onuInCache.(*OnuDevice).proxyDeviceID
568 }
569 */
570 /* and compare onu_adapter py code:
571 omci_msg = InterAdapterOmciMessage(
572 message=bytes(frame),
573 proxy_address=self._proxy_address,
574 connect_status=self._device.connect_status)
575
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000576 self.logger.debug('sent-omci-msg', tid=tx_tid, omci_msg=hexlify(bytes(frame)))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000577
578 yield self._adapter_proxy.send_inter_adapter_message(
579 msg=omci_msg,
580 type=InterAdapterMessageType.OMCI_REQUEST,
581 from_adapter=self._device.type,
582 to_adapter=self._proxy_address.device_type,
583 to_device_id=self._device_id,
584 proxy_device_id=self._proxy_address.device_id
585 )
586 */
mpagenko80622a52021-02-09 16:53:23 +0000587 if omciTxRequest.withFramePrint {
588 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
589 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
590 "device-id": oo.deviceID,
591 "toDeviceType": oo.pBaseDeviceHandler.ProxyAddressType,
khenaidoo7d3c5582021-08-11 18:09:44 -0400592 "proxyDeviceID": oo.pBaseDeviceHandler.ProxyAddressID,
593 "proxyAddress": oo.pBaseDeviceHandler.device.ProxyAddress})
mpagenko80622a52021-02-09 16:53:23 +0000594 }
khenaidoo7d3c5582021-08-11 18:09:44 -0400595 omciMsg := &ic.OmciMessage{
596 ParentDeviceId: oo.pBaseDeviceHandler.ProxyAddressID,
597 ChildDeviceId: oo.deviceID,
598 Message: omciTxRequest.txFrame,
599 ProxyAddress: oo.pBaseDeviceHandler.device.ProxyAddress,
600 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 +0200601 }
khenaidoo7d3c5582021-08-11 18:09:44 -0400602 sendErr := oo.pBaseDeviceHandler.sendOMCIRequest(ctx, oo.pBaseDeviceHandler.device.ProxyAddress.AdapterEndpoint, omciMsg)
603 if sendErr != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000604 logger.Errorw(ctx, "send omci request error", log.Fields{"ChildId": oo.deviceID, "error": sendErr})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000605 return sendErr
606 }
607 oo.txQueue.Remove(queueElement) // Dequeue
608 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000609 return nil
610}
611
Himani Chawla6d2ae152020-09-02 13:11:20 +0530612func (oo *omciCC) getNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000613 var next uint16
614 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000615 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000616 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530617 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000618 if oo.hpTid < 0x8000 {
619 oo.hpTid = 0x8000
620 }
mpagenko900ee4b2020-10-12 11:56:34 +0000621 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000622 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000623 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000624 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530625 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000626 if oo.tid >= 0x8000 {
627 oo.tid = 1
628 }
mpagenko900ee4b2020-10-12 11:56:34 +0000629 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000630 }
631 return next
632}
633
634// ###################################################################################
635// # utility methods provided to work on OMCI messages
dbainbri4d3a0dc2020-12-02 00:33:42 +0000636func serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000637 omciLayer := &omci.OMCI{
638 TransactionID: tid,
639 MessageType: msgType,
640 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000641 return serializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000642}
643
dbainbri4d3a0dc2020-12-02 00:33:42 +0000644func serializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000645 var options gopacket.SerializeOptions
646 options.FixLengths = true
647
648 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530649 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000650 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000651 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000652 return nil, err
653 }
654 return buffer.Bytes(), nil
655}
656
Himani Chawla4d908332020-08-31 12:30:20 +0530657/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000658func hexEncode(omciPkt []byte) ([]byte, error) {
659 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
660 hex.Encode(dst, omciPkt)
661 return dst, nil
662}
Himani Chawla4d908332020-08-31 12:30:20 +0530663*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000664
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000665//supply a response handler for omci response messages to be transferred to the requested FSM
dbainbri4d3a0dc2020-12-02 00:33:42 +0000666func (oo *omciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000667
dbainbri4d3a0dc2020-12-02 00:33:42 +0000668 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000669 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000670
671 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000672 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000673 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200674 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000675 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000676 oo.mutexMonReq.RLock()
677 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000678 //implement non-blocking channel send to avoid blocking on mutexMonReq later
679 select {
680 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
681 default:
682 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
683 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
684 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000685 } else {
686 logger.Infow(ctx, "reqMon: map entry does not exist!",
687 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
688 }
689 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000690
691 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
692 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000693 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000694 Type: OMCI,
695 Data: OmciMessage{
696 OmciMsg: omciMsg,
697 OmciPacket: packet,
698 },
699 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000700 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000701 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000702
703 return nil
704}
705
Himani Chawla6d2ae152020-09-02 13:11:20 +0530706func (oo *omciCC) sendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000707
dbainbri4d3a0dc2020-12-02 00:33:42 +0000708 logger.Debugw(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000709 request := &omci.MibResetRequest{
710 MeBasePacket: omci.MeBasePacket{
711 EntityClass: me.OnuDataClassID,
712 },
713 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530714 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000715 pkt, err := serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000716 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000717 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000718 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000719 return err
720 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530721 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000722 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000723 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000724 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000725 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000726}
727
Himani Chawla6d2ae152020-09-02 13:11:20 +0530728func (oo *omciCC) sendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000729 logger.Debugw(ctx, "send Reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300730 request := &omci.RebootRequest{
731 MeBasePacket: omci.MeBasePacket{
732 EntityClass: me.OnuGClassID,
733 },
734 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530735 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000736 pkt, err := serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300737 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000738 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000739 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300740 return err
741 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530742 omciRxCallbackPair := callbackPair{
ozgecanetsiae11479f2020-07-06 09:44:47 +0300743 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000744 cbEntry: callbackPairEntry{oo.pOnuDeviceEntry.omciRebootMessageReceivedChannel, oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300745 }
746
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000747 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300748 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000749 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000750 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300751 return err
752 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000753 err = oo.pOnuDeviceEntry.waitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300754 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000755 logger.Errorw(ctx, "aborting ONU Reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200756 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300757 return err
758 }
759 return nil
760}
761
Himani Chawla6d2ae152020-09-02 13:11:20 +0530762func (oo *omciCC) sendMibUpload(ctx context.Context, timeout int, highPrio bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000763 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000764 request := &omci.MibUploadRequest{
765 MeBasePacket: omci.MeBasePacket{
766 EntityClass: me.OnuDataClassID,
767 },
768 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530769 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000770 pkt, err := serialize(ctx, omci.MibUploadRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000771 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000772 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000773 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000774 return err
775 }
776 oo.uploadSequNo = 0
777 oo.uploadNoOfCmds = 0
778
Himani Chawla6d2ae152020-09-02 13:11:20 +0530779 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000780 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000781 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000782 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000783 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000784}
785
Himani Chawla6d2ae152020-09-02 13:11:20 +0530786func (oo *omciCC) sendMibUploadNext(ctx context.Context, timeout int, highPrio bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000787 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "uploadSequNo": oo.uploadSequNo})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000788 request := &omci.MibUploadNextRequest{
789 MeBasePacket: omci.MeBasePacket{
790 EntityClass: me.OnuDataClassID,
791 },
792 CommandSequenceNumber: oo.uploadSequNo,
793 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530794 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000795 pkt, err := serialize(ctx, omci.MibUploadNextRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000796 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000797 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000798 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000799 return err
800 }
801 oo.uploadSequNo++
802
Himani Chawla6d2ae152020-09-02 13:11:20 +0530803 omciRxCallbackPair := callbackPair{
mpagenko80622a52021-02-09 16:53:23 +0000804 cbKey: tid,
805 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
806 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
807 // compare also software upgrade download section handling
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000808 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000809 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000810 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000811}
812
Himani Chawlad3dac422021-03-13 02:31:31 +0530813func (oo *omciCC) sendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool) error {
814 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
815 request := &omci.GetAllAlarmsRequest{
816 MeBasePacket: omci.MeBasePacket{
817 EntityClass: me.OnuDataClassID,
818 },
819 AlarmRetrievalMode: byte(alarmRetreivalMode),
820 }
821 tid := oo.getNextTid(highPrio)
822 pkt, err := serialize(ctx, omci.GetAllAlarmsRequestType, request, tid)
823 if err != nil {
824 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{
825 "Err": err, "device-id": oo.deviceID})
826 return err
827 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000828 oo.pBaseDeviceHandler.pAlarmMgr.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +0530829
830 omciRxCallbackPair := callbackPair{
831 cbKey: tid,
832 cbEntry: callbackPairEntry{(*oo.pBaseDeviceHandler.pAlarmMgr).eventChannel,
833 oo.receiveOmciResponse, true},
834 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000835 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +0530836}
837
838func (oo *omciCC) sendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000839 alarmUploadSeqNo := oo.pBaseDeviceHandler.pAlarmMgr.GetAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +0530840 logger.Debugw(ctx, "send sendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
841 "alarmUploadSeqNo": alarmUploadSeqNo})
842 request := &omci.GetAllAlarmsNextRequest{
843 MeBasePacket: omci.MeBasePacket{
844 EntityClass: me.OnuDataClassID,
845 },
846 CommandSequenceNumber: alarmUploadSeqNo,
847 }
848 tid := oo.getNextTid(highPrio)
849 pkt, err := serialize(ctx, omci.GetAllAlarmsNextRequestType, request, tid)
850 if err != nil {
851 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{
852 "Err": err, "device-id": oo.deviceID})
853 return err
854 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000855 oo.pBaseDeviceHandler.pAlarmMgr.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +0530856
857 omciRxCallbackPair := callbackPair{
858 cbKey: tid,
859 cbEntry: callbackPairEntry{(*oo.pBaseDeviceHandler.pAlarmMgr).eventChannel, oo.receiveOmciResponse, true},
860 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000861 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +0530862}
863
ozgecanetsiab36ed572021-04-01 10:38:48 +0300864func (oo *omciCC) sendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +0530865 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000866 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000867 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000868
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000869 meParams := me.ParamData{
870 EntityID: galEthernetEID,
871 Attributes: me.AttributeValueMap{"MaximumGemPayloadSize": maxGemPayloadSize},
872 }
873 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
874 if omciErr.GetError() == nil {
875 //all setByCreate parameters already set, no default option required ...
876 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
877 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000878 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000879 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300880 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000881 }
882
dbainbri4d3a0dc2020-12-02 00:33:42 +0000883 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000884 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000885 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000886 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300887 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000888 }
889
Himani Chawla6d2ae152020-09-02 13:11:20 +0530890 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000891 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000892 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000893 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000894 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000895 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000896 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000897 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300898 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000899 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000900 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +0300901 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000902 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000903 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000904 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300905 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000906}
907
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000908// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
ozgecanetsiab36ed572021-04-01 10:38:48 +0300909func (oo *omciCC) sendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +0530910 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000911 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000912 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000913
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000914 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
915 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000916 // By now we just use fix values to fire - this is anyway what the python adapter does
917 // read ONU-2G from DB ???? //TODO!!!
918 meParams := me.ParamData{
919 EntityID: 0,
920 Attributes: me.AttributeValueMap{"CurrentConnectivityMode": connectivityModeValue},
921 }
922 meInstance, omciErr := me.NewOnu2G(meParams)
923 if omciErr.GetError() == nil {
924 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
925 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000926 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000927 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300928 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000929 }
930
dbainbri4d3a0dc2020-12-02 00:33:42 +0000931 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000932 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000933 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000934 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300935 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000936 }
937
Himani Chawla6d2ae152020-09-02 13:11:20 +0530938 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000939 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000940 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000941 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000942 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000943 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000944 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000945 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300946 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000947 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000948 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +0300949 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000950 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000951 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000952 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300953 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000954}
955
Himani Chawla6d2ae152020-09-02 13:11:20 +0530956func (oo *omciCC) sendCreateMBServiceProfile(ctx context.Context,
ozgecanetsiab36ed572021-04-01 10:38:48 +0300957 aPUniPort *onuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +0530958 tid := oo.getNextTid(highPrio)
Himani Chawla4d908332020-08-31 12:30:20 +0530959 instID := macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000960 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000961 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000962
963 meParams := me.ParamData{
964 EntityID: instID,
965 Attributes: me.AttributeValueMap{
ozgecanetsiab5000ef2020-11-27 14:38:20 +0300966 "Priority": 0x8000,
967 "MaxAge": 20 * 256, //20s
968 "HelloTime": 2 * 256, //2s
969 "ForwardDelay": 15 * 256, //15s
970 "DynamicFilteringAgeingTime": 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000971 },
972 }
973
974 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
975 if omciErr.GetError() == nil {
976 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
977 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
978 omci.TransactionID(tid), omci.AddDefaults(true))
979 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000980 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000981 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300982 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000983 }
984
dbainbri4d3a0dc2020-12-02 00:33:42 +0000985 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000986 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000987 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000988 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300989 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000990 }
991
Himani Chawla6d2ae152020-09-02 13:11:20 +0530992 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000993 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000994 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000995 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000996 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000997 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000998 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000999 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001000 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001001 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001002 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001003 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001004 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001005 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001006 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001007 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001008}
1009
Mahir Gunyel6781f962021-05-16 23:30:08 -07001010func (oo *omciCC) sendCreateMBPConfigDataUniSide(ctx context.Context,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001011 aPUniPort *onuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301012 tid := oo.getNextTid(highPrio)
Mahir Gunyel6781f962021-05-16 23:30:08 -07001013 instID, idErr := generateUNISideMBPCDEID(uint16(aPUniPort.macBpNo))
1014 if idErr != nil {
1015 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1016 "Err": idErr, "device-id": oo.deviceID})
1017 return nil, idErr
1018 }
1019 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
1020 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.macBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001021
1022 meParams := me.ParamData{
1023 EntityID: instID,
1024 Attributes: me.AttributeValueMap{
Himani Chawla4d908332020-08-31 12:30:20 +05301025 "BridgeIdPointer": macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo),
1026 "PortNum": aPUniPort.macBpNo,
1027 "TpType": uint8(aPUniPort.portType),
Himani Chawla26e555c2020-08-31 12:30:20 +05301028 "TpPointer": aPUniPort.entityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001029 },
1030 }
1031 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1032 if omciErr.GetError() == nil {
1033 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1034 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1035 omci.TransactionID(tid), omci.AddDefaults(true))
1036 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001037 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001038 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001039 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001040 }
1041
dbainbri4d3a0dc2020-12-02 00:33:42 +00001042 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001043 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001044 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001045 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001046 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001047 }
1048
Himani Chawla6d2ae152020-09-02 13:11:20 +05301049 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001050 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001051 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001052 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001053 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001054 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001055 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001056 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001057 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001058 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001059 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001060 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001061 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001062 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001063 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001064 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001065}
1066
Himani Chawla6d2ae152020-09-02 13:11:20 +05301067func (oo *omciCC) sendCreateEVTOConfigData(ctx context.Context,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001068 aPUniPort *onuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301069 tid := oo.getNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001070 //same entityId is used as for MBSP (see there), but just arbitrary ...
Himani Chawla4d908332020-08-31 12:30:20 +05301071 instID := macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001072 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001073 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001074
1075 // compare python adapter code WA VOL-1311: this is not done here!
1076 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1077 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1078 assType := uint8(2) // default AssociationType is PPTPEthUni
Himani Chawla6d2ae152020-09-02 13:11:20 +05301079 if aPUniPort.portType == uniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001080 assType = uint8(10) // for VEIP
1081 }
1082 meParams := me.ParamData{
1083 EntityID: instID,
1084 Attributes: me.AttributeValueMap{
1085 "AssociationType": assType,
Himani Chawla26e555c2020-08-31 12:30:20 +05301086 "AssociatedMePointer": aPUniPort.entityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001087 },
1088 }
1089 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1090 if omciErr.GetError() == nil {
1091 //all setByCreate parameters already set, no default option required ...
1092 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1093 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001094 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001095 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001096 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001097 }
1098
dbainbri4d3a0dc2020-12-02 00:33:42 +00001099 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001100 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001101 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001102 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001103 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001104 }
1105
Himani Chawla6d2ae152020-09-02 13:11:20 +05301106 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001107 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001108 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001109 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001110 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001111 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001112 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001113 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001114 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001115 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001116 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001117 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001118 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001119 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001120 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001121 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001122}
1123
Himani Chawla6d2ae152020-09-02 13:11:20 +05301124func (oo *omciCC) sendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001125 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301126 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001127 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001128 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001129
1130 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1131 meParams := me.ParamData{
1132 EntityID: 0,
1133 Attributes: requestedAttributes,
1134 }
1135 meInstance, omciErr := me.NewOnuG(meParams)
1136 if omciErr.GetError() == nil {
1137 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1138 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001139 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001140 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001141 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001142 }
1143
dbainbri4d3a0dc2020-12-02 00:33:42 +00001144 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001145 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001146 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001147 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001148 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001149 }
1150
Himani Chawla6d2ae152020-09-02 13:11:20 +05301151 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001152 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001153 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001154 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001155 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001156 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001157 logger.Errorw(ctx, "Cannot send ONU-G 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 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001161 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001162 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001163 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001164 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001165 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001166 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001167}
1168
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001169func (oo *omciCC) sendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001170 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001171 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001172 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001173 "SequNo": strconv.FormatInt(int64(tid), 16)})
1174
1175 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1176 meParams := me.ParamData{
1177 EntityID: aInstNo,
1178 Attributes: requestedAttributes,
1179 }
1180 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1181 if omciErr.GetError() == nil {
1182 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1183 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001184 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001185 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001186 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001187 }
1188
dbainbri4d3a0dc2020-12-02 00:33:42 +00001189 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001190 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001191 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001192 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001193 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001194 }
1195
1196 omciRxCallbackPair := callbackPair{
1197 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001198 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001199 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001200 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001201 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001202 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001203 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001204 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001205 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001206 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001207 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001208 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001209 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001210 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001211 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001212}
1213
1214/* UniG obsolete by now, left here in case it should be needed once again
1215 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301216func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001217 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301218 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001219 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001220 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001221
1222 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1223 meParams := me.ParamData{
1224 EntityID: aInstNo,
1225 Attributes: requestedAttributes,
1226 }
1227 meInstance, omciErr := me.NewUniG(meParams)
1228 if omciErr.GetError() == nil {
1229 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1230 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001231 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001232 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001233 return nil
1234 }
1235
1236 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1237 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001238 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001239 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001240 return nil
1241 }
1242
Himani Chawla6d2ae152020-09-02 13:11:20 +05301243 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001244 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001245 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001246 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001247 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001248 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001249 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001250 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001251 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001252 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001253 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001254 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001255 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001256 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001257 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001258 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001259}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001260*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001261
Himani Chawla6d2ae152020-09-02 13:11:20 +05301262func (oo *omciCC) sendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001263 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301264 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001265 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001266 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001267
1268 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1269 meParams := me.ParamData{
1270 EntityID: aInstNo,
1271 Attributes: requestedAttributes,
1272 }
1273 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1274 if omciErr.GetError() == nil {
1275 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1276 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001277 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001278 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001279 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001280 }
1281
dbainbri4d3a0dc2020-12-02 00:33:42 +00001282 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001283 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001284 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001285 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001286 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001287 }
1288
Himani Chawla6d2ae152020-09-02 13:11:20 +05301289 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001290 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001291 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001292 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001293 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001294 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001295 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001296 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001297 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001298 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001299 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001300 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001301 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001302 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001303 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001304 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001305}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001306
Himani Chawla6d2ae152020-09-02 13:11:20 +05301307func (oo *omciCC) sendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001308 timeout int, highPrio bool, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001309
Himani Chawla6d2ae152020-09-02 13:11:20 +05301310 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001311 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001312 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001313
1314 meParams := me.ParamData{
1315 EntityID: entityID,
1316 Attributes: requestedAttributes,
1317 }
1318 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1319 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301320 meClassIDName := meInstance.GetName()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001321 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.GetRequestType, omci.TransactionID(tid))
1322 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001323 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 +03001324 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001325 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001326 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001327 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001328 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001329 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001330 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301331 omciRxCallbackPair := callbackPair{
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001332 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001333 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001334 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001335 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001336 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001337 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001338 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001339 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001340 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001341 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001342 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001343 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001344 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001345}
1346
Himani Chawla43f95ff2021-06-03 00:24:12 +05301347func (oo *omciCC) sendGetMeWithAttributeMask(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributesMask uint16,
1348 timeout int, highPrio bool, rxChan chan Message) error {
1349
1350 tid := oo.getNextTid(highPrio)
1351 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
1352 "SequNo": strconv.FormatInt(int64(tid), 16)})
1353
1354 request := &omci.GetRequest{
1355 MeBasePacket: omci.MeBasePacket{
1356 EntityInstance: entityID,
1357 EntityClass: classID,
1358 },
1359 AttributeMask: requestedAttributesMask,
1360 }
1361
1362 pkt, err := serialize(ctx, omci.GetRequestType, request, tid)
1363 if err != nil {
1364 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1365 return err
1366 }
1367 omciRxCallbackPair := callbackPair{
1368 cbKey: tid,
1369 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1370 }
1371 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
1372 if err != nil {
1373 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": classID, "Err": err, "device-id": oo.deviceID})
1374 return err
1375 }
1376 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": classID, "device-id": oo.deviceID})
1377 return nil
1378}
1379
Himani Chawla6d2ae152020-09-02 13:11:20 +05301380func (oo *omciCC) sendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001381 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301382 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001383 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001384 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1385
1386 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001387 EntityID: aInstID,
1388 Attributes: me.AttributeValueMap{
1389 //workaround for unsuitable omci-lib default values, cmp VOL-3729
1390 "TpPointer": 0xFFFF,
1391 "InterworkTpPointerForPBitPriority0": 0xFFFF,
1392 "InterworkTpPointerForPBitPriority1": 0xFFFF,
1393 "InterworkTpPointerForPBitPriority2": 0xFFFF,
1394 "InterworkTpPointerForPBitPriority3": 0xFFFF,
1395 "InterworkTpPointerForPBitPriority4": 0xFFFF,
1396 "InterworkTpPointerForPBitPriority5": 0xFFFF,
1397 "InterworkTpPointerForPBitPriority6": 0xFFFF,
1398 "InterworkTpPointerForPBitPriority7": 0xFFFF,
1399 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001400 }
1401 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1402 if omciErr.GetError() == nil {
1403 //we have to set all 'untouched' parameters to default by some additional option parameter!!
1404 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1405 omci.TransactionID(tid), omci.AddDefaults(true))
1406 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001407 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001408 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001409 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001410 }
1411
dbainbri4d3a0dc2020-12-02 00:33:42 +00001412 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001413 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001414 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001415 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001416 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001417 }
1418
Himani Chawla6d2ae152020-09-02 13:11:20 +05301419 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001420 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001421 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001422 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001423 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001424 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001425 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001426 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001427 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001428 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001429 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001430 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001431 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001432 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001433 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001434 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001435}
1436
Himani Chawla6d2ae152020-09-02 13:11:20 +05301437func (oo *omciCC) sendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001438 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301439 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001440 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001441 "SequNo": strconv.FormatInt(int64(tid), 16),
1442 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1443
1444 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1445 if omciErr.GetError() == nil {
1446 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1447 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1448 omci.TransactionID(tid), omci.AddDefaults(true))
1449 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001450 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001451 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001452 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001453 }
1454
dbainbri4d3a0dc2020-12-02 00:33:42 +00001455 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001456 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001457 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001458 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001459 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001460 }
1461
Himani Chawla6d2ae152020-09-02 13:11:20 +05301462 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001463 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001464 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001465 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001466 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001467 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001468 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001469 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001470 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001471 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001472 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001473 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001474 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001475 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001476 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001477 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001478}
1479
Himani Chawla6d2ae152020-09-02 13:11:20 +05301480func (oo *omciCC) sendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001481 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301482 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001483 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001484 "SequNo": strconv.FormatInt(int64(tid), 16),
1485 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1486
1487 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1488 if omciErr.GetError() == nil {
1489 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1490 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1491 omci.TransactionID(tid), omci.AddDefaults(true))
1492 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001493 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001494 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001495 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001496 }
1497
dbainbri4d3a0dc2020-12-02 00:33:42 +00001498 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001499 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001500 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001501 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001502 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001503 }
1504
Himani Chawla6d2ae152020-09-02 13:11:20 +05301505 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001506 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001507 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001508 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001509 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001510 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001511 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001512 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001513 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001514 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001515 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001516 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001517 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001518 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001519 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001520 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001521}
1522
ozgecanetsia82b91a62021-05-21 18:54:49 +03001523func (oo *omciCC) sendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1524 tid := oo.getNextTid(highPrio)
1525 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1526 "SequNo": strconv.FormatInt(int64(tid), 16),
1527 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1528
1529 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1530 if omciErr.GetError() == nil {
1531 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1532 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType,
1533 omci.TransactionID(tid), omci.AddDefaults(true))
1534 if err != nil {
1535 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1536 "Err": err, "device-id": oo.deviceID})
1537 return nil, err
1538 }
1539
1540 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
1541 if err != nil {
1542 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1543 "Err": err, "device-id": oo.deviceID})
1544 return nil, err
1545 }
1546
1547 omciRxCallbackPair := callbackPair{
1548 cbKey: tid,
1549 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1550 }
1551 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
1552 if err != nil {
1553 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1554 "Err": err, "device-id": oo.deviceID})
1555 return nil, err
1556 }
1557 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1558 return meInstance, nil
1559 }
1560 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1561 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1562 return nil, omciErr.GetError()
1563}
1564
Himani Chawla6d2ae152020-09-02 13:11:20 +05301565func (oo *omciCC) sendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001566 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301567 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001568 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001569 "SequNo": strconv.FormatInt(int64(tid), 16),
1570 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1571
1572 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1573 if omciErr.GetError() == nil {
1574 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
1575 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1576 omci.TransactionID(tid))
1577 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001578 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001579 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001580 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001581 }
1582
dbainbri4d3a0dc2020-12-02 00:33:42 +00001583 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001584 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001585 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001586 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001587 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001588 }
1589
Himani Chawla6d2ae152020-09-02 13:11:20 +05301590 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001591 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001592 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001593 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001594 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001595 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001596 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001597 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001598 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001599 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001600 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001601 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001602 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001603 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001604 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001605 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001606}
1607
Himani Chawla6d2ae152020-09-02 13:11:20 +05301608func (oo *omciCC) sendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001609 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301610 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001611 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001612 "SequNo": strconv.FormatInt(int64(tid), 16),
1613 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1614
1615 meInstance, omciErr := me.NewTCont(params[0])
1616 if omciErr.GetError() == nil {
1617 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1618 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001619 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001620 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001621 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001622 }
1623
dbainbri4d3a0dc2020-12-02 00:33:42 +00001624 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001625 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001626 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001627 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001628 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001629 }
1630
Himani Chawla6d2ae152020-09-02 13:11:20 +05301631 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001632 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001633 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001634 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001635 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001636 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001637 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001638 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001639 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001640 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001641 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001642 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001643 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001644 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001645 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001646 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001647}
1648
Himani Chawla6d2ae152020-09-02 13:11:20 +05301649func (oo *omciCC) sendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001650 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301651 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001652 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001653 "SequNo": strconv.FormatInt(int64(tid), 16),
1654 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1655
1656 meInstance, omciErr := me.NewPriorityQueue(params[0])
1657 if omciErr.GetError() == nil {
1658 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1659 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001660 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001661 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001662 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001663 }
1664
dbainbri4d3a0dc2020-12-02 00:33:42 +00001665 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001666 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001667 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001668 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001669 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001670 }
1671
Himani Chawla6d2ae152020-09-02 13:11:20 +05301672 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001673 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001674 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001675 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001676 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001677 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001678 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001679 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001680 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001681 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001682 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001683 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001684 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001685 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001686 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001687 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001688}
1689
Himani Chawla6d2ae152020-09-02 13:11:20 +05301690func (oo *omciCC) sendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001691 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301692 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001693 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001694 "SequNo": strconv.FormatInt(int64(tid), 16),
1695 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1696
1697 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1698 if omciErr.GetError() == nil {
1699 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1700 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001701 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001702 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001703 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001704 }
1705
dbainbri4d3a0dc2020-12-02 00:33:42 +00001706 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001707 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001708 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001709 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001710 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001711 }
1712
Himani Chawla6d2ae152020-09-02 13:11:20 +05301713 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001714 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001715 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001716 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001717 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001718 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001719 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001720 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001721 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001722 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001723 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001724 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001725 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001726 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001727 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001728 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001729}
mpagenkodff5dda2020-08-28 11:52:01 +00001730
Himani Chawla6d2ae152020-09-02 13:11:20 +05301731func (oo *omciCC) sendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001732 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301733 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001734 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001735 "SequNo": strconv.FormatInt(int64(tid), 16),
1736 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1737
1738 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1739 if omciErr.GetError() == nil {
1740 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
1741 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1742 omci.TransactionID(tid))
1743 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001744 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001745 "Err": err, "device-id": oo.deviceID})
1746 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1747 // return (dual format) error code that can be used at caller for immediate error treatment
1748 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001749 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001750 }
1751
dbainbri4d3a0dc2020-12-02 00:33:42 +00001752 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001753 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001754 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001755 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001756 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001757 }
1758
Himani Chawla6d2ae152020-09-02 13:11:20 +05301759 omciRxCallbackPair := callbackPair{
mpagenkodff5dda2020-08-28 11:52:01 +00001760 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001761 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001762 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001763 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001764 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001765 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001766 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001767 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001768 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001769 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001770 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00001771 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001772 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001773 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001774 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00001775}
1776
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001777// nolint: unused
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001778func (oo *omciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001779 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001780 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001781 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001782 "SequNo": strconv.FormatInt(int64(tid), 16),
1783 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1784
1785 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1786 if omciErr.GetError() == nil {
1787 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType,
1788 omci.TransactionID(tid))
1789 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001790 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001791 "Err": err, "device-id": oo.deviceID})
1792 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1793 // return (dual format) error code that can be used at caller for immediate error treatment
1794 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001795 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001796 }
1797
dbainbri4d3a0dc2020-12-02 00:33:42 +00001798 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001799 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001800 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001801 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001802 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001803 }
1804
1805 omciRxCallbackPair := callbackPair{
1806 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001807 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001808 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001809 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001810 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001811 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001812 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001813 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001814 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001815 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001816 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001817 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001818 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001819 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001820 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001821}
1822
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001823func (oo *omciCC) sendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001824 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001825 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001826 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001827 "SequNo": strconv.FormatInt(int64(tid), 16),
1828 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1829
1830 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1831 if omciErr.GetError() == nil {
1832 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1833 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001834 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001835 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001836 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001837 }
1838
dbainbri4d3a0dc2020-12-02 00:33:42 +00001839 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001840 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001841 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001842 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001843 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001844 }
1845
1846 omciRxCallbackPair := callbackPair{
1847 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001848 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001849 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001850 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001851 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001852 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001853 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001854 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001855 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001856 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001857 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001858 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001859 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001860 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001861 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001862}
1863
Himani Chawla6d2ae152020-09-02 13:11:20 +05301864func (oo *omciCC) sendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001865 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301866 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001867 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001868 "SequNo": strconv.FormatInt(int64(tid), 16),
1869 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1870
1871 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1872 if omciErr.GetError() == nil {
1873 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1874 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001875 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001876 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001877 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001878 }
1879
dbainbri4d3a0dc2020-12-02 00:33:42 +00001880 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001881 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001882 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001883 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001884 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001885 }
1886
Himani Chawla6d2ae152020-09-02 13:11:20 +05301887 omciRxCallbackPair := callbackPair{
mpagenkodff5dda2020-08-28 11:52:01 +00001888 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001889 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001890 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001891 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001892 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001893 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001894 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001895 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001896 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001897 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001898 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00001899 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001900 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001901 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001902 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00001903}
mpagenko01e726e2020-10-23 09:45:29 +00001904
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001905func (oo *omciCC) sendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001906 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001907 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001908 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001909 "SequNo": strconv.FormatInt(int64(tid), 16),
1910 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1911
1912 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1913 if omciErr.GetError() == nil {
1914 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid))
1915 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001916 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001917 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001918 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001919 }
1920
dbainbri4d3a0dc2020-12-02 00:33:42 +00001921 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001922 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001923 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001924 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001925 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001926 }
1927
1928 omciRxCallbackPair := callbackPair{
1929 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001930 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001931 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001932 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001933 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001934 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001935 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001936 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001937 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001938 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001939 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001940 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001941 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001942 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001943 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001944}
1945
mpagenko01e726e2020-10-23 09:45:29 +00001946func (oo *omciCC) sendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001947 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko01e726e2020-10-23 09:45:29 +00001948 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001949 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00001950 "SequNo": strconv.FormatInt(int64(tid), 16),
1951 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1952
1953 meParams := me.ParamData{EntityID: aInstID}
1954 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
1955 if omciErr.GetError() == nil {
1956 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
1957 omci.TransactionID(tid))
1958 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001959 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001960 "Err": err, "device-id": oo.deviceID})
1961 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1962 // return (dual format) error code that can be used at caller for immediate error treatment
1963 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001964 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00001965 }
1966
dbainbri4d3a0dc2020-12-02 00:33:42 +00001967 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00001968 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001969 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001970 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001971 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00001972 }
1973
1974 omciRxCallbackPair := callbackPair{
1975 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001976 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00001977 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001978 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00001979 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001980 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001981 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001982 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00001983 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001984 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001985 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00001986 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001987 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001988 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001989 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00001990}
ozgecanetsia422dbf32020-10-28 14:07:19 +03001991
ozgecanetsia82b91a62021-05-21 18:54:49 +03001992func (oo *omciCC) sendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab6441962021-03-10 10:58:48 +03001993 tid := oo.getNextTid(highPrio)
1994 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
1995 "SequNo": strconv.FormatInt(int64(tid), 16),
1996 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1997 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
1998 if omciErr.GetError() == nil {
1999 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
2000 if err != nil {
2001 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002002 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002003 }
2004 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2005 if err != nil {
2006 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002007 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002008 }
2009 omciRxCallbackPair := callbackPair{
2010 cbKey: tid,
2011 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2012 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002013 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002014 if err != nil {
2015 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002016 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002017 }
2018 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002019 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002020 }
2021 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002022 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002023}
2024
2025// nolint: unused
2026func (oo *omciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002027 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab6441962021-03-10 10:58:48 +03002028 tid := oo.getNextTid(highPrio)
2029 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
2030 "SequNo": strconv.FormatInt(int64(tid), 16),
2031 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2032
2033 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2034 if omciErr.GetError() == nil {
2035 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
2036 if err != nil {
2037 logger.Errorw(ctx, "Cannot encode TD for set", 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 set", 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 }
2045 omciRxCallbackPair := callbackPair{
2046 cbKey: tid,
2047 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2048 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +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 set", 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-Set-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
2062// nolint: unused
2063func (oo *omciCC) sendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002064 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
ozgecanetsiab6441962021-03-10 10:58:48 +03002065 tid := oo.getNextTid(highPrio)
2066 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2067 "SequNo": strconv.FormatInt(int64(tid), 16),
2068 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2069
2070 meParams := me.ParamData{EntityID: aInstID}
2071 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2072 if omciErr.GetError() == nil {
2073 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid))
2074 if err != nil {
2075 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002076 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002077 }
2078 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2079 if err != nil {
2080 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002081 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002082 }
2083 omciRxCallbackPair := callbackPair{
2084 cbKey: tid,
2085 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2086 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002087 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002088 if err != nil {
2089 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002090 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002091 }
2092 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002093 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002094 }
2095 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002096 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002097
2098}
2099
mpagenko8b07c1b2020-11-26 10:36:31 +00002100func (oo *omciCC) sendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002101 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko8b07c1b2020-11-26 10:36:31 +00002102 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002103 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002104 "SequNo": strconv.FormatInt(int64(tid), 16),
2105 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2106
2107 meParams := me.ParamData{EntityID: aInstID}
2108 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2109 if omciErr.GetError() == nil {
2110 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2111 omci.TransactionID(tid))
2112 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002113 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002114 "Err": err, "device-id": oo.deviceID})
2115 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2116 // return (dual format) error code that can be used at caller for immediate error treatment
2117 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002118 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002119 }
2120
dbainbri4d3a0dc2020-12-02 00:33:42 +00002121 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002122 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002123 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002124 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002125 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002126 }
2127
2128 omciRxCallbackPair := callbackPair{
2129 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002130 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002131 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002132 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002133 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002134 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002135 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002136 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002137 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002138 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002139 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002140 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002141 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002142 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002143 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002144}
2145
2146func (oo *omciCC) sendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002147 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko8b07c1b2020-11-26 10:36:31 +00002148 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002149 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002150 "SequNo": strconv.FormatInt(int64(tid), 16),
2151 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2152
2153 meParams := me.ParamData{EntityID: aInstID}
2154 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2155 if omciErr.GetError() == nil {
2156 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2157 omci.TransactionID(tid))
2158 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002159 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002160 "Err": err, "device-id": oo.deviceID})
2161 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2162 // return (dual format) error code that can be used at caller for immediate error treatment
2163 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002164 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002165 }
2166
dbainbri4d3a0dc2020-12-02 00:33:42 +00002167 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002168 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002169 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002170 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002171 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002172 }
2173
2174 omciRxCallbackPair := callbackPair{
2175 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002176 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002177 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002178 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002179 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002180 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002181 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002182 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002183 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002184 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002185 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002186 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002187 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002188 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002189 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002190}
2191
2192func (oo *omciCC) sendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002193 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko8b07c1b2020-11-26 10:36:31 +00002194 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002195 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002196 "SequNo": strconv.FormatInt(int64(tid), 16),
2197 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2198
2199 meParams := me.ParamData{EntityID: aInstID}
2200 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2201 if omciErr.GetError() == nil {
2202 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2203 omci.TransactionID(tid))
2204 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002205 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002206 "Err": err, "device-id": oo.deviceID})
2207 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2208 // return (dual format) error code that can be used at caller for immediate error treatment
2209 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002210 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002211 }
2212
dbainbri4d3a0dc2020-12-02 00:33:42 +00002213 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002214 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002215 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002216 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002217 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002218 }
2219
2220 omciRxCallbackPair := callbackPair{
2221 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002222 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002223 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002224 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002225 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002226 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002227 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002228 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002229 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002230 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002231 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002232 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002233 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002234 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002235 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002236}
2237
2238func (oo *omciCC) sendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002239 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko8b07c1b2020-11-26 10:36:31 +00002240 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002241 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002242 "SequNo": strconv.FormatInt(int64(tid), 16),
2243 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2244
2245 meParams := me.ParamData{EntityID: aInstID}
2246 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2247 if omciErr.GetError() == nil {
2248 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2249 omci.TransactionID(tid))
2250 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002251 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002252 "Err": err, "device-id": oo.deviceID})
2253 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2254 // return (dual format) error code that can be used at caller for immediate error treatment
2255 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002256 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002257 }
2258
dbainbri4d3a0dc2020-12-02 00:33:42 +00002259 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002260 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002261 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002262 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002263 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002264 }
2265
2266 omciRxCallbackPair := callbackPair{
2267 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002268 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002269 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002270 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002271 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002272 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002273 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002274 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002275 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002276 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002277 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002278 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002279 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002280 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002281 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002282}
2283
ozgecanetsia422dbf32020-10-28 14:07:19 +03002284func (oo *omciCC) sendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002285 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsia422dbf32020-10-28 14:07:19 +03002286 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002287 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002288 "SequNo": strconv.FormatInt(int64(tid), 16),
2289 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2290
2291 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2292 if omciErr.GetError() == nil {
2293 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2294 omci.AddDefaults(true))
2295 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002296 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002297 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002298 }
2299
dbainbri4d3a0dc2020-12-02 00:33:42 +00002300 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002301 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002302 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002303 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002304 }
2305
2306 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002307 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002308 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002309 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002310 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002311 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002312 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002313 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002314 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002315 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002316 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002317 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002318 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002319 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002320}
2321
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002322func (oo *omciCC) sendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002323 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002324 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002325 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002326 "SequNo": strconv.FormatInt(int64(tid), 16),
2327 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2328
2329 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2330 if omciErr.GetError() == nil {
2331 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid),
2332 omci.AddDefaults(true))
2333 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002334 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002335 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002336 }
2337
dbainbri4d3a0dc2020-12-02 00:33:42 +00002338 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002339 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002340 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002341 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002342 }
2343
2344 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002345 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002346 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002347 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002348 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002349 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002350 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002351 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002352 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002353 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002354 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002355 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002356 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002357 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002358}
2359
ozgecanetsia422dbf32020-10-28 14:07:19 +03002360func (oo *omciCC) sendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002361 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsia422dbf32020-10-28 14:07:19 +03002362 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002363 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002364 "SequNo": strconv.FormatInt(int64(tid), 16),
2365 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2366
2367 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2368 if omciErr.GetError() == nil {
2369 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2370 omci.AddDefaults(true))
2371 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002372 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002373 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002374 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002375 }
2376
dbainbri4d3a0dc2020-12-02 00:33:42 +00002377 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002378 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002379 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002380 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002381 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002382 }
2383
2384 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002385 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002386 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002387 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002388 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002389 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002390 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002391 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002392 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002393 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002394 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002395 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002396 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002397 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002398 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002399}
2400
2401func (oo *omciCC) sendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002402 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsia422dbf32020-10-28 14:07:19 +03002403 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002404 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002405 "SequNo": strconv.FormatInt(int64(tid), 16),
2406 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2407
2408 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2409 if omciErr.GetError() == nil {
2410 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid),
2411 omci.AddDefaults(true))
2412 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002413 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002414 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002415 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002416 }
2417
dbainbri4d3a0dc2020-12-02 00:33:42 +00002418 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002419 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002420 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002421 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002422 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002423 }
2424
2425 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002426 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002427 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002428 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002429 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002430 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002431 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002432 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002433 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002434 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002435 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002436 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002437 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002438 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002439 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002440}
2441
2442func (oo *omciCC) sendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002443 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsia422dbf32020-10-28 14:07:19 +03002444 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002445 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002446 "SequNo": strconv.FormatInt(int64(tid), 16),
2447 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2448
2449 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2450 if omciErr.GetError() == nil {
2451 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2452 omci.AddDefaults(true))
2453 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002454 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002455 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002456 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002457 }
2458
dbainbri4d3a0dc2020-12-02 00:33:42 +00002459 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002460 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002461 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002462 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002463 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002464 }
2465
2466 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002467 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002468 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002469 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002470 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002471 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002472 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002473 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002474 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002475 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002476 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002477 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002478 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002479 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002480 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002481}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002482
Girish Gowdrae0140f02021-02-02 16:55:09 -08002483func (oo *omciCC) sendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
2484 tid := oo.getNextTid(highPrio)
2485 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
2486 "SequNo": strconv.FormatInt(int64(tid), 16)})
2487
2488 omciLayer := &omci.OMCI{
2489 TransactionID: tid,
2490 MessageType: omci.SynchronizeTimeRequestType,
2491 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2492 // Length: 0x28, // Optional, defaults to 40 octets
2493 }
2494 utcTime := time.Now().UTC()
2495 request := &omci.SynchronizeTimeRequest{
2496 MeBasePacket: omci.MeBasePacket{
2497 EntityClass: me.OnuGClassID,
2498 // Default Instance ID is 0
2499 },
2500 Year: uint16(utcTime.Year()),
2501 Month: uint8(utcTime.Month()),
2502 Day: uint8(utcTime.Day()),
2503 Hour: uint8(utcTime.Hour()),
2504 Minute: uint8(utcTime.Minute()),
2505 Second: uint8(utcTime.Second()),
2506 }
2507
2508 pkt, err := serializeOmciLayer(ctx, omciLayer, request)
2509 if err != nil {
2510 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
2511 "device-id": oo.deviceID})
2512 return err
2513 }
2514
2515 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002516 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002517 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002518 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002519 if err != nil {
2520 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
2521 "device-id": oo.deviceID})
2522 return err
2523 }
2524 logger.Debug(ctx, "send synchronize time request done")
2525 return nil
2526}
2527
2528func (oo *omciCC) sendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002529 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Girish Gowdrae0140f02021-02-02 16:55:09 -08002530 tid := oo.getNextTid(highPrio)
2531 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2532 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
2533 meParam := me.ParamData{EntityID: entityID}
2534 var meInstance *me.ManagedEntity
2535 var omciErr me.OmciErrors
2536 if upstream {
2537 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
2538 } else {
2539 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
2540 }
2541 if omciErr.GetError() == nil {
2542 var omciLayer *omci.OMCI
2543 var msgLayer gopacket.SerializableLayer
2544 var err error
2545 if create {
2546 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2547 omci.AddDefaults(true))
2548 } else {
2549 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2550 omci.AddDefaults(true))
2551 }
2552 if err != nil {
2553 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
2554 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002555 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002556 }
2557
2558 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2559 if err != nil {
2560 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
2561 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002562 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002563 }
2564
2565 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002566 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002567 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002568 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002569 if err != nil {
2570 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
2571 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002572 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002573 }
2574 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
2575 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002576 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08002577 }
2578 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
2579 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 +03002580 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08002581}
2582
2583func (oo *omciCC) sendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002584 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Girish Gowdrae0140f02021-02-02 16:55:09 -08002585 tid := oo.getNextTid(highPrio)
2586 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2587 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2588 meParam := me.ParamData{EntityID: entityID}
2589 var meInstance *me.ManagedEntity
2590 var omciErr me.OmciErrors
2591 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
2592
2593 if omciErr.GetError() == nil {
2594 var omciLayer *omci.OMCI
2595 var msgLayer gopacket.SerializableLayer
2596 var err error
2597 if create {
2598 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2599 omci.AddDefaults(true))
2600 } else {
2601 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2602 omci.AddDefaults(true))
2603 }
2604 if err != nil {
2605 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
2606 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002607 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002608 }
2609
2610 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2611 if err != nil {
2612 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
2613 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002614 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002615 }
2616
2617 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002618 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002619 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002620 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002621 if err != nil {
2622 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
2623 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002624 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002625 }
2626 logger.Debugw(ctx, "send ethernet uni history data ME done",
2627 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002628 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08002629 }
2630 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
2631 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002632 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08002633}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002634
2635func (oo *omciCC) sendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002636 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002637 tid := oo.getNextTid(highPrio)
2638 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2639 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2640 meParam := me.ParamData{EntityID: entityID}
2641 var meInstance *me.ManagedEntity
2642 var omciErr me.OmciErrors
2643 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
2644
2645 if omciErr.GetError() == nil {
2646 var omciLayer *omci.OMCI
2647 var msgLayer gopacket.SerializableLayer
2648 var err error
2649 if create {
2650 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2651 omci.AddDefaults(true))
2652 } else {
2653 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2654 omci.AddDefaults(true))
2655 }
2656 if err != nil {
2657 logger.Errorw(ctx, "Cannot encode fec history data ME",
2658 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002659 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002660 }
2661
2662 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2663 if err != nil {
2664 logger.Errorw(ctx, "Cannot serialize fec history data ME",
2665 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002666 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002667 }
2668
2669 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002670 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002671 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002672 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002673 if err != nil {
2674 logger.Errorw(ctx, "Cannot send fec history data ME",
2675 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002676 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002677 }
2678 logger.Debugw(ctx, "send fec history data ME done",
2679 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002680 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002681 }
2682 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
2683 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002684 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002685}
2686
2687func (oo *omciCC) sendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002688 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002689 tid := oo.getNextTid(highPrio)
2690 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2691 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2692 meParam := me.ParamData{EntityID: entityID}
2693 var meInstance *me.ManagedEntity
2694 var omciErr me.OmciErrors
2695 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
2696
2697 if omciErr.GetError() == nil {
2698 var omciLayer *omci.OMCI
2699 var msgLayer gopacket.SerializableLayer
2700 var err error
2701 if create {
2702 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2703 omci.AddDefaults(true))
2704 } else {
2705 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2706 omci.AddDefaults(true))
2707 }
2708 if err != nil {
2709 logger.Errorw(ctx, "Cannot encode gemport history data ME",
2710 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002711 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002712 }
2713
2714 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2715 if err != nil {
2716 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
2717 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002718 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002719 }
2720
2721 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002722 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002723 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002724 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002725 if err != nil {
2726 logger.Errorw(ctx, "Cannot send gemport history data ME",
2727 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002728 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002729 }
2730 logger.Debugw(ctx, "send gemport history data ME done",
2731 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002732 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002733 }
2734 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
2735 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002736 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002737}
2738
mpagenko80622a52021-02-09 16:53:23 +00002739func (oo *omciCC) sendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
2740 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32) error {
2741 tid := oo.getNextTid(highPrio)
2742 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
2743 "SequNo": strconv.FormatInt(int64(tid), 16),
2744 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2745
2746 omciLayer := &omci.OMCI{
2747 TransactionID: tid,
2748 MessageType: omci.StartSoftwareDownloadRequestType,
2749 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2750 // Length: 0x28, // Optional, defaults to 40 octets
2751 }
2752 request := &omci.StartSoftwareDownloadRequest{
2753 MeBasePacket: omci.MeBasePacket{
2754 EntityClass: me.SoftwareImageClassID,
2755 EntityInstance: aImageMeID, //inactive image
2756 },
2757 WindowSize: aDownloadWindowSize,
2758 ImageSize: aFileLen,
2759 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
2760 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
2761 }
2762
2763 var options gopacket.SerializeOptions
2764 options.FixLengths = true
2765 buffer := gopacket.NewSerializeBuffer()
2766 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2767 if err != nil {
2768 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
2769 "device-id": oo.deviceID})
2770 return err
2771 }
2772 outgoingPacket := buffer.Bytes()
2773
2774 omciRxCallbackPair := callbackPair{cbKey: tid,
2775 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2776 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002777 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00002778 if err != nil {
2779 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
2780 "device-id": oo.deviceID})
2781 return err
2782 }
2783 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002784 return nil
2785}
2786
mpagenkoc26d4c02021-05-06 14:27:57 +00002787func (oo *omciCC) sendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
mpagenko80622a52021-02-09 16:53:23 +00002788 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool) error {
2789 tid := oo.getNextTid(highPrio)
2790 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
2791 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00002792 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00002793
2794 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
2795 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00002796 msgType := omci.DownloadSectionRequestType
mpagenkoc26d4c02021-05-06 14:27:57 +00002797 var timeout int = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00002798 if aAckRequest > 0 {
2799 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00002800 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00002801 }
mpagenko80622a52021-02-09 16:53:23 +00002802 omciLayer := &omci.OMCI{
2803 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002804 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00002805 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2806 // Length: 0x28, // Optional, defaults to 40 octets
2807 }
Himani Chawla43f95ff2021-06-03 00:24:12 +05302808 localSectionData := make([]byte, len(aSection))
2809
mpagenko15ff4a52021-03-02 10:09:20 +00002810 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00002811 request := &omci.DownloadSectionRequest{
2812 MeBasePacket: omci.MeBasePacket{
2813 EntityClass: me.SoftwareImageClassID,
2814 EntityInstance: aImageMeID, //inactive image
2815 },
2816 SectionNumber: aDownloadSectionNo,
2817 SectionData: localSectionData,
2818 }
2819
2820 var options gopacket.SerializeOptions
2821 options.FixLengths = true
2822 buffer := gopacket.NewSerializeBuffer()
2823 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2824 if err != nil {
2825 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
2826 "device-id": oo.deviceID})
2827 return err
2828 }
2829 outgoingPacket := buffer.Bytes()
2830
mpagenko15ff4a52021-03-02 10:09:20 +00002831 //for initial debug purpose overrule the requested print state for some frames
2832 printFrame := aPrint
2833 if aAckRequest > 0 || aDownloadSectionNo == 0 {
2834 printFrame = true
2835 }
2836
mpagenko80622a52021-02-09 16:53:23 +00002837 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00002838 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
2839 // (used to avoid retransmission of frames with the same TID)
mpagenko15ff4a52021-03-02 10:09:20 +00002840 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00002841 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002842 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00002843 if err != nil {
2844 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
2845 "device-id": oo.deviceID})
2846 return err
2847 }
2848 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002849 return nil
2850}
2851
2852func (oo *omciCC) sendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
2853 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32) error {
2854 tid := oo.getNextTid(highPrio)
2855 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
2856 "SequNo": strconv.FormatInt(int64(tid), 16),
2857 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2858
mpagenko15ff4a52021-03-02 10:09:20 +00002859 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00002860 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002861 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00002862 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2863 // Length: 0x28, // Optional, defaults to 40 octets
2864 }
mpagenko15ff4a52021-03-02 10:09:20 +00002865 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00002866 MeBasePacket: omci.MeBasePacket{
2867 EntityClass: me.SoftwareImageClassID,
2868 EntityInstance: aImageMeID, //inactive image
2869 },
mpagenko15ff4a52021-03-02 10:09:20 +00002870 CRC32: aImageCrc,
2871 ImageSize: aFileLen,
2872 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
2873 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00002874 }
mpagenko15ff4a52021-03-02 10:09:20 +00002875
2876 var options gopacket.SerializeOptions
2877 options.FixLengths = true
2878 buffer := gopacket.NewSerializeBuffer()
2879 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2880 if err != nil {
2881 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00002882 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002883 return err
mpagenko80622a52021-02-09 16:53:23 +00002884 }
mpagenko15ff4a52021-03-02 10:09:20 +00002885 outgoingPacket := buffer.Bytes()
2886
2887 omciRxCallbackPair := callbackPair{cbKey: tid,
2888 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2889 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002890 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00002891 if err != nil {
2892 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
2893 "device-id": oo.deviceID})
2894 return err
2895 }
2896 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002897 return nil
2898}
2899
2900func (oo *omciCC) sendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
2901 rxChan chan Message, aImageMeID uint16) error {
2902 tid := oo.getNextTid(highPrio)
2903 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
2904 "SequNo": strconv.FormatInt(int64(tid), 16),
2905 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2906
2907 omciLayer := &omci.OMCI{
2908 TransactionID: tid,
2909 MessageType: omci.ActivateSoftwareRequestType,
2910 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2911 // Length: 0x28, // Optional, defaults to 40 octets
2912 }
2913 request := &omci.ActivateSoftwareRequest{
2914 MeBasePacket: omci.MeBasePacket{
2915 EntityClass: me.SoftwareImageClassID,
2916 EntityInstance: aImageMeID, //inactive image
2917 },
2918 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
2919 }
2920
2921 var options gopacket.SerializeOptions
2922 options.FixLengths = true
2923 buffer := gopacket.NewSerializeBuffer()
2924 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2925 if err != nil {
2926 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
2927 "device-id": oo.deviceID})
2928 return err
2929 }
2930 outgoingPacket := buffer.Bytes()
2931
2932 omciRxCallbackPair := callbackPair{cbKey: tid,
2933 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2934 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002935 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00002936 if err != nil {
2937 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
2938 "device-id": oo.deviceID})
2939 return err
2940 }
2941 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00002942 return nil
2943}
mpagenko80622a52021-02-09 16:53:23 +00002944
mpagenko15ff4a52021-03-02 10:09:20 +00002945func (oo *omciCC) sendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
2946 rxChan chan Message, aImageMeID uint16) error {
2947 tid := oo.getNextTid(highPrio)
2948 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
2949 "SequNo": strconv.FormatInt(int64(tid), 16),
2950 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2951
2952 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00002953 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002954 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00002955 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2956 // Length: 0x28, // Optional, defaults to 40 octets
2957 }
mpagenko15ff4a52021-03-02 10:09:20 +00002958 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00002959 MeBasePacket: omci.MeBasePacket{
2960 EntityClass: me.SoftwareImageClassID,
2961 EntityInstance: aImageMeID, //inactive image
2962 },
mpagenko80622a52021-02-09 16:53:23 +00002963 }
mpagenko15ff4a52021-03-02 10:09:20 +00002964
2965 var options gopacket.SerializeOptions
2966 options.FixLengths = true
2967 buffer := gopacket.NewSerializeBuffer()
2968 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2969 if err != nil {
2970 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00002971 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002972 return err
mpagenko80622a52021-02-09 16:53:23 +00002973 }
mpagenko15ff4a52021-03-02 10:09:20 +00002974 outgoingPacket := buffer.Bytes()
2975
2976 omciRxCallbackPair := callbackPair{cbKey: tid,
2977 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2978 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002979 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00002980 if err != nil {
2981 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
2982 "device-id": oo.deviceID})
2983 return err
2984 }
2985 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002986 return nil
2987}
2988
Girish Gowdra6afb56a2021-04-27 17:47:57 -07002989func (oo *omciCC) sendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
2990 tid := oo.getNextTid(highPrio)
2991 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
2992 "SequNo": strconv.FormatInt(int64(tid), 16),
2993 "InstId": strconv.FormatInt(int64(instdID), 16)})
2994 omciLayer := &omci.OMCI{
2995 TransactionID: tid,
2996 MessageType: omci.TestRequestType,
2997 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2998 // Length: 0x28, // Optional, defaults to 40 octets
2999 }
3000
3001 var request *omci.OpticalLineSupervisionTestRequest
3002 switch classID {
3003 case aniGClassID:
3004 request = &omci.OpticalLineSupervisionTestRequest{
3005 MeBasePacket: omci.MeBasePacket{
3006 EntityClass: classID,
3007 EntityInstance: instdID,
3008 },
3009 SelectTest: uint8(7), // self test
3010 GeneralPurposeBuffer: uint16(0),
3011 VendorSpecificParameters: uint16(0),
3012 }
3013 default:
3014 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
3015 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
3016 }
3017 // Test serialization back to former string
3018 var options gopacket.SerializeOptions
3019 options.FixLengths = true
3020
3021 buffer := gopacket.NewSerializeBuffer()
3022 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
3023 if err != nil {
3024 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
3025 "device-id": oo.deviceID})
3026 return err
3027 }
3028 outgoingPacket := buffer.Bytes()
3029
3030 omciRxCallbackPair := callbackPair{cbKey: tid,
3031 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3032 }
3033 err = oo.send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
3034 if err != nil {
3035 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
3036 "device-id": oo.deviceID})
3037 return err
3038 }
3039 logger.Debug(ctx, "send self test request done")
3040 return nil
3041}
3042
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003043//nolint: gocyclo
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003044func isSuccessfulResponseWithMibDataSync(omciMsg *omci.OMCI, packet *gp.Packet) bool {
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00003045 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003046 if v == omciMsg.MessageType {
Girish Gowdra6afb56a2021-04-27 17:47:57 -07003047 nextLayer, _ := omci.MsgTypeToNextLayer(v, false)
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003048 msgLayer := (*packet).Layer(nextLayer)
3049 switch nextLayer {
3050 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003051 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
3052 if resp.Result == me.Success {
3053 return true
3054 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003055 }
3056 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003057 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
3058 if resp.Result == me.Success {
3059 return true
3060 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003061 }
3062 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003063 if resp := msgLayer.(*omci.SetResponse); resp != nil {
3064 if resp.Result == me.Success {
3065 return true
3066 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003067 }
3068 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003069 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
3070 if resp.Result == me.Success {
3071 return true
3072 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003073 }
3074 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003075 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
3076 if resp.Result == me.Success {
3077 return true
3078 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003079 }
3080 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003081 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
3082 if resp.Result == me.Success {
3083 return true
3084 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003085 }
3086 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003087 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
3088 if resp.Result == me.Success {
3089 return true
3090 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003091 }
3092 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00003093 }
3094 }
3095 return false
3096}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003097
3098func (oo *omciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest omciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003099 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00003100 if timeout == 0 {
3101 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003102 oo.mutexTxQueue.Lock()
3103 oo.txQueue.PushBack(aOmciTxRequest) // enqueue
3104 oo.mutexTxQueue.Unlock()
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003105 go oo.sendNextRequest(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00003106 } else {
mpagenko7455fd42021-06-10 16:25:55 +00003107 //the supervised sending with waiting on the response (based on TID) is called in background
3108 // to avoid blocking of the sender for the complete OMCI handshake procedure
3109 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
3110 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
3111 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003112 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003113}
3114
mpagenko7455fd42021-06-10 16:25:55 +00003115func (oo *omciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest omciTransferStructure, aTimeout int) {
3116 chSuccess := make(chan bool)
3117 aOmciTxRequest.chSuccess = chSuccess
3118 tid := aOmciTxRequest.cbPair.cbKey
3119 oo.mutexMonReq.Lock()
3120 oo.monitoredRequests[tid] = aOmciTxRequest
3121 oo.mutexMonReq.Unlock()
3122
3123 retries := aOmciTxRequest.retries
3124 retryCounter := 0
3125loop:
3126 for retryCounter <= retries {
3127
3128 oo.mutexTxQueue.Lock()
3129 oo.txQueue.PushBack(aOmciTxRequest) // enqueue
3130 oo.mutexTxQueue.Unlock()
3131 go oo.sendNextRequest(ctx)
3132
3133 select {
3134 case success := <-chSuccess:
3135 if success {
3136 logger.Debugw(ctx, "reqMon: response received in time",
3137 log.Fields{"tid": tid, "device-id": oo.deviceID})
3138 } else {
3139 logger.Debugw(ctx, "reqMon: wait for response aborted",
3140 log.Fields{"tid": tid, "device-id": oo.deviceID})
3141 }
3142 break loop
3143 case <-time.After(time.Duration(aTimeout) * time.Second):
3144 if retryCounter == retries {
3145 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached!",
3146 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
3147 break loop
3148 } else {
3149 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
3150 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
3151 }
3152 }
3153 retryCounter++
3154 }
3155 oo.mutexMonReq.Lock()
3156 delete(oo.monitoredRequests, tid)
3157 oo.mutexMonReq.Unlock()
3158}
3159
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003160//CancelRequestMonitoring terminates monitoring of outstanding omci requests
mpagenko8cd1bf72021-06-22 10:11:19 +00003161func (oo *omciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003162 oo.mutexMonReq.RLock()
3163 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00003164 //implement non-blocking channel send to avoid blocking on mutexMonReq later
3165 select {
3166 case oo.monitoredRequests[k].chSuccess <- false:
3167 default:
3168 logger.Debugw(ctx, "cancel not send on omciRespChannel (no receiver)", log.Fields{
3169 "index": k, "device-id": oo.deviceID})
3170 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003171 }
3172 oo.mutexMonReq.RUnlock()
3173}
3174
3175//GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
3176//time consumed for retry processing of a particular OMCI-request
3177func (oo *omciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
3178 return time.Duration((cDefaultRetries+1)*oo.pOnuDeviceEntry.pOpenOnuAc.omciTimeout + 1)
3179}
Himani Chawla43f95ff2021-06-03 00:24:12 +05303180
3181func (oo *omciCC) sendCreateOrDeleteEthernetFrameExtendedPMME(ctx context.Context, timeout int, highPrio bool,
3182 upstream bool, create bool, rxChan chan Message, entityID uint16, classID me.ClassID, controlBlock []uint16) (*me.ManagedEntity, error) {
3183 tid := oo.getNextTid(highPrio)
3184 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-msg:", log.Fields{"device-id": oo.deviceID,
3185 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
3186
3187 meParam := me.ParamData{EntityID: entityID,
3188 Attributes: me.AttributeValueMap{"ControlBlock": controlBlock},
3189 }
3190 var meInstance *me.ManagedEntity
3191 var omciErr me.OmciErrors
3192 if classID == me.EthernetFrameExtendedPmClassID {
3193 meInstance, omciErr = me.NewEthernetFrameExtendedPm(meParam)
3194 } else {
3195 meInstance, omciErr = me.NewEthernetFrameExtendedPm64Bit(meParam)
3196 }
3197
3198 if omciErr.GetError() == nil {
3199 var omciLayer *omci.OMCI
3200 var msgLayer gopacket.SerializableLayer
3201 var err error
3202 if create {
3203 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
3204 omci.AddDefaults(true))
3205 } else {
3206 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
3207 omci.AddDefaults(true))
3208 }
3209 if err != nil {
3210 logger.Errorw(ctx, "cannot-encode-ethernet-frame-extended-pm-me",
3211 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
3212 return nil, err
3213 }
3214
3215 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
3216 if err != nil {
3217 logger.Errorw(ctx, "cannot-serialize-ethernet-frame-extended-pm-me",
3218 log.Fields{"err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
3219 return nil, err
3220 }
3221
3222 omciRxCallbackPair := callbackPair{cbKey: tid,
3223 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3224 }
3225 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
3226 if err != nil {
3227 logger.Errorw(ctx, "Cannot send ethernet-frame-extended-pm-me",
3228 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
3229 return nil, err
3230 }
3231 logger.Debugw(ctx, "send-ethernet-frame-extended-pm-me-done",
3232 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
3233 return meInstance, nil
3234 }
3235 logger.Errorw(ctx, "cannot-generate-ethernet-frame-extended-pm-me-instance",
3236 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "inst-id": strconv.FormatInt(int64(entityID), 16)})
3237 return nil, omciErr.GetError()
3238}