blob: 7d281694285749dfc8cba9be2550b36e7591f68a [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"
dbainbri4d3a0dc2020-12-02 00:33:42 +000036 "github.com/opencord/voltha-lib-go/v4/pkg/adapters/adapterif"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000037
dbainbri4d3a0dc2020-12-02 00:33:42 +000038 //"github.com/opencord/voltha-lib-go/v4/pkg/kafka"
39 "github.com/opencord/voltha-lib-go/v4/pkg/log"
40 ic "github.com/opencord/voltha-protos/v4/go/inter_container"
41 //"github.com/opencord/voltha-protos/v4/go/openflow_13"
42 //"github.com/opencord/voltha-protos/v4/go/voltha"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000043)
44
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000045// ### OMCI related definitions - retrieved from Python adapter code/trace ####
Himani Chawla6d2ae152020-09-02 13:11:20 +053046
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000047const galEthernetEID = uint16(1)
48const maxGemPayloadSize = uint16(48)
49const connectivityModeValue = uint8(5)
Himani Chawla4d908332020-08-31 12:30:20 +053050
51//const defaultTPID = uint16(0x8100)
52//const broadComDefaultVID = uint16(4091)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000053const macBridgeServiceProfileEID = uint16(0x201) // TODO: most all these need better definition or tuning
54const ieeeMapperServiceProfileEID = uint16(0x8001)
55const macBridgePortAniEID = uint16(0x2102)
56
mpagenko8b07c1b2020-11-26 10:36:31 +000057const unusedTcontAllocID = uint16(0xFFFF) //common unused AllocId for G.984 and G.987 systems
58
mpagenkoc8bba412021-01-15 15:38:44 +000059const cOmciBaseMessageTrailerLen = 40
60
61// tOmciReceiveError - enum type for detected problems/errors in the received OMCI message (format)
62type tOmciReceiveError uint8
63
64const (
65 // cOmciMessageReceiveNoError - default start state
66 cOmciMessageReceiveNoError tOmciReceiveError = iota
67 // Error indication wrong trailer length within the message
68 cOmciMessageReceiveErrorTrailerLen
69 // Error indication missing trailer within the message
70 cOmciMessageReceiveErrorMissTrailer
71)
72
Holger Hildebrandt366ef192021-05-05 11:07:44 +000073const cDefaultRetries = 2
74
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000075// ### OMCI related definitions - end
76
Himani Chawla6d2ae152020-09-02 13:11:20 +053077//callbackPairEntry to be used for OMCI send/receive correlation
78type callbackPairEntry struct {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000079 cbRespChannel chan Message
dbainbri4d3a0dc2020-12-02 00:33:42 +000080 cbFunction func(context.Context, *omci.OMCI, *gp.Packet, chan Message) error
mpagenko80622a52021-02-09 16:53:23 +000081 framePrint bool //true for printing
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000082}
83
Himani Chawla6d2ae152020-09-02 13:11:20 +053084//callbackPair to be used for ReceiveCallback init
85type callbackPair struct {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000086 cbKey uint16
Himani Chawla6d2ae152020-09-02 13:11:20 +053087 cbEntry callbackPairEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +000088}
89
90type omciTransferStructure struct {
mpagenko80622a52021-02-09 16:53:23 +000091 txFrame []byte
92 timeout int
Holger Hildebrandt366ef192021-05-05 11:07:44 +000093 retries int
mpagenko80622a52021-02-09 16:53:23 +000094 highPrio bool
95 withFramePrint bool
Holger Hildebrandt366ef192021-05-05 11:07:44 +000096 cbPair callbackPair
97 chSuccess chan bool
Holger Hildebrandtfa074992020-03-27 15:42:06 +000098}
99
Himani Chawla6d2ae152020-09-02 13:11:20 +0530100//omciCC structure holds information needed for OMCI communication (to/from OLT Adapter)
101type omciCC struct {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000102 enabled bool
103 pOnuDeviceEntry *OnuDeviceEntry
104 deviceID string
Himani Chawla6d2ae152020-09-02 13:11:20 +0530105 pBaseDeviceHandler *deviceHandler
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000106 coreProxy adapterif.CoreProxy
107 adapterProxy adapterif.AdapterProxy
108 supportExtMsg bool
mpagenkoc8bba412021-01-15 15:38:44 +0000109 rxOmciFrameError tOmciReceiveError
110
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000111 txFrames, txOnuFrames uint32
112 rxFrames, rxOnuFrames, rxOnuDiscards uint32
113
114 // OMCI params
115 mutexTid sync.Mutex
116 tid uint16
117 mutexHpTid sync.Mutex
118 hpTid uint16
119 uploadSequNo uint16
120 uploadNoOfCmds uint16
121
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000122 mutexTxQueue sync.Mutex
123 txQueue *list.List
124 mutexRxSchedMap sync.Mutex
Himani Chawla6d2ae152020-09-02 13:11:20 +0530125 rxSchedulerMap map[uint16]callbackPairEntry
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000126 mutexMonReq sync.RWMutex
127 monitoredRequests map[uint16]omciTransferStructure
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000128 pLastTxMeInstance *me.ManagedEntity
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000129}
130
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000131var responsesWithMibDataSync = []omci.MessageType{
132 omci.CreateResponseType,
133 omci.DeleteResponseType,
134 omci.SetResponseType,
135 omci.StartSoftwareDownloadResponseType,
136 omci.EndSoftwareDownloadResponseType,
137 omci.ActivateSoftwareResponseType,
138 omci.CommitSoftwareResponseType,
139}
140
Himani Chawla6d2ae152020-09-02 13:11:20 +0530141//newOmciCC constructor returns a new instance of a OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000142//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Himani Chawla6d2ae152020-09-02 13:11:20 +0530143func newOmciCC(ctx context.Context, onuDeviceEntry *OnuDeviceEntry,
144 deviceID string, deviceHandler *deviceHandler,
145 coreProxy adapterif.CoreProxy, adapterProxy adapterif.AdapterProxy) *omciCC {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000146 logger.Debugw(ctx, "init-omciCC", log.Fields{"device-id": deviceID})
Himani Chawla6d2ae152020-09-02 13:11:20 +0530147 var omciCC omciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000148 omciCC.enabled = false
Himani Chawla4d908332020-08-31 12:30:20 +0530149 omciCC.pOnuDeviceEntry = onuDeviceEntry
150 omciCC.deviceID = deviceID
151 omciCC.pBaseDeviceHandler = deviceHandler
152 omciCC.coreProxy = coreProxy
153 omciCC.adapterProxy = adapterProxy
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000154 omciCC.supportExtMsg = false
mpagenkoc8bba412021-01-15 15:38:44 +0000155 omciCC.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000156 omciCC.txFrames = 0
157 omciCC.txOnuFrames = 0
158 omciCC.rxFrames = 0
159 omciCC.rxOnuFrames = 0
160 omciCC.rxOnuDiscards = 0
161 omciCC.tid = 0x1
162 omciCC.hpTid = 0x8000
163 omciCC.uploadSequNo = 0
164 omciCC.uploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000165 omciCC.txQueue = list.New()
Himani Chawla6d2ae152020-09-02 13:11:20 +0530166 omciCC.rxSchedulerMap = make(map[uint16]callbackPairEntry)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000167 omciCC.monitoredRequests = make(map[uint16]omciTransferStructure)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000168
169 return &omciCC
170}
171
mpagenko900ee4b2020-10-12 11:56:34 +0000172//stop stops/resets the omciCC
173func (oo *omciCC) stop(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000174 logger.Debugw(ctx, "omciCC-stopping", log.Fields{"device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000175 //reseting all internal data, which might also be helpful for discarding any lingering tx/rx requests
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000176 oo.CancelRequestMonitoring()
mpagenko900ee4b2020-10-12 11:56:34 +0000177 oo.mutexTxQueue.Lock()
178 oo.txQueue.Init() // clear the tx queue
179 oo.mutexTxQueue.Unlock()
180 oo.mutexRxSchedMap.Lock()
181 for k := range oo.rxSchedulerMap {
182 delete(oo.rxSchedulerMap, k) //clear the scheduler map
183 }
184 oo.mutexRxSchedMap.Unlock()
185 oo.mutexHpTid.Lock()
186 oo.hpTid = 0x8000 //reset the high prio transactionId
187 oo.mutexHpTid.Unlock()
188 oo.mutexTid.Lock()
189 oo.tid = 1 //reset the low prio transactionId
190 oo.mutexTid.Unlock()
191 //reset control values
192 oo.uploadSequNo = 0
193 oo.uploadNoOfCmds = 0
mpagenkoc8bba412021-01-15 15:38:44 +0000194 oo.rxOmciFrameError = cOmciMessageReceiveNoError
mpagenko900ee4b2020-10-12 11:56:34 +0000195 //reset the stats counter - which might be topic of discussion ...
196 oo.txFrames = 0
197 oo.txOnuFrames = 0
198 oo.rxFrames = 0
199 oo.rxOnuFrames = 0
200 oo.rxOnuDiscards = 0
201
202 return nil
203}
204
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000205// Rx handler for omci messages
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530206func (oo *omciCC) receiveOnuMessage(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000207 logger.Debugw(ctx, "rx-onu-autonomous-message", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000208 "payload": hex.EncodeToString(omciMsg.Payload)})
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530209 switch omciMsg.MessageType {
210 case omci.AlarmNotificationType:
211 data := OmciMessage{
212 OmciMsg: omciMsg,
213 OmciPacket: packet,
214 }
215 go oo.pBaseDeviceHandler.pAlarmMgr.handleOmciAlarmNotificationMessage(ctx, data)
216 return nil
217 default:
218 return fmt.Errorf("receiveOnuMessageType %s unimplemented", omciMsg.MessageType.String())
219 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000220 /*
221 msgType = rxFrame.fields["message_type"] //assumed OmciOperationsValue
222 rxOnuFrames++
223
224 switch msgType {
225 case AlarmNotification:
226 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000227 logger.Info("Unhandled: received-onu-alarm-message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000228 // python code was:
229 //if msg_type == EntityOperations.AlarmNotification.value:
230 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Alarm_Notification)
231 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
232 //
233 return errors.New("RxAlarmNotification unimplemented")
234 }
235 case AttributeValueChange:
236 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000237 logger.Info("Unhandled: received-attribute-value-change")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000238 // python code was:
239 //elif msg_type == EntityOperations.AttributeValueChange.value:
240 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.AVC_Notification)
241 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
242 //
243 return errors.New("RxAttributeValueChange unimplemented")
244 }
245 case TestResult:
246 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000247 logger.Info("Unhandled: received-test-result")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000248 // python code was:
249 //elif msg_type == EntityOperations.TestResult.value:
250 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Test_Result)
251 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
252 //
253 return errors.New("RxTestResult unimplemented")
254 }
255 default:
256 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000257 logger.Errorw(ctx,"rx-onu-unsupported-autonomous-message", log.Fields{"msgType": msgType})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000258 rxOnuDiscards++
259 return errors.New("RxOnuMsgType unimplemented")
260 }
261 }
262 */
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000263}
264
mpagenko80622a52021-02-09 16:53:23 +0000265func (oo *omciCC) printRxMessage(ctx context.Context, rxMsg []byte) {
266 //assuming omci message content is hex coded!
267 // with restricted output of 16bytes would be ...rxMsg[:16]
268 logger.Debugw(ctx, "omci-message-received:", log.Fields{
269 "RxOmciMessage": hex.EncodeToString(rxMsg),
270 "device-id": oo.deviceID})
271}
272
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000273// Rx handler for onu messages
274// e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
Himani Chawla6d2ae152020-09-02 13:11:20 +0530275func (oo *omciCC) receiveMessage(ctx context.Context, rxMsg []byte) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000276 //logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000277 if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
278 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
mpagenkoc8bba412021-01-15 15:38:44 +0000279 // (an extendedFormat message could be destroyed this way!)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000280 trailerLenData := rxMsg[42:44]
281 trailerLen := binary.BigEndian.Uint16(trailerLenData)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000282 //logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
mpagenkoc8bba412021-01-15 15:38:44 +0000283 if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
284 binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
285 if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
286 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
287 logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
288 log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
289 oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
290 }
291 }
292 } else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
293 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
294 // (an extendedFormat message could be destroyed this way!)
295 // extend/overwrite with trailer
296 trailer := make([]byte, 8)
297 binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
298 rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
299 if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
300 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
301 logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
302 log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
303 oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000304 }
305 } else {
mpagenkoc8bba412021-01-15 15:38:44 +0000306 logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
307 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000308 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200309 return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000310 }
311
312 packet := gopacket.NewPacket(rxMsg, omci.LayerTypeOMCI, gopacket.NoCopy)
313 if packet == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000314 logger.Errorw(ctx, "omci-message could not be decoded", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000315 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200316 return fmt.Errorf("could not decode rxMsg as OMCI %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000317 }
318 omciLayer := packet.Layer(omci.LayerTypeOMCI)
319 if omciLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000320 logger.Errorw(ctx, "omci-message could not decode omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000321 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200322 return fmt.Errorf("could not decode omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000323 }
324 omciMsg, ok := omciLayer.(*omci.OMCI)
325 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000326 logger.Errorw(ctx, "omci-message could not assign omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000327 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200328 return fmt.Errorf("could not assign omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000329 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000330 logger.Debugw(ctx, "omci-message-decoded:", log.Fields{"omciMsgType": omciMsg.MessageType,
mpagenko3dbcdd22020-07-22 07:38:45 +0000331 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "DeviceIdent": omciMsg.DeviceIdentifier})
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000332 if byte(omciMsg.MessageType)&me.AK == 0 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000333 // Not a response
mpagenko80622a52021-02-09 16:53:23 +0000334 oo.printRxMessage(ctx, rxMsg)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000335 logger.Debug(ctx, "RxMsg is no Omci Response Message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000336 if omciMsg.TransactionID == 0 {
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530337 return oo.receiveOnuMessage(ctx, omciMsg, &packet)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000338 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000339 logger.Errorw(ctx, "Unexpected TransCorrId != 0 not accepted for autonomous messages",
Andrea Campanella6515c582020-10-05 11:25:00 +0200340 log.Fields{"msgType": omciMsg.MessageType, "payload": hex.EncodeToString(omciMsg.Payload),
mpagenko8b07c1b2020-11-26 10:36:31 +0000341 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200342 return fmt.Errorf("autonomous Omci Message with TranSCorrId != 0 not acccepted %s", oo.deviceID)
Himani Chawla4d908332020-08-31 12:30:20 +0530343
344 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000345 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530346 oo.mutexRxSchedMap.Lock()
347 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
348 if ok && rxCallbackEntry.cbFunction != nil {
mpagenko80622a52021-02-09 16:53:23 +0000349 if rxCallbackEntry.framePrint {
350 oo.printRxMessage(ctx, rxMsg)
351 }
Himani Chawla4d908332020-08-31 12:30:20 +0530352 //disadvantage of decoupling: error verification made difficult, but anyway the question is
353 // how to react on erroneous frame reception, maybe can simply be ignored
dbainbri4d3a0dc2020-12-02 00:33:42 +0000354 go rxCallbackEntry.cbFunction(ctx, omciMsg, &packet, rxCallbackEntry.cbRespChannel)
Holger Hildebrandt3124e302021-03-23 12:47:03 +0000355 if isSuccessfulResponseWithMibDataSync(omciMsg, &packet) {
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000356 oo.pOnuDeviceEntry.incrementMibDataSync(ctx)
357 }
mpagenkoc8bba412021-01-15 15:38:44 +0000358
Himani Chawla4d908332020-08-31 12:30:20 +0530359 // having posted the response the request is regarded as 'done'
360 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
361 oo.mutexRxSchedMap.Unlock()
mpagenko80622a52021-02-09 16:53:23 +0000362 return nil
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000363 }
mpagenko80622a52021-02-09 16:53:23 +0000364 oo.mutexRxSchedMap.Unlock()
365 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID})
366 oo.printRxMessage(ctx, rxMsg)
367 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000368
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000369 /* py code was:
370 Receive and OMCI message from the proxy channel to the OLT.
371
372 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
373 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
374 """
375 if not self.enabled:
376 return
377
378 try:
379 now = arrow.utcnow()
380 d = None
381
382 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
383 # save the current value of the entity_id_to_class_map, then
384 # replace it with our custom one before decode, and then finally
385 # restore it later. Tried other ways but really made the code messy.
386 saved_me_map = omci_entities.entity_id_to_class_map
387 omci_entities.entity_id_to_class_map = self._me_map
388
389 try:
390 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000391 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000392 except KeyError as e:
393 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000394 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000395 rx_frame = self._decode_unknown_me(msg)
396 self._rx_unknown_me += 1
397
398 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000399 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000400 return
401
402 finally:
403 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
404
405 rx_tid = rx_frame.fields['transaction_id']
406 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000407 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000408 # Filter the Test Result frame and route through receive onu
409 # message method.
410 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000411 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000412 return self._receive_onu_message(rx_frame)
413
414 # Previously unreachable if this is the very first round-trip Rx or we
415 # have been running consecutive errors
416 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000417 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000418 self.reactor.callLater(0, self._publish_connectivity_event, True)
419
420 self._rx_frames += 1
421 self._consecutive_errors = 0
422
423 try:
424 high_priority = self._tid_is_high_priority(rx_tid)
425 index = self._get_priority_index(high_priority)
426
427 # (timestamp, defer, frame, timeout, retry, delayedCall)
428 last_tx_tuple = self._tx_request[index]
429
430 if last_tx_tuple is None or \
431 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
432 # Possible late Rx on a message that timed-out
433 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000434 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000435 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
436 self._rx_unknown_tid += 1
437 self._rx_late += 1
438 return
439
440 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
441 if dc is not None and not dc.cancelled and not dc.called:
442 dc.cancel()
443
444 _secs = self._update_rx_tx_stats(now, ts)
445
446 # Late arrival already serviced by a timeout?
447 if d.called:
448 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000449 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000450 return
451
452 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000453 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000454 if d is not None:
455 return d.errback(failure.Failure(e))
456 return
457
458 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000459 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000460 tx_tid = tx_frame.fields['transaction_id'])
461 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
462
463 # begin success callback chain (will cancel timeout and queue next Tx message)
464 self._rx_response[index] = rx_frame
465 d.callback(rx_frame)
466
467 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000468 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000469 */
470}
471
Himani Chawla6d2ae152020-09-02 13:11:20 +0530472/*
473func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530474 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530475 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000476}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530477*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000478
479//Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
Himani Chawla6d2ae152020-09-02 13:11:20 +0530480func (oo *omciCC) send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
481 receiveCallbackPair callbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000482
dbainbri4d3a0dc2020-12-02 00:33:42 +0000483 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": receiveCallbackPair.cbKey})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000484 // it could be checked, if the callback keay is already registered - but simply overwrite may be acceptable ...
485 oo.mutexRxSchedMap.Lock()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000486 oo.rxSchedulerMap[receiveCallbackPair.cbKey] = receiveCallbackPair.cbEntry
mpagenko80622a52021-02-09 16:53:23 +0000487 printFrame := receiveCallbackPair.cbEntry.framePrint //printFrame true means debug print of frame is requested
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000488 oo.mutexRxSchedMap.Unlock()
489
490 //just use a simple list for starting - might need some more effort, especially for multi source write access
491 omciTxRequest := omciTransferStructure{
492 txFrame,
493 timeout,
494 retry,
495 highPrio,
mpagenko80622a52021-02-09 16:53:23 +0000496 printFrame,
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000497 receiveCallbackPair,
498 nil,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000499 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000500 oo.mutexMonReq.Lock()
501 defer oo.mutexMonReq.Unlock()
502 if _, exist := oo.monitoredRequests[receiveCallbackPair.cbKey]; !exist {
503 go oo.processRequestMonitoring(ctx, omciTxRequest)
504 return nil
505 }
506 logger.Errorw(ctx, "A message with this tid is processed already!",
507 log.Fields{"tid": receiveCallbackPair.cbKey, "device-id": oo.deviceID})
508 return fmt.Errorf("message with tid is processed already %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000509}
510
511//Pull next tx request and send it
Himani Chawla6d2ae152020-09-02 13:11:20 +0530512func (oo *omciCC) sendNextRequest(ctx context.Context) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000513 // return errors.New("sendNextRequest unimplemented")
514
515 // just try to get something transferred !!
516 // avoid accessing the txQueue from parallel send requests
517 // block parallel omci send requests at least until SendIAP is 'committed'
518 // that should be feasible for an onu instance as on OMCI anyway window size 1 is assumed
519 oo.mutexTxQueue.Lock()
mpagenkodff5dda2020-08-28 11:52:01 +0000520 defer oo.mutexTxQueue.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000521 for oo.txQueue.Len() > 0 {
522 queueElement := oo.txQueue.Front() // First element
523 omciTxRequest := queueElement.Value.(omciTransferStructure)
524 /* compare olt device handler code:
525 func (dh *DeviceHandler) omciIndication(omciInd *oop.OmciIndication) {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000526 logger.Debugw(ctx,"omci indication", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000527 var deviceType string
528 var deviceID string
529 var proxyDeviceID string
530
531 onuKey := dh.formOnuKey(omciInd.IntfId, omciInd.OnuId)
532
533 if onuInCache, ok := dh.onus.Load(onuKey); !ok {
534
dbainbri4d3a0dc2020-12-02 00:33:42 +0000535 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 +0000536 ponPort := IntfIDToPortNo(omciInd.GetIntfId(), voltha.Port_PON_OLT)
537 kwargs := make(map[string]interface{})
538 kwargs["onu_id"] = omciInd.OnuId
539 kwargs["parent_port_no"] = ponPort
540
dbainbri4d3a0dc2020-12-02 00:33:42 +0000541 onuDevice, err := dh.coreProxy.GetChildDevice(log.WithSpanFromContext(context.TODO(), ctx), dh.device.Id, kwargs)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000542 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000543 logger.Errorw(ctx,"onu not found", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId, "error": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000544 return
545 }
546 deviceType = onuDevice.Type
547 deviceID = onuDevice.Id
548 proxyDeviceID = onuDevice.ProxyAddress.DeviceId
549 //if not exist in cache, then add to cache.
550 dh.onus.Store(onuKey, NewOnuDevice(deviceID, deviceType, onuDevice.SerialNumber, omciInd.OnuId, omciInd.IntfId, proxyDeviceID))
551 } else {
552 //found in cache
dbainbri4d3a0dc2020-12-02 00:33:42 +0000553 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 +0000554 deviceType = onuInCache.(*OnuDevice).deviceType
555 deviceID = onuInCache.(*OnuDevice).deviceID
556 proxyDeviceID = onuInCache.(*OnuDevice).proxyDeviceID
557 }
558 */
559 /* and compare onu_adapter py code:
560 omci_msg = InterAdapterOmciMessage(
561 message=bytes(frame),
562 proxy_address=self._proxy_address,
563 connect_status=self._device.connect_status)
564
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000565 self.logger.debug('sent-omci-msg', tid=tx_tid, omci_msg=hexlify(bytes(frame)))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000566
567 yield self._adapter_proxy.send_inter_adapter_message(
568 msg=omci_msg,
569 type=InterAdapterMessageType.OMCI_REQUEST,
570 from_adapter=self._device.type,
571 to_adapter=self._proxy_address.device_type,
572 to_device_id=self._device_id,
573 proxy_device_id=self._proxy_address.device_id
574 )
575 */
576 device, err := oo.coreProxy.GetDevice(ctx,
577 oo.pBaseDeviceHandler.deviceID, oo.deviceID) //parent, child
578 if err != nil || device == nil {
579 /*TODO: needs to handle error scenarios */
dbainbri4d3a0dc2020-12-02 00:33:42 +0000580 logger.Errorw(ctx, "Failed to fetch device", log.Fields{"err": err, "ParentId": oo.pBaseDeviceHandler.deviceID,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000581 "ChildId": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200582 return fmt.Errorf("failed to fetch device %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000583 }
584
mpagenko80622a52021-02-09 16:53:23 +0000585 if omciTxRequest.withFramePrint {
586 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
587 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
588 "device-id": oo.deviceID,
589 "toDeviceType": oo.pBaseDeviceHandler.ProxyAddressType,
590 "proxyDeviceID": oo.pBaseDeviceHandler.ProxyAddressID})
591 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000592 omciMsg := &ic.InterAdapterOmciMessage{Message: omciTxRequest.txFrame}
dbainbri4d3a0dc2020-12-02 00:33:42 +0000593 if sendErr := oo.adapterProxy.SendInterAdapterMessage(log.WithSpanFromContext(context.Background(), ctx), omciMsg,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000594 ic.InterAdapterMessageType_OMCI_REQUEST,
Matteo Scandoloefbec272020-11-17 10:33:09 -0800595 //fromTopic,toType,toDevId, ProxyDevId
596 oo.pOnuDeviceEntry.baseDeviceHandler.pOpenOnuAc.config.Topic, oo.pBaseDeviceHandler.ProxyAddressType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000597 oo.deviceID, oo.pBaseDeviceHandler.ProxyAddressID, ""); sendErr != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000598 logger.Errorw(ctx, "send omci request error", log.Fields{"ChildId": oo.deviceID, "error": sendErr})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000599 return sendErr
600 }
601 oo.txQueue.Remove(queueElement) // Dequeue
602 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000603 return nil
604}
605
Himani Chawla6d2ae152020-09-02 13:11:20 +0530606func (oo *omciCC) getNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000607 var next uint16
608 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000609 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000610 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530611 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000612 if oo.hpTid < 0x8000 {
613 oo.hpTid = 0x8000
614 }
mpagenko900ee4b2020-10-12 11:56:34 +0000615 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000616 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000617 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000618 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530619 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000620 if oo.tid >= 0x8000 {
621 oo.tid = 1
622 }
mpagenko900ee4b2020-10-12 11:56:34 +0000623 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000624 }
625 return next
626}
627
628// ###################################################################################
629// # utility methods provided to work on OMCI messages
dbainbri4d3a0dc2020-12-02 00:33:42 +0000630func serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000631 omciLayer := &omci.OMCI{
632 TransactionID: tid,
633 MessageType: msgType,
634 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000635 return serializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000636}
637
dbainbri4d3a0dc2020-12-02 00:33:42 +0000638func serializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000639 var options gopacket.SerializeOptions
640 options.FixLengths = true
641
642 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530643 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000644 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000645 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000646 return nil, err
647 }
648 return buffer.Bytes(), nil
649}
650
Himani Chawla4d908332020-08-31 12:30:20 +0530651/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000652func hexEncode(omciPkt []byte) ([]byte, error) {
653 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
654 hex.Encode(dst, omciPkt)
655 return dst, nil
656}
Himani Chawla4d908332020-08-31 12:30:20 +0530657*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000658
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000659//supply a response handler for omci response messages to be transferred to the requested FSM
dbainbri4d3a0dc2020-12-02 00:33:42 +0000660func (oo *omciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000661
dbainbri4d3a0dc2020-12-02 00:33:42 +0000662 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000663 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000664
665 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000666 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000667 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200668 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000669 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000670 oo.mutexMonReq.RLock()
671 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
672 oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true
673 } else {
674 logger.Infow(ctx, "reqMon: map entry does not exist!",
675 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
676 }
677 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000678
679 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
680 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000681 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000682 Type: OMCI,
683 Data: OmciMessage{
684 OmciMsg: omciMsg,
685 OmciPacket: packet,
686 },
687 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000688 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000689 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000690
691 return nil
692}
693
Himani Chawla6d2ae152020-09-02 13:11:20 +0530694func (oo *omciCC) sendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000695
dbainbri4d3a0dc2020-12-02 00:33:42 +0000696 logger.Debugw(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000697 request := &omci.MibResetRequest{
698 MeBasePacket: omci.MeBasePacket{
699 EntityClass: me.OnuDataClassID,
700 },
701 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530702 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000703 pkt, err := serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000704 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000705 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000706 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000707 return err
708 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530709 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000710 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000711 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000712 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000713 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000714}
715
Himani Chawla6d2ae152020-09-02 13:11:20 +0530716func (oo *omciCC) sendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000717 logger.Debugw(ctx, "send Reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300718 request := &omci.RebootRequest{
719 MeBasePacket: omci.MeBasePacket{
720 EntityClass: me.OnuGClassID,
721 },
722 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530723 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000724 pkt, err := serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300725 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000726 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000727 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300728 return err
729 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530730 omciRxCallbackPair := callbackPair{
ozgecanetsiae11479f2020-07-06 09:44:47 +0300731 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000732 cbEntry: callbackPairEntry{oo.pOnuDeviceEntry.omciRebootMessageReceivedChannel, oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300733 }
734
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000735 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300736 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000737 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000738 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300739 return err
740 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000741 err = oo.pOnuDeviceEntry.waitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300742 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000743 logger.Errorw(ctx, "aborting ONU Reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200744 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300745 return err
746 }
747 return nil
748}
749
Himani Chawla6d2ae152020-09-02 13:11:20 +0530750func (oo *omciCC) sendMibUpload(ctx context.Context, timeout int, highPrio bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000751 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000752 request := &omci.MibUploadRequest{
753 MeBasePacket: omci.MeBasePacket{
754 EntityClass: me.OnuDataClassID,
755 },
756 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530757 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000758 pkt, err := serialize(ctx, omci.MibUploadRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000759 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000760 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000761 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000762 return err
763 }
764 oo.uploadSequNo = 0
765 oo.uploadNoOfCmds = 0
766
Himani Chawla6d2ae152020-09-02 13:11:20 +0530767 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000768 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000769 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000770 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000771 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000772}
773
Himani Chawla6d2ae152020-09-02 13:11:20 +0530774func (oo *omciCC) sendMibUploadNext(ctx context.Context, timeout int, highPrio bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000775 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "uploadSequNo": oo.uploadSequNo})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000776 request := &omci.MibUploadNextRequest{
777 MeBasePacket: omci.MeBasePacket{
778 EntityClass: me.OnuDataClassID,
779 },
780 CommandSequenceNumber: oo.uploadSequNo,
781 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530782 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000783 pkt, err := serialize(ctx, omci.MibUploadNextRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000784 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000785 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000786 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000787 return err
788 }
789 oo.uploadSequNo++
790
Himani Chawla6d2ae152020-09-02 13:11:20 +0530791 omciRxCallbackPair := callbackPair{
mpagenko80622a52021-02-09 16:53:23 +0000792 cbKey: tid,
793 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
794 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
795 // compare also software upgrade download section handling
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000796 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000797 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000798 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000799}
800
Himani Chawlad3dac422021-03-13 02:31:31 +0530801func (oo *omciCC) sendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool) error {
802 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
803 request := &omci.GetAllAlarmsRequest{
804 MeBasePacket: omci.MeBasePacket{
805 EntityClass: me.OnuDataClassID,
806 },
807 AlarmRetrievalMode: byte(alarmRetreivalMode),
808 }
809 tid := oo.getNextTid(highPrio)
810 pkt, err := serialize(ctx, omci.GetAllAlarmsRequestType, request, tid)
811 if err != nil {
812 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{
813 "Err": err, "device-id": oo.deviceID})
814 return err
815 }
816 oo.pBaseDeviceHandler.pAlarmMgr.alarmUploadSeqNo = 0
817 oo.pBaseDeviceHandler.pAlarmMgr.alarmUploadNoOfCmds = 0
818
819 omciRxCallbackPair := callbackPair{
820 cbKey: tid,
821 cbEntry: callbackPairEntry{(*oo.pBaseDeviceHandler.pAlarmMgr).eventChannel,
822 oo.receiveOmciResponse, true},
823 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000824 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +0530825}
826
827func (oo *omciCC) sendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool) error {
828 alarmUploadSeqNo := oo.pBaseDeviceHandler.pAlarmMgr.alarmUploadSeqNo
829 logger.Debugw(ctx, "send sendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
830 "alarmUploadSeqNo": alarmUploadSeqNo})
831 request := &omci.GetAllAlarmsNextRequest{
832 MeBasePacket: omci.MeBasePacket{
833 EntityClass: me.OnuDataClassID,
834 },
835 CommandSequenceNumber: alarmUploadSeqNo,
836 }
837 tid := oo.getNextTid(highPrio)
838 pkt, err := serialize(ctx, omci.GetAllAlarmsNextRequestType, request, tid)
839 if err != nil {
840 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{
841 "Err": err, "device-id": oo.deviceID})
842 return err
843 }
844 oo.pBaseDeviceHandler.pAlarmMgr.alarmUploadSeqNo++
845
846 omciRxCallbackPair := callbackPair{
847 cbKey: tid,
848 cbEntry: callbackPairEntry{(*oo.pBaseDeviceHandler.pAlarmMgr).eventChannel, oo.receiveOmciResponse, true},
849 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000850 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +0530851}
852
ozgecanetsiab36ed572021-04-01 10:38:48 +0300853func (oo *omciCC) sendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +0530854 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000855 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000856 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000857
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000858 meParams := me.ParamData{
859 EntityID: galEthernetEID,
860 Attributes: me.AttributeValueMap{"MaximumGemPayloadSize": maxGemPayloadSize},
861 }
862 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
863 if omciErr.GetError() == nil {
864 //all setByCreate parameters already set, no default option required ...
865 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
866 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000867 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000868 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300869 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000870 }
871
dbainbri4d3a0dc2020-12-02 00:33:42 +0000872 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000873 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000874 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000875 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300876 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000877 }
878
Himani Chawla6d2ae152020-09-02 13:11:20 +0530879 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000880 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000881 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000882 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000883 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000884 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000885 logger.Errorw(ctx, "Cannot send 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 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000889 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +0300890 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000891 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000892 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000893 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300894 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000895}
896
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000897// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
ozgecanetsiab36ed572021-04-01 10:38:48 +0300898func (oo *omciCC) sendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +0530899 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000900 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000901 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000902
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000903 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
904 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000905 // By now we just use fix values to fire - this is anyway what the python adapter does
906 // read ONU-2G from DB ???? //TODO!!!
907 meParams := me.ParamData{
908 EntityID: 0,
909 Attributes: me.AttributeValueMap{"CurrentConnectivityMode": connectivityModeValue},
910 }
911 meInstance, omciErr := me.NewOnu2G(meParams)
912 if omciErr.GetError() == nil {
913 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
914 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000915 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000916 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300917 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000918 }
919
dbainbri4d3a0dc2020-12-02 00:33:42 +0000920 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000921 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000922 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000923 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300924 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000925 }
926
Himani Chawla6d2ae152020-09-02 13:11:20 +0530927 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000928 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000929 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000930 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000931 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000932 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000933 logger.Errorw(ctx, "Cannot send 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 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000937 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +0300938 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000939 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000940 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000941 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300942 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000943}
944
Himani Chawla6d2ae152020-09-02 13:11:20 +0530945func (oo *omciCC) sendCreateMBServiceProfile(ctx context.Context,
ozgecanetsiab36ed572021-04-01 10:38:48 +0300946 aPUniPort *onuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +0530947 tid := oo.getNextTid(highPrio)
Himani Chawla4d908332020-08-31 12:30:20 +0530948 instID := macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000949 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000950 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000951
952 meParams := me.ParamData{
953 EntityID: instID,
954 Attributes: me.AttributeValueMap{
ozgecanetsiab5000ef2020-11-27 14:38:20 +0300955 "Priority": 0x8000,
956 "MaxAge": 20 * 256, //20s
957 "HelloTime": 2 * 256, //2s
958 "ForwardDelay": 15 * 256, //15s
959 "DynamicFilteringAgeingTime": 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000960 },
961 }
962
963 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
964 if omciErr.GetError() == nil {
965 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
966 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
967 omci.TransactionID(tid), omci.AddDefaults(true))
968 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000969 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000970 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300971 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000972 }
973
dbainbri4d3a0dc2020-12-02 00:33:42 +0000974 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000975 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000976 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000977 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300978 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000979 }
980
Himani Chawla6d2ae152020-09-02 13:11:20 +0530981 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000982 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000983 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000984 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000985 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000986 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000987 logger.Errorw(ctx, "Cannot send 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 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000991 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +0300992 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000993 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000994 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000995 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300996 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000997}
998
Himani Chawla6d2ae152020-09-02 13:11:20 +0530999func (oo *omciCC) sendCreateMBPConfigData(ctx context.Context,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001000 aPUniPort *onuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301001 tid := oo.getNextTid(highPrio)
Himani Chawla26e555c2020-08-31 12:30:20 +05301002 instID := macBridgePortAniEID + aPUniPort.entityID
dbainbri4d3a0dc2020-12-02 00:33:42 +00001003 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001004 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001005
1006 meParams := me.ParamData{
1007 EntityID: instID,
1008 Attributes: me.AttributeValueMap{
Himani Chawla4d908332020-08-31 12:30:20 +05301009 "BridgeIdPointer": macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo),
1010 "PortNum": aPUniPort.macBpNo,
1011 "TpType": uint8(aPUniPort.portType),
Himani Chawla26e555c2020-08-31 12:30:20 +05301012 "TpPointer": aPUniPort.entityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001013 },
1014 }
1015 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1016 if omciErr.GetError() == nil {
1017 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1018 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1019 omci.TransactionID(tid), omci.AddDefaults(true))
1020 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001021 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001022 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001023 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001024 }
1025
dbainbri4d3a0dc2020-12-02 00:33:42 +00001026 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001027 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001028 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001029 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001030 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001031 }
1032
Himani Chawla6d2ae152020-09-02 13:11:20 +05301033 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001034 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001035 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001036 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001037 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001038 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001039 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001040 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001041 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001042 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001043 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001044 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001045 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001046 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001047 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001048 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001049}
1050
Himani Chawla6d2ae152020-09-02 13:11:20 +05301051func (oo *omciCC) sendCreateEVTOConfigData(ctx context.Context,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001052 aPUniPort *onuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301053 tid := oo.getNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001054 //same entityId is used as for MBSP (see there), but just arbitrary ...
Himani Chawla4d908332020-08-31 12:30:20 +05301055 instID := macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001056 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001057 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001058
1059 // compare python adapter code WA VOL-1311: this is not done here!
1060 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1061 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1062 assType := uint8(2) // default AssociationType is PPTPEthUni
Himani Chawla6d2ae152020-09-02 13:11:20 +05301063 if aPUniPort.portType == uniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001064 assType = uint8(10) // for VEIP
1065 }
1066 meParams := me.ParamData{
1067 EntityID: instID,
1068 Attributes: me.AttributeValueMap{
1069 "AssociationType": assType,
Himani Chawla26e555c2020-08-31 12:30:20 +05301070 "AssociatedMePointer": aPUniPort.entityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001071 },
1072 }
1073 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1074 if omciErr.GetError() == nil {
1075 //all setByCreate parameters already set, no default option required ...
1076 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1077 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001078 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001079 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001080 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001081 }
1082
dbainbri4d3a0dc2020-12-02 00:33:42 +00001083 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001084 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001085 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001086 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001087 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001088 }
1089
Himani Chawla6d2ae152020-09-02 13:11:20 +05301090 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001091 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001092 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001093 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001094 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001095 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001096 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001097 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001098 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001099 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001100 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001101 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001102 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001103 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001104 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001105 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001106}
1107
Himani Chawla6d2ae152020-09-02 13:11:20 +05301108func (oo *omciCC) sendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001109 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301110 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001111 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001112 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001113
1114 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1115 meParams := me.ParamData{
1116 EntityID: 0,
1117 Attributes: requestedAttributes,
1118 }
1119 meInstance, omciErr := me.NewOnuG(meParams)
1120 if omciErr.GetError() == nil {
1121 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1122 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001123 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001124 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001125 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001126 }
1127
dbainbri4d3a0dc2020-12-02 00:33:42 +00001128 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001129 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001130 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001131 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001132 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001133 }
1134
Himani Chawla6d2ae152020-09-02 13:11:20 +05301135 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001136 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001137 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001138 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001139 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001140 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001141 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001142 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001143 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001144 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001145 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001146 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001147 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001148 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001149 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001150 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001151}
1152
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001153func (oo *omciCC) sendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001154 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001155 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001156 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001157 "SequNo": strconv.FormatInt(int64(tid), 16)})
1158
1159 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1160 meParams := me.ParamData{
1161 EntityID: aInstNo,
1162 Attributes: requestedAttributes,
1163 }
1164 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1165 if omciErr.GetError() == nil {
1166 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1167 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001168 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001169 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001170 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001171 }
1172
dbainbri4d3a0dc2020-12-02 00:33:42 +00001173 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001174 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001175 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001176 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001177 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001178 }
1179
1180 omciRxCallbackPair := callbackPair{
1181 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001182 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001183 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001184 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001185 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001186 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001187 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001188 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001189 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001190 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001191 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001192 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001193 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001194 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001195 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001196}
1197
1198/* UniG obsolete by now, left here in case it should be needed once again
1199 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301200func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001201 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301202 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001203 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001204 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001205
1206 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1207 meParams := me.ParamData{
1208 EntityID: aInstNo,
1209 Attributes: requestedAttributes,
1210 }
1211 meInstance, omciErr := me.NewUniG(meParams)
1212 if omciErr.GetError() == nil {
1213 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1214 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001215 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001216 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001217 return nil
1218 }
1219
1220 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1221 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001222 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001223 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001224 return nil
1225 }
1226
Himani Chawla6d2ae152020-09-02 13:11:20 +05301227 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001228 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001229 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001230 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001231 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001232 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001233 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001234 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001235 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001236 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001237 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001238 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001239 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001240 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001241 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001242 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001243}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001244*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001245
Himani Chawla6d2ae152020-09-02 13:11:20 +05301246func (oo *omciCC) sendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001247 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301248 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001249 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001250 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001251
1252 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1253 meParams := me.ParamData{
1254 EntityID: aInstNo,
1255 Attributes: requestedAttributes,
1256 }
1257 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1258 if omciErr.GetError() == nil {
1259 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1260 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001261 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001262 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001263 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001264 }
1265
dbainbri4d3a0dc2020-12-02 00:33:42 +00001266 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001267 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001268 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001269 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001270 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001271 }
1272
Himani Chawla6d2ae152020-09-02 13:11:20 +05301273 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001274 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001275 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001276 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001277 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001278 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001279 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001280 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001281 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001282 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001283 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001284 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001285 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001286 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001287 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001288 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001289}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001290
Himani Chawla6d2ae152020-09-02 13:11:20 +05301291func (oo *omciCC) sendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001292 timeout int, highPrio bool, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001293
Himani Chawla6d2ae152020-09-02 13:11:20 +05301294 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001295 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001296 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001297
1298 meParams := me.ParamData{
1299 EntityID: entityID,
1300 Attributes: requestedAttributes,
1301 }
1302 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1303 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301304 meClassIDName := meInstance.GetName()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001305 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.GetRequestType, omci.TransactionID(tid))
1306 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001307 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 +03001308 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001309 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001310 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001311 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001312 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001313 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001314 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301315 omciRxCallbackPair := callbackPair{
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001316 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001317 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001318 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001319 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001320 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001321 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001322 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001323 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001324 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001325 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001326 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001327 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001328 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001329}
1330
Himani Chawla6d2ae152020-09-02 13:11:20 +05301331func (oo *omciCC) sendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001332 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301333 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001334 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001335 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1336
1337 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001338 EntityID: aInstID,
1339 Attributes: me.AttributeValueMap{
1340 //workaround for unsuitable omci-lib default values, cmp VOL-3729
1341 "TpPointer": 0xFFFF,
1342 "InterworkTpPointerForPBitPriority0": 0xFFFF,
1343 "InterworkTpPointerForPBitPriority1": 0xFFFF,
1344 "InterworkTpPointerForPBitPriority2": 0xFFFF,
1345 "InterworkTpPointerForPBitPriority3": 0xFFFF,
1346 "InterworkTpPointerForPBitPriority4": 0xFFFF,
1347 "InterworkTpPointerForPBitPriority5": 0xFFFF,
1348 "InterworkTpPointerForPBitPriority6": 0xFFFF,
1349 "InterworkTpPointerForPBitPriority7": 0xFFFF,
1350 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001351 }
1352 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1353 if omciErr.GetError() == nil {
1354 //we have to set all 'untouched' parameters to default by some additional option parameter!!
1355 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1356 omci.TransactionID(tid), omci.AddDefaults(true))
1357 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001358 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001359 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001360 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001361 }
1362
dbainbri4d3a0dc2020-12-02 00:33:42 +00001363 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001364 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001365 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001366 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001367 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001368 }
1369
Himani Chawla6d2ae152020-09-02 13:11:20 +05301370 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001371 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001372 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001373 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001374 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001375 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001376 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001377 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001378 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001379 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001380 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001381 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001382 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001383 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001384 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001385 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001386}
1387
Himani Chawla6d2ae152020-09-02 13:11:20 +05301388func (oo *omciCC) sendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001389 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301390 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001391 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001392 "SequNo": strconv.FormatInt(int64(tid), 16),
1393 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1394
1395 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1396 if omciErr.GetError() == nil {
1397 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1398 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1399 omci.TransactionID(tid), omci.AddDefaults(true))
1400 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001401 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001402 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001403 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001404 }
1405
dbainbri4d3a0dc2020-12-02 00:33:42 +00001406 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001407 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001408 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001409 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001410 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001411 }
1412
Himani Chawla6d2ae152020-09-02 13:11:20 +05301413 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001414 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001415 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001416 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001417 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001418 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001419 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001420 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001421 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001422 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001423 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001424 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001425 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001426 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001427 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001428 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001429}
1430
Himani Chawla6d2ae152020-09-02 13:11:20 +05301431func (oo *omciCC) sendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001432 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301433 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001434 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001435 "SequNo": strconv.FormatInt(int64(tid), 16),
1436 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1437
1438 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1439 if omciErr.GetError() == nil {
1440 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1441 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1442 omci.TransactionID(tid), omci.AddDefaults(true))
1443 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001444 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001445 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001446 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001447 }
1448
dbainbri4d3a0dc2020-12-02 00:33:42 +00001449 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001450 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001451 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001452 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001453 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001454 }
1455
Himani Chawla6d2ae152020-09-02 13:11:20 +05301456 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001457 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001458 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001459 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001460 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001461 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001462 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001463 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001464 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001465 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001466 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001467 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001468 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001469 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001470 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001471 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001472}
1473
Himani Chawla6d2ae152020-09-02 13:11:20 +05301474func (oo *omciCC) sendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001475 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301476 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001477 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001478 "SequNo": strconv.FormatInt(int64(tid), 16),
1479 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1480
1481 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1482 if omciErr.GetError() == nil {
1483 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
1484 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1485 omci.TransactionID(tid))
1486 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001487 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001488 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001489 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001490 }
1491
dbainbri4d3a0dc2020-12-02 00:33:42 +00001492 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001493 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001494 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001495 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001496 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001497 }
1498
Himani Chawla6d2ae152020-09-02 13:11:20 +05301499 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001500 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001501 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001502 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001503 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001504 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001505 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001506 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001507 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001508 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001509 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001510 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001511 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001512 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001513 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001514 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001515}
1516
Himani Chawla6d2ae152020-09-02 13:11:20 +05301517func (oo *omciCC) sendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001518 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301519 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001520 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001521 "SequNo": strconv.FormatInt(int64(tid), 16),
1522 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1523
1524 meInstance, omciErr := me.NewTCont(params[0])
1525 if omciErr.GetError() == nil {
1526 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1527 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001528 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001529 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001530 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001531 }
1532
dbainbri4d3a0dc2020-12-02 00:33:42 +00001533 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001534 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001535 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001536 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001537 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001538 }
1539
Himani Chawla6d2ae152020-09-02 13:11:20 +05301540 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001541 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001542 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001543 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001544 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001545 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001546 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001547 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001548 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001549 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001550 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001551 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001552 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001553 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001554 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001555 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001556}
1557
Himani Chawla6d2ae152020-09-02 13:11:20 +05301558func (oo *omciCC) sendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001559 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301560 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001561 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001562 "SequNo": strconv.FormatInt(int64(tid), 16),
1563 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1564
1565 meInstance, omciErr := me.NewPriorityQueue(params[0])
1566 if omciErr.GetError() == nil {
1567 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1568 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001569 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001570 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001571 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001572 }
1573
dbainbri4d3a0dc2020-12-02 00:33:42 +00001574 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001575 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001576 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001577 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001578 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001579 }
1580
Himani Chawla6d2ae152020-09-02 13:11:20 +05301581 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001582 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001583 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001584 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001585 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001586 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001587 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001588 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001589 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001590 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001591 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001592 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001593 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001594 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001595 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001596 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001597}
1598
Himani Chawla6d2ae152020-09-02 13:11:20 +05301599func (oo *omciCC) sendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001600 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301601 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001602 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001603 "SequNo": strconv.FormatInt(int64(tid), 16),
1604 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1605
1606 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1607 if omciErr.GetError() == nil {
1608 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1609 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001610 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001611 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001612 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001613 }
1614
dbainbri4d3a0dc2020-12-02 00:33:42 +00001615 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001616 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001617 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001618 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001619 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001620 }
1621
Himani Chawla6d2ae152020-09-02 13:11:20 +05301622 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001623 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001624 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001625 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001626 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001627 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001628 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001629 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001630 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001631 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001632 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001633 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001634 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001635 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001636 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001637 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001638}
mpagenkodff5dda2020-08-28 11:52:01 +00001639
Himani Chawla6d2ae152020-09-02 13:11:20 +05301640func (oo *omciCC) sendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001641 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301642 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001643 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001644 "SequNo": strconv.FormatInt(int64(tid), 16),
1645 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1646
1647 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1648 if omciErr.GetError() == nil {
1649 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
1650 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1651 omci.TransactionID(tid))
1652 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001653 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001654 "Err": err, "device-id": oo.deviceID})
1655 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1656 // return (dual format) error code that can be used at caller for immediate error treatment
1657 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001658 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001659 }
1660
dbainbri4d3a0dc2020-12-02 00:33:42 +00001661 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001662 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001663 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001664 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001665 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001666 }
1667
Himani Chawla6d2ae152020-09-02 13:11:20 +05301668 omciRxCallbackPair := callbackPair{
mpagenkodff5dda2020-08-28 11:52:01 +00001669 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001670 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001671 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001672 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001673 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001674 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001675 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001676 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001677 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001678 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001679 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00001680 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001681 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001682 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001683 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00001684}
1685
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001686// nolint: unused
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001687func (oo *omciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001688 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001689 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001690 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001691 "SequNo": strconv.FormatInt(int64(tid), 16),
1692 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1693
1694 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1695 if omciErr.GetError() == nil {
1696 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType,
1697 omci.TransactionID(tid))
1698 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001699 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001700 "Err": err, "device-id": oo.deviceID})
1701 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1702 // return (dual format) error code that can be used at caller for immediate error treatment
1703 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001704 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001705 }
1706
dbainbri4d3a0dc2020-12-02 00:33:42 +00001707 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001708 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001709 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001710 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001711 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001712 }
1713
1714 omciRxCallbackPair := callbackPair{
1715 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001716 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001717 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001718 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001719 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001720 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001721 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001722 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001723 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001724 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001725 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001726 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001727 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001728 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001729 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001730}
1731
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001732func (oo *omciCC) sendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001733 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001734 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001735 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001736 "SequNo": strconv.FormatInt(int64(tid), 16),
1737 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1738
1739 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1740 if omciErr.GetError() == nil {
1741 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1742 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001743 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001744 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001745 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001746 }
1747
dbainbri4d3a0dc2020-12-02 00:33:42 +00001748 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001749 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001750 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001751 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001752 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001753 }
1754
1755 omciRxCallbackPair := callbackPair{
1756 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001757 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001758 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001759 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001760 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001761 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001762 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001763 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001764 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001765 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001766 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001767 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001768 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001769 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001770 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001771}
1772
Himani Chawla6d2ae152020-09-02 13:11:20 +05301773func (oo *omciCC) sendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001774 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301775 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001776 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001777 "SequNo": strconv.FormatInt(int64(tid), 16),
1778 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1779
1780 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1781 if omciErr.GetError() == nil {
1782 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1783 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001784 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001785 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001786 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001787 }
1788
dbainbri4d3a0dc2020-12-02 00:33:42 +00001789 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001790 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001791 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001792 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001793 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001794 }
1795
Himani Chawla6d2ae152020-09-02 13:11:20 +05301796 omciRxCallbackPair := callbackPair{
mpagenkodff5dda2020-08-28 11:52:01 +00001797 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001798 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001799 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001800 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001801 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001802 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001803 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001804 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001805 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001806 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001807 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00001808 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001809 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001810 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001811 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00001812}
mpagenko01e726e2020-10-23 09:45:29 +00001813
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001814func (oo *omciCC) sendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001815 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001816 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001817 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001818 "SequNo": strconv.FormatInt(int64(tid), 16),
1819 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1820
1821 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1822 if omciErr.GetError() == nil {
1823 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid))
1824 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001825 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001826 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001827 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001828 }
1829
dbainbri4d3a0dc2020-12-02 00:33:42 +00001830 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001831 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001832 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001833 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001834 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001835 }
1836
1837 omciRxCallbackPair := callbackPair{
1838 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001839 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001840 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001841 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001842 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001843 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001844 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001845 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001846 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001847 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001848 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001849 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001850 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001851 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001852 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001853}
1854
mpagenko01e726e2020-10-23 09:45:29 +00001855func (oo *omciCC) sendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001856 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko01e726e2020-10-23 09:45:29 +00001857 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001858 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00001859 "SequNo": strconv.FormatInt(int64(tid), 16),
1860 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1861
1862 meParams := me.ParamData{EntityID: aInstID}
1863 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
1864 if omciErr.GetError() == nil {
1865 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
1866 omci.TransactionID(tid))
1867 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001868 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001869 "Err": err, "device-id": oo.deviceID})
1870 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1871 // return (dual format) error code that can be used at caller for immediate error treatment
1872 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001873 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00001874 }
1875
dbainbri4d3a0dc2020-12-02 00:33:42 +00001876 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00001877 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001878 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001879 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001880 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00001881 }
1882
1883 omciRxCallbackPair := callbackPair{
1884 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001885 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00001886 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001887 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00001888 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001889 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001890 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001891 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00001892 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001893 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001894 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00001895 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001896 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001897 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001898 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00001899}
ozgecanetsia422dbf32020-10-28 14:07:19 +03001900
ozgecanetsiab6441962021-03-10 10:58:48 +03001901// nolint: unused
1902func (oo *omciCC) sendCreateTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001903 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab6441962021-03-10 10:58:48 +03001904 tid := oo.getNextTid(highPrio)
1905 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
1906 "SequNo": strconv.FormatInt(int64(tid), 16),
1907 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1908 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
1909 if omciErr.GetError() == nil {
1910 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1911 if err != nil {
1912 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001913 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03001914 }
1915 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
1916 if err != nil {
1917 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001918 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03001919 }
1920 omciRxCallbackPair := callbackPair{
1921 cbKey: tid,
1922 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1923 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001924 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03001925 if err != nil {
1926 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001927 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03001928 }
1929 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001930 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03001931 }
1932 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001933 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03001934}
1935
1936// nolint: unused
1937func (oo *omciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001938 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab6441962021-03-10 10:58:48 +03001939 tid := oo.getNextTid(highPrio)
1940 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
1941 "SequNo": strconv.FormatInt(int64(tid), 16),
1942 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1943
1944 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
1945 if omciErr.GetError() == nil {
1946 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1947 if err != nil {
1948 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001949 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03001950 }
1951 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
1952 if err != nil {
1953 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001954 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03001955 }
1956 omciRxCallbackPair := callbackPair{
1957 cbKey: tid,
1958 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1959 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001960 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03001961 if err != nil {
1962 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001963 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03001964 }
1965 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001966 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03001967 }
1968 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001969 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03001970
1971}
1972
1973// nolint: unused
1974func (oo *omciCC) sendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001975 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
ozgecanetsiab6441962021-03-10 10:58:48 +03001976 tid := oo.getNextTid(highPrio)
1977 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
1978 "SequNo": strconv.FormatInt(int64(tid), 16),
1979 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1980
1981 meParams := me.ParamData{EntityID: aInstID}
1982 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
1983 if omciErr.GetError() == nil {
1984 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid))
1985 if err != nil {
1986 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001987 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03001988 }
1989 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
1990 if err != nil {
1991 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001992 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03001993 }
1994 omciRxCallbackPair := callbackPair{
1995 cbKey: tid,
1996 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1997 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001998 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03001999 if err != nil {
2000 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002001 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002002 }
2003 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002004 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002005 }
2006 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002007 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002008
2009}
2010
mpagenko8b07c1b2020-11-26 10:36:31 +00002011func (oo *omciCC) sendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002012 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko8b07c1b2020-11-26 10:36:31 +00002013 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002014 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002015 "SequNo": strconv.FormatInt(int64(tid), 16),
2016 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2017
2018 meParams := me.ParamData{EntityID: aInstID}
2019 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2020 if omciErr.GetError() == nil {
2021 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2022 omci.TransactionID(tid))
2023 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002024 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002025 "Err": err, "device-id": oo.deviceID})
2026 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2027 // return (dual format) error code that can be used at caller for immediate error treatment
2028 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002029 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002030 }
2031
dbainbri4d3a0dc2020-12-02 00:33:42 +00002032 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002033 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002034 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002035 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002036 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002037 }
2038
2039 omciRxCallbackPair := callbackPair{
2040 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002041 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002042 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002043 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002044 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002045 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002046 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002047 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002048 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002049 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002050 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002051 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002052 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002053 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002054 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002055}
2056
2057func (oo *omciCC) sendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002058 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko8b07c1b2020-11-26 10:36:31 +00002059 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002060 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002061 "SequNo": strconv.FormatInt(int64(tid), 16),
2062 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2063
2064 meParams := me.ParamData{EntityID: aInstID}
2065 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2066 if omciErr.GetError() == nil {
2067 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2068 omci.TransactionID(tid))
2069 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002070 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002071 "Err": err, "device-id": oo.deviceID})
2072 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2073 // return (dual format) error code that can be used at caller for immediate error treatment
2074 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002075 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002076 }
2077
dbainbri4d3a0dc2020-12-02 00:33:42 +00002078 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002079 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002080 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002081 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002082 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002083 }
2084
2085 omciRxCallbackPair := callbackPair{
2086 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002087 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002088 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002089 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002090 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002091 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002092 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002093 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002094 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002095 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002096 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002097 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002098 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002099 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002100 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002101}
2102
2103func (oo *omciCC) sendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002104 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko8b07c1b2020-11-26 10:36:31 +00002105 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002106 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002107 "SequNo": strconv.FormatInt(int64(tid), 16),
2108 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2109
2110 meParams := me.ParamData{EntityID: aInstID}
2111 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2112 if omciErr.GetError() == nil {
2113 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2114 omci.TransactionID(tid))
2115 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002116 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002117 "Err": err, "device-id": oo.deviceID})
2118 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2119 // return (dual format) error code that can be used at caller for immediate error treatment
2120 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002121 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002122 }
2123
dbainbri4d3a0dc2020-12-02 00:33:42 +00002124 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002125 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002126 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002127 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002128 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002129 }
2130
2131 omciRxCallbackPair := callbackPair{
2132 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002133 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002134 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002135 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002136 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002137 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002138 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002139 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002140 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002141 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002142 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002143 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002144 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002145 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002146 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002147}
2148
2149func (oo *omciCC) sendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002150 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko8b07c1b2020-11-26 10:36:31 +00002151 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002152 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002153 "SequNo": strconv.FormatInt(int64(tid), 16),
2154 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2155
2156 meParams := me.ParamData{EntityID: aInstID}
2157 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2158 if omciErr.GetError() == nil {
2159 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2160 omci.TransactionID(tid))
2161 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002162 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002163 "Err": err, "device-id": oo.deviceID})
2164 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2165 // return (dual format) error code that can be used at caller for immediate error treatment
2166 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002167 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002168 }
2169
dbainbri4d3a0dc2020-12-02 00:33:42 +00002170 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002171 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002172 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002173 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002174 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002175 }
2176
2177 omciRxCallbackPair := callbackPair{
2178 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002179 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002180 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002181 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002182 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002183 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002184 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002185 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002186 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002187 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002188 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002189 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002190 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002191 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002192 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002193}
2194
ozgecanetsia422dbf32020-10-28 14:07:19 +03002195func (oo *omciCC) sendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002196 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsia422dbf32020-10-28 14:07:19 +03002197 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002198 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002199 "SequNo": strconv.FormatInt(int64(tid), 16),
2200 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2201
2202 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2203 if omciErr.GetError() == nil {
2204 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2205 omci.AddDefaults(true))
2206 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002207 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002208 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002209 }
2210
dbainbri4d3a0dc2020-12-02 00:33:42 +00002211 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002212 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002213 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002214 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002215 }
2216
2217 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002218 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002219 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002220 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002221 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002222 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002223 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002224 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002225 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002226 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002227 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002228 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002229 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002230 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002231}
2232
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002233func (oo *omciCC) sendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002234 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002235 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002236 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002237 "SequNo": strconv.FormatInt(int64(tid), 16),
2238 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2239
2240 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2241 if omciErr.GetError() == nil {
2242 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid),
2243 omci.AddDefaults(true))
2244 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002245 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002246 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002247 }
2248
dbainbri4d3a0dc2020-12-02 00:33:42 +00002249 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002250 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002251 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002252 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002253 }
2254
2255 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002256 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002257 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002258 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002259 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002260 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002261 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002262 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002263 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002264 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002265 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002266 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002267 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002268 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002269}
2270
ozgecanetsia422dbf32020-10-28 14:07:19 +03002271func (oo *omciCC) sendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002272 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsia422dbf32020-10-28 14:07:19 +03002273 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002274 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002275 "SequNo": strconv.FormatInt(int64(tid), 16),
2276 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2277
2278 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2279 if omciErr.GetError() == nil {
2280 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2281 omci.AddDefaults(true))
2282 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002283 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002284 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002285 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002286 }
2287
dbainbri4d3a0dc2020-12-02 00:33:42 +00002288 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002289 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002290 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002291 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002292 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002293 }
2294
2295 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002296 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002297 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002298 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002299 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002300 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002301 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002302 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002303 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002304 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002305 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002306 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002307 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002308 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002309 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002310}
2311
2312func (oo *omciCC) sendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002313 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsia422dbf32020-10-28 14:07:19 +03002314 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002315 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002316 "SequNo": strconv.FormatInt(int64(tid), 16),
2317 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2318
2319 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2320 if omciErr.GetError() == nil {
2321 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid),
2322 omci.AddDefaults(true))
2323 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002324 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002325 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002326 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002327 }
2328
dbainbri4d3a0dc2020-12-02 00:33:42 +00002329 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002330 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002331 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002332 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002333 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002334 }
2335
2336 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002337 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002338 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002339 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002340 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002341 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002342 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002343 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002344 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002345 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002346 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002347 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002348 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002349 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002350 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002351}
2352
2353func (oo *omciCC) sendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002354 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsia422dbf32020-10-28 14:07:19 +03002355 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002356 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002357 "SequNo": strconv.FormatInt(int64(tid), 16),
2358 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2359
2360 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2361 if omciErr.GetError() == nil {
2362 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2363 omci.AddDefaults(true))
2364 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002365 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002366 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002367 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002368 }
2369
dbainbri4d3a0dc2020-12-02 00:33:42 +00002370 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002371 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002372 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo 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
2377 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002378 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002379 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002380 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002381 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002382 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002383 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002384 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002385 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002386 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002387 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002388 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002389 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002390 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002391 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002392}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002393
Girish Gowdrae0140f02021-02-02 16:55:09 -08002394func (oo *omciCC) sendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
2395 tid := oo.getNextTid(highPrio)
2396 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
2397 "SequNo": strconv.FormatInt(int64(tid), 16)})
2398
2399 omciLayer := &omci.OMCI{
2400 TransactionID: tid,
2401 MessageType: omci.SynchronizeTimeRequestType,
2402 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2403 // Length: 0x28, // Optional, defaults to 40 octets
2404 }
2405 utcTime := time.Now().UTC()
2406 request := &omci.SynchronizeTimeRequest{
2407 MeBasePacket: omci.MeBasePacket{
2408 EntityClass: me.OnuGClassID,
2409 // Default Instance ID is 0
2410 },
2411 Year: uint16(utcTime.Year()),
2412 Month: uint8(utcTime.Month()),
2413 Day: uint8(utcTime.Day()),
2414 Hour: uint8(utcTime.Hour()),
2415 Minute: uint8(utcTime.Minute()),
2416 Second: uint8(utcTime.Second()),
2417 }
2418
2419 pkt, err := serializeOmciLayer(ctx, omciLayer, request)
2420 if err != nil {
2421 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
2422 "device-id": oo.deviceID})
2423 return err
2424 }
2425
2426 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002427 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002428 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002429 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002430 if err != nil {
2431 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
2432 "device-id": oo.deviceID})
2433 return err
2434 }
2435 logger.Debug(ctx, "send synchronize time request done")
2436 return nil
2437}
2438
2439func (oo *omciCC) sendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002440 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Girish Gowdrae0140f02021-02-02 16:55:09 -08002441 tid := oo.getNextTid(highPrio)
2442 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2443 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
2444 meParam := me.ParamData{EntityID: entityID}
2445 var meInstance *me.ManagedEntity
2446 var omciErr me.OmciErrors
2447 if upstream {
2448 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
2449 } else {
2450 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
2451 }
2452 if omciErr.GetError() == nil {
2453 var omciLayer *omci.OMCI
2454 var msgLayer gopacket.SerializableLayer
2455 var err error
2456 if create {
2457 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2458 omci.AddDefaults(true))
2459 } else {
2460 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2461 omci.AddDefaults(true))
2462 }
2463 if err != nil {
2464 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
2465 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002466 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002467 }
2468
2469 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2470 if err != nil {
2471 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
2472 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002473 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002474 }
2475
2476 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002477 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002478 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002479 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002480 if err != nil {
2481 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
2482 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002483 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002484 }
2485 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
2486 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002487 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08002488 }
2489 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
2490 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 +03002491 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08002492}
2493
2494func (oo *omciCC) sendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002495 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Girish Gowdrae0140f02021-02-02 16:55:09 -08002496 tid := oo.getNextTid(highPrio)
2497 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2498 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2499 meParam := me.ParamData{EntityID: entityID}
2500 var meInstance *me.ManagedEntity
2501 var omciErr me.OmciErrors
2502 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
2503
2504 if omciErr.GetError() == nil {
2505 var omciLayer *omci.OMCI
2506 var msgLayer gopacket.SerializableLayer
2507 var err error
2508 if create {
2509 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2510 omci.AddDefaults(true))
2511 } else {
2512 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2513 omci.AddDefaults(true))
2514 }
2515 if err != nil {
2516 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
2517 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002518 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002519 }
2520
2521 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2522 if err != nil {
2523 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
2524 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002525 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002526 }
2527
2528 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002529 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002530 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002531 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002532 if err != nil {
2533 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
2534 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002535 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002536 }
2537 logger.Debugw(ctx, "send ethernet uni history data ME done",
2538 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002539 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08002540 }
2541 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
2542 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002543 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08002544}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002545
2546func (oo *omciCC) sendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002547 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002548 tid := oo.getNextTid(highPrio)
2549 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2550 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2551 meParam := me.ParamData{EntityID: entityID}
2552 var meInstance *me.ManagedEntity
2553 var omciErr me.OmciErrors
2554 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
2555
2556 if omciErr.GetError() == nil {
2557 var omciLayer *omci.OMCI
2558 var msgLayer gopacket.SerializableLayer
2559 var err error
2560 if create {
2561 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2562 omci.AddDefaults(true))
2563 } else {
2564 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2565 omci.AddDefaults(true))
2566 }
2567 if err != nil {
2568 logger.Errorw(ctx, "Cannot encode fec history data ME",
2569 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002570 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002571 }
2572
2573 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2574 if err != nil {
2575 logger.Errorw(ctx, "Cannot serialize fec history data ME",
2576 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002577 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002578 }
2579
2580 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002581 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002582 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002583 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002584 if err != nil {
2585 logger.Errorw(ctx, "Cannot send fec history data ME",
2586 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002587 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002588 }
2589 logger.Debugw(ctx, "send fec history data ME done",
2590 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002591 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002592 }
2593 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
2594 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002595 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002596}
2597
2598func (oo *omciCC) sendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002599 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002600 tid := oo.getNextTid(highPrio)
2601 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2602 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2603 meParam := me.ParamData{EntityID: entityID}
2604 var meInstance *me.ManagedEntity
2605 var omciErr me.OmciErrors
2606 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
2607
2608 if omciErr.GetError() == nil {
2609 var omciLayer *omci.OMCI
2610 var msgLayer gopacket.SerializableLayer
2611 var err error
2612 if create {
2613 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2614 omci.AddDefaults(true))
2615 } else {
2616 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2617 omci.AddDefaults(true))
2618 }
2619 if err != nil {
2620 logger.Errorw(ctx, "Cannot encode gemport history data ME",
2621 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002622 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002623 }
2624
2625 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2626 if err != nil {
2627 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
2628 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002629 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002630 }
2631
2632 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002633 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002634 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002635 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002636 if err != nil {
2637 logger.Errorw(ctx, "Cannot send gemport history data ME",
2638 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002639 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002640 }
2641 logger.Debugw(ctx, "send gemport history data ME done",
2642 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002643 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002644 }
2645 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
2646 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002647 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002648}
2649
mpagenko80622a52021-02-09 16:53:23 +00002650func (oo *omciCC) sendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
2651 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32) error {
2652 tid := oo.getNextTid(highPrio)
2653 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
2654 "SequNo": strconv.FormatInt(int64(tid), 16),
2655 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2656
2657 omciLayer := &omci.OMCI{
2658 TransactionID: tid,
2659 MessageType: omci.StartSoftwareDownloadRequestType,
2660 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2661 // Length: 0x28, // Optional, defaults to 40 octets
2662 }
2663 request := &omci.StartSoftwareDownloadRequest{
2664 MeBasePacket: omci.MeBasePacket{
2665 EntityClass: me.SoftwareImageClassID,
2666 EntityInstance: aImageMeID, //inactive image
2667 },
2668 WindowSize: aDownloadWindowSize,
2669 ImageSize: aFileLen,
2670 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
2671 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
2672 }
2673
2674 var options gopacket.SerializeOptions
2675 options.FixLengths = true
2676 buffer := gopacket.NewSerializeBuffer()
2677 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2678 if err != nil {
2679 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
2680 "device-id": oo.deviceID})
2681 return err
2682 }
2683 outgoingPacket := buffer.Bytes()
2684
2685 omciRxCallbackPair := callbackPair{cbKey: tid,
2686 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2687 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002688 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00002689 if err != nil {
2690 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
2691 "device-id": oo.deviceID})
2692 return err
2693 }
2694 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002695 return nil
2696}
2697
2698func (oo *omciCC) sendDownloadSection(ctx context.Context, timeout int, highPrio bool,
2699 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool) error {
2700 tid := oo.getNextTid(highPrio)
2701 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
2702 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00002703 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00002704
2705 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
2706 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00002707 msgType := omci.DownloadSectionRequestType
2708 if aAckRequest > 0 {
2709 msgType = omci.DownloadSectionRequestWithResponseType
2710 }
mpagenko80622a52021-02-09 16:53:23 +00002711 omciLayer := &omci.OMCI{
2712 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002713 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00002714 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2715 // Length: 0x28, // Optional, defaults to 40 octets
2716 }
Girish Gowdra8a7b4562021-02-23 16:27:42 -08002717 var localSectionData [31]byte
mpagenko15ff4a52021-03-02 10:09:20 +00002718 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00002719 request := &omci.DownloadSectionRequest{
2720 MeBasePacket: omci.MeBasePacket{
2721 EntityClass: me.SoftwareImageClassID,
2722 EntityInstance: aImageMeID, //inactive image
2723 },
2724 SectionNumber: aDownloadSectionNo,
2725 SectionData: localSectionData,
2726 }
2727
2728 var options gopacket.SerializeOptions
2729 options.FixLengths = true
2730 buffer := gopacket.NewSerializeBuffer()
2731 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2732 if err != nil {
2733 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
2734 "device-id": oo.deviceID})
2735 return err
2736 }
2737 outgoingPacket := buffer.Bytes()
2738
mpagenko15ff4a52021-03-02 10:09:20 +00002739 //for initial debug purpose overrule the requested print state for some frames
2740 printFrame := aPrint
2741 if aAckRequest > 0 || aDownloadSectionNo == 0 {
2742 printFrame = true
2743 }
2744
mpagenko80622a52021-02-09 16:53:23 +00002745 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002746 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00002747 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002748 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00002749 if err != nil {
2750 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
2751 "device-id": oo.deviceID})
2752 return err
2753 }
2754 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002755 return nil
2756}
2757
2758func (oo *omciCC) sendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
2759 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32) error {
2760 tid := oo.getNextTid(highPrio)
2761 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
2762 "SequNo": strconv.FormatInt(int64(tid), 16),
2763 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2764
mpagenko15ff4a52021-03-02 10:09:20 +00002765 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00002766 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002767 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00002768 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2769 // Length: 0x28, // Optional, defaults to 40 octets
2770 }
mpagenko15ff4a52021-03-02 10:09:20 +00002771 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00002772 MeBasePacket: omci.MeBasePacket{
2773 EntityClass: me.SoftwareImageClassID,
2774 EntityInstance: aImageMeID, //inactive image
2775 },
mpagenko15ff4a52021-03-02 10:09:20 +00002776 CRC32: aImageCrc,
2777 ImageSize: aFileLen,
2778 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
2779 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00002780 }
mpagenko15ff4a52021-03-02 10:09:20 +00002781
2782 var options gopacket.SerializeOptions
2783 options.FixLengths = true
2784 buffer := gopacket.NewSerializeBuffer()
2785 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2786 if err != nil {
2787 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00002788 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002789 return err
mpagenko80622a52021-02-09 16:53:23 +00002790 }
mpagenko15ff4a52021-03-02 10:09:20 +00002791 outgoingPacket := buffer.Bytes()
2792
2793 omciRxCallbackPair := callbackPair{cbKey: tid,
2794 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2795 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002796 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00002797 if err != nil {
2798 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
2799 "device-id": oo.deviceID})
2800 return err
2801 }
2802 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002803 return nil
2804}
2805
2806func (oo *omciCC) sendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
2807 rxChan chan Message, aImageMeID uint16) error {
2808 tid := oo.getNextTid(highPrio)
2809 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
2810 "SequNo": strconv.FormatInt(int64(tid), 16),
2811 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2812
2813 omciLayer := &omci.OMCI{
2814 TransactionID: tid,
2815 MessageType: omci.ActivateSoftwareRequestType,
2816 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2817 // Length: 0x28, // Optional, defaults to 40 octets
2818 }
2819 request := &omci.ActivateSoftwareRequest{
2820 MeBasePacket: omci.MeBasePacket{
2821 EntityClass: me.SoftwareImageClassID,
2822 EntityInstance: aImageMeID, //inactive image
2823 },
2824 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
2825 }
2826
2827 var options gopacket.SerializeOptions
2828 options.FixLengths = true
2829 buffer := gopacket.NewSerializeBuffer()
2830 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2831 if err != nil {
2832 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
2833 "device-id": oo.deviceID})
2834 return err
2835 }
2836 outgoingPacket := buffer.Bytes()
2837
2838 omciRxCallbackPair := callbackPair{cbKey: tid,
2839 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2840 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002841 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00002842 if err != nil {
2843 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
2844 "device-id": oo.deviceID})
2845 return err
2846 }
2847 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00002848 return nil
2849}
mpagenko80622a52021-02-09 16:53:23 +00002850
mpagenko15ff4a52021-03-02 10:09:20 +00002851func (oo *omciCC) sendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
2852 rxChan chan Message, aImageMeID uint16) error {
2853 tid := oo.getNextTid(highPrio)
2854 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
2855 "SequNo": strconv.FormatInt(int64(tid), 16),
2856 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2857
2858 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00002859 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002860 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00002861 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2862 // Length: 0x28, // Optional, defaults to 40 octets
2863 }
mpagenko15ff4a52021-03-02 10:09:20 +00002864 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00002865 MeBasePacket: omci.MeBasePacket{
2866 EntityClass: me.SoftwareImageClassID,
2867 EntityInstance: aImageMeID, //inactive image
2868 },
mpagenko80622a52021-02-09 16:53:23 +00002869 }
mpagenko15ff4a52021-03-02 10:09:20 +00002870
2871 var options gopacket.SerializeOptions
2872 options.FixLengths = true
2873 buffer := gopacket.NewSerializeBuffer()
2874 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2875 if err != nil {
2876 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00002877 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002878 return err
mpagenko80622a52021-02-09 16:53:23 +00002879 }
mpagenko15ff4a52021-03-02 10:09:20 +00002880 outgoingPacket := buffer.Bytes()
2881
2882 omciRxCallbackPair := callbackPair{cbKey: tid,
2883 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2884 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002885 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00002886 if err != nil {
2887 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
2888 "device-id": oo.deviceID})
2889 return err
2890 }
2891 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002892 return nil
2893}
2894
Holger Hildebrandt3124e302021-03-23 12:47:03 +00002895func isSuccessfulResponseWithMibDataSync(omciMsg *omci.OMCI, packet *gp.Packet) bool {
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002896 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00002897 if v == omciMsg.MessageType {
2898 nextLayer, _ := omci.MsgTypeToNextLayer(v)
2899 msgLayer := (*packet).Layer(nextLayer)
2900 switch nextLayer {
2901 case omci.LayerTypeCreateResponse:
2902 if msgLayer.(*omci.CreateResponse).Result == me.Success {
2903 return true
2904 }
2905 case omci.LayerTypeDeleteResponse:
2906 if msgLayer.(*omci.DeleteResponse).Result == me.Success {
2907 return true
2908 }
2909 case omci.LayerTypeSetResponse:
2910 if msgLayer.(*omci.SetResponse).Result == me.Success {
2911 return true
2912 }
2913 case omci.LayerTypeStartSoftwareDownloadResponse:
2914 if msgLayer.(*omci.StartSoftwareDownloadResponse).Result == me.Success {
2915 return true
2916 }
2917 case omci.LayerTypeEndSoftwareDownloadResponse:
2918 if msgLayer.(*omci.EndSoftwareDownloadResponse).Result == me.Success {
2919 return true
2920 }
2921 case omci.LayerTypeActivateSoftwareResponse:
2922 if msgLayer.(*omci.ActivateSoftwareResponse).Result == me.Success {
2923 return true
2924 }
2925 case omci.LayerTypeCommitSoftwareResponse:
2926 if msgLayer.(*omci.CommitSoftwareResponse).Result == me.Success {
2927 return true
2928 }
2929 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002930 }
2931 }
2932 return false
2933}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002934
2935func (oo *omciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest omciTransferStructure) {
2936
2937 chSuccess := make(chan bool)
2938 aOmciTxRequest.chSuccess = chSuccess
2939
2940 tid := aOmciTxRequest.cbPair.cbKey
2941 timeout := aOmciTxRequest.timeout
2942 retries := aOmciTxRequest.retries
2943
2944 oo.mutexMonReq.Lock()
2945 oo.monitoredRequests[tid] = aOmciTxRequest
2946 oo.mutexMonReq.Unlock()
2947
2948 retryCounter := 0
2949loop:
2950 for retryCounter <= retries {
2951
2952 oo.mutexTxQueue.Lock()
2953 oo.txQueue.PushBack(aOmciTxRequest) // enqueue
2954 oo.mutexTxQueue.Unlock()
2955
2956 go oo.sendNextRequest(ctx)
2957
2958 select {
2959 case success := <-chSuccess:
2960 if success {
2961 logger.Debugw(ctx, "reqMon: response received in time",
2962 log.Fields{"tid": tid, "device-id": oo.deviceID})
2963 } else {
2964 logger.Debugw(ctx, "reqMon: wait for response aborted",
2965 log.Fields{"tid": tid, "device-id": oo.deviceID})
2966 }
2967 break loop
2968 case <-time.After(time.Duration(timeout) * time.Second):
2969 if retryCounter == retries {
2970 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached!",
2971 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
2972 break loop
2973 } else {
2974 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
2975 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
2976 }
2977 }
2978 retryCounter++
2979 }
2980 oo.mutexMonReq.Lock()
2981 delete(oo.monitoredRequests, tid)
2982 oo.mutexMonReq.Unlock()
2983}
2984
2985//CancelRequestMonitoring terminates monitoring of outstanding omci requests
2986func (oo *omciCC) CancelRequestMonitoring() {
2987 oo.mutexMonReq.RLock()
2988 for k := range oo.monitoredRequests {
2989 oo.monitoredRequests[k].chSuccess <- false
2990 }
2991 oo.mutexMonReq.RUnlock()
2992}
2993
2994//GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
2995//time consumed for retry processing of a particular OMCI-request
2996func (oo *omciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
2997 return time.Duration((cDefaultRetries+1)*oo.pOnuDeviceEntry.pOpenOnuAc.omciTimeout + 1)
2998}