blob: df13717d5b01f3556a93a89cbcd24e5e81730d22 [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"
Girish Gowdra50e56422021-06-01 16:46:04 -070036 "github.com/opencord/voltha-lib-go/v5/pkg/adapters/adapterif"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000037
amit.ghosh58b704b2021-06-18 03:45:52 +020038 "github.com/opencord/voltha-protos/v4/go/common"
Girish Gowdra50e56422021-06-01 16:46:04 -070039 //"github.com/opencord/voltha-lib-go/v5/pkg/kafka"
40 "github.com/opencord/voltha-lib-go/v5/pkg/log"
dbainbri4d3a0dc2020-12-02 00:33:42 +000041 ic "github.com/opencord/voltha-protos/v4/go/inter_container"
42 //"github.com/opencord/voltha-protos/v4/go/openflow_13"
43 //"github.com/opencord/voltha-protos/v4/go/voltha"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000044)
45
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000046// ### OMCI related definitions - retrieved from Python adapter code/trace ####
Himani Chawla6d2ae152020-09-02 13:11:20 +053047
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000048const 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 +000053
mpagenko8b07c1b2020-11-26 10:36:31 +000054const unusedTcontAllocID = uint16(0xFFFF) //common unused AllocId for G.984 and G.987 systems
55
mpagenkoc8bba412021-01-15 15:38:44 +000056const cOmciBaseMessageTrailerLen = 40
57
58// tOmciReceiveError - enum type for detected problems/errors in the received OMCI message (format)
59type tOmciReceiveError uint8
60
61const (
62 // cOmciMessageReceiveNoError - default start state
63 cOmciMessageReceiveNoError tOmciReceiveError = iota
64 // Error indication wrong trailer length within the message
65 cOmciMessageReceiveErrorTrailerLen
66 // Error indication missing trailer within the message
67 cOmciMessageReceiveErrorMissTrailer
68)
69
Holger Hildebrandt366ef192021-05-05 11:07:44 +000070const cDefaultRetries = 2
71
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000072// ### OMCI related definitions - end
73
Himani Chawla6d2ae152020-09-02 13:11:20 +053074//callbackPairEntry to be used for OMCI send/receive correlation
75type callbackPairEntry struct {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000076 cbRespChannel chan Message
dbainbri4d3a0dc2020-12-02 00:33:42 +000077 cbFunction func(context.Context, *omci.OMCI, *gp.Packet, chan Message) error
mpagenko80622a52021-02-09 16:53:23 +000078 framePrint bool //true for printing
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000079}
80
Himani Chawla6d2ae152020-09-02 13:11:20 +053081//callbackPair to be used for ReceiveCallback init
82type callbackPair struct {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000083 cbKey uint16
Himani Chawla6d2ae152020-09-02 13:11:20 +053084 cbEntry callbackPairEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +000085}
86
87type omciTransferStructure struct {
mpagenko80622a52021-02-09 16:53:23 +000088 txFrame []byte
89 timeout int
Holger Hildebrandt366ef192021-05-05 11:07:44 +000090 retries int
mpagenko80622a52021-02-09 16:53:23 +000091 highPrio bool
92 withFramePrint bool
Holger Hildebrandt366ef192021-05-05 11:07:44 +000093 cbPair callbackPair
94 chSuccess chan bool
Holger Hildebrandtfa074992020-03-27 15:42:06 +000095}
96
Himani Chawla6d2ae152020-09-02 13:11:20 +053097//omciCC structure holds information needed for OMCI communication (to/from OLT Adapter)
98type omciCC struct {
Holger Hildebrandtfa074992020-03-27 15:42:06 +000099 enabled bool
100 pOnuDeviceEntry *OnuDeviceEntry
101 deviceID string
Himani Chawla6d2ae152020-09-02 13:11:20 +0530102 pBaseDeviceHandler *deviceHandler
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000103 coreProxy adapterif.CoreProxy
104 adapterProxy adapterif.AdapterProxy
105 supportExtMsg bool
mpagenkoc8bba412021-01-15 15:38:44 +0000106 rxOmciFrameError tOmciReceiveError
107
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000108 txFrames, txOnuFrames uint32
109 rxFrames, rxOnuFrames, rxOnuDiscards uint32
110
111 // OMCI params
112 mutexTid sync.Mutex
113 tid uint16
114 mutexHpTid sync.Mutex
115 hpTid uint16
116 uploadSequNo uint16
117 uploadNoOfCmds uint16
118
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000119 mutexTxQueue sync.Mutex
120 txQueue *list.List
121 mutexRxSchedMap sync.Mutex
122 rxSchedulerMap map[uint16]callbackPairEntry
123 mutexMonReq sync.RWMutex
124 monitoredRequests map[uint16]omciTransferStructure
125 mutexPLastTxMeInstance sync.RWMutex
126 pLastTxMeInstance *me.ManagedEntity
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000127}
128
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000129var responsesWithMibDataSync = []omci.MessageType{
130 omci.CreateResponseType,
131 omci.DeleteResponseType,
132 omci.SetResponseType,
133 omci.StartSoftwareDownloadResponseType,
134 omci.EndSoftwareDownloadResponseType,
135 omci.ActivateSoftwareResponseType,
136 omci.CommitSoftwareResponseType,
137}
138
Himani Chawla6d2ae152020-09-02 13:11:20 +0530139//newOmciCC constructor returns a new instance of a OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000140//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Himani Chawla6d2ae152020-09-02 13:11:20 +0530141func newOmciCC(ctx context.Context, onuDeviceEntry *OnuDeviceEntry,
142 deviceID string, deviceHandler *deviceHandler,
143 coreProxy adapterif.CoreProxy, adapterProxy adapterif.AdapterProxy) *omciCC {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000144 logger.Debugw(ctx, "init-omciCC", log.Fields{"device-id": deviceID})
Himani Chawla6d2ae152020-09-02 13:11:20 +0530145 var omciCC omciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000146 omciCC.enabled = false
Himani Chawla4d908332020-08-31 12:30:20 +0530147 omciCC.pOnuDeviceEntry = onuDeviceEntry
148 omciCC.deviceID = deviceID
149 omciCC.pBaseDeviceHandler = deviceHandler
150 omciCC.coreProxy = coreProxy
151 omciCC.adapterProxy = adapterProxy
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000152 omciCC.supportExtMsg = false
mpagenkoc8bba412021-01-15 15:38:44 +0000153 omciCC.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000154 omciCC.txFrames = 0
155 omciCC.txOnuFrames = 0
156 omciCC.rxFrames = 0
157 omciCC.rxOnuFrames = 0
158 omciCC.rxOnuDiscards = 0
159 omciCC.tid = 0x1
160 omciCC.hpTid = 0x8000
161 omciCC.uploadSequNo = 0
162 omciCC.uploadNoOfCmds = 0
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000163 omciCC.txQueue = list.New()
Himani Chawla6d2ae152020-09-02 13:11:20 +0530164 omciCC.rxSchedulerMap = make(map[uint16]callbackPairEntry)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000165 omciCC.monitoredRequests = make(map[uint16]omciTransferStructure)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000166
167 return &omciCC
168}
169
mpagenko900ee4b2020-10-12 11:56:34 +0000170//stop stops/resets the omciCC
171func (oo *omciCC) stop(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000172 logger.Debugw(ctx, "omciCC-stopping", log.Fields{"device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000173 //reseting all internal data, which might also be helpful for discarding any lingering tx/rx requests
mpagenko8cd1bf72021-06-22 10:11:19 +0000174 oo.CancelRequestMonitoring(ctx)
mpagenko900ee4b2020-10-12 11:56:34 +0000175 oo.mutexTxQueue.Lock()
176 oo.txQueue.Init() // clear the tx queue
177 oo.mutexTxQueue.Unlock()
178 oo.mutexRxSchedMap.Lock()
179 for k := range oo.rxSchedulerMap {
180 delete(oo.rxSchedulerMap, k) //clear the scheduler map
181 }
182 oo.mutexRxSchedMap.Unlock()
183 oo.mutexHpTid.Lock()
184 oo.hpTid = 0x8000 //reset the high prio transactionId
185 oo.mutexHpTid.Unlock()
186 oo.mutexTid.Lock()
187 oo.tid = 1 //reset the low prio transactionId
188 oo.mutexTid.Unlock()
189 //reset control values
190 oo.uploadSequNo = 0
191 oo.uploadNoOfCmds = 0
mpagenkoc8bba412021-01-15 15:38:44 +0000192 oo.rxOmciFrameError = cOmciMessageReceiveNoError
mpagenko900ee4b2020-10-12 11:56:34 +0000193 //reset the stats counter - which might be topic of discussion ...
194 oo.txFrames = 0
195 oo.txOnuFrames = 0
196 oo.rxFrames = 0
197 oo.rxOnuFrames = 0
198 oo.rxOnuDiscards = 0
199
200 return nil
201}
202
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000203// Rx handler for omci messages
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530204func (oo *omciCC) receiveOnuMessage(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000205 logger.Debugw(ctx, "rx-onu-autonomous-message", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000206 "payload": hex.EncodeToString(omciMsg.Payload)})
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530207 switch omciMsg.MessageType {
208 case omci.AlarmNotificationType:
209 data := OmciMessage{
210 OmciMsg: omciMsg,
211 OmciPacket: packet,
212 }
213 go oo.pBaseDeviceHandler.pAlarmMgr.handleOmciAlarmNotificationMessage(ctx, data)
214 return nil
215 default:
216 return fmt.Errorf("receiveOnuMessageType %s unimplemented", omciMsg.MessageType.String())
217 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000218 /*
219 msgType = rxFrame.fields["message_type"] //assumed OmciOperationsValue
220 rxOnuFrames++
221
222 switch msgType {
223 case AlarmNotification:
224 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000225 logger.Info("Unhandled: received-onu-alarm-message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000226 // python code was:
227 //if msg_type == EntityOperations.AlarmNotification.value:
228 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Alarm_Notification)
229 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
230 //
231 return errors.New("RxAlarmNotification unimplemented")
232 }
233 case AttributeValueChange:
234 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000235 logger.Info("Unhandled: received-attribute-value-change")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000236 // python code was:
237 //elif msg_type == EntityOperations.AttributeValueChange.value:
238 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.AVC_Notification)
239 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
240 //
241 return errors.New("RxAttributeValueChange unimplemented")
242 }
243 case TestResult:
244 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000245 logger.Info("Unhandled: received-test-result")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000246 // python code was:
247 //elif msg_type == EntityOperations.TestResult.value:
248 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Test_Result)
249 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
250 //
251 return errors.New("RxTestResult unimplemented")
252 }
253 default:
254 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000255 logger.Errorw(ctx,"rx-onu-unsupported-autonomous-message", log.Fields{"msgType": msgType})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000256 rxOnuDiscards++
257 return errors.New("RxOnuMsgType unimplemented")
258 }
259 }
260 */
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000261}
262
mpagenko80622a52021-02-09 16:53:23 +0000263func (oo *omciCC) printRxMessage(ctx context.Context, rxMsg []byte) {
264 //assuming omci message content is hex coded!
265 // with restricted output of 16bytes would be ...rxMsg[:16]
266 logger.Debugw(ctx, "omci-message-received:", log.Fields{
267 "RxOmciMessage": hex.EncodeToString(rxMsg),
268 "device-id": oo.deviceID})
269}
270
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000271// Rx handler for onu messages
272// e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
Himani Chawla6d2ae152020-09-02 13:11:20 +0530273func (oo *omciCC) receiveMessage(ctx context.Context, rxMsg []byte) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000274 //logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000275 if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
276 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
mpagenkoc8bba412021-01-15 15:38:44 +0000277 // (an extendedFormat message could be destroyed this way!)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000278 trailerLenData := rxMsg[42:44]
279 trailerLen := binary.BigEndian.Uint16(trailerLenData)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000280 //logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
mpagenkoc8bba412021-01-15 15:38:44 +0000281 if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
282 binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
283 if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
284 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
285 logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
286 log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
287 oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
288 }
289 }
290 } else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
291 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
292 // (an extendedFormat message could be destroyed this way!)
293 // extend/overwrite with trailer
294 trailer := make([]byte, 8)
295 binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
296 rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
297 if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
298 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
299 logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
300 log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
301 oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000302 }
303 } else {
mpagenkoc8bba412021-01-15 15:38:44 +0000304 logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
305 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000306 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200307 return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000308 }
309
310 packet := gopacket.NewPacket(rxMsg, omci.LayerTypeOMCI, gopacket.NoCopy)
311 if packet == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000312 logger.Errorw(ctx, "omci-message could not be decoded", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000313 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200314 return fmt.Errorf("could not decode rxMsg as OMCI %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000315 }
316 omciLayer := packet.Layer(omci.LayerTypeOMCI)
317 if omciLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000318 logger.Errorw(ctx, "omci-message could not decode omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000319 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200320 return fmt.Errorf("could not decode omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000321 }
322 omciMsg, ok := omciLayer.(*omci.OMCI)
323 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000324 logger.Errorw(ctx, "omci-message could not assign omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000325 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200326 return fmt.Errorf("could not assign omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000327 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000328 logger.Debugw(ctx, "omci-message-decoded:", log.Fields{"omciMsgType": omciMsg.MessageType,
mpagenko3dbcdd22020-07-22 07:38:45 +0000329 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "DeviceIdent": omciMsg.DeviceIdentifier})
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700330 // TestResult is asynchronous indication that carries the same TID as the TestResponse.
331 // We expect to find the TID in the oo.rxSchedulerMap
332 if byte(omciMsg.MessageType)&me.AK == 0 && omciMsg.MessageType != omci.TestResultType {
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 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000344 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530345 oo.mutexRxSchedMap.Lock()
346 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
347 if ok && rxCallbackEntry.cbFunction != nil {
mpagenko80622a52021-02-09 16:53:23 +0000348 if rxCallbackEntry.framePrint {
349 oo.printRxMessage(ctx, rxMsg)
350 }
Himani Chawla4d908332020-08-31 12:30:20 +0530351 //disadvantage of decoupling: error verification made difficult, but anyway the question is
352 // how to react on erroneous frame reception, maybe can simply be ignored
dbainbri4d3a0dc2020-12-02 00:33:42 +0000353 go rxCallbackEntry.cbFunction(ctx, omciMsg, &packet, rxCallbackEntry.cbRespChannel)
Holger Hildebrandt3124e302021-03-23 12:47:03 +0000354 if isSuccessfulResponseWithMibDataSync(omciMsg, &packet) {
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000355 oo.pOnuDeviceEntry.incrementMibDataSync(ctx)
356 }
mpagenkoc8bba412021-01-15 15:38:44 +0000357
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700358 // If omciMsg.MessageType is omci.TestResponseType, we still expect the TestResult OMCI message,
359 // so do not clean up the TransactionID in that case.
360 if omciMsg.MessageType != omci.TestResponseType {
361 // having posted the response the request is regarded as 'done'
362 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
363 }
Himani Chawla4d908332020-08-31 12:30:20 +0530364 oo.mutexRxSchedMap.Unlock()
mpagenko80622a52021-02-09 16:53:23 +0000365 return nil
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000366 }
mpagenko80622a52021-02-09 16:53:23 +0000367 oo.mutexRxSchedMap.Unlock()
368 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID})
369 oo.printRxMessage(ctx, rxMsg)
370 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000371
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000372 /* py code was:
373 Receive and OMCI message from the proxy channel to the OLT.
374
375 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
376 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
377 """
378 if not self.enabled:
379 return
380
381 try:
382 now = arrow.utcnow()
383 d = None
384
385 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
386 # save the current value of the entity_id_to_class_map, then
387 # replace it with our custom one before decode, and then finally
388 # restore it later. Tried other ways but really made the code messy.
389 saved_me_map = omci_entities.entity_id_to_class_map
390 omci_entities.entity_id_to_class_map = self._me_map
391
392 try:
393 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000394 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000395 except KeyError as e:
396 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000397 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000398 rx_frame = self._decode_unknown_me(msg)
399 self._rx_unknown_me += 1
400
401 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000402 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000403 return
404
405 finally:
406 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
407
408 rx_tid = rx_frame.fields['transaction_id']
409 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000410 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000411 # Filter the Test Result frame and route through receive onu
412 # message method.
413 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000414 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000415 return self._receive_onu_message(rx_frame)
416
417 # Previously unreachable if this is the very first round-trip Rx or we
418 # have been running consecutive errors
419 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000420 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000421 self.reactor.callLater(0, self._publish_connectivity_event, True)
422
423 self._rx_frames += 1
424 self._consecutive_errors = 0
425
426 try:
427 high_priority = self._tid_is_high_priority(rx_tid)
428 index = self._get_priority_index(high_priority)
429
430 # (timestamp, defer, frame, timeout, retry, delayedCall)
431 last_tx_tuple = self._tx_request[index]
432
433 if last_tx_tuple is None or \
434 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
435 # Possible late Rx on a message that timed-out
436 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000437 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000438 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
439 self._rx_unknown_tid += 1
440 self._rx_late += 1
441 return
442
443 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
444 if dc is not None and not dc.cancelled and not dc.called:
445 dc.cancel()
446
447 _secs = self._update_rx_tx_stats(now, ts)
448
449 # Late arrival already serviced by a timeout?
450 if d.called:
451 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000452 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000453 return
454
455 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000456 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000457 if d is not None:
458 return d.errback(failure.Failure(e))
459 return
460
461 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000462 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000463 tx_tid = tx_frame.fields['transaction_id'])
464 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
465
466 # begin success callback chain (will cancel timeout and queue next Tx message)
467 self._rx_response[index] = rx_frame
468 d.callback(rx_frame)
469
470 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000471 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000472 */
473}
474
Himani Chawla6d2ae152020-09-02 13:11:20 +0530475/*
476func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530477 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530478 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000479}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530480*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000481
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700482// ReleaseTid releases OMCI transaction identifier from rxSchedulerMap
483func (oo *omciCC) ReleaseTid(ctx context.Context, tid uint16) {
484 logger.Debugw(ctx, "releasing tid from rxSchedulerMap", log.Fields{"tid": tid})
485 delete(oo.rxSchedulerMap, tid)
486}
487
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000488//Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
Himani Chawla6d2ae152020-09-02 13:11:20 +0530489func (oo *omciCC) send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
490 receiveCallbackPair callbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000491
mpagenkoc26d4c02021-05-06 14:27:57 +0000492 if timeout != 0 {
493 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": receiveCallbackPair.cbKey})
494 oo.mutexRxSchedMap.Lock()
495 // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
496 oo.rxSchedulerMap[receiveCallbackPair.cbKey] = receiveCallbackPair.cbEntry
497 oo.mutexRxSchedMap.Unlock()
498 } //else timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000499
mpagenkoc26d4c02021-05-06 14:27:57 +0000500 printFrame := receiveCallbackPair.cbEntry.framePrint //printFrame true means debug print of frame is requested
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000501 //just use a simple list for starting - might need some more effort, especially for multi source write access
502 omciTxRequest := omciTransferStructure{
503 txFrame,
504 timeout,
505 retry,
506 highPrio,
mpagenko80622a52021-02-09 16:53:23 +0000507 printFrame,
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000508 receiveCallbackPair,
509 nil,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000510 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000511 oo.mutexMonReq.Lock()
512 defer oo.mutexMonReq.Unlock()
513 if _, exist := oo.monitoredRequests[receiveCallbackPair.cbKey]; !exist {
mpagenko7455fd42021-06-10 16:25:55 +0000514 // do not call processRequestMonitoring in background here to ensure correct sequencing
515 // of requested messages into txQueue (especially for non-response-supervised messages)
516 oo.processRequestMonitoring(ctx, omciTxRequest)
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000517 return nil
518 }
519 logger.Errorw(ctx, "A message with this tid is processed already!",
520 log.Fields{"tid": receiveCallbackPair.cbKey, "device-id": oo.deviceID})
521 return fmt.Errorf("message with tid is processed already %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000522}
523
524//Pull next tx request and send it
Himani Chawla6d2ae152020-09-02 13:11:20 +0530525func (oo *omciCC) sendNextRequest(ctx context.Context) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000526 // return errors.New("sendNextRequest unimplemented")
527
528 // just try to get something transferred !!
529 // avoid accessing the txQueue from parallel send requests
530 // block parallel omci send requests at least until SendIAP is 'committed'
531 // that should be feasible for an onu instance as on OMCI anyway window size 1 is assumed
532 oo.mutexTxQueue.Lock()
mpagenkodff5dda2020-08-28 11:52:01 +0000533 defer oo.mutexTxQueue.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000534 for oo.txQueue.Len() > 0 {
535 queueElement := oo.txQueue.Front() // First element
536 omciTxRequest := queueElement.Value.(omciTransferStructure)
537 /* compare olt device handler code:
538 func (dh *DeviceHandler) omciIndication(omciInd *oop.OmciIndication) {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000539 logger.Debugw(ctx,"omci indication", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000540 var deviceType string
541 var deviceID string
542 var proxyDeviceID string
543
544 onuKey := dh.formOnuKey(omciInd.IntfId, omciInd.OnuId)
545
546 if onuInCache, ok := dh.onus.Load(onuKey); !ok {
547
dbainbri4d3a0dc2020-12-02 00:33:42 +0000548 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 +0000549 ponPort := IntfIDToPortNo(omciInd.GetIntfId(), voltha.Port_PON_OLT)
550 kwargs := make(map[string]interface{})
551 kwargs["onu_id"] = omciInd.OnuId
552 kwargs["parent_port_no"] = ponPort
553
dbainbri4d3a0dc2020-12-02 00:33:42 +0000554 onuDevice, err := dh.coreProxy.GetChildDevice(log.WithSpanFromContext(context.TODO(), ctx), dh.device.Id, kwargs)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000555 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000556 logger.Errorw(ctx,"onu not found", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId, "error": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000557 return
558 }
559 deviceType = onuDevice.Type
560 deviceID = onuDevice.Id
561 proxyDeviceID = onuDevice.ProxyAddress.DeviceId
562 //if not exist in cache, then add to cache.
563 dh.onus.Store(onuKey, NewOnuDevice(deviceID, deviceType, onuDevice.SerialNumber, omciInd.OnuId, omciInd.IntfId, proxyDeviceID))
564 } else {
565 //found in cache
dbainbri4d3a0dc2020-12-02 00:33:42 +0000566 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 +0000567 deviceType = onuInCache.(*OnuDevice).deviceType
568 deviceID = onuInCache.(*OnuDevice).deviceID
569 proxyDeviceID = onuInCache.(*OnuDevice).proxyDeviceID
570 }
571 */
572 /* and compare onu_adapter py code:
573 omci_msg = InterAdapterOmciMessage(
574 message=bytes(frame),
575 proxy_address=self._proxy_address,
576 connect_status=self._device.connect_status)
577
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000578 self.logger.debug('sent-omci-msg', tid=tx_tid, omci_msg=hexlify(bytes(frame)))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000579
580 yield self._adapter_proxy.send_inter_adapter_message(
581 msg=omci_msg,
582 type=InterAdapterMessageType.OMCI_REQUEST,
583 from_adapter=self._device.type,
584 to_adapter=self._proxy_address.device_type,
585 to_device_id=self._device_id,
586 proxy_device_id=self._proxy_address.device_id
587 )
588 */
mpagenko80622a52021-02-09 16:53:23 +0000589 if omciTxRequest.withFramePrint {
590 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
591 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
592 "device-id": oo.deviceID,
593 "toDeviceType": oo.pBaseDeviceHandler.ProxyAddressType,
594 "proxyDeviceID": oo.pBaseDeviceHandler.ProxyAddressID})
595 }
amit.ghosh58b704b2021-06-18 03:45:52 +0200596 omciMsg := &ic.InterAdapterOmciMessage{
597 Message: omciTxRequest.txFrame,
598 ProxyAddress: oo.pBaseDeviceHandler.device.ProxyAddress,
599 ConnectStatus: common.ConnectStatus_REACHABLE, // If we are sending OMCI messages means we are connected, else we should not be here
600 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000601 if sendErr := oo.adapterProxy.SendInterAdapterMessage(log.WithSpanFromContext(context.Background(), ctx), omciMsg,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000602 ic.InterAdapterMessageType_OMCI_REQUEST,
Matteo Scandoloefbec272020-11-17 10:33:09 -0800603 //fromTopic,toType,toDevId, ProxyDevId
604 oo.pOnuDeviceEntry.baseDeviceHandler.pOpenOnuAc.config.Topic, oo.pBaseDeviceHandler.ProxyAddressType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000605 oo.deviceID, oo.pBaseDeviceHandler.ProxyAddressID, ""); sendErr != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000606 logger.Errorw(ctx, "send omci request error", log.Fields{"ChildId": oo.deviceID, "error": sendErr})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000607 return sendErr
608 }
609 oo.txQueue.Remove(queueElement) // Dequeue
610 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000611 return nil
612}
613
Himani Chawla6d2ae152020-09-02 13:11:20 +0530614func (oo *omciCC) getNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000615 var next uint16
616 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000617 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000618 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530619 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000620 if oo.hpTid < 0x8000 {
621 oo.hpTid = 0x8000
622 }
mpagenko900ee4b2020-10-12 11:56:34 +0000623 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000624 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000625 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000626 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530627 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000628 if oo.tid >= 0x8000 {
629 oo.tid = 1
630 }
mpagenko900ee4b2020-10-12 11:56:34 +0000631 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000632 }
633 return next
634}
635
636// ###################################################################################
637// # utility methods provided to work on OMCI messages
dbainbri4d3a0dc2020-12-02 00:33:42 +0000638func serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000639 omciLayer := &omci.OMCI{
640 TransactionID: tid,
641 MessageType: msgType,
642 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000643 return serializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000644}
645
dbainbri4d3a0dc2020-12-02 00:33:42 +0000646func serializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000647 var options gopacket.SerializeOptions
648 options.FixLengths = true
649
650 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530651 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000652 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000653 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000654 return nil, err
655 }
656 return buffer.Bytes(), nil
657}
658
Himani Chawla4d908332020-08-31 12:30:20 +0530659/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000660func hexEncode(omciPkt []byte) ([]byte, error) {
661 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
662 hex.Encode(dst, omciPkt)
663 return dst, nil
664}
Himani Chawla4d908332020-08-31 12:30:20 +0530665*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000666
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000667//supply a response handler for omci response messages to be transferred to the requested FSM
dbainbri4d3a0dc2020-12-02 00:33:42 +0000668func (oo *omciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000669
dbainbri4d3a0dc2020-12-02 00:33:42 +0000670 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000671 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000672
673 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000674 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000675 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200676 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000677 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000678 oo.mutexMonReq.RLock()
679 if _, exist := oo.monitoredRequests[omciMsg.TransactionID]; exist {
mpagenko8cd1bf72021-06-22 10:11:19 +0000680 //implement non-blocking channel send to avoid blocking on mutexMonReq later
681 select {
682 case oo.monitoredRequests[omciMsg.TransactionID].chSuccess <- true:
683 default:
684 logger.Debugw(ctx, "response not send on omciRespChannel (no receiver)", log.Fields{
685 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
686 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000687 } else {
688 logger.Infow(ctx, "reqMon: map entry does not exist!",
689 log.Fields{"tid": omciMsg.TransactionID, "device-id": oo.deviceID})
690 }
691 oo.mutexMonReq.RUnlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000692
693 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
694 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000695 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000696 Type: OMCI,
697 Data: OmciMessage{
698 OmciMsg: omciMsg,
699 OmciPacket: packet,
700 },
701 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000702 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000703 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000704
705 return nil
706}
707
Himani Chawla6d2ae152020-09-02 13:11:20 +0530708func (oo *omciCC) sendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000709
dbainbri4d3a0dc2020-12-02 00:33:42 +0000710 logger.Debugw(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000711 request := &omci.MibResetRequest{
712 MeBasePacket: omci.MeBasePacket{
713 EntityClass: me.OnuDataClassID,
714 },
715 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530716 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000717 pkt, err := serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000718 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000719 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000720 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000721 return err
722 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530723 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000724 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000725 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000726 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000727 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000728}
729
Himani Chawla6d2ae152020-09-02 13:11:20 +0530730func (oo *omciCC) sendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000731 logger.Debugw(ctx, "send Reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300732 request := &omci.RebootRequest{
733 MeBasePacket: omci.MeBasePacket{
734 EntityClass: me.OnuGClassID,
735 },
736 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530737 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000738 pkt, err := serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300739 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000740 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000741 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300742 return err
743 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530744 omciRxCallbackPair := callbackPair{
ozgecanetsiae11479f2020-07-06 09:44:47 +0300745 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000746 cbEntry: callbackPairEntry{oo.pOnuDeviceEntry.omciRebootMessageReceivedChannel, oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300747 }
748
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000749 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300750 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000751 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000752 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300753 return err
754 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000755 err = oo.pOnuDeviceEntry.waitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300756 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000757 logger.Errorw(ctx, "aborting ONU Reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200758 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300759 return err
760 }
761 return nil
762}
763
Himani Chawla6d2ae152020-09-02 13:11:20 +0530764func (oo *omciCC) sendMibUpload(ctx context.Context, timeout int, highPrio bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000765 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000766 request := &omci.MibUploadRequest{
767 MeBasePacket: omci.MeBasePacket{
768 EntityClass: me.OnuDataClassID,
769 },
770 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530771 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000772 pkt, err := serialize(ctx, omci.MibUploadRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000773 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000774 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000775 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000776 return err
777 }
778 oo.uploadSequNo = 0
779 oo.uploadNoOfCmds = 0
780
Himani Chawla6d2ae152020-09-02 13:11:20 +0530781 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000782 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000783 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000784 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000785 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000786}
787
Himani Chawla6d2ae152020-09-02 13:11:20 +0530788func (oo *omciCC) sendMibUploadNext(ctx context.Context, timeout int, highPrio bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000789 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "uploadSequNo": oo.uploadSequNo})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000790 request := &omci.MibUploadNextRequest{
791 MeBasePacket: omci.MeBasePacket{
792 EntityClass: me.OnuDataClassID,
793 },
794 CommandSequenceNumber: oo.uploadSequNo,
795 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530796 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000797 pkt, err := serialize(ctx, omci.MibUploadNextRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000798 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000799 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000800 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000801 return err
802 }
803 oo.uploadSequNo++
804
Himani Chawla6d2ae152020-09-02 13:11:20 +0530805 omciRxCallbackPair := callbackPair{
mpagenko80622a52021-02-09 16:53:23 +0000806 cbKey: tid,
807 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
808 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
809 // compare also software upgrade download section handling
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000810 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000811 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000812 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000813}
814
Himani Chawlad3dac422021-03-13 02:31:31 +0530815func (oo *omciCC) sendGetAllAlarm(ctx context.Context, alarmRetreivalMode uint8, timeout int, highPrio bool) error {
816 logger.Debugw(ctx, "send GetAllAlarms-msg to:", log.Fields{"device-id": oo.deviceID})
817 request := &omci.GetAllAlarmsRequest{
818 MeBasePacket: omci.MeBasePacket{
819 EntityClass: me.OnuDataClassID,
820 },
821 AlarmRetrievalMode: byte(alarmRetreivalMode),
822 }
823 tid := oo.getNextTid(highPrio)
824 pkt, err := serialize(ctx, omci.GetAllAlarmsRequestType, request, tid)
825 if err != nil {
826 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsRequest", log.Fields{
827 "Err": err, "device-id": oo.deviceID})
828 return err
829 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000830 oo.pBaseDeviceHandler.pAlarmMgr.ResetAlarmUploadCounters()
Himani Chawlad3dac422021-03-13 02:31:31 +0530831
832 omciRxCallbackPair := callbackPair{
833 cbKey: tid,
834 cbEntry: callbackPairEntry{(*oo.pBaseDeviceHandler.pAlarmMgr).eventChannel,
835 oo.receiveOmciResponse, true},
836 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000837 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +0530838}
839
840func (oo *omciCC) sendGetAllAlarmNext(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000841 alarmUploadSeqNo := oo.pBaseDeviceHandler.pAlarmMgr.GetAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +0530842 logger.Debugw(ctx, "send sendGetAllAlarmNext-msg to:", log.Fields{"device-id": oo.deviceID,
843 "alarmUploadSeqNo": alarmUploadSeqNo})
844 request := &omci.GetAllAlarmsNextRequest{
845 MeBasePacket: omci.MeBasePacket{
846 EntityClass: me.OnuDataClassID,
847 },
848 CommandSequenceNumber: alarmUploadSeqNo,
849 }
850 tid := oo.getNextTid(highPrio)
851 pkt, err := serialize(ctx, omci.GetAllAlarmsNextRequestType, request, tid)
852 if err != nil {
853 logger.Errorw(ctx, "Cannot serialize GetAllAlarmsNextRequest", log.Fields{
854 "Err": err, "device-id": oo.deviceID})
855 return err
856 }
Holger Hildebrandt0da7e6f2021-05-12 13:08:43 +0000857 oo.pBaseDeviceHandler.pAlarmMgr.IncrementAlarmUploadSeqNo()
Himani Chawlad3dac422021-03-13 02:31:31 +0530858
859 omciRxCallbackPair := callbackPair{
860 cbKey: tid,
861 cbEntry: callbackPairEntry{(*oo.pBaseDeviceHandler.pAlarmMgr).eventChannel, oo.receiveOmciResponse, true},
862 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000863 return oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Himani Chawlad3dac422021-03-13 02:31:31 +0530864}
865
ozgecanetsiab36ed572021-04-01 10:38:48 +0300866func (oo *omciCC) sendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +0530867 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000868 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000869 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000870
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000871 meParams := me.ParamData{
872 EntityID: galEthernetEID,
873 Attributes: me.AttributeValueMap{"MaximumGemPayloadSize": maxGemPayloadSize},
874 }
875 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
876 if omciErr.GetError() == nil {
877 //all setByCreate parameters already set, no default option required ...
878 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
879 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000880 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000881 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300882 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000883 }
884
dbainbri4d3a0dc2020-12-02 00:33:42 +0000885 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000886 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000887 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000888 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300889 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000890 }
891
Himani Chawla6d2ae152020-09-02 13:11:20 +0530892 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000893 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000894 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000895 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000896 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000897 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000898 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000899 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300900 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000901 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000902 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +0300903 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000904 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000905 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000906 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300907 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000908}
909
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000910// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
ozgecanetsiab36ed572021-04-01 10:38:48 +0300911func (oo *omciCC) sendSetOnu2g(ctx context.Context, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +0530912 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000913 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000914 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000915
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000916 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
917 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000918 // By now we just use fix values to fire - this is anyway what the python adapter does
919 // read ONU-2G from DB ???? //TODO!!!
920 meParams := me.ParamData{
921 EntityID: 0,
922 Attributes: me.AttributeValueMap{"CurrentConnectivityMode": connectivityModeValue},
923 }
924 meInstance, omciErr := me.NewOnu2G(meParams)
925 if omciErr.GetError() == nil {
926 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
927 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000928 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000929 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300930 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000931 }
932
dbainbri4d3a0dc2020-12-02 00:33:42 +0000933 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000934 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000935 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000936 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300937 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000938 }
939
Himani Chawla6d2ae152020-09-02 13:11:20 +0530940 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000941 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000942 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000943 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000944 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000945 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000946 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000947 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300948 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000949 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000950 logger.Debug(ctx, "send ONU2-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +0300951 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000952 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000953 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000954 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300955 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000956}
957
Himani Chawla6d2ae152020-09-02 13:11:20 +0530958func (oo *omciCC) sendCreateMBServiceProfile(ctx context.Context,
ozgecanetsiab36ed572021-04-01 10:38:48 +0300959 aPUniPort *onuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +0530960 tid := oo.getNextTid(highPrio)
Himani Chawla4d908332020-08-31 12:30:20 +0530961 instID := macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000962 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000963 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000964
965 meParams := me.ParamData{
966 EntityID: instID,
967 Attributes: me.AttributeValueMap{
ozgecanetsiab5000ef2020-11-27 14:38:20 +0300968 "Priority": 0x8000,
969 "MaxAge": 20 * 256, //20s
970 "HelloTime": 2 * 256, //2s
971 "ForwardDelay": 15 * 256, //15s
972 "DynamicFilteringAgeingTime": 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000973 },
974 }
975
976 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
977 if omciErr.GetError() == nil {
978 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
979 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
980 omci.TransactionID(tid), omci.AddDefaults(true))
981 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000982 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000983 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300984 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000985 }
986
dbainbri4d3a0dc2020-12-02 00:33:42 +0000987 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000988 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000989 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000990 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +0300991 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000992 }
993
Himani Chawla6d2ae152020-09-02 13:11:20 +0530994 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000995 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000996 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000997 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +0000998 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000999 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001000 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001001 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001002 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001003 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001004 logger.Debug(ctx, "send MBSP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001005 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001006 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001007 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001008 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001009 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001010}
1011
Mahir Gunyel6781f962021-05-16 23:30:08 -07001012func (oo *omciCC) sendCreateMBPConfigDataUniSide(ctx context.Context,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001013 aPUniPort *onuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301014 tid := oo.getNextTid(highPrio)
Mahir Gunyel6781f962021-05-16 23:30:08 -07001015 instID, idErr := generateUNISideMBPCDEID(uint16(aPUniPort.macBpNo))
1016 if idErr != nil {
1017 logger.Errorw(ctx, "Cannot generate MBPCD entity id", log.Fields{
1018 "Err": idErr, "device-id": oo.deviceID})
1019 return nil, idErr
1020 }
1021 logger.Debugw(ctx, "send MBPCD-Create-msg for uni side:", log.Fields{"device-id": oo.deviceID,
1022 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16), "macBpNo": aPUniPort.macBpNo})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001023
1024 meParams := me.ParamData{
1025 EntityID: instID,
1026 Attributes: me.AttributeValueMap{
Himani Chawla4d908332020-08-31 12:30:20 +05301027 "BridgeIdPointer": macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo),
1028 "PortNum": aPUniPort.macBpNo,
1029 "TpType": uint8(aPUniPort.portType),
Himani Chawla26e555c2020-08-31 12:30:20 +05301030 "TpPointer": aPUniPort.entityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001031 },
1032 }
1033 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1034 if omciErr.GetError() == nil {
1035 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1036 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1037 omci.TransactionID(tid), omci.AddDefaults(true))
1038 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001039 logger.Errorw(ctx, "Cannot encode MBPCD for 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 }
1043
dbainbri4d3a0dc2020-12-02 00:33:42 +00001044 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001045 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001046 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001047 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001048 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001049 }
1050
Himani Chawla6d2ae152020-09-02 13:11:20 +05301051 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001052 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001053 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001054 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001055 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001056 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001057 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001058 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001059 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001060 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001061 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001062 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001063 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001064 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001065 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001066 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001067}
1068
Himani Chawla6d2ae152020-09-02 13:11:20 +05301069func (oo *omciCC) sendCreateEVTOConfigData(ctx context.Context,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001070 aPUniPort *onuUniPort, timeout int, highPrio bool) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301071 tid := oo.getNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001072 //same entityId is used as for MBSP (see there), but just arbitrary ...
Himani Chawla4d908332020-08-31 12:30:20 +05301073 instID := macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001074 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001075 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001076
1077 // compare python adapter code WA VOL-1311: this is not done here!
1078 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
1079 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
1080 assType := uint8(2) // default AssociationType is PPTPEthUni
Himani Chawla6d2ae152020-09-02 13:11:20 +05301081 if aPUniPort.portType == uniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001082 assType = uint8(10) // for VEIP
1083 }
1084 meParams := me.ParamData{
1085 EntityID: instID,
1086 Attributes: me.AttributeValueMap{
1087 "AssociationType": assType,
Himani Chawla26e555c2020-08-31 12:30:20 +05301088 "AssociatedMePointer": aPUniPort.entityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001089 },
1090 }
1091 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1092 if omciErr.GetError() == nil {
1093 //all setByCreate parameters already set, no default option required ...
1094 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1095 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001096 logger.Errorw(ctx, "Cannot encode EVTOCD for 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 }
1100
dbainbri4d3a0dc2020-12-02 00:33:42 +00001101 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001102 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001103 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001104 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001105 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001106 }
1107
Himani Chawla6d2ae152020-09-02 13:11:20 +05301108 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001109 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001110 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001111 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001112 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001113 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001114 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001115 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001116 return nil, err
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001117 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001118 logger.Debug(ctx, "send EVTOCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001119 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001120 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001121 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001122 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001123 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001124}
1125
Himani Chawla6d2ae152020-09-02 13:11:20 +05301126func (oo *omciCC) sendSetOnuGLS(ctx context.Context, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001127 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301128 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001129 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001130 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001131
1132 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1133 meParams := me.ParamData{
1134 EntityID: 0,
1135 Attributes: requestedAttributes,
1136 }
1137 meInstance, omciErr := me.NewOnuG(meParams)
1138 if omciErr.GetError() == nil {
1139 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1140 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001141 logger.Errorw(ctx, "Cannot encode ONU-G instance for 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 }
1145
dbainbri4d3a0dc2020-12-02 00:33:42 +00001146 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001147 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001148 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001149 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001150 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001151 }
1152
Himani Chawla6d2ae152020-09-02 13:11:20 +05301153 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001154 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001155 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001156 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001157 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001158 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001159 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001160 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001161 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001162 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001163 logger.Debug(ctx, "send ONU-G-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001164 return meInstance, nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001165 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001166 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001167 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001168 return nil, omciErr.GetError()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001169}
1170
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001171func (oo *omciCC) sendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001172 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001173 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001174 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001175 "SequNo": strconv.FormatInt(int64(tid), 16)})
1176
1177 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1178 meParams := me.ParamData{
1179 EntityID: aInstNo,
1180 Attributes: requestedAttributes,
1181 }
1182 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1183 if omciErr.GetError() == nil {
1184 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1185 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001186 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for 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 }
1190
dbainbri4d3a0dc2020-12-02 00:33:42 +00001191 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001192 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001193 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001194 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001195 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001196 }
1197
1198 omciRxCallbackPair := callbackPair{
1199 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001200 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001201 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001202 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001203 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001204 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001205 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001206 return nil, err
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001207 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001208 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001209 return meInstance, nil
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001210 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001211 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001212 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001213 return nil, omciErr.GetError()
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001214}
1215
1216/* UniG obsolete by now, left here in case it should be needed once again
1217 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301218func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001219 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301220 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001221 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001222 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001223
1224 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1225 meParams := me.ParamData{
1226 EntityID: aInstNo,
1227 Attributes: requestedAttributes,
1228 }
1229 meInstance, omciErr := me.NewUniG(meParams)
1230 if omciErr.GetError() == nil {
1231 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1232 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001233 logger.Errorw(ctx,"Cannot encode UNI-G instance for 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
1236 }
1237
1238 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1239 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001240 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001241 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001242 return nil
1243 }
1244
Himani Chawla6d2ae152020-09-02 13:11:20 +05301245 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001246 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001247 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001248 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001249 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001250 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001251 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001252 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001253 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001254 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001255 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001256 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001257 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001258 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001259 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001260 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001261}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001262*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001263
Himani Chawla6d2ae152020-09-02 13:11:20 +05301264func (oo *omciCC) sendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001265 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301266 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001267 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001268 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001269
1270 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1271 meParams := me.ParamData{
1272 EntityID: aInstNo,
1273 Attributes: requestedAttributes,
1274 }
1275 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1276 if omciErr.GetError() == nil {
1277 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1278 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001279 logger.Errorw(ctx, "Cannot encode VEIP instance for 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 }
1283
dbainbri4d3a0dc2020-12-02 00:33:42 +00001284 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001285 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001286 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001287 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001288 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001289 }
1290
Himani Chawla6d2ae152020-09-02 13:11:20 +05301291 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001292 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001293 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001294 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001295 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001296 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001297 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001298 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001299 return nil, err
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001300 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001301 logger.Debug(ctx, "send VEIP-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001302 return meInstance, nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001303 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001304 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001305 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001306 return nil, omciErr.GetError()
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001307}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001308
Himani Chawla6d2ae152020-09-02 13:11:20 +05301309func (oo *omciCC) sendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001310 timeout int, highPrio bool, rxChan chan Message) (*me.ManagedEntity, error) {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001311
Himani Chawla6d2ae152020-09-02 13:11:20 +05301312 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001313 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001314 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001315
1316 meParams := me.ParamData{
1317 EntityID: entityID,
1318 Attributes: requestedAttributes,
1319 }
1320 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1321 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301322 meClassIDName := meInstance.GetName()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001323 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.GetRequestType, omci.TransactionID(tid))
1324 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001325 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 +03001326 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001327 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001328 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001329 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001330 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001331 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001332 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301333 omciRxCallbackPair := callbackPair{
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001334 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001335 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001336 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001337 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001338 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001339 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001340 return nil, err
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001341 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001342 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001343 return meInstance, nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001344 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001345 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001346 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001347}
1348
Himani Chawla6d2ae152020-09-02 13:11:20 +05301349func (oo *omciCC) sendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001350 aInstID uint16, rxChan chan Message) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301351 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001352 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001353 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1354
1355 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001356 EntityID: aInstID,
1357 Attributes: me.AttributeValueMap{
1358 //workaround for unsuitable omci-lib default values, cmp VOL-3729
1359 "TpPointer": 0xFFFF,
1360 "InterworkTpPointerForPBitPriority0": 0xFFFF,
1361 "InterworkTpPointerForPBitPriority1": 0xFFFF,
1362 "InterworkTpPointerForPBitPriority2": 0xFFFF,
1363 "InterworkTpPointerForPBitPriority3": 0xFFFF,
1364 "InterworkTpPointerForPBitPriority4": 0xFFFF,
1365 "InterworkTpPointerForPBitPriority5": 0xFFFF,
1366 "InterworkTpPointerForPBitPriority6": 0xFFFF,
1367 "InterworkTpPointerForPBitPriority7": 0xFFFF,
1368 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001369 }
1370 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1371 if omciErr.GetError() == nil {
1372 //we have to set all 'untouched' parameters to default by some additional option parameter!!
1373 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1374 omci.TransactionID(tid), omci.AddDefaults(true))
1375 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001376 logger.Errorw(ctx, "Cannot encode .1pMapper for 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 }
1380
dbainbri4d3a0dc2020-12-02 00:33:42 +00001381 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001382 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001383 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001384 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001385 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001386 }
1387
Himani Chawla6d2ae152020-09-02 13:11:20 +05301388 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001389 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001390 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001391 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001392 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001393 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001394 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001395 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001396 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001397 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001398 logger.Debug(ctx, "send .1pMapper-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001399 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001400 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001401 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001402 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001403 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001404}
1405
Himani Chawla6d2ae152020-09-02 13:11:20 +05301406func (oo *omciCC) sendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001407 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301408 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001409 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001410 "SequNo": strconv.FormatInt(int64(tid), 16),
1411 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1412
1413 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1414 if omciErr.GetError() == nil {
1415 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1416 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1417 omci.TransactionID(tid), omci.AddDefaults(true))
1418 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001419 logger.Errorw(ctx, "Cannot encode MBPCD for 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 }
1423
dbainbri4d3a0dc2020-12-02 00:33:42 +00001424 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001425 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001426 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001427 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001428 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001429 }
1430
Himani Chawla6d2ae152020-09-02 13:11:20 +05301431 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001432 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001433 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001434 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001435 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001436 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001437 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001438 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001439 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001440 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001441 logger.Debug(ctx, "send MBPCD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001442 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001443 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001444 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001445 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001446 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001447}
1448
Himani Chawla6d2ae152020-09-02 13:11:20 +05301449func (oo *omciCC) sendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001450 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301451 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001452 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001453 "SequNo": strconv.FormatInt(int64(tid), 16),
1454 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1455
1456 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1457 if omciErr.GetError() == nil {
1458 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1459 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1460 omci.TransactionID(tid), omci.AddDefaults(true))
1461 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001462 logger.Errorw(ctx, "Cannot encode GemNCTP for 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 }
1466
dbainbri4d3a0dc2020-12-02 00:33:42 +00001467 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001468 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001469 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001470 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001471 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001472 }
1473
Himani Chawla6d2ae152020-09-02 13:11:20 +05301474 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001475 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001476 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001477 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001478 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001479 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001480 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001481 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001482 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001483 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001484 logger.Debug(ctx, "send GemNCTP-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001485 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001486 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001487 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001488 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001489 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001490}
1491
ozgecanetsia82b91a62021-05-21 18:54:49 +03001492func (oo *omciCC) sendSetGemNCTPVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
1493 tid := oo.getNextTid(highPrio)
1494 logger.Debugw(ctx, "send GemNCTP-Set-msg:", log.Fields{"device-id": oo.deviceID,
1495 "SequNo": strconv.FormatInt(int64(tid), 16),
1496 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1497
1498 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1499 if omciErr.GetError() == nil {
1500 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1501 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType,
1502 omci.TransactionID(tid), omci.AddDefaults(true))
1503 if err != nil {
1504 logger.Errorw(ctx, "Cannot encode GemNCTP for set", log.Fields{
1505 "Err": err, "device-id": oo.deviceID})
1506 return nil, err
1507 }
1508
1509 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
1510 if err != nil {
1511 logger.Errorw(ctx, "Cannot serialize GemNCTP set", log.Fields{
1512 "Err": err, "device-id": oo.deviceID})
1513 return nil, err
1514 }
1515
1516 omciRxCallbackPair := callbackPair{
1517 cbKey: tid,
1518 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1519 }
1520 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
1521 if err != nil {
1522 logger.Errorw(ctx, "Cannot send GemNCTP set", log.Fields{
1523 "Err": err, "device-id": oo.deviceID})
1524 return nil, err
1525 }
1526 logger.Debug(ctx, "send GemNCTP-Set-msg done", log.Fields{"device-id": oo.deviceID})
1527 return meInstance, nil
1528 }
1529 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
1530 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1531 return nil, omciErr.GetError()
1532}
1533
Himani Chawla6d2ae152020-09-02 13:11:20 +05301534func (oo *omciCC) sendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001535 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301536 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001537 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001538 "SequNo": strconv.FormatInt(int64(tid), 16),
1539 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1540
1541 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1542 if omciErr.GetError() == nil {
1543 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
1544 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1545 omci.TransactionID(tid))
1546 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001547 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001548 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001549 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001550 }
1551
dbainbri4d3a0dc2020-12-02 00:33:42 +00001552 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001553 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001554 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001555 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001556 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001557 }
1558
Himani Chawla6d2ae152020-09-02 13:11:20 +05301559 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001560 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001561 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001562 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001563 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001564 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001565 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001566 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001567 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001568 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001569 logger.Debug(ctx, "send GemIwTp-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001570 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001571 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001572 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001573 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001574 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001575}
1576
Himani Chawla6d2ae152020-09-02 13:11:20 +05301577func (oo *omciCC) sendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001578 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301579 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001580 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001581 "SequNo": strconv.FormatInt(int64(tid), 16),
1582 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1583
1584 meInstance, omciErr := me.NewTCont(params[0])
1585 if omciErr.GetError() == nil {
1586 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1587 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001588 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001589 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001590 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001591 }
1592
dbainbri4d3a0dc2020-12-02 00:33:42 +00001593 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001594 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001595 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001596 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001597 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001598 }
1599
Himani Chawla6d2ae152020-09-02 13:11:20 +05301600 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001601 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001602 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001603 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001604 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001605 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001606 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001607 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001608 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001609 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001610 logger.Debug(ctx, "send TCont-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001611 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001612 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001613 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001614 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001615 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001616}
1617
Himani Chawla6d2ae152020-09-02 13:11:20 +05301618func (oo *omciCC) sendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001619 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301620 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001621 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001622 "SequNo": strconv.FormatInt(int64(tid), 16),
1623 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1624
1625 meInstance, omciErr := me.NewPriorityQueue(params[0])
1626 if omciErr.GetError() == nil {
1627 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1628 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001629 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001630 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001631 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001632 }
1633
dbainbri4d3a0dc2020-12-02 00:33:42 +00001634 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001635 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001636 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001637 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001638 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001639 }
1640
Himani Chawla6d2ae152020-09-02 13:11:20 +05301641 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001642 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001643 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001644 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001645 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001646 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001647 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001648 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001649 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001650 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001651 logger.Debug(ctx, "send PrioQueue-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001652 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001653 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001654 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001655 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001656 return nil, omciErr.GetError()
mpagenko3dbcdd22020-07-22 07:38:45 +00001657}
1658
Himani Chawla6d2ae152020-09-02 13:11:20 +05301659func (oo *omciCC) sendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001660 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301661 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001662 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001663 "SequNo": strconv.FormatInt(int64(tid), 16),
1664 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1665
1666 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1667 if omciErr.GetError() == nil {
1668 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1669 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001670 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001671 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001672 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001673 }
1674
dbainbri4d3a0dc2020-12-02 00:33:42 +00001675 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001676 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001677 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001678 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001679 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001680 }
1681
Himani Chawla6d2ae152020-09-02 13:11:20 +05301682 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001683 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001684 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001685 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001686 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001687 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001688 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001689 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001690 return nil, err
mpagenko3dbcdd22020-07-22 07:38:45 +00001691 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001692 logger.Debug(ctx, "send 1PMapper-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001693 return meInstance, nil
mpagenko3dbcdd22020-07-22 07:38:45 +00001694 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001695 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001696 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001697 return nil, omciErr.GetError()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001698}
mpagenkodff5dda2020-08-28 11:52:01 +00001699
Himani Chawla6d2ae152020-09-02 13:11:20 +05301700func (oo *omciCC) sendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001701 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301702 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001703 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001704 "SequNo": strconv.FormatInt(int64(tid), 16),
1705 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1706
1707 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1708 if omciErr.GetError() == nil {
1709 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
1710 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1711 omci.TransactionID(tid))
1712 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001713 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001714 "Err": err, "device-id": oo.deviceID})
1715 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1716 // return (dual format) error code that can be used at caller for immediate error treatment
1717 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001718 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001719 }
1720
dbainbri4d3a0dc2020-12-02 00:33:42 +00001721 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001722 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001723 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001724 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001725 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001726 }
1727
Himani Chawla6d2ae152020-09-02 13:11:20 +05301728 omciRxCallbackPair := callbackPair{
mpagenkodff5dda2020-08-28 11:52:01 +00001729 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001730 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001731 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001732 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001733 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001734 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001735 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001736 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001737 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001738 logger.Debug(ctx, "send VTFD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001739 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00001740 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001741 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001742 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001743 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00001744}
1745
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001746// nolint: unused
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001747func (oo *omciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001748 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001749 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001750 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001751 "SequNo": strconv.FormatInt(int64(tid), 16),
1752 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1753
1754 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1755 if omciErr.GetError() == nil {
1756 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType,
1757 omci.TransactionID(tid))
1758 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001759 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001760 "Err": err, "device-id": oo.deviceID})
1761 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1762 // return (dual format) error code that can be used at caller for immediate error treatment
1763 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001764 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001765 }
1766
dbainbri4d3a0dc2020-12-02 00:33:42 +00001767 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001768 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001769 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001770 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001771 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001772 }
1773
1774 omciRxCallbackPair := callbackPair{
1775 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001776 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001777 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001778 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001779 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001780 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001781 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001782 return nil, err
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001783 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001784 logger.Debug(ctx, "send VTFD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001785 return meInstance, nil
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001786 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001787 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001788 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001789 return nil, omciErr.GetError()
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001790}
1791
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001792func (oo *omciCC) sendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001793 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001794 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001795 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001796 "SequNo": strconv.FormatInt(int64(tid), 16),
1797 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1798
1799 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1800 if omciErr.GetError() == nil {
1801 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1802 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001803 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001804 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001805 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001806 }
1807
dbainbri4d3a0dc2020-12-02 00:33:42 +00001808 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001809 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001810 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001811 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001812 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001813 }
1814
1815 omciRxCallbackPair := callbackPair{
1816 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001817 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001818 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001819 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001820 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001821 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001822 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001823 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001824 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001825 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001826 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001827 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001828 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001829 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001830 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001831}
1832
Himani Chawla6d2ae152020-09-02 13:11:20 +05301833func (oo *omciCC) sendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001834 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301835 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001836 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001837 "SequNo": strconv.FormatInt(int64(tid), 16),
1838 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1839
1840 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1841 if omciErr.GetError() == nil {
1842 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1843 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001844 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001845 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001846 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001847 }
1848
dbainbri4d3a0dc2020-12-02 00:33:42 +00001849 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001850 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001851 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001852 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001853 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001854 }
1855
Himani Chawla6d2ae152020-09-02 13:11:20 +05301856 omciRxCallbackPair := callbackPair{
mpagenkodff5dda2020-08-28 11:52:01 +00001857 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001858 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001859 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001860 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001861 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001862 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001863 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001864 return nil, err
mpagenkodff5dda2020-08-28 11:52:01 +00001865 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001866 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001867 return meInstance, nil
mpagenkodff5dda2020-08-28 11:52:01 +00001868 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001869 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001870 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001871 return nil, omciErr.GetError()
mpagenkodff5dda2020-08-28 11:52:01 +00001872}
mpagenko01e726e2020-10-23 09:45:29 +00001873
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001874func (oo *omciCC) sendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001875 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001876 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001877 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001878 "SequNo": strconv.FormatInt(int64(tid), 16),
1879 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1880
1881 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1882 if omciErr.GetError() == nil {
1883 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid))
1884 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001885 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001886 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001887 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001888 }
1889
dbainbri4d3a0dc2020-12-02 00:33:42 +00001890 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001891 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001892 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001893 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001894 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001895 }
1896
1897 omciRxCallbackPair := callbackPair{
1898 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001899 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001900 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001901 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001902 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001903 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001904 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001905 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001906 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001907 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001908 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001909 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001910 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001911 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001912 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001913}
1914
mpagenko01e726e2020-10-23 09:45:29 +00001915func (oo *omciCC) sendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001916 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko01e726e2020-10-23 09:45:29 +00001917 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001918 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00001919 "SequNo": strconv.FormatInt(int64(tid), 16),
1920 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1921
1922 meParams := me.ParamData{EntityID: aInstID}
1923 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
1924 if omciErr.GetError() == nil {
1925 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
1926 omci.TransactionID(tid))
1927 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001928 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001929 "Err": err, "device-id": oo.deviceID})
1930 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1931 // return (dual format) error code that can be used at caller for immediate error treatment
1932 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03001933 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00001934 }
1935
dbainbri4d3a0dc2020-12-02 00:33:42 +00001936 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00001937 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001938 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001939 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001940 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00001941 }
1942
1943 omciRxCallbackPair := callbackPair{
1944 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001945 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00001946 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001947 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko01e726e2020-10-23 09:45:29 +00001948 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001949 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001950 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001951 return nil, err
mpagenko01e726e2020-10-23 09:45:29 +00001952 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001953 logger.Debug(ctx, "send VTFD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001954 return meInstance, nil
mpagenko01e726e2020-10-23 09:45:29 +00001955 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001956 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001957 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001958 return nil, omciErr.GetError()
mpagenko01e726e2020-10-23 09:45:29 +00001959}
ozgecanetsia422dbf32020-10-28 14:07:19 +03001960
ozgecanetsia82b91a62021-05-21 18:54:49 +03001961func (oo *omciCC) sendCreateTDVar(ctx context.Context, timeout int, highPrio bool, rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab6441962021-03-10 10:58:48 +03001962 tid := oo.getNextTid(highPrio)
1963 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
1964 "SequNo": strconv.FormatInt(int64(tid), 16),
1965 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1966 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
1967 if omciErr.GetError() == nil {
1968 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1969 if err != nil {
1970 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001971 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03001972 }
1973 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
1974 if err != nil {
1975 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001976 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03001977 }
1978 omciRxCallbackPair := callbackPair{
1979 cbKey: tid,
1980 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1981 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00001982 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03001983 if err != nil {
1984 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001985 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03001986 }
1987 logger.Debug(ctx, "send TD-Create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03001988 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03001989 }
1990 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03001991 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03001992}
1993
1994// nolint: unused
1995func (oo *omciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03001996 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab6441962021-03-10 10:58:48 +03001997 tid := oo.getNextTid(highPrio)
1998 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
1999 "SequNo": strconv.FormatInt(int64(tid), 16),
2000 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2001
2002 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
2003 if omciErr.GetError() == nil {
2004 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
2005 if err != nil {
2006 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002007 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002008 }
2009 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2010 if err != nil {
2011 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002012 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002013 }
2014 omciRxCallbackPair := callbackPair{
2015 cbKey: tid,
2016 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2017 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002018 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002019 if err != nil {
2020 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002021 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002022 }
2023 logger.Debug(ctx, "send TD-Set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002024 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002025 }
2026 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002027 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002028
2029}
2030
2031// nolint: unused
2032func (oo *omciCC) sendDeleteTD(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002033 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
ozgecanetsiab6441962021-03-10 10:58:48 +03002034 tid := oo.getNextTid(highPrio)
2035 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
2036 "SequNo": strconv.FormatInt(int64(tid), 16),
2037 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2038
2039 meParams := me.ParamData{EntityID: aInstID}
2040 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
2041 if omciErr.GetError() == nil {
2042 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid))
2043 if err != nil {
2044 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002045 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002046 }
2047 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2048 if err != nil {
2049 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002050 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002051 }
2052 omciRxCallbackPair := callbackPair{
2053 cbKey: tid,
2054 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2055 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002056 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab6441962021-03-10 10:58:48 +03002057 if err != nil {
2058 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002059 return nil, err
ozgecanetsiab6441962021-03-10 10:58:48 +03002060 }
2061 logger.Debug(ctx, "send TD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002062 return meInstance, nil
ozgecanetsiab6441962021-03-10 10:58:48 +03002063 }
2064 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002065 return nil, omciErr.GetError()
ozgecanetsiab6441962021-03-10 10:58:48 +03002066
2067}
2068
mpagenko8b07c1b2020-11-26 10:36:31 +00002069func (oo *omciCC) sendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002070 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko8b07c1b2020-11-26 10:36:31 +00002071 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002072 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002073 "SequNo": strconv.FormatInt(int64(tid), 16),
2074 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2075
2076 meParams := me.ParamData{EntityID: aInstID}
2077 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
2078 if omciErr.GetError() == nil {
2079 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2080 omci.TransactionID(tid))
2081 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002082 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002083 "Err": err, "device-id": oo.deviceID})
2084 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2085 // return (dual format) error code that can be used at caller for immediate error treatment
2086 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002087 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002088 }
2089
dbainbri4d3a0dc2020-12-02 00:33:42 +00002090 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002091 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002092 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002093 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002094 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002095 }
2096
2097 omciRxCallbackPair := callbackPair{
2098 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002099 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002100 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002101 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002102 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002103 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002104 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002105 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002106 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002107 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002108 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002109 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002110 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002111 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002112 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002113}
2114
2115func (oo *omciCC) sendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002116 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko8b07c1b2020-11-26 10:36:31 +00002117 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002118 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002119 "SequNo": strconv.FormatInt(int64(tid), 16),
2120 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2121
2122 meParams := me.ParamData{EntityID: aInstID}
2123 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
2124 if omciErr.GetError() == nil {
2125 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2126 omci.TransactionID(tid))
2127 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002128 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002129 "Err": err, "device-id": oo.deviceID})
2130 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2131 // return (dual format) error code that can be used at caller for immediate error treatment
2132 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002133 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002134 }
2135
dbainbri4d3a0dc2020-12-02 00:33:42 +00002136 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002137 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002138 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002139 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002140 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002141 }
2142
2143 omciRxCallbackPair := callbackPair{
2144 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002145 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002146 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002147 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002148 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002149 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002150 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002151 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002152 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002153 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002154 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002155 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002156 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002157 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002158 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002159}
2160
2161func (oo *omciCC) sendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002162 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko8b07c1b2020-11-26 10:36:31 +00002163 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002164 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002165 "SequNo": strconv.FormatInt(int64(tid), 16),
2166 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2167
2168 meParams := me.ParamData{EntityID: aInstID}
2169 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2170 if omciErr.GetError() == nil {
2171 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2172 omci.TransactionID(tid))
2173 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002174 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002175 "Err": err, "device-id": oo.deviceID})
2176 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2177 // return (dual format) error code that can be used at caller for immediate error treatment
2178 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002179 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002180 }
2181
dbainbri4d3a0dc2020-12-02 00:33:42 +00002182 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002183 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002184 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002185 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002186 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002187 }
2188
2189 omciRxCallbackPair := callbackPair{
2190 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002191 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002192 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002193 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002194 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002195 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002196 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002197 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002198 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002199 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002200 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002201 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002202 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002203 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002204 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002205}
2206
2207func (oo *omciCC) sendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002208 rxChan chan Message, aInstID uint16) (*me.ManagedEntity, error) {
mpagenko8b07c1b2020-11-26 10:36:31 +00002209 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002210 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002211 "SequNo": strconv.FormatInt(int64(tid), 16),
2212 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2213
2214 meParams := me.ParamData{EntityID: aInstID}
2215 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2216 if omciErr.GetError() == nil {
2217 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2218 omci.TransactionID(tid))
2219 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002220 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002221 "Err": err, "device-id": oo.deviceID})
2222 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2223 // return (dual format) error code that can be used at caller for immediate error treatment
2224 // (relevant to all used sendXX() methods and their error conditions)
ozgecanetsiab36ed572021-04-01 10:38:48 +03002225 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002226 }
2227
dbainbri4d3a0dc2020-12-02 00:33:42 +00002228 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002229 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002230 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002231 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002232 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002233 }
2234
2235 omciRxCallbackPair := callbackPair{
2236 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002237 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002238 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002239 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko8b07c1b2020-11-26 10:36:31 +00002240 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002241 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002242 "Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002243 return nil, err
mpagenko8b07c1b2020-11-26 10:36:31 +00002244 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002245 logger.Debug(ctx, "send MBPCD-Delete-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002246 return meInstance, nil
mpagenko8b07c1b2020-11-26 10:36:31 +00002247 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002248 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002249 "Err": omciErr.GetError(), "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002250 return nil, omciErr.GetError()
mpagenko8b07c1b2020-11-26 10:36:31 +00002251}
2252
ozgecanetsia422dbf32020-10-28 14:07:19 +03002253func (oo *omciCC) sendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002254 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsia422dbf32020-10-28 14:07:19 +03002255 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002256 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002257 "SequNo": strconv.FormatInt(int64(tid), 16),
2258 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2259
2260 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2261 if omciErr.GetError() == nil {
2262 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2263 omci.AddDefaults(true))
2264 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002265 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002266 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002267 }
2268
dbainbri4d3a0dc2020-12-02 00:33:42 +00002269 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002270 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002271 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002272 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002273 }
2274
2275 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002276 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002277 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002278 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002279 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002280 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002281 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002282 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002283 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002284 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002285 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002286 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002287 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002288 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002289}
2290
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002291func (oo *omciCC) sendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002292 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002293 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002294 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002295 "SequNo": strconv.FormatInt(int64(tid), 16),
2296 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2297
2298 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2299 if omciErr.GetError() == nil {
2300 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid),
2301 omci.AddDefaults(true))
2302 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002303 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002304 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002305 }
2306
dbainbri4d3a0dc2020-12-02 00:33:42 +00002307 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002308 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002309 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002310 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002311 }
2312
2313 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002314 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002315 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002316 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002317 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002318 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002319 return nil, err
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002320 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002321 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002322 return meInstance, nil
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002323 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002324 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002325 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002326 return nil, omciErr.GetError()
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002327}
2328
ozgecanetsia422dbf32020-10-28 14:07:19 +03002329func (oo *omciCC) sendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002330 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsia422dbf32020-10-28 14:07:19 +03002331 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002332 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002333 "SequNo": strconv.FormatInt(int64(tid), 16),
2334 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2335
2336 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2337 if omciErr.GetError() == nil {
2338 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2339 omci.AddDefaults(true))
2340 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002341 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for 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 }
2345
dbainbri4d3a0dc2020-12-02 00:33:42 +00002346 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002347 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002348 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002349 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002350 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002351 }
2352
2353 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002354 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002355 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002356 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002357 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002358 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002359 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002360 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002361 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002362 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002363 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002364 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002365 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002366 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002367 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002368}
2369
2370func (oo *omciCC) sendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002371 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsia422dbf32020-10-28 14:07:19 +03002372 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002373 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002374 "SequNo": strconv.FormatInt(int64(tid), 16),
2375 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2376
2377 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2378 if omciErr.GetError() == nil {
2379 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid),
2380 omci.AddDefaults(true))
2381 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002382 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for 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 }
2386
dbainbri4d3a0dc2020-12-02 00:33:42 +00002387 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002388 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002389 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002390 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002391 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002392 }
2393
2394 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002395 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002396 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002397 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002398 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002399 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002400 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002401 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002402 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002403 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002404 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002405 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002406 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002407 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002408 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002409}
2410
2411func (oo *omciCC) sendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002412 rxChan chan Message, params ...me.ParamData) (*me.ManagedEntity, error) {
ozgecanetsia422dbf32020-10-28 14:07:19 +03002413 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002414 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002415 "SequNo": strconv.FormatInt(int64(tid), 16),
2416 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2417
2418 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2419 if omciErr.GetError() == nil {
2420 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2421 omci.AddDefaults(true))
2422 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002423 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002424 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002425 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002426 }
2427
dbainbri4d3a0dc2020-12-02 00:33:42 +00002428 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002429 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002430 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002431 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002432 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002433 }
2434
2435 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002436 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002437 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002438 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002439 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002440 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002441 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002442 return nil, err
ozgecanetsia422dbf32020-10-28 14:07:19 +03002443 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002444 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsiab36ed572021-04-01 10:38:48 +03002445 return meInstance, nil
ozgecanetsia422dbf32020-10-28 14:07:19 +03002446 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002447 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002448 "device-id": oo.deviceID})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002449 return nil, omciErr.GetError()
ozgecanetsia422dbf32020-10-28 14:07:19 +03002450}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002451
Girish Gowdrae0140f02021-02-02 16:55:09 -08002452func (oo *omciCC) sendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
2453 tid := oo.getNextTid(highPrio)
2454 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
2455 "SequNo": strconv.FormatInt(int64(tid), 16)})
2456
2457 omciLayer := &omci.OMCI{
2458 TransactionID: tid,
2459 MessageType: omci.SynchronizeTimeRequestType,
2460 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2461 // Length: 0x28, // Optional, defaults to 40 octets
2462 }
2463 utcTime := time.Now().UTC()
2464 request := &omci.SynchronizeTimeRequest{
2465 MeBasePacket: omci.MeBasePacket{
2466 EntityClass: me.OnuGClassID,
2467 // Default Instance ID is 0
2468 },
2469 Year: uint16(utcTime.Year()),
2470 Month: uint8(utcTime.Month()),
2471 Day: uint8(utcTime.Day()),
2472 Hour: uint8(utcTime.Hour()),
2473 Minute: uint8(utcTime.Minute()),
2474 Second: uint8(utcTime.Second()),
2475 }
2476
2477 pkt, err := serializeOmciLayer(ctx, omciLayer, request)
2478 if err != nil {
2479 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
2480 "device-id": oo.deviceID})
2481 return err
2482 }
2483
2484 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002485 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002486 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002487 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002488 if err != nil {
2489 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
2490 "device-id": oo.deviceID})
2491 return err
2492 }
2493 logger.Debug(ctx, "send synchronize time request done")
2494 return nil
2495}
2496
2497func (oo *omciCC) sendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002498 upstream bool, create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Girish Gowdrae0140f02021-02-02 16:55:09 -08002499 tid := oo.getNextTid(highPrio)
2500 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2501 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
2502 meParam := me.ParamData{EntityID: entityID}
2503 var meInstance *me.ManagedEntity
2504 var omciErr me.OmciErrors
2505 if upstream {
2506 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
2507 } else {
2508 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
2509 }
2510 if omciErr.GetError() == nil {
2511 var omciLayer *omci.OMCI
2512 var msgLayer gopacket.SerializableLayer
2513 var err error
2514 if create {
2515 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2516 omci.AddDefaults(true))
2517 } else {
2518 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2519 omci.AddDefaults(true))
2520 }
2521 if err != nil {
2522 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
2523 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002524 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002525 }
2526
2527 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2528 if err != nil {
2529 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
2530 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002531 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002532 }
2533
2534 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002535 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002536 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002537 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002538 if err != nil {
2539 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
2540 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002541 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002542 }
2543 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
2544 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002545 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08002546 }
2547 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
2548 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 +03002549 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08002550}
2551
2552func (oo *omciCC) sendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002553 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Girish Gowdrae0140f02021-02-02 16:55:09 -08002554 tid := oo.getNextTid(highPrio)
2555 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2556 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2557 meParam := me.ParamData{EntityID: entityID}
2558 var meInstance *me.ManagedEntity
2559 var omciErr me.OmciErrors
2560 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
2561
2562 if omciErr.GetError() == nil {
2563 var omciLayer *omci.OMCI
2564 var msgLayer gopacket.SerializableLayer
2565 var err error
2566 if create {
2567 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2568 omci.AddDefaults(true))
2569 } else {
2570 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2571 omci.AddDefaults(true))
2572 }
2573 if err != nil {
2574 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
2575 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002576 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002577 }
2578
2579 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2580 if err != nil {
2581 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
2582 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002583 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002584 }
2585
2586 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002587 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002588 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002589 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdrae0140f02021-02-02 16:55:09 -08002590 if err != nil {
2591 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
2592 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002593 return nil, err
Girish Gowdrae0140f02021-02-02 16:55:09 -08002594 }
2595 logger.Debugw(ctx, "send ethernet uni history data ME done",
2596 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002597 return meInstance, nil
Girish Gowdrae0140f02021-02-02 16:55:09 -08002598 }
2599 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
2600 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002601 return nil, omciErr.GetError()
Girish Gowdrae0140f02021-02-02 16:55:09 -08002602}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002603
2604func (oo *omciCC) sendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002605 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002606 tid := oo.getNextTid(highPrio)
2607 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2608 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2609 meParam := me.ParamData{EntityID: entityID}
2610 var meInstance *me.ManagedEntity
2611 var omciErr me.OmciErrors
2612 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
2613
2614 if omciErr.GetError() == nil {
2615 var omciLayer *omci.OMCI
2616 var msgLayer gopacket.SerializableLayer
2617 var err error
2618 if create {
2619 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2620 omci.AddDefaults(true))
2621 } else {
2622 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2623 omci.AddDefaults(true))
2624 }
2625 if err != nil {
2626 logger.Errorw(ctx, "Cannot encode fec history data ME",
2627 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002628 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002629 }
2630
2631 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2632 if err != nil {
2633 logger.Errorw(ctx, "Cannot serialize fec history data ME",
2634 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002635 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002636 }
2637
2638 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002639 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002640 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002641 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002642 if err != nil {
2643 logger.Errorw(ctx, "Cannot send fec history data ME",
2644 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002645 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002646 }
2647 logger.Debugw(ctx, "send fec history data ME done",
2648 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002649 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002650 }
2651 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
2652 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002653 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002654}
2655
2656func (oo *omciCC) sendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
ozgecanetsiab36ed572021-04-01 10:38:48 +03002657 create bool, rxChan chan Message, entityID uint16) (*me.ManagedEntity, error) {
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002658 tid := oo.getNextTid(highPrio)
2659 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2660 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2661 meParam := me.ParamData{EntityID: entityID}
2662 var meInstance *me.ManagedEntity
2663 var omciErr me.OmciErrors
2664 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
2665
2666 if omciErr.GetError() == nil {
2667 var omciLayer *omci.OMCI
2668 var msgLayer gopacket.SerializableLayer
2669 var err error
2670 if create {
2671 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2672 omci.AddDefaults(true))
2673 } else {
2674 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2675 omci.AddDefaults(true))
2676 }
2677 if err != nil {
2678 logger.Errorw(ctx, "Cannot encode gemport history data ME",
2679 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002680 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002681 }
2682
2683 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2684 if err != nil {
2685 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
2686 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002687 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002688 }
2689
2690 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002691 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002692 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002693 err = oo.send(ctx, pkt, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002694 if err != nil {
2695 logger.Errorw(ctx, "Cannot send gemport history data ME",
2696 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002697 return nil, err
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002698 }
2699 logger.Debugw(ctx, "send gemport history data ME done",
2700 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002701 return meInstance, nil
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002702 }
2703 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
2704 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
ozgecanetsiab36ed572021-04-01 10:38:48 +03002705 return nil, omciErr.GetError()
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002706}
2707
mpagenko80622a52021-02-09 16:53:23 +00002708func (oo *omciCC) sendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
2709 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32) error {
2710 tid := oo.getNextTid(highPrio)
2711 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
2712 "SequNo": strconv.FormatInt(int64(tid), 16),
2713 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2714
2715 omciLayer := &omci.OMCI{
2716 TransactionID: tid,
2717 MessageType: omci.StartSoftwareDownloadRequestType,
2718 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2719 // Length: 0x28, // Optional, defaults to 40 octets
2720 }
2721 request := &omci.StartSoftwareDownloadRequest{
2722 MeBasePacket: omci.MeBasePacket{
2723 EntityClass: me.SoftwareImageClassID,
2724 EntityInstance: aImageMeID, //inactive image
2725 },
2726 WindowSize: aDownloadWindowSize,
2727 ImageSize: aFileLen,
2728 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
2729 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
2730 }
2731
2732 var options gopacket.SerializeOptions
2733 options.FixLengths = true
2734 buffer := gopacket.NewSerializeBuffer()
2735 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2736 if err != nil {
2737 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
2738 "device-id": oo.deviceID})
2739 return err
2740 }
2741 outgoingPacket := buffer.Bytes()
2742
2743 omciRxCallbackPair := callbackPair{cbKey: tid,
2744 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2745 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002746 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00002747 if err != nil {
2748 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
2749 "device-id": oo.deviceID})
2750 return err
2751 }
2752 logger.Debug(ctx, "send StartSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002753 return nil
2754}
2755
mpagenkoc26d4c02021-05-06 14:27:57 +00002756func (oo *omciCC) sendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
mpagenko80622a52021-02-09 16:53:23 +00002757 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool) error {
2758 tid := oo.getNextTid(highPrio)
2759 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
2760 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00002761 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00002762
2763 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
2764 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00002765 msgType := omci.DownloadSectionRequestType
mpagenkoc26d4c02021-05-06 14:27:57 +00002766 var timeout int = 0 //default value for no response expected
mpagenko15ff4a52021-03-02 10:09:20 +00002767 if aAckRequest > 0 {
2768 msgType = omci.DownloadSectionRequestWithResponseType
mpagenkoc26d4c02021-05-06 14:27:57 +00002769 timeout = aTimeout
mpagenko15ff4a52021-03-02 10:09:20 +00002770 }
mpagenko80622a52021-02-09 16:53:23 +00002771 omciLayer := &omci.OMCI{
2772 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002773 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00002774 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2775 // Length: 0x28, // Optional, defaults to 40 octets
2776 }
Girish Gowdra8a7b4562021-02-23 16:27:42 -08002777 var localSectionData [31]byte
mpagenko15ff4a52021-03-02 10:09:20 +00002778 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00002779 request := &omci.DownloadSectionRequest{
2780 MeBasePacket: omci.MeBasePacket{
2781 EntityClass: me.SoftwareImageClassID,
2782 EntityInstance: aImageMeID, //inactive image
2783 },
2784 SectionNumber: aDownloadSectionNo,
2785 SectionData: localSectionData,
2786 }
2787
2788 var options gopacket.SerializeOptions
2789 options.FixLengths = true
2790 buffer := gopacket.NewSerializeBuffer()
2791 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2792 if err != nil {
2793 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
2794 "device-id": oo.deviceID})
2795 return err
2796 }
2797 outgoingPacket := buffer.Bytes()
2798
mpagenko15ff4a52021-03-02 10:09:20 +00002799 //for initial debug purpose overrule the requested print state for some frames
2800 printFrame := aPrint
2801 if aAckRequest > 0 || aDownloadSectionNo == 0 {
2802 printFrame = true
2803 }
2804
mpagenko80622a52021-02-09 16:53:23 +00002805 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenkoc26d4c02021-05-06 14:27:57 +00002806 // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
2807 // (used to avoid retransmission of frames with the same TID)
mpagenko15ff4a52021-03-02 10:09:20 +00002808 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00002809 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002810 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00002811 if err != nil {
2812 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
2813 "device-id": oo.deviceID})
2814 return err
2815 }
2816 logger.Debug(ctx, "send DlSectionRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002817 return nil
2818}
2819
2820func (oo *omciCC) sendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
2821 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32) error {
2822 tid := oo.getNextTid(highPrio)
2823 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
2824 "SequNo": strconv.FormatInt(int64(tid), 16),
2825 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2826
mpagenko15ff4a52021-03-02 10:09:20 +00002827 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00002828 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002829 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00002830 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2831 // Length: 0x28, // Optional, defaults to 40 octets
2832 }
mpagenko15ff4a52021-03-02 10:09:20 +00002833 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00002834 MeBasePacket: omci.MeBasePacket{
2835 EntityClass: me.SoftwareImageClassID,
2836 EntityInstance: aImageMeID, //inactive image
2837 },
mpagenko15ff4a52021-03-02 10:09:20 +00002838 CRC32: aImageCrc,
2839 ImageSize: aFileLen,
2840 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
2841 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00002842 }
mpagenko15ff4a52021-03-02 10:09:20 +00002843
2844 var options gopacket.SerializeOptions
2845 options.FixLengths = true
2846 buffer := gopacket.NewSerializeBuffer()
2847 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2848 if err != nil {
2849 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00002850 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002851 return err
mpagenko80622a52021-02-09 16:53:23 +00002852 }
mpagenko15ff4a52021-03-02 10:09:20 +00002853 outgoingPacket := buffer.Bytes()
2854
2855 omciRxCallbackPair := callbackPair{cbKey: tid,
2856 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2857 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002858 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00002859 if err != nil {
2860 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
2861 "device-id": oo.deviceID})
2862 return err
2863 }
2864 logger.Debug(ctx, "send EndSwDlRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002865 return nil
2866}
2867
2868func (oo *omciCC) sendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
2869 rxChan chan Message, aImageMeID uint16) error {
2870 tid := oo.getNextTid(highPrio)
2871 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
2872 "SequNo": strconv.FormatInt(int64(tid), 16),
2873 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2874
2875 omciLayer := &omci.OMCI{
2876 TransactionID: tid,
2877 MessageType: omci.ActivateSoftwareRequestType,
2878 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2879 // Length: 0x28, // Optional, defaults to 40 octets
2880 }
2881 request := &omci.ActivateSoftwareRequest{
2882 MeBasePacket: omci.MeBasePacket{
2883 EntityClass: me.SoftwareImageClassID,
2884 EntityInstance: aImageMeID, //inactive image
2885 },
2886 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
2887 }
2888
2889 var options gopacket.SerializeOptions
2890 options.FixLengths = true
2891 buffer := gopacket.NewSerializeBuffer()
2892 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2893 if err != nil {
2894 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
2895 "device-id": oo.deviceID})
2896 return err
2897 }
2898 outgoingPacket := buffer.Bytes()
2899
2900 omciRxCallbackPair := callbackPair{cbKey: tid,
2901 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2902 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002903 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko80622a52021-02-09 16:53:23 +00002904 if err != nil {
2905 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
2906 "device-id": oo.deviceID})
2907 return err
2908 }
2909 logger.Debug(ctx, "send ActivateSwRequest done")
mpagenko15ff4a52021-03-02 10:09:20 +00002910 return nil
2911}
mpagenko80622a52021-02-09 16:53:23 +00002912
mpagenko15ff4a52021-03-02 10:09:20 +00002913func (oo *omciCC) sendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
2914 rxChan chan Message, aImageMeID uint16) error {
2915 tid := oo.getNextTid(highPrio)
2916 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
2917 "SequNo": strconv.FormatInt(int64(tid), 16),
2918 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2919
2920 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00002921 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002922 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00002923 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2924 // Length: 0x28, // Optional, defaults to 40 octets
2925 }
mpagenko15ff4a52021-03-02 10:09:20 +00002926 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00002927 MeBasePacket: omci.MeBasePacket{
2928 EntityClass: me.SoftwareImageClassID,
2929 EntityInstance: aImageMeID, //inactive image
2930 },
mpagenko80622a52021-02-09 16:53:23 +00002931 }
mpagenko15ff4a52021-03-02 10:09:20 +00002932
2933 var options gopacket.SerializeOptions
2934 options.FixLengths = true
2935 buffer := gopacket.NewSerializeBuffer()
2936 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2937 if err != nil {
2938 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00002939 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002940 return err
mpagenko80622a52021-02-09 16:53:23 +00002941 }
mpagenko15ff4a52021-03-02 10:09:20 +00002942 outgoingPacket := buffer.Bytes()
2943
2944 omciRxCallbackPair := callbackPair{cbKey: tid,
2945 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2946 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00002947 err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
mpagenko15ff4a52021-03-02 10:09:20 +00002948 if err != nil {
2949 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
2950 "device-id": oo.deviceID})
2951 return err
2952 }
2953 logger.Debug(ctx, "send CommitSwRequest done")
mpagenko80622a52021-02-09 16:53:23 +00002954 return nil
2955}
2956
Girish Gowdra6afb56a2021-04-27 17:47:57 -07002957func (oo *omciCC) sendSelfTestReq(ctx context.Context, classID me.ClassID, instdID uint16, timeout int, highPrio bool, rxChan chan Message) error {
2958 tid := oo.getNextTid(highPrio)
2959 logger.Debugw(ctx, "send self test request:", log.Fields{"device-id": oo.deviceID,
2960 "SequNo": strconv.FormatInt(int64(tid), 16),
2961 "InstId": strconv.FormatInt(int64(instdID), 16)})
2962 omciLayer := &omci.OMCI{
2963 TransactionID: tid,
2964 MessageType: omci.TestRequestType,
2965 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2966 // Length: 0x28, // Optional, defaults to 40 octets
2967 }
2968
2969 var request *omci.OpticalLineSupervisionTestRequest
2970 switch classID {
2971 case aniGClassID:
2972 request = &omci.OpticalLineSupervisionTestRequest{
2973 MeBasePacket: omci.MeBasePacket{
2974 EntityClass: classID,
2975 EntityInstance: instdID,
2976 },
2977 SelectTest: uint8(7), // self test
2978 GeneralPurposeBuffer: uint16(0),
2979 VendorSpecificParameters: uint16(0),
2980 }
2981 default:
2982 logger.Errorw(ctx, "unsupported class id for self test request", log.Fields{"device-id": oo.deviceID, "classID": classID})
2983 return fmt.Errorf("unsupported-class-id-for-self-test-request-%v", classID)
2984 }
2985 // Test serialization back to former string
2986 var options gopacket.SerializeOptions
2987 options.FixLengths = true
2988
2989 buffer := gopacket.NewSerializeBuffer()
2990 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2991 if err != nil {
2992 logger.Errorw(ctx, "Cannot serialize self test request", log.Fields{"Err": err,
2993 "device-id": oo.deviceID})
2994 return err
2995 }
2996 outgoingPacket := buffer.Bytes()
2997
2998 omciRxCallbackPair := callbackPair{cbKey: tid,
2999 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
3000 }
3001 err = oo.send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
3002 if err != nil {
3003 logger.Errorw(ctx, "Cannot send self test request", log.Fields{"Err": err,
3004 "device-id": oo.deviceID})
3005 return err
3006 }
3007 logger.Debug(ctx, "send self test request done")
3008 return nil
3009}
3010
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003011//nolint: gocyclo
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003012func isSuccessfulResponseWithMibDataSync(omciMsg *omci.OMCI, packet *gp.Packet) bool {
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00003013 for _, v := range responsesWithMibDataSync {
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003014 if v == omciMsg.MessageType {
Girish Gowdra6afb56a2021-04-27 17:47:57 -07003015 nextLayer, _ := omci.MsgTypeToNextLayer(v, false)
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003016 msgLayer := (*packet).Layer(nextLayer)
3017 switch nextLayer {
3018 case omci.LayerTypeCreateResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003019 if resp := msgLayer.(*omci.CreateResponse); resp != nil {
3020 if resp.Result == me.Success {
3021 return true
3022 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003023 }
3024 case omci.LayerTypeDeleteResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003025 if resp := msgLayer.(*omci.DeleteResponse); resp != nil {
3026 if resp.Result == me.Success {
3027 return true
3028 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003029 }
3030 case omci.LayerTypeSetResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003031 if resp := msgLayer.(*omci.SetResponse); resp != nil {
3032 if resp.Result == me.Success {
3033 return true
3034 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003035 }
3036 case omci.LayerTypeStartSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003037 if resp := msgLayer.(*omci.StartSoftwareDownloadResponse); resp != nil {
3038 if resp.Result == me.Success {
3039 return true
3040 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003041 }
3042 case omci.LayerTypeEndSoftwareDownloadResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003043 if resp := msgLayer.(*omci.EndSoftwareDownloadResponse); resp != nil {
3044 if resp.Result == me.Success {
3045 return true
3046 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003047 }
3048 case omci.LayerTypeActivateSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003049 if resp := msgLayer.(*omci.ActivateSoftwareResponse); resp != nil {
3050 if resp.Result == me.Success {
3051 return true
3052 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003053 }
3054 case omci.LayerTypeCommitSoftwareResponse:
Holger Hildebrandt8680ca32021-05-19 10:30:53 +00003055 if resp := msgLayer.(*omci.CommitSoftwareResponse); resp != nil {
3056 if resp.Result == me.Success {
3057 return true
3058 }
Holger Hildebrandt3124e302021-03-23 12:47:03 +00003059 }
3060 }
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00003061 }
3062 }
3063 return false
3064}
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003065
3066func (oo *omciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest omciTransferStructure) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003067 timeout := aOmciTxRequest.timeout
mpagenkoc26d4c02021-05-06 14:27:57 +00003068 if timeout == 0 {
3069 //timeout 0 indicates that no response is expected - fire and forget
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003070 oo.mutexTxQueue.Lock()
3071 oo.txQueue.PushBack(aOmciTxRequest) // enqueue
3072 oo.mutexTxQueue.Unlock()
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003073 go oo.sendNextRequest(ctx)
mpagenkoc26d4c02021-05-06 14:27:57 +00003074 } else {
mpagenko7455fd42021-06-10 16:25:55 +00003075 //the supervised sending with waiting on the response (based on TID) is called in background
3076 // to avoid blocking of the sender for the complete OMCI handshake procedure
3077 // to stay consistent with the processing tested so far, sending of next messages of the same control procedure
3078 // is ensured by the according control instances (FSM's etc.) (by waiting for the respective responses there)
3079 go oo.sendWithRxSupervision(ctx, aOmciTxRequest, timeout)
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003080 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003081}
3082
mpagenko7455fd42021-06-10 16:25:55 +00003083func (oo *omciCC) sendWithRxSupervision(ctx context.Context, aOmciTxRequest omciTransferStructure, aTimeout int) {
3084 chSuccess := make(chan bool)
3085 aOmciTxRequest.chSuccess = chSuccess
3086 tid := aOmciTxRequest.cbPair.cbKey
3087 oo.mutexMonReq.Lock()
3088 oo.monitoredRequests[tid] = aOmciTxRequest
3089 oo.mutexMonReq.Unlock()
3090
3091 retries := aOmciTxRequest.retries
3092 retryCounter := 0
3093loop:
3094 for retryCounter <= retries {
3095
3096 oo.mutexTxQueue.Lock()
3097 oo.txQueue.PushBack(aOmciTxRequest) // enqueue
3098 oo.mutexTxQueue.Unlock()
3099 go oo.sendNextRequest(ctx)
3100
3101 select {
3102 case success := <-chSuccess:
3103 if success {
3104 logger.Debugw(ctx, "reqMon: response received in time",
3105 log.Fields{"tid": tid, "device-id": oo.deviceID})
3106 } else {
3107 logger.Debugw(ctx, "reqMon: wait for response aborted",
3108 log.Fields{"tid": tid, "device-id": oo.deviceID})
3109 }
3110 break loop
3111 case <-time.After(time.Duration(aTimeout) * time.Second):
3112 if retryCounter == retries {
3113 logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached!",
3114 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
3115 break loop
3116 } else {
3117 logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
3118 log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
3119 }
3120 }
3121 retryCounter++
3122 }
3123 oo.mutexMonReq.Lock()
3124 delete(oo.monitoredRequests, tid)
3125 oo.mutexMonReq.Unlock()
3126}
3127
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003128//CancelRequestMonitoring terminates monitoring of outstanding omci requests
mpagenko8cd1bf72021-06-22 10:11:19 +00003129func (oo *omciCC) CancelRequestMonitoring(ctx context.Context) {
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003130 oo.mutexMonReq.RLock()
3131 for k := range oo.monitoredRequests {
mpagenko8cd1bf72021-06-22 10:11:19 +00003132 //implement non-blocking channel send to avoid blocking on mutexMonReq later
3133 select {
3134 case oo.monitoredRequests[k].chSuccess <- false:
3135 default:
3136 logger.Debugw(ctx, "cancel not send on omciRespChannel (no receiver)", log.Fields{
3137 "index": k, "device-id": oo.deviceID})
3138 }
Holger Hildebrandt366ef192021-05-05 11:07:44 +00003139 }
3140 oo.mutexMonReq.RUnlock()
3141}
3142
3143//GetMaxOmciTimeoutWithRetries provides a timeout value greater than the maximum
3144//time consumed for retry processing of a particular OMCI-request
3145func (oo *omciCC) GetMaxOmciTimeoutWithRetries() time.Duration {
3146 return time.Duration((cDefaultRetries+1)*oo.pOnuDeviceEntry.pOpenOnuAc.omciTimeout + 1)
3147}