blob: 73b4901896fcfe222fdb5d28872a30a252342336 [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"
25 "errors"
Andrea Campanella6515c582020-10-05 11:25:00 +020026 "fmt"
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000027 "strconv"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000028 "sync"
Girish Gowdrae0140f02021-02-02 16:55:09 -080029 "time"
mpagenkodff5dda2020-08-28 11:52:01 +000030
Holger Hildebrandtfa074992020-03-27 15:42:06 +000031 //"time"
32
33 "github.com/google/gopacket"
34 // TODO!!! Some references could be resolved auto, but some need specific context ....
35 gp "github.com/google/gopacket"
36
37 "github.com/opencord/omci-lib-go"
38 me "github.com/opencord/omci-lib-go/generated"
dbainbri4d3a0dc2020-12-02 00:33:42 +000039 "github.com/opencord/voltha-lib-go/v4/pkg/adapters/adapterif"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000040
dbainbri4d3a0dc2020-12-02 00:33:42 +000041 //"github.com/opencord/voltha-lib-go/v4/pkg/kafka"
42 "github.com/opencord/voltha-lib-go/v4/pkg/log"
43 ic "github.com/opencord/voltha-protos/v4/go/inter_container"
44 //"github.com/opencord/voltha-protos/v4/go/openflow_13"
45 //"github.com/opencord/voltha-protos/v4/go/voltha"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000046)
47
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000048// ### OMCI related definitions - retrieved from Python adapter code/trace ####
Himani Chawla6d2ae152020-09-02 13:11:20 +053049
50//ConstDefaultOmciTimeout - Default OMCI Timeout
Holger Hildebrandtfa074992020-03-27 15:42:06 +000051const ConstDefaultOmciTimeout = 10 // ( 3 ?) Seconds
52
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000053const galEthernetEID = uint16(1)
54const maxGemPayloadSize = uint16(48)
55const connectivityModeValue = uint8(5)
Himani Chawla4d908332020-08-31 12:30:20 +053056
57//const defaultTPID = uint16(0x8100)
58//const broadComDefaultVID = uint16(4091)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000059const macBridgeServiceProfileEID = uint16(0x201) // TODO: most all these need better definition or tuning
60const ieeeMapperServiceProfileEID = uint16(0x8001)
61const macBridgePortAniEID = uint16(0x2102)
62
mpagenko8b07c1b2020-11-26 10:36:31 +000063const unusedTcontAllocID = uint16(0xFFFF) //common unused AllocId for G.984 and G.987 systems
64
mpagenkoc8bba412021-01-15 15:38:44 +000065const cOmciBaseMessageTrailerLen = 40
66
67// tOmciReceiveError - enum type for detected problems/errors in the received OMCI message (format)
68type tOmciReceiveError uint8
69
70const (
71 // cOmciMessageReceiveNoError - default start state
72 cOmciMessageReceiveNoError tOmciReceiveError = iota
73 // Error indication wrong trailer length within the message
74 cOmciMessageReceiveErrorTrailerLen
75 // Error indication missing trailer within the message
76 cOmciMessageReceiveErrorMissTrailer
77)
78
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000079// ### OMCI related definitions - end
80
Himani Chawla6d2ae152020-09-02 13:11:20 +053081//callbackPairEntry to be used for OMCI send/receive correlation
82type callbackPairEntry struct {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000083 cbRespChannel chan Message
dbainbri4d3a0dc2020-12-02 00:33:42 +000084 cbFunction func(context.Context, *omci.OMCI, *gp.Packet, chan Message) error
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000085}
86
Himani Chawla6d2ae152020-09-02 13:11:20 +053087//callbackPair to be used for ReceiveCallback init
88type callbackPair struct {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000089 cbKey uint16
Himani Chawla6d2ae152020-09-02 13:11:20 +053090 cbEntry callbackPairEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +000091}
92
93type omciTransferStructure struct {
94 txFrame []byte
95 timeout int
96 retry int
97 highPrio bool
98}
99
Himani Chawla6d2ae152020-09-02 13:11:20 +0530100//omciCC structure holds information needed for OMCI communication (to/from OLT Adapter)
101type omciCC struct {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000102 enabled bool
103 pOnuDeviceEntry *OnuDeviceEntry
104 deviceID string
Himani Chawla6d2ae152020-09-02 13:11:20 +0530105 pBaseDeviceHandler *deviceHandler
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000106 coreProxy adapterif.CoreProxy
107 adapterProxy adapterif.AdapterProxy
108 supportExtMsg bool
mpagenkoc8bba412021-01-15 15:38:44 +0000109 rxOmciFrameError tOmciReceiveError
110
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000111 txFrames, txOnuFrames uint32
112 rxFrames, rxOnuFrames, rxOnuDiscards uint32
113
114 // OMCI params
115 mutexTid sync.Mutex
116 tid uint16
117 mutexHpTid sync.Mutex
118 hpTid uint16
119 uploadSequNo uint16
120 uploadNoOfCmds uint16
121
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000122 mutexTxQueue sync.Mutex
123 txQueue *list.List
124 mutexRxSchedMap sync.Mutex
Himani Chawla6d2ae152020-09-02 13:11:20 +0530125 rxSchedulerMap map[uint16]callbackPairEntry
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000126 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
163
164 omciCC.txQueue = list.New()
Himani Chawla6d2ae152020-09-02 13:11:20 +0530165 omciCC.rxSchedulerMap = make(map[uint16]callbackPairEntry)
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
174 oo.mutexTxQueue.Lock()
175 oo.txQueue.Init() // clear the tx queue
176 oo.mutexTxQueue.Unlock()
177 oo.mutexRxSchedMap.Lock()
178 for k := range oo.rxSchedulerMap {
179 delete(oo.rxSchedulerMap, k) //clear the scheduler map
180 }
181 oo.mutexRxSchedMap.Unlock()
182 oo.mutexHpTid.Lock()
183 oo.hpTid = 0x8000 //reset the high prio transactionId
184 oo.mutexHpTid.Unlock()
185 oo.mutexTid.Lock()
186 oo.tid = 1 //reset the low prio transactionId
187 oo.mutexTid.Unlock()
188 //reset control values
189 oo.uploadSequNo = 0
190 oo.uploadNoOfCmds = 0
mpagenkoc8bba412021-01-15 15:38:44 +0000191 oo.rxOmciFrameError = cOmciMessageReceiveNoError
mpagenko900ee4b2020-10-12 11:56:34 +0000192 //reset the stats counter - which might be topic of discussion ...
193 oo.txFrames = 0
194 oo.txOnuFrames = 0
195 oo.rxFrames = 0
196 oo.rxOnuFrames = 0
197 oo.rxOnuDiscards = 0
198
199 return nil
200}
201
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000202// Rx handler for omci messages
Himani Chawla6d2ae152020-09-02 13:11:20 +0530203func (oo *omciCC) receiveOnuMessage(ctx context.Context, omciMsg *omci.OMCI) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000204 logger.Debugw(ctx, "rx-onu-autonomous-message", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000205 "payload": hex.EncodeToString(omciMsg.Payload)})
206 /*
207 msgType = rxFrame.fields["message_type"] //assumed OmciOperationsValue
208 rxOnuFrames++
209
210 switch msgType {
211 case AlarmNotification:
212 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000213 logger.Info("Unhandled: received-onu-alarm-message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000214 // python code was:
215 //if msg_type == EntityOperations.AlarmNotification.value:
216 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Alarm_Notification)
217 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
218 //
219 return errors.New("RxAlarmNotification unimplemented")
220 }
221 case AttributeValueChange:
222 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000223 logger.Info("Unhandled: received-attribute-value-change")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000224 // python code was:
225 //elif msg_type == EntityOperations.AttributeValueChange.value:
226 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.AVC_Notification)
227 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
228 //
229 return errors.New("RxAttributeValueChange unimplemented")
230 }
231 case TestResult:
232 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000233 logger.Info("Unhandled: received-test-result")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000234 // python code was:
235 //elif msg_type == EntityOperations.TestResult.value:
236 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Test_Result)
237 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
238 //
239 return errors.New("RxTestResult unimplemented")
240 }
241 default:
242 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000243 logger.Errorw(ctx,"rx-onu-unsupported-autonomous-message", log.Fields{"msgType": msgType})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000244 rxOnuDiscards++
245 return errors.New("RxOnuMsgType unimplemented")
246 }
247 }
248 */
Himani Chawla4d908332020-08-31 12:30:20 +0530249 return errors.New("receiveOnuMessage unimplemented")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000250}
251
252// Rx handler for onu messages
253// e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
Himani Chawla6d2ae152020-09-02 13:11:20 +0530254func (oo *omciCC) receiveMessage(ctx context.Context, rxMsg []byte) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000255 //logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000256 if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
257 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
mpagenkoc8bba412021-01-15 15:38:44 +0000258 // (an extendedFormat message could be destroyed this way!)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000259 trailerLenData := rxMsg[42:44]
260 trailerLen := binary.BigEndian.Uint16(trailerLenData)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000261 //logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
mpagenkoc8bba412021-01-15 15:38:44 +0000262 if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
263 binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
264 if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
265 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
266 logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
267 log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
268 oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
269 }
270 }
271 } else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
272 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
273 // (an extendedFormat message could be destroyed this way!)
274 // extend/overwrite with trailer
275 trailer := make([]byte, 8)
276 binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
277 rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
278 if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
279 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
280 logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
281 log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
282 oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000283 }
284 } else {
mpagenkoc8bba412021-01-15 15:38:44 +0000285 logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
286 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200287 return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000288 }
289
290 packet := gopacket.NewPacket(rxMsg, omci.LayerTypeOMCI, gopacket.NoCopy)
291 if packet == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000292 logger.Errorw(ctx, "omci-message could not be decoded", log.Fields{"device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200293 return fmt.Errorf("could not decode rxMsg as OMCI %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000294 }
295 omciLayer := packet.Layer(omci.LayerTypeOMCI)
296 if omciLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000297 logger.Errorw(ctx, "omci-message could not decode omci layer", log.Fields{"device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200298 return fmt.Errorf("could not decode omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000299 }
300 omciMsg, ok := omciLayer.(*omci.OMCI)
301 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000302 logger.Errorw(ctx, "omci-message could not assign omci layer", log.Fields{"device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200303 return fmt.Errorf("could not assign omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000304 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000305 logger.Debugw(ctx, "omci-message-decoded:", log.Fields{"omciMsgType": omciMsg.MessageType,
mpagenko3dbcdd22020-07-22 07:38:45 +0000306 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "DeviceIdent": omciMsg.DeviceIdentifier})
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000307 if byte(omciMsg.MessageType)&me.AK == 0 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000308 // Not a response
dbainbri4d3a0dc2020-12-02 00:33:42 +0000309 logger.Debug(ctx, "RxMsg is no Omci Response Message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000310 if omciMsg.TransactionID == 0 {
Himani Chawla6d2ae152020-09-02 13:11:20 +0530311 return oo.receiveOnuMessage(ctx, omciMsg)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000312 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000313 logger.Errorw(ctx, "Unexpected TransCorrId != 0 not accepted for autonomous messages",
Andrea Campanella6515c582020-10-05 11:25:00 +0200314 log.Fields{"msgType": omciMsg.MessageType, "payload": hex.EncodeToString(omciMsg.Payload),
mpagenko8b07c1b2020-11-26 10:36:31 +0000315 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200316 return fmt.Errorf("autonomous Omci Message with TranSCorrId != 0 not acccepted %s", oo.deviceID)
Himani Chawla4d908332020-08-31 12:30:20 +0530317
318 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000319 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530320 oo.mutexRxSchedMap.Lock()
321 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
322 if ok && rxCallbackEntry.cbFunction != nil {
323 //disadvantage of decoupling: error verification made difficult, but anyway the question is
324 // how to react on erroneous frame reception, maybe can simply be ignored
dbainbri4d3a0dc2020-12-02 00:33:42 +0000325 go rxCallbackEntry.cbFunction(ctx, omciMsg, &packet, rxCallbackEntry.cbRespChannel)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000326 if isResponseWithMibDataSync(omciMsg.MessageType) {
327 oo.pOnuDeviceEntry.incrementMibDataSync(ctx)
328 }
mpagenkoc8bba412021-01-15 15:38:44 +0000329
Himani Chawla4d908332020-08-31 12:30:20 +0530330 // having posted the response the request is regarded as 'done'
331 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
332 oo.mutexRxSchedMap.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000333 } else {
Himani Chawla4d908332020-08-31 12:30:20 +0530334 oo.mutexRxSchedMap.Unlock()
Matteo Scandolo20ca10c2021-01-21 14:35:45 -0800335 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID, "omciMsg": omciMsg, "transCorrId": omciMsg.TransactionID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200336 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000337 }
338
339 return nil
340 /* py code was:
341 Receive and OMCI message from the proxy channel to the OLT.
342
343 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
344 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
345 """
346 if not self.enabled:
347 return
348
349 try:
350 now = arrow.utcnow()
351 d = None
352
353 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
354 # save the current value of the entity_id_to_class_map, then
355 # replace it with our custom one before decode, and then finally
356 # restore it later. Tried other ways but really made the code messy.
357 saved_me_map = omci_entities.entity_id_to_class_map
358 omci_entities.entity_id_to_class_map = self._me_map
359
360 try:
361 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000362 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000363 except KeyError as e:
364 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000365 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000366 rx_frame = self._decode_unknown_me(msg)
367 self._rx_unknown_me += 1
368
369 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000370 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000371 return
372
373 finally:
374 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
375
376 rx_tid = rx_frame.fields['transaction_id']
377 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000378 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000379 # Filter the Test Result frame and route through receive onu
380 # message method.
381 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000382 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000383 return self._receive_onu_message(rx_frame)
384
385 # Previously unreachable if this is the very first round-trip Rx or we
386 # have been running consecutive errors
387 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000388 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000389 self.reactor.callLater(0, self._publish_connectivity_event, True)
390
391 self._rx_frames += 1
392 self._consecutive_errors = 0
393
394 try:
395 high_priority = self._tid_is_high_priority(rx_tid)
396 index = self._get_priority_index(high_priority)
397
398 # (timestamp, defer, frame, timeout, retry, delayedCall)
399 last_tx_tuple = self._tx_request[index]
400
401 if last_tx_tuple is None or \
402 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
403 # Possible late Rx on a message that timed-out
404 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000405 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000406 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
407 self._rx_unknown_tid += 1
408 self._rx_late += 1
409 return
410
411 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
412 if dc is not None and not dc.cancelled and not dc.called:
413 dc.cancel()
414
415 _secs = self._update_rx_tx_stats(now, ts)
416
417 # Late arrival already serviced by a timeout?
418 if d.called:
419 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000420 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000421 return
422
423 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000424 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000425 if d is not None:
426 return d.errback(failure.Failure(e))
427 return
428
429 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000430 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000431 tx_tid = tx_frame.fields['transaction_id'])
432 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
433
434 # begin success callback chain (will cancel timeout and queue next Tx message)
435 self._rx_response[index] = rx_frame
436 d.callback(rx_frame)
437
438 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000439 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000440 */
441}
442
Himani Chawla6d2ae152020-09-02 13:11:20 +0530443/*
444func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530445 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530446 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000447}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530448*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000449
450//Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
Himani Chawla6d2ae152020-09-02 13:11:20 +0530451func (oo *omciCC) send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
452 receiveCallbackPair callbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000453
dbainbri4d3a0dc2020-12-02 00:33:42 +0000454 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": receiveCallbackPair.cbKey})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000455 // it could be checked, if the callback keay is already registered - but simply overwrite may be acceptable ...
456 oo.mutexRxSchedMap.Lock()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000457 oo.rxSchedulerMap[receiveCallbackPair.cbKey] = receiveCallbackPair.cbEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000458 oo.mutexRxSchedMap.Unlock()
459
460 //just use a simple list for starting - might need some more effort, especially for multi source write access
461 omciTxRequest := omciTransferStructure{
462 txFrame,
463 timeout,
464 retry,
465 highPrio,
466 }
467 oo.mutexTxQueue.Lock()
468 oo.txQueue.PushBack(omciTxRequest) // enqueue
469 oo.mutexTxQueue.Unlock()
470
471 // for first test just bypass and send directly:
472 go oo.sendNextRequest(ctx)
473 return nil
474}
475
476//Pull next tx request and send it
Himani Chawla6d2ae152020-09-02 13:11:20 +0530477func (oo *omciCC) sendNextRequest(ctx context.Context) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000478 // return errors.New("sendNextRequest unimplemented")
479
480 // just try to get something transferred !!
481 // avoid accessing the txQueue from parallel send requests
482 // block parallel omci send requests at least until SendIAP is 'committed'
483 // that should be feasible for an onu instance as on OMCI anyway window size 1 is assumed
484 oo.mutexTxQueue.Lock()
mpagenkodff5dda2020-08-28 11:52:01 +0000485 defer oo.mutexTxQueue.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000486 for oo.txQueue.Len() > 0 {
487 queueElement := oo.txQueue.Front() // First element
488 omciTxRequest := queueElement.Value.(omciTransferStructure)
489 /* compare olt device handler code:
490 func (dh *DeviceHandler) omciIndication(omciInd *oop.OmciIndication) {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000491 logger.Debugw(ctx,"omci indication", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000492 var deviceType string
493 var deviceID string
494 var proxyDeviceID string
495
496 onuKey := dh.formOnuKey(omciInd.IntfId, omciInd.OnuId)
497
498 if onuInCache, ok := dh.onus.Load(onuKey); !ok {
499
dbainbri4d3a0dc2020-12-02 00:33:42 +0000500 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 +0000501 ponPort := IntfIDToPortNo(omciInd.GetIntfId(), voltha.Port_PON_OLT)
502 kwargs := make(map[string]interface{})
503 kwargs["onu_id"] = omciInd.OnuId
504 kwargs["parent_port_no"] = ponPort
505
dbainbri4d3a0dc2020-12-02 00:33:42 +0000506 onuDevice, err := dh.coreProxy.GetChildDevice(log.WithSpanFromContext(context.TODO(), ctx), dh.device.Id, kwargs)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000507 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000508 logger.Errorw(ctx,"onu not found", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId, "error": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000509 return
510 }
511 deviceType = onuDevice.Type
512 deviceID = onuDevice.Id
513 proxyDeviceID = onuDevice.ProxyAddress.DeviceId
514 //if not exist in cache, then add to cache.
515 dh.onus.Store(onuKey, NewOnuDevice(deviceID, deviceType, onuDevice.SerialNumber, omciInd.OnuId, omciInd.IntfId, proxyDeviceID))
516 } else {
517 //found in cache
dbainbri4d3a0dc2020-12-02 00:33:42 +0000518 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 +0000519 deviceType = onuInCache.(*OnuDevice).deviceType
520 deviceID = onuInCache.(*OnuDevice).deviceID
521 proxyDeviceID = onuInCache.(*OnuDevice).proxyDeviceID
522 }
523 */
524 /* and compare onu_adapter py code:
525 omci_msg = InterAdapterOmciMessage(
526 message=bytes(frame),
527 proxy_address=self._proxy_address,
528 connect_status=self._device.connect_status)
529
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000530 self.logger.debug('sent-omci-msg', tid=tx_tid, omci_msg=hexlify(bytes(frame)))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000531
532 yield self._adapter_proxy.send_inter_adapter_message(
533 msg=omci_msg,
534 type=InterAdapterMessageType.OMCI_REQUEST,
535 from_adapter=self._device.type,
536 to_adapter=self._proxy_address.device_type,
537 to_device_id=self._device_id,
538 proxy_device_id=self._proxy_address.device_id
539 )
540 */
541 device, err := oo.coreProxy.GetDevice(ctx,
542 oo.pBaseDeviceHandler.deviceID, oo.deviceID) //parent, child
543 if err != nil || device == nil {
544 /*TODO: needs to handle error scenarios */
dbainbri4d3a0dc2020-12-02 00:33:42 +0000545 logger.Errorw(ctx, "Failed to fetch device", log.Fields{"err": err, "ParentId": oo.pBaseDeviceHandler.deviceID,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000546 "ChildId": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200547 return fmt.Errorf("failed to fetch device %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000548 }
549
dbainbri4d3a0dc2020-12-02 00:33:42 +0000550 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +0000551 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
552 "device-id": oo.deviceID,
553 "toDeviceType": oo.pBaseDeviceHandler.ProxyAddressType,
554 "proxyDeviceID": oo.pBaseDeviceHandler.ProxyAddressID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000555
556 omciMsg := &ic.InterAdapterOmciMessage{Message: omciTxRequest.txFrame}
dbainbri4d3a0dc2020-12-02 00:33:42 +0000557 if sendErr := oo.adapterProxy.SendInterAdapterMessage(log.WithSpanFromContext(context.Background(), ctx), omciMsg,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000558 ic.InterAdapterMessageType_OMCI_REQUEST,
Matteo Scandoloefbec272020-11-17 10:33:09 -0800559 //fromTopic,toType,toDevId, ProxyDevId
560 oo.pOnuDeviceEntry.baseDeviceHandler.pOpenOnuAc.config.Topic, oo.pBaseDeviceHandler.ProxyAddressType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000561 oo.deviceID, oo.pBaseDeviceHandler.ProxyAddressID, ""); sendErr != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000562 logger.Errorw(ctx, "send omci request error", log.Fields{"ChildId": oo.deviceID, "error": sendErr})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000563 return sendErr
564 }
565 oo.txQueue.Remove(queueElement) // Dequeue
566 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000567 return nil
568}
569
Himani Chawla6d2ae152020-09-02 13:11:20 +0530570func (oo *omciCC) getNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000571 var next uint16
572 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000573 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000574 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530575 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000576 if oo.hpTid < 0x8000 {
577 oo.hpTid = 0x8000
578 }
mpagenko900ee4b2020-10-12 11:56:34 +0000579 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000580 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000581 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000582 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530583 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000584 if oo.tid >= 0x8000 {
585 oo.tid = 1
586 }
mpagenko900ee4b2020-10-12 11:56:34 +0000587 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000588 }
589 return next
590}
591
592// ###################################################################################
593// # utility methods provided to work on OMCI messages
dbainbri4d3a0dc2020-12-02 00:33:42 +0000594func serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000595 omciLayer := &omci.OMCI{
596 TransactionID: tid,
597 MessageType: msgType,
598 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000599 return serializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000600}
601
dbainbri4d3a0dc2020-12-02 00:33:42 +0000602func serializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000603 var options gopacket.SerializeOptions
604 options.FixLengths = true
605
606 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530607 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000608 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000609 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000610 return nil, err
611 }
612 return buffer.Bytes(), nil
613}
614
Himani Chawla4d908332020-08-31 12:30:20 +0530615/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000616func hexEncode(omciPkt []byte) ([]byte, error) {
617 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
618 hex.Encode(dst, omciPkt)
619 return dst, nil
620}
Himani Chawla4d908332020-08-31 12:30:20 +0530621*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000622
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000623//supply a response handler for omci response messages to be transferred to the requested FSM
dbainbri4d3a0dc2020-12-02 00:33:42 +0000624func (oo *omciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000625
dbainbri4d3a0dc2020-12-02 00:33:42 +0000626 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000627 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000628
629 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000630 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000631 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200632 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000633 }
634
635 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
636 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000637 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000638 Type: OMCI,
639 Data: OmciMessage{
640 OmciMsg: omciMsg,
641 OmciPacket: packet,
642 },
643 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000644 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000645 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000646
647 return nil
648}
649
Himani Chawla6d2ae152020-09-02 13:11:20 +0530650func (oo *omciCC) sendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000651
dbainbri4d3a0dc2020-12-02 00:33:42 +0000652 logger.Debugw(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000653 request := &omci.MibResetRequest{
654 MeBasePacket: omci.MeBasePacket{
655 EntityClass: me.OnuDataClassID,
656 },
657 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530658 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000659 pkt, err := serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000660 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000661 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000662 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000663 return err
664 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530665 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000666 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +0530667 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000668 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530669 return oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000670}
671
Himani Chawla6d2ae152020-09-02 13:11:20 +0530672func (oo *omciCC) sendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000673 logger.Debugw(ctx, "send Reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300674 request := &omci.RebootRequest{
675 MeBasePacket: omci.MeBasePacket{
676 EntityClass: me.OnuGClassID,
677 },
678 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530679 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000680 pkt, err := serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300681 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000682 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000683 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300684 return err
685 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530686 omciRxCallbackPair := callbackPair{
ozgecanetsiae11479f2020-07-06 09:44:47 +0300687 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +0530688 cbEntry: callbackPairEntry{oo.pOnuDeviceEntry.omciRebootMessageReceivedChannel, oo.receiveOmciResponse},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300689 }
690
Himani Chawla6d2ae152020-09-02 13:11:20 +0530691 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300692 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000693 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000694 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300695 return err
696 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000697 err = oo.pOnuDeviceEntry.waitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300698 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000699 logger.Errorw(ctx, "aborting ONU Reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200700 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300701 return err
702 }
703 return nil
704}
705
Himani Chawla6d2ae152020-09-02 13:11:20 +0530706func (oo *omciCC) sendMibUpload(ctx context.Context, timeout int, highPrio bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000707 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000708 request := &omci.MibUploadRequest{
709 MeBasePacket: omci.MeBasePacket{
710 EntityClass: me.OnuDataClassID,
711 },
712 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530713 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000714 pkt, err := serialize(ctx, omci.MibUploadRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000715 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000716 logger.Errorw(ctx, "Cannot serialize MibUploadRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000717 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000718 return err
719 }
720 oo.uploadSequNo = 0
721 oo.uploadNoOfCmds = 0
722
Himani Chawla6d2ae152020-09-02 13:11:20 +0530723 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000724 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +0530725 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000726 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530727 return oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000728}
729
Himani Chawla6d2ae152020-09-02 13:11:20 +0530730func (oo *omciCC) sendMibUploadNext(ctx context.Context, timeout int, highPrio bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000731 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "uploadSequNo": oo.uploadSequNo})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000732 request := &omci.MibUploadNextRequest{
733 MeBasePacket: omci.MeBasePacket{
734 EntityClass: me.OnuDataClassID,
735 },
736 CommandSequenceNumber: oo.uploadSequNo,
737 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530738 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000739 pkt, err := serialize(ctx, omci.MibUploadNextRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000740 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000741 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000742 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000743 return err
744 }
745 oo.uploadSequNo++
746
Himani Chawla6d2ae152020-09-02 13:11:20 +0530747 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000748 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +0530749 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000750 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530751 return oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000752}
753
Himani Chawla6d2ae152020-09-02 13:11:20 +0530754func (oo *omciCC) sendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) *me.ManagedEntity {
755 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000756 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000757 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000758
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000759 meParams := me.ParamData{
760 EntityID: galEthernetEID,
761 Attributes: me.AttributeValueMap{"MaximumGemPayloadSize": maxGemPayloadSize},
762 }
763 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
764 if omciErr.GetError() == nil {
765 //all setByCreate parameters already set, no default option required ...
766 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
767 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000768 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000769 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000770 return nil
771 }
772
dbainbri4d3a0dc2020-12-02 00:33:42 +0000773 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000774 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000775 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000776 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000777 return nil
778 }
779
Himani Chawla6d2ae152020-09-02 13:11:20 +0530780 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000781 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +0530782 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000783 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530784 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000785 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000786 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000787 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000788 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000789 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000790 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +0000791 return meInstance
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000792 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000793 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000794 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +0000795 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000796}
797
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000798// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Himani Chawla6d2ae152020-09-02 13:11:20 +0530799func (oo *omciCC) sendSetOnu2g(ctx context.Context, timeout int, highPrio bool) *me.ManagedEntity {
800 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000801 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000802 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000803
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000804 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
805 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000806 // By now we just use fix values to fire - this is anyway what the python adapter does
807 // read ONU-2G from DB ???? //TODO!!!
808 meParams := me.ParamData{
809 EntityID: 0,
810 Attributes: me.AttributeValueMap{"CurrentConnectivityMode": connectivityModeValue},
811 }
812 meInstance, omciErr := me.NewOnu2G(meParams)
813 if omciErr.GetError() == nil {
814 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
815 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000816 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000817 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000818 return nil
819 }
820
dbainbri4d3a0dc2020-12-02 00:33:42 +0000821 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000822 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000823 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000824 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000825 return nil
826 }
827
Himani Chawla6d2ae152020-09-02 13:11:20 +0530828 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000829 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +0530830 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000831 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530832 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000833 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000834 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000835 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000836 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000837 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000838 logger.Debug(ctx, "send ONU2-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +0000839 return meInstance
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000840 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000841 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000842 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +0000843 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000844}
845
Himani Chawla6d2ae152020-09-02 13:11:20 +0530846func (oo *omciCC) sendCreateMBServiceProfile(ctx context.Context,
847 aPUniPort *onuUniPort, timeout int, highPrio bool) *me.ManagedEntity {
848 tid := oo.getNextTid(highPrio)
Himani Chawla4d908332020-08-31 12:30:20 +0530849 instID := macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000850 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000851 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000852
853 meParams := me.ParamData{
854 EntityID: instID,
855 Attributes: me.AttributeValueMap{
ozgecanetsiab5000ef2020-11-27 14:38:20 +0300856 "Priority": 0x8000,
857 "MaxAge": 20 * 256, //20s
858 "HelloTime": 2 * 256, //2s
859 "ForwardDelay": 15 * 256, //15s
860 "DynamicFilteringAgeingTime": 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000861 },
862 }
863
864 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
865 if omciErr.GetError() == nil {
866 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
867 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
868 omci.TransactionID(tid), omci.AddDefaults(true))
869 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000870 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000871 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000872 return nil
873 }
874
dbainbri4d3a0dc2020-12-02 00:33:42 +0000875 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000876 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000877 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000878 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000879 return nil
880 }
881
Himani Chawla6d2ae152020-09-02 13:11:20 +0530882 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000883 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +0530884 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000885 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530886 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000887 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000888 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000889 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000890 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000891 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000892 logger.Debug(ctx, "send MBSP-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +0000893 return meInstance
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000894 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000895 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000896 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +0000897 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000898}
899
Himani Chawla6d2ae152020-09-02 13:11:20 +0530900func (oo *omciCC) sendCreateMBPConfigData(ctx context.Context,
901 aPUniPort *onuUniPort, timeout int, highPrio bool) *me.ManagedEntity {
902 tid := oo.getNextTid(highPrio)
Himani Chawla26e555c2020-08-31 12:30:20 +0530903 instID := macBridgePortAniEID + aPUniPort.entityID
dbainbri4d3a0dc2020-12-02 00:33:42 +0000904 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000905 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000906
907 meParams := me.ParamData{
908 EntityID: instID,
909 Attributes: me.AttributeValueMap{
Himani Chawla4d908332020-08-31 12:30:20 +0530910 "BridgeIdPointer": macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo),
911 "PortNum": aPUniPort.macBpNo,
912 "TpType": uint8(aPUniPort.portType),
Himani Chawla26e555c2020-08-31 12:30:20 +0530913 "TpPointer": aPUniPort.entityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000914 },
915 }
916 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
917 if omciErr.GetError() == nil {
918 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
919 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
920 omci.TransactionID(tid), omci.AddDefaults(true))
921 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000922 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000923 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000924 return nil
925 }
926
dbainbri4d3a0dc2020-12-02 00:33:42 +0000927 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000928 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000929 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000930 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000931 return nil
932 }
933
Himani Chawla6d2ae152020-09-02 13:11:20 +0530934 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000935 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +0530936 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000937 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530938 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000939 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000940 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000941 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000942 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000943 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000944 logger.Debug(ctx, "send MBPCD-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +0000945 return meInstance
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000946 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000947 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000948 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +0000949 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000950}
951
Himani Chawla6d2ae152020-09-02 13:11:20 +0530952func (oo *omciCC) sendCreateEVTOConfigData(ctx context.Context,
953 aPUniPort *onuUniPort, timeout int, highPrio bool) *me.ManagedEntity {
954 tid := oo.getNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000955 //same entityId is used as for MBSP (see there), but just arbitrary ...
Himani Chawla4d908332020-08-31 12:30:20 +0530956 instID := macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000957 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000958 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000959
960 // compare python adapter code WA VOL-1311: this is not done here!
961 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
962 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
963 assType := uint8(2) // default AssociationType is PPTPEthUni
Himani Chawla6d2ae152020-09-02 13:11:20 +0530964 if aPUniPort.portType == uniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000965 assType = uint8(10) // for VEIP
966 }
967 meParams := me.ParamData{
968 EntityID: instID,
969 Attributes: me.AttributeValueMap{
970 "AssociationType": assType,
Himani Chawla26e555c2020-08-31 12:30:20 +0530971 "AssociatedMePointer": aPUniPort.entityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000972 },
973 }
974 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
975 if omciErr.GetError() == nil {
976 //all setByCreate parameters already set, no default option required ...
977 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
978 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000979 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000980 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000981 return nil
982 }
983
dbainbri4d3a0dc2020-12-02 00:33:42 +0000984 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000985 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000986 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000987 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000988 return nil
989 }
990
Himani Chawla6d2ae152020-09-02 13:11:20 +0530991 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000992 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +0530993 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000994 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530995 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000996 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000997 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000998 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000999 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001000 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001001 logger.Debug(ctx, "send EVTOCD-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001002 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001003 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001004 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001005 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001006 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001007}
1008
Himani Chawla6d2ae152020-09-02 13:11:20 +05301009func (oo *omciCC) sendSetOnuGLS(ctx context.Context, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001010 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301011 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001012 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001013 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001014
1015 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1016 meParams := me.ParamData{
1017 EntityID: 0,
1018 Attributes: requestedAttributes,
1019 }
1020 meInstance, omciErr := me.NewOnuG(meParams)
1021 if omciErr.GetError() == nil {
1022 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1023 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001024 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001025 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001026 return nil
1027 }
1028
dbainbri4d3a0dc2020-12-02 00:33:42 +00001029 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001030 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001031 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001032 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001033 return nil
1034 }
1035
Himani Chawla6d2ae152020-09-02 13:11:20 +05301036 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001037 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +05301038 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001039 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301040 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001041 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001042 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001043 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001044 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001045 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001046 logger.Debug(ctx, "send ONU-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001047 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001048 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001049 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001050 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001051 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001052}
1053
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001054func (oo *omciCC) sendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
1055 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
1056 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001057 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001058 "SequNo": strconv.FormatInt(int64(tid), 16)})
1059
1060 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1061 meParams := me.ParamData{
1062 EntityID: aInstNo,
1063 Attributes: requestedAttributes,
1064 }
1065 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1066 if omciErr.GetError() == nil {
1067 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1068 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001069 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001070 "Err": err, "device-id": oo.deviceID})
1071 return nil
1072 }
1073
dbainbri4d3a0dc2020-12-02 00:33:42 +00001074 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001075 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001076 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001077 "Err": err, "device-id": oo.deviceID})
1078 return nil
1079 }
1080
1081 omciRxCallbackPair := callbackPair{
1082 cbKey: tid,
1083 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
1084 }
1085 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1086 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001087 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001088 "Err": err, "device-id": oo.deviceID})
1089 return nil
1090 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001091 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001092 return meInstance
1093 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001094 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001095 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1096 return nil
1097}
1098
1099/* UniG obsolete by now, left here in case it should be needed once again
1100 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301101func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001102 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301103 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001104 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001105 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001106
1107 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1108 meParams := me.ParamData{
1109 EntityID: aInstNo,
1110 Attributes: requestedAttributes,
1111 }
1112 meInstance, omciErr := me.NewUniG(meParams)
1113 if omciErr.GetError() == nil {
1114 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1115 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001116 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001117 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001118 return nil
1119 }
1120
1121 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1122 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001123 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001124 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001125 return nil
1126 }
1127
Himani Chawla6d2ae152020-09-02 13:11:20 +05301128 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001129 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +05301130 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001131 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301132 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001133 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001134 logger.Errorw(ctx,"Cannot send UNIG-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001135 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001136 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001137 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001138 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001139 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001140 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001141 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001142 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001143 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001144}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001145*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001146
Himani Chawla6d2ae152020-09-02 13:11:20 +05301147func (oo *omciCC) sendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001148 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301149 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001150 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001151 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001152
1153 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1154 meParams := me.ParamData{
1155 EntityID: aInstNo,
1156 Attributes: requestedAttributes,
1157 }
1158 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1159 if omciErr.GetError() == nil {
1160 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1161 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001162 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001163 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001164 return nil
1165 }
1166
dbainbri4d3a0dc2020-12-02 00:33:42 +00001167 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001168 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001169 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001170 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001171 return nil
1172 }
1173
Himani Chawla6d2ae152020-09-02 13:11:20 +05301174 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001175 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +05301176 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001177 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301178 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001179 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001180 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001181 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001182 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001183 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001184 logger.Debug(ctx, "send VEIP-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001185 return meInstance
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001186 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001187 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001188 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001189 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001190}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001191
Himani Chawla6d2ae152020-09-02 13:11:20 +05301192func (oo *omciCC) sendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
Girish Gowdrae09a6202021-01-12 18:10:59 -08001193 timeout int, highPrio bool, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001194
Himani Chawla6d2ae152020-09-02 13:11:20 +05301195 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001196 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001197 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001198
1199 meParams := me.ParamData{
1200 EntityID: entityID,
1201 Attributes: requestedAttributes,
1202 }
1203 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1204 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301205 meClassIDName := meInstance.GetName()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001206 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.GetRequestType, omci.TransactionID(tid))
1207 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001208 logger.Errorf(ctx, "Cannot encode instance for get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001209 return nil
1210 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001211 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001212 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001213 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001214 return nil
1215 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301216 omciRxCallbackPair := callbackPair{
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001217 cbKey: tid,
Girish Gowdrae09a6202021-01-12 18:10:59 -08001218 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001219 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301220 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001221 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001222 logger.Errorw(ctx, "Cannot send get-request-msg", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001223 return nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001224 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001225 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001226 return meInstance
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001227 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001228 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001229 return nil
1230}
1231
Himani Chawla6d2ae152020-09-02 13:11:20 +05301232func (oo *omciCC) sendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001233 aInstID uint16, rxChan chan Message) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301234 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001235 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001236 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1237
1238 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001239 EntityID: aInstID,
1240 Attributes: me.AttributeValueMap{
1241 //workaround for unsuitable omci-lib default values, cmp VOL-3729
1242 "TpPointer": 0xFFFF,
1243 "InterworkTpPointerForPBitPriority0": 0xFFFF,
1244 "InterworkTpPointerForPBitPriority1": 0xFFFF,
1245 "InterworkTpPointerForPBitPriority2": 0xFFFF,
1246 "InterworkTpPointerForPBitPriority3": 0xFFFF,
1247 "InterworkTpPointerForPBitPriority4": 0xFFFF,
1248 "InterworkTpPointerForPBitPriority5": 0xFFFF,
1249 "InterworkTpPointerForPBitPriority6": 0xFFFF,
1250 "InterworkTpPointerForPBitPriority7": 0xFFFF,
1251 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001252 }
1253 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1254 if omciErr.GetError() == nil {
1255 //we have to set all 'untouched' parameters to default by some additional option parameter!!
1256 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1257 omci.TransactionID(tid), omci.AddDefaults(true))
1258 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001259 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001260 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001261 return nil
1262 }
1263
dbainbri4d3a0dc2020-12-02 00:33:42 +00001264 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001265 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001266 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001267 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001268 return nil
1269 }
1270
Himani Chawla6d2ae152020-09-02 13:11:20 +05301271 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001272 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +05301273 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
mpagenko3dbcdd22020-07-22 07:38:45 +00001274 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301275 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001276 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001277 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001278 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001279 return nil
1280 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001281 logger.Debug(ctx, "send .1pMapper-create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001282 return meInstance
1283 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001284 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001285 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001286 return nil
1287}
1288
Himani Chawla6d2ae152020-09-02 13:11:20 +05301289func (oo *omciCC) sendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001290 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301291 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001292 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001293 "SequNo": strconv.FormatInt(int64(tid), 16),
1294 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1295
1296 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1297 if omciErr.GetError() == nil {
1298 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1299 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1300 omci.TransactionID(tid), omci.AddDefaults(true))
1301 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001302 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001303 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001304 return nil
1305 }
1306
dbainbri4d3a0dc2020-12-02 00:33:42 +00001307 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001308 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001309 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001310 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001311 return nil
1312 }
1313
Himani Chawla6d2ae152020-09-02 13:11:20 +05301314 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001315 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +05301316 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
mpagenko3dbcdd22020-07-22 07:38:45 +00001317 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301318 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001319 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001320 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001321 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001322 return nil
1323 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001324 logger.Debug(ctx, "send MBPCD-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001325 return meInstance
1326 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001327 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001328 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001329 return nil
1330}
1331
Himani Chawla6d2ae152020-09-02 13:11:20 +05301332func (oo *omciCC) sendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001333 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301334 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001335 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001336 "SequNo": strconv.FormatInt(int64(tid), 16),
1337 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1338
1339 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1340 if omciErr.GetError() == nil {
1341 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1342 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1343 omci.TransactionID(tid), omci.AddDefaults(true))
1344 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001345 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001346 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001347 return nil
1348 }
1349
dbainbri4d3a0dc2020-12-02 00:33:42 +00001350 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001351 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001352 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001353 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001354 return nil
1355 }
1356
Himani Chawla6d2ae152020-09-02 13:11:20 +05301357 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001358 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +05301359 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
mpagenko3dbcdd22020-07-22 07:38:45 +00001360 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301361 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001362 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001363 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001364 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001365 return nil
1366 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001367 logger.Debug(ctx, "send GemNCTP-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001368 return meInstance
1369 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001370 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001371 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001372 return nil
1373}
1374
Himani Chawla6d2ae152020-09-02 13:11:20 +05301375func (oo *omciCC) sendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001376 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301377 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001378 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001379 "SequNo": strconv.FormatInt(int64(tid), 16),
1380 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1381
1382 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1383 if omciErr.GetError() == nil {
1384 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
1385 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1386 omci.TransactionID(tid))
1387 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001388 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001389 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001390 return nil
1391 }
1392
dbainbri4d3a0dc2020-12-02 00:33:42 +00001393 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001394 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001395 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001396 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001397 return nil
1398 }
1399
Himani Chawla6d2ae152020-09-02 13:11:20 +05301400 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001401 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +05301402 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
mpagenko3dbcdd22020-07-22 07:38:45 +00001403 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301404 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001405 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001406 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001407 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001408 return nil
1409 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001410 logger.Debug(ctx, "send GemIwTp-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001411 return meInstance
1412 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001413 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001414 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001415 return nil
1416}
1417
Himani Chawla6d2ae152020-09-02 13:11:20 +05301418func (oo *omciCC) sendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001419 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301420 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001421 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001422 "SequNo": strconv.FormatInt(int64(tid), 16),
1423 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1424
1425 meInstance, omciErr := me.NewTCont(params[0])
1426 if omciErr.GetError() == nil {
1427 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1428 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001429 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001430 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001431 return nil
1432 }
1433
dbainbri4d3a0dc2020-12-02 00:33:42 +00001434 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001435 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001436 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001437 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001438 return nil
1439 }
1440
Himani Chawla6d2ae152020-09-02 13:11:20 +05301441 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001442 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +05301443 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
mpagenko3dbcdd22020-07-22 07:38:45 +00001444 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301445 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001446 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001447 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001448 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001449 return nil
1450 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001451 logger.Debug(ctx, "send TCont-set msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001452 return meInstance
1453 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001454 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001455 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001456 return nil
1457}
1458
Himani Chawla6d2ae152020-09-02 13:11:20 +05301459func (oo *omciCC) sendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001460 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301461 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001462 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001463 "SequNo": strconv.FormatInt(int64(tid), 16),
1464 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1465
1466 meInstance, omciErr := me.NewPriorityQueue(params[0])
1467 if omciErr.GetError() == nil {
1468 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1469 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001470 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001471 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001472 return nil
1473 }
1474
dbainbri4d3a0dc2020-12-02 00:33:42 +00001475 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001476 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001477 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001478 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001479 return nil
1480 }
1481
Himani Chawla6d2ae152020-09-02 13:11:20 +05301482 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001483 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +05301484 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
mpagenko3dbcdd22020-07-22 07:38:45 +00001485 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301486 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001487 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001488 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001489 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001490 return nil
1491 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001492 logger.Debug(ctx, "send PrioQueue-set msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001493 return meInstance
1494 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001495 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001496 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001497 return nil
1498}
1499
Himani Chawla6d2ae152020-09-02 13:11:20 +05301500func (oo *omciCC) sendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001501 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301502 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001503 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001504 "SequNo": strconv.FormatInt(int64(tid), 16),
1505 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1506
1507 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1508 if omciErr.GetError() == nil {
1509 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1510 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001511 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001512 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001513 return nil
1514 }
1515
dbainbri4d3a0dc2020-12-02 00:33:42 +00001516 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001517 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001518 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001519 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001520 return nil
1521 }
1522
Himani Chawla6d2ae152020-09-02 13:11:20 +05301523 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001524 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +05301525 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
mpagenko3dbcdd22020-07-22 07:38:45 +00001526 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301527 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001528 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001529 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001530 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001531 return nil
1532 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001533 logger.Debug(ctx, "send 1PMapper-set msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001534 return meInstance
1535 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001536 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001537 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001538 return nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001539}
mpagenkodff5dda2020-08-28 11:52:01 +00001540
Himani Chawla6d2ae152020-09-02 13:11:20 +05301541func (oo *omciCC) sendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
mpagenkodff5dda2020-08-28 11:52:01 +00001542 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301543 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001544 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001545 "SequNo": strconv.FormatInt(int64(tid), 16),
1546 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1547
1548 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1549 if omciErr.GetError() == nil {
1550 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
1551 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1552 omci.TransactionID(tid))
1553 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001554 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001555 "Err": err, "device-id": oo.deviceID})
1556 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1557 // return (dual format) error code that can be used at caller for immediate error treatment
1558 // (relevant to all used sendXX() methods and their error conditions)
1559 return nil
1560 }
1561
dbainbri4d3a0dc2020-12-02 00:33:42 +00001562 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001563 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001564 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001565 "Err": err, "device-id": oo.deviceID})
1566 return nil
1567 }
1568
Himani Chawla6d2ae152020-09-02 13:11:20 +05301569 omciRxCallbackPair := callbackPair{
mpagenkodff5dda2020-08-28 11:52:01 +00001570 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +05301571 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
mpagenkodff5dda2020-08-28 11:52:01 +00001572 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301573 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001574 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001575 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001576 "Err": err, "device-id": oo.deviceID})
1577 return nil
1578 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001579 logger.Debug(ctx, "send VTFD-Create-msg done")
mpagenkodff5dda2020-08-28 11:52:01 +00001580 return meInstance
1581 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001582 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001583 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1584 return nil
1585}
1586
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001587// nolint: unused
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001588func (oo *omciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
1589 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
1590 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001591 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001592 "SequNo": strconv.FormatInt(int64(tid), 16),
1593 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1594
1595 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1596 if omciErr.GetError() == nil {
1597 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType,
1598 omci.TransactionID(tid))
1599 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001600 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001601 "Err": err, "device-id": oo.deviceID})
1602 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1603 // return (dual format) error code that can be used at caller for immediate error treatment
1604 // (relevant to all used sendXX() methods and their error conditions)
1605 return nil
1606 }
1607
dbainbri4d3a0dc2020-12-02 00:33:42 +00001608 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001609 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001610 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001611 "Err": err, "device-id": oo.deviceID})
1612 return nil
1613 }
1614
1615 omciRxCallbackPair := callbackPair{
1616 cbKey: tid,
1617 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
1618 }
1619 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1620 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001621 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001622 "Err": err, "device-id": oo.deviceID})
1623 return nil
1624 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001625 logger.Debug(ctx, "send VTFD-Set-msg done")
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001626 return meInstance
1627 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001628 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001629 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1630 return nil
1631}
1632
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001633func (oo *omciCC) sendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
1634 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
1635 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001636 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001637 "SequNo": strconv.FormatInt(int64(tid), 16),
1638 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1639
1640 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1641 if omciErr.GetError() == nil {
1642 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1643 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001644 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001645 "Err": err, "device-id": oo.deviceID})
1646 return nil
1647 }
1648
dbainbri4d3a0dc2020-12-02 00:33:42 +00001649 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001650 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001651 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001652 "Err": err, "device-id": oo.deviceID})
1653 return nil
1654 }
1655
1656 omciRxCallbackPair := callbackPair{
1657 cbKey: tid,
1658 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
1659 }
1660 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1661 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001662 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001663 "Err": err, "device-id": oo.deviceID})
1664 return nil
1665 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001666 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001667 return meInstance
1668 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001669 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001670 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1671 return nil
1672}
1673
Himani Chawla6d2ae152020-09-02 13:11:20 +05301674func (oo *omciCC) sendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
mpagenkodff5dda2020-08-28 11:52:01 +00001675 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301676 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001677 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001678 "SequNo": strconv.FormatInt(int64(tid), 16),
1679 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1680
1681 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1682 if omciErr.GetError() == nil {
1683 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1684 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001685 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001686 "Err": err, "device-id": oo.deviceID})
1687 return nil
1688 }
1689
dbainbri4d3a0dc2020-12-02 00:33:42 +00001690 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001691 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001692 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001693 "Err": err, "device-id": oo.deviceID})
1694 return nil
1695 }
1696
Himani Chawla6d2ae152020-09-02 13:11:20 +05301697 omciRxCallbackPair := callbackPair{
mpagenkodff5dda2020-08-28 11:52:01 +00001698 cbKey: tid,
Himani Chawla6d2ae152020-09-02 13:11:20 +05301699 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
mpagenkodff5dda2020-08-28 11:52:01 +00001700 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301701 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001702 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001703 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001704 "Err": err, "device-id": oo.deviceID})
1705 return nil
1706 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001707 logger.Debug(ctx, "send EVTOCD-set msg done")
mpagenkodff5dda2020-08-28 11:52:01 +00001708 return meInstance
1709 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001710 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001711 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1712 return nil
1713}
mpagenko01e726e2020-10-23 09:45:29 +00001714
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001715func (oo *omciCC) sendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
1716 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
1717 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001718 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001719 "SequNo": strconv.FormatInt(int64(tid), 16),
1720 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1721
1722 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1723 if omciErr.GetError() == nil {
1724 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid))
1725 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001726 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001727 "Err": err, "device-id": oo.deviceID})
1728 return nil
1729 }
1730
dbainbri4d3a0dc2020-12-02 00:33:42 +00001731 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001732 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001733 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001734 "Err": err, "device-id": oo.deviceID})
1735 return nil
1736 }
1737
1738 omciRxCallbackPair := callbackPair{
1739 cbKey: tid,
1740 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
1741 }
1742 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1743 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001744 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001745 "Err": err, "device-id": oo.deviceID})
1746 return nil
1747 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001748 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001749 return meInstance
1750 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001751 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001752 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1753 return nil
1754}
1755
mpagenko01e726e2020-10-23 09:45:29 +00001756func (oo *omciCC) sendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
1757 rxChan chan Message, aInstID uint16) *me.ManagedEntity {
1758 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001759 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00001760 "SequNo": strconv.FormatInt(int64(tid), 16),
1761 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1762
1763 meParams := me.ParamData{EntityID: aInstID}
1764 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
1765 if omciErr.GetError() == nil {
1766 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
1767 omci.TransactionID(tid))
1768 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001769 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001770 "Err": err, "device-id": oo.deviceID})
1771 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1772 // return (dual format) error code that can be used at caller for immediate error treatment
1773 // (relevant to all used sendXX() methods and their error conditions)
1774 return nil
1775 }
1776
dbainbri4d3a0dc2020-12-02 00:33:42 +00001777 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00001778 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001779 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001780 "Err": err, "device-id": oo.deviceID})
1781 return nil
1782 }
1783
1784 omciRxCallbackPair := callbackPair{
1785 cbKey: tid,
1786 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
1787 }
1788 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1789 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001790 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001791 "Err": err, "device-id": oo.deviceID})
1792 return nil
1793 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001794 logger.Debug(ctx, "send VTFD-Delete-msg done")
mpagenko01e726e2020-10-23 09:45:29 +00001795 return meInstance
1796 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001797 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001798 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1799 return nil
1800}
ozgecanetsia422dbf32020-10-28 14:07:19 +03001801
mpagenko8b07c1b2020-11-26 10:36:31 +00001802func (oo *omciCC) sendDeleteGemIWTP(ctx context.Context, timeout int, highPrio bool,
1803 rxChan chan Message, aInstID uint16) *me.ManagedEntity {
1804 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001805 logger.Debugw(ctx, "send GemIwTp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00001806 "SequNo": strconv.FormatInt(int64(tid), 16),
1807 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1808
1809 meParams := me.ParamData{EntityID: aInstID}
1810 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(meParams)
1811 if omciErr.GetError() == nil {
1812 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
1813 omci.TransactionID(tid))
1814 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001815 logger.Errorw(ctx, "Cannot encode GemIwTp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001816 "Err": err, "device-id": oo.deviceID})
1817 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1818 // return (dual format) error code that can be used at caller for immediate error treatment
1819 // (relevant to all used sendXX() methods and their error conditions)
1820 return nil
1821 }
1822
dbainbri4d3a0dc2020-12-02 00:33:42 +00001823 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00001824 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001825 logger.Errorw(ctx, "Cannot serialize GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001826 "Err": err, "device-id": oo.deviceID})
1827 return nil
1828 }
1829
1830 omciRxCallbackPair := callbackPair{
1831 cbKey: tid,
1832 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
1833 }
1834 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1835 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001836 logger.Errorw(ctx, "Cannot send GemIwTp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001837 "Err": err, "device-id": oo.deviceID})
1838 return nil
1839 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001840 logger.Debug(ctx, "send GemIwTp-Delete-msg done")
mpagenko8b07c1b2020-11-26 10:36:31 +00001841 return meInstance
1842 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001843 logger.Errorw(ctx, "Cannot generate GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001844 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1845 return nil
1846}
1847
1848func (oo *omciCC) sendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
1849 rxChan chan Message, aInstID uint16) *me.ManagedEntity {
1850 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001851 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00001852 "SequNo": strconv.FormatInt(int64(tid), 16),
1853 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1854
1855 meParams := me.ParamData{EntityID: aInstID}
1856 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
1857 if omciErr.GetError() == nil {
1858 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
1859 omci.TransactionID(tid))
1860 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001861 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001862 "Err": err, "device-id": oo.deviceID})
1863 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1864 // return (dual format) error code that can be used at caller for immediate error treatment
1865 // (relevant to all used sendXX() methods and their error conditions)
1866 return nil
1867 }
1868
dbainbri4d3a0dc2020-12-02 00:33:42 +00001869 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00001870 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001871 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001872 "Err": err, "device-id": oo.deviceID})
1873 return nil
1874 }
1875
1876 omciRxCallbackPair := callbackPair{
1877 cbKey: tid,
1878 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
1879 }
1880 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1881 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001882 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001883 "Err": err, "device-id": oo.deviceID})
1884 return nil
1885 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001886 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
mpagenko8b07c1b2020-11-26 10:36:31 +00001887 return meInstance
1888 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001889 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001890 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1891 return nil
1892}
1893
1894func (oo *omciCC) sendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
1895 rxChan chan Message, aInstID uint16) *me.ManagedEntity {
1896 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001897 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00001898 "SequNo": strconv.FormatInt(int64(tid), 16),
1899 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1900
1901 meParams := me.ParamData{EntityID: aInstID}
1902 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1903 if omciErr.GetError() == nil {
1904 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
1905 omci.TransactionID(tid))
1906 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001907 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001908 "Err": err, "device-id": oo.deviceID})
1909 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1910 // return (dual format) error code that can be used at caller for immediate error treatment
1911 // (relevant to all used sendXX() methods and their error conditions)
1912 return nil
1913 }
1914
dbainbri4d3a0dc2020-12-02 00:33:42 +00001915 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00001916 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001917 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001918 "Err": err, "device-id": oo.deviceID})
1919 return nil
1920 }
1921
1922 omciRxCallbackPair := callbackPair{
1923 cbKey: tid,
1924 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
1925 }
1926 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1927 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001928 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001929 "Err": err, "device-id": oo.deviceID})
1930 return nil
1931 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001932 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
mpagenko8b07c1b2020-11-26 10:36:31 +00001933 return meInstance
1934 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001935 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001936 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1937 return nil
1938}
1939
1940func (oo *omciCC) sendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
1941 rxChan chan Message, aInstID uint16) *me.ManagedEntity {
1942 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001943 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00001944 "SequNo": strconv.FormatInt(int64(tid), 16),
1945 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1946
1947 meParams := me.ParamData{EntityID: aInstID}
1948 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
1949 if omciErr.GetError() == nil {
1950 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
1951 omci.TransactionID(tid))
1952 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001953 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001954 "Err": err, "device-id": oo.deviceID})
1955 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1956 // return (dual format) error code that can be used at caller for immediate error treatment
1957 // (relevant to all used sendXX() methods and their error conditions)
1958 return nil
1959 }
1960
dbainbri4d3a0dc2020-12-02 00:33:42 +00001961 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00001962 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001963 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001964 "Err": err, "device-id": oo.deviceID})
1965 return nil
1966 }
1967
1968 omciRxCallbackPair := callbackPair{
1969 cbKey: tid,
1970 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
1971 }
1972 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1973 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001974 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001975 "Err": err, "device-id": oo.deviceID})
1976 return nil
1977 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001978 logger.Debug(ctx, "send MBPCD-Delete-msg done")
mpagenko8b07c1b2020-11-26 10:36:31 +00001979 return meInstance
1980 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001981 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001982 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1983 return nil
1984}
1985
mpagenkofc4f56e2020-11-04 17:17:49 +00001986// nolint: unused
ozgecanetsia422dbf32020-10-28 14:07:19 +03001987func (oo *omciCC) sendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
1988 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
1989 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001990 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03001991 "SequNo": strconv.FormatInt(int64(tid), 16),
1992 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1993
1994 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
1995 if omciErr.GetError() == nil {
1996 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
1997 omci.AddDefaults(true))
1998 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001999 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsia422dbf32020-10-28 14:07:19 +03002000 return nil
2001 }
2002
dbainbri4d3a0dc2020-12-02 00:33:42 +00002003 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002004 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002005 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsia422dbf32020-10-28 14:07:19 +03002006 return nil
2007 }
2008
2009 omciRxCallbackPair := callbackPair{cbKey: tid,
2010 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
2011 }
2012 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2013 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002014 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsia422dbf32020-10-28 14:07:19 +03002015 return nil
2016 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002017 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsia422dbf32020-10-28 14:07:19 +03002018 return meInstance
2019 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002020 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002021 "device-id": oo.deviceID})
2022 return nil
2023}
2024
mpagenkofc4f56e2020-11-04 17:17:49 +00002025// nolint: unused
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002026func (oo *omciCC) sendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
2027 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
2028 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002029 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002030 "SequNo": strconv.FormatInt(int64(tid), 16),
2031 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2032
2033 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2034 if omciErr.GetError() == nil {
2035 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid),
2036 omci.AddDefaults(true))
2037 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002038 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002039 return nil
2040 }
2041
dbainbri4d3a0dc2020-12-02 00:33:42 +00002042 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002043 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002044 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002045 return nil
2046 }
2047
2048 omciRxCallbackPair := callbackPair{cbKey: tid,
2049 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
2050 }
2051 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2052 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002053 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002054 return nil
2055 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002056 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002057 return meInstance
2058 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002059 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002060 "device-id": oo.deviceID})
2061 return nil
2062}
2063
2064// nolint: unused
ozgecanetsia422dbf32020-10-28 14:07:19 +03002065func (oo *omciCC) sendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
2066 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
2067 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002068 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002069 "SequNo": strconv.FormatInt(int64(tid), 16),
2070 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2071
2072 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2073 if omciErr.GetError() == nil {
2074 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2075 omci.AddDefaults(true))
2076 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002077 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002078 "device-id": oo.deviceID})
2079 return nil
2080 }
2081
dbainbri4d3a0dc2020-12-02 00:33:42 +00002082 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002083 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002084 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002085 "device-id": oo.deviceID})
2086 return nil
2087 }
2088
2089 omciRxCallbackPair := callbackPair{cbKey: tid,
2090 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
2091 }
2092 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2093 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002094 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002095 "device-id": oo.deviceID})
2096 return nil
2097 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002098 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsia422dbf32020-10-28 14:07:19 +03002099 return meInstance
2100 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002101 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002102 "device-id": oo.deviceID})
2103 return nil
2104}
2105
mpagenkofc4f56e2020-11-04 17:17:49 +00002106// nolint: unused
ozgecanetsia422dbf32020-10-28 14:07:19 +03002107func (oo *omciCC) sendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
2108 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
2109 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002110 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002111 "SequNo": strconv.FormatInt(int64(tid), 16),
2112 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2113
2114 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2115 if omciErr.GetError() == nil {
2116 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid),
2117 omci.AddDefaults(true))
2118 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002119 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002120 "device-id": oo.deviceID})
2121 return nil
2122 }
2123
dbainbri4d3a0dc2020-12-02 00:33:42 +00002124 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002125 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002126 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002127 "device-id": oo.deviceID})
2128 return nil
2129 }
2130
2131 omciRxCallbackPair := callbackPair{cbKey: tid,
2132 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
2133 }
2134 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2135 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002136 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002137 "device-id": oo.deviceID})
2138 return nil
2139 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002140 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsia422dbf32020-10-28 14:07:19 +03002141 return meInstance
2142 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002143 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002144 "device-id": oo.deviceID})
2145 return nil
2146}
2147
mpagenkofc4f56e2020-11-04 17:17:49 +00002148// nolint: unused
ozgecanetsia422dbf32020-10-28 14:07:19 +03002149func (oo *omciCC) sendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
2150 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
2151 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002152 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002153 "SequNo": strconv.FormatInt(int64(tid), 16),
2154 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2155
2156 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2157 if omciErr.GetError() == nil {
2158 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2159 omci.AddDefaults(true))
2160 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002161 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002162 "device-id": oo.deviceID})
2163 return nil
2164 }
2165
dbainbri4d3a0dc2020-12-02 00:33:42 +00002166 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002167 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002168 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002169 "device-id": oo.deviceID})
2170 return nil
2171 }
2172
2173 omciRxCallbackPair := callbackPair{cbKey: tid,
2174 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
2175 }
2176 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2177 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002178 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002179 "device-id": oo.deviceID})
2180 return nil
2181 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002182 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsia422dbf32020-10-28 14:07:19 +03002183 return meInstance
2184 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002185 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002186 "device-id": oo.deviceID})
2187 return nil
2188}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002189
Girish Gowdrae0140f02021-02-02 16:55:09 -08002190func (oo *omciCC) sendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
2191 tid := oo.getNextTid(highPrio)
2192 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
2193 "SequNo": strconv.FormatInt(int64(tid), 16)})
2194
2195 omciLayer := &omci.OMCI{
2196 TransactionID: tid,
2197 MessageType: omci.SynchronizeTimeRequestType,
2198 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2199 // Length: 0x28, // Optional, defaults to 40 octets
2200 }
2201 utcTime := time.Now().UTC()
2202 request := &omci.SynchronizeTimeRequest{
2203 MeBasePacket: omci.MeBasePacket{
2204 EntityClass: me.OnuGClassID,
2205 // Default Instance ID is 0
2206 },
2207 Year: uint16(utcTime.Year()),
2208 Month: uint8(utcTime.Month()),
2209 Day: uint8(utcTime.Day()),
2210 Hour: uint8(utcTime.Hour()),
2211 Minute: uint8(utcTime.Minute()),
2212 Second: uint8(utcTime.Second()),
2213 }
2214
2215 pkt, err := serializeOmciLayer(ctx, omciLayer, request)
2216 if err != nil {
2217 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
2218 "device-id": oo.deviceID})
2219 return err
2220 }
2221
2222 omciRxCallbackPair := callbackPair{cbKey: tid,
2223 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
2224 }
2225 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2226 if err != nil {
2227 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
2228 "device-id": oo.deviceID})
2229 return err
2230 }
2231 logger.Debug(ctx, "send synchronize time request done")
2232 return nil
2233}
2234
2235func (oo *omciCC) sendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
2236 upstream bool, create bool, rxChan chan Message, entityID uint16) *me.ManagedEntity {
2237 tid := oo.getNextTid(highPrio)
2238 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2239 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
2240 meParam := me.ParamData{EntityID: entityID}
2241 var meInstance *me.ManagedEntity
2242 var omciErr me.OmciErrors
2243 if upstream {
2244 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
2245 } else {
2246 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
2247 }
2248 if omciErr.GetError() == nil {
2249 var omciLayer *omci.OMCI
2250 var msgLayer gopacket.SerializableLayer
2251 var err error
2252 if create {
2253 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2254 omci.AddDefaults(true))
2255 } else {
2256 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2257 omci.AddDefaults(true))
2258 }
2259 if err != nil {
2260 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
2261 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2262 return nil
2263 }
2264
2265 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2266 if err != nil {
2267 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
2268 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2269 return nil
2270 }
2271
2272 omciRxCallbackPair := callbackPair{cbKey: tid,
2273 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
2274 }
2275 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2276 if err != nil {
2277 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
2278 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2279 return nil
2280 }
2281 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
2282 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2283 return meInstance
2284 }
2285 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
2286 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2287 return nil
2288}
2289
2290func (oo *omciCC) sendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
2291 create bool, rxChan chan Message, entityID uint16) *me.ManagedEntity {
2292 tid := oo.getNextTid(highPrio)
2293 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2294 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2295 meParam := me.ParamData{EntityID: entityID}
2296 var meInstance *me.ManagedEntity
2297 var omciErr me.OmciErrors
2298 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
2299
2300 if omciErr.GetError() == nil {
2301 var omciLayer *omci.OMCI
2302 var msgLayer gopacket.SerializableLayer
2303 var err error
2304 if create {
2305 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2306 omci.AddDefaults(true))
2307 } else {
2308 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2309 omci.AddDefaults(true))
2310 }
2311 if err != nil {
2312 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
2313 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2314 return nil
2315 }
2316
2317 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2318 if err != nil {
2319 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
2320 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2321 return nil
2322 }
2323
2324 omciRxCallbackPair := callbackPair{cbKey: tid,
2325 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse},
2326 }
2327 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2328 if err != nil {
2329 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
2330 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2331 return nil
2332 }
2333 logger.Debugw(ctx, "send ethernet uni history data ME done",
2334 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2335 return meInstance
2336 }
2337 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
2338 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2339 return nil
2340}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002341func isResponseWithMibDataSync(msgType omci.MessageType) bool {
2342 for _, v := range responsesWithMibDataSync {
2343 if v == msgType {
2344 return true
2345 }
2346 }
2347 return false
2348}