blob: 3a46f45b9140c3c7f6159ef2469d7c19781a5150 [file] [log] [blame]
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001/*
2 * Copyright 2020-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000017//Package adaptercoreonu provides the utility for onu devices, flows and statistics
18package adaptercoreonu
Holger Hildebrandtfa074992020-03-27 15:42:06 +000019
20import (
21 "container/list"
22 "context"
23 "encoding/binary"
24 "encoding/hex"
Andrea Campanella6515c582020-10-05 11:25:00 +020025 "fmt"
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000026 "strconv"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000027 "sync"
mpagenko80622a52021-02-09 16:53:23 +000028 "time" //by now for testing
Holger Hildebrandtfa074992020-03-27 15:42:06 +000029
30 "github.com/google/gopacket"
31 // TODO!!! Some references could be resolved auto, but some need specific context ....
32 gp "github.com/google/gopacket"
33
34 "github.com/opencord/omci-lib-go"
35 me "github.com/opencord/omci-lib-go/generated"
dbainbri4d3a0dc2020-12-02 00:33:42 +000036 "github.com/opencord/voltha-lib-go/v4/pkg/adapters/adapterif"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000037
dbainbri4d3a0dc2020-12-02 00:33:42 +000038 //"github.com/opencord/voltha-lib-go/v4/pkg/kafka"
39 "github.com/opencord/voltha-lib-go/v4/pkg/log"
40 ic "github.com/opencord/voltha-protos/v4/go/inter_container"
41 //"github.com/opencord/voltha-protos/v4/go/openflow_13"
42 //"github.com/opencord/voltha-protos/v4/go/voltha"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000043)
44
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000045// ### OMCI related definitions - retrieved from Python adapter code/trace ####
Himani Chawla6d2ae152020-09-02 13:11:20 +053046
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000047const galEthernetEID = uint16(1)
48const maxGemPayloadSize = uint16(48)
49const connectivityModeValue = uint8(5)
Himani Chawla4d908332020-08-31 12:30:20 +053050
51//const defaultTPID = uint16(0x8100)
52//const broadComDefaultVID = uint16(4091)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000053const macBridgeServiceProfileEID = uint16(0x201) // TODO: most all these need better definition or tuning
54const ieeeMapperServiceProfileEID = uint16(0x8001)
55const macBridgePortAniEID = uint16(0x2102)
56
mpagenko8b07c1b2020-11-26 10:36:31 +000057const unusedTcontAllocID = uint16(0xFFFF) //common unused AllocId for G.984 and G.987 systems
58
mpagenkoc8bba412021-01-15 15:38:44 +000059const cOmciBaseMessageTrailerLen = 40
60
61// tOmciReceiveError - enum type for detected problems/errors in the received OMCI message (format)
62type tOmciReceiveError uint8
63
64const (
65 // cOmciMessageReceiveNoError - default start state
66 cOmciMessageReceiveNoError tOmciReceiveError = iota
67 // Error indication wrong trailer length within the message
68 cOmciMessageReceiveErrorTrailerLen
69 // Error indication missing trailer within the message
70 cOmciMessageReceiveErrorMissTrailer
71)
72
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000073// ### OMCI related definitions - end
74
Himani Chawla6d2ae152020-09-02 13:11:20 +053075//callbackPairEntry to be used for OMCI send/receive correlation
76type callbackPairEntry struct {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000077 cbRespChannel chan Message
dbainbri4d3a0dc2020-12-02 00:33:42 +000078 cbFunction func(context.Context, *omci.OMCI, *gp.Packet, chan Message) error
mpagenko80622a52021-02-09 16:53:23 +000079 framePrint bool //true for printing
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000080}
81
Himani Chawla6d2ae152020-09-02 13:11:20 +053082//callbackPair to be used for ReceiveCallback init
83type callbackPair struct {
Holger Hildebrandtccd390c2020-05-29 13:49:04 +000084 cbKey uint16
Himani Chawla6d2ae152020-09-02 13:11:20 +053085 cbEntry callbackPairEntry
Holger Hildebrandtfa074992020-03-27 15:42:06 +000086}
87
88type omciTransferStructure struct {
mpagenko80622a52021-02-09 16:53:23 +000089 txFrame []byte
90 timeout int
91 retry int
92 highPrio bool
93 withFramePrint bool
Holger Hildebrandtfa074992020-03-27 15:42:06 +000094}
95
Himani Chawla6d2ae152020-09-02 13:11:20 +053096//omciCC structure holds information needed for OMCI communication (to/from OLT Adapter)
97type omciCC struct {
Holger Hildebrandtfa074992020-03-27 15:42:06 +000098 enabled bool
99 pOnuDeviceEntry *OnuDeviceEntry
100 deviceID string
Himani Chawla6d2ae152020-09-02 13:11:20 +0530101 pBaseDeviceHandler *deviceHandler
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000102 coreProxy adapterif.CoreProxy
103 adapterProxy adapterif.AdapterProxy
104 supportExtMsg bool
mpagenkoc8bba412021-01-15 15:38:44 +0000105 rxOmciFrameError tOmciReceiveError
106
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000107 txFrames, txOnuFrames uint32
108 rxFrames, rxOnuFrames, rxOnuDiscards uint32
109
110 // OMCI params
111 mutexTid sync.Mutex
112 tid uint16
113 mutexHpTid sync.Mutex
114 hpTid uint16
115 uploadSequNo uint16
116 uploadNoOfCmds uint16
117
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000118 mutexTxQueue sync.Mutex
119 txQueue *list.List
120 mutexRxSchedMap sync.Mutex
Himani Chawla6d2ae152020-09-02 13:11:20 +0530121 rxSchedulerMap map[uint16]callbackPairEntry
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000122 pLastTxMeInstance *me.ManagedEntity
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000123}
124
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000125var responsesWithMibDataSync = []omci.MessageType{
126 omci.CreateResponseType,
127 omci.DeleteResponseType,
128 omci.SetResponseType,
129 omci.StartSoftwareDownloadResponseType,
130 omci.EndSoftwareDownloadResponseType,
131 omci.ActivateSoftwareResponseType,
132 omci.CommitSoftwareResponseType,
133}
134
Himani Chawla6d2ae152020-09-02 13:11:20 +0530135//newOmciCC constructor returns a new instance of a OmciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000136//mib_db (as well as not inluded alarm_db not really used in this code? VERIFY!!)
Himani Chawla6d2ae152020-09-02 13:11:20 +0530137func newOmciCC(ctx context.Context, onuDeviceEntry *OnuDeviceEntry,
138 deviceID string, deviceHandler *deviceHandler,
139 coreProxy adapterif.CoreProxy, adapterProxy adapterif.AdapterProxy) *omciCC {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000140 logger.Debugw(ctx, "init-omciCC", log.Fields{"device-id": deviceID})
Himani Chawla6d2ae152020-09-02 13:11:20 +0530141 var omciCC omciCC
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000142 omciCC.enabled = false
Himani Chawla4d908332020-08-31 12:30:20 +0530143 omciCC.pOnuDeviceEntry = onuDeviceEntry
144 omciCC.deviceID = deviceID
145 omciCC.pBaseDeviceHandler = deviceHandler
146 omciCC.coreProxy = coreProxy
147 omciCC.adapterProxy = adapterProxy
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000148 omciCC.supportExtMsg = false
mpagenkoc8bba412021-01-15 15:38:44 +0000149 omciCC.rxOmciFrameError = cOmciMessageReceiveNoError
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000150 omciCC.txFrames = 0
151 omciCC.txOnuFrames = 0
152 omciCC.rxFrames = 0
153 omciCC.rxOnuFrames = 0
154 omciCC.rxOnuDiscards = 0
155 omciCC.tid = 0x1
156 omciCC.hpTid = 0x8000
157 omciCC.uploadSequNo = 0
158 omciCC.uploadNoOfCmds = 0
159
160 omciCC.txQueue = list.New()
Himani Chawla6d2ae152020-09-02 13:11:20 +0530161 omciCC.rxSchedulerMap = make(map[uint16]callbackPairEntry)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000162
163 return &omciCC
164}
165
mpagenko900ee4b2020-10-12 11:56:34 +0000166//stop stops/resets the omciCC
167func (oo *omciCC) stop(ctx context.Context) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000168 logger.Debugw(ctx, "omciCC-stopping", log.Fields{"device-id": oo.deviceID})
mpagenko900ee4b2020-10-12 11:56:34 +0000169 //reseting all internal data, which might also be helpful for discarding any lingering tx/rx requests
170 oo.mutexTxQueue.Lock()
171 oo.txQueue.Init() // clear the tx queue
172 oo.mutexTxQueue.Unlock()
173 oo.mutexRxSchedMap.Lock()
174 for k := range oo.rxSchedulerMap {
175 delete(oo.rxSchedulerMap, k) //clear the scheduler map
176 }
177 oo.mutexRxSchedMap.Unlock()
178 oo.mutexHpTid.Lock()
179 oo.hpTid = 0x8000 //reset the high prio transactionId
180 oo.mutexHpTid.Unlock()
181 oo.mutexTid.Lock()
182 oo.tid = 1 //reset the low prio transactionId
183 oo.mutexTid.Unlock()
184 //reset control values
185 oo.uploadSequNo = 0
186 oo.uploadNoOfCmds = 0
mpagenkoc8bba412021-01-15 15:38:44 +0000187 oo.rxOmciFrameError = cOmciMessageReceiveNoError
mpagenko900ee4b2020-10-12 11:56:34 +0000188 //reset the stats counter - which might be topic of discussion ...
189 oo.txFrames = 0
190 oo.txOnuFrames = 0
191 oo.rxFrames = 0
192 oo.rxOnuFrames = 0
193 oo.rxOnuDiscards = 0
194
195 return nil
196}
197
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000198// Rx handler for omci messages
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530199func (oo *omciCC) receiveOnuMessage(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000200 logger.Debugw(ctx, "rx-onu-autonomous-message", log.Fields{"omciMsgType": omciMsg.MessageType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000201 "payload": hex.EncodeToString(omciMsg.Payload)})
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530202 switch omciMsg.MessageType {
203 case omci.AlarmNotificationType:
204 data := OmciMessage{
205 OmciMsg: omciMsg,
206 OmciPacket: packet,
207 }
208 go oo.pBaseDeviceHandler.pAlarmMgr.handleOmciAlarmNotificationMessage(ctx, data)
209 return nil
210 default:
211 return fmt.Errorf("receiveOnuMessageType %s unimplemented", omciMsg.MessageType.String())
212 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000213 /*
214 msgType = rxFrame.fields["message_type"] //assumed OmciOperationsValue
215 rxOnuFrames++
216
217 switch msgType {
218 case AlarmNotification:
219 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000220 logger.Info("Unhandled: received-onu-alarm-message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000221 // python code was:
222 //if msg_type == EntityOperations.AlarmNotification.value:
223 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Alarm_Notification)
224 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
225 //
226 return errors.New("RxAlarmNotification unimplemented")
227 }
228 case AttributeValueChange:
229 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000230 logger.Info("Unhandled: received-attribute-value-change")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000231 // python code was:
232 //elif msg_type == EntityOperations.AttributeValueChange.value:
233 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.AVC_Notification)
234 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
235 //
236 return errors.New("RxAttributeValueChange unimplemented")
237 }
238 case TestResult:
239 {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000240 logger.Info("Unhandled: received-test-result")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000241 // python code was:
242 //elif msg_type == EntityOperations.TestResult.value:
243 // topic = OMCI_CC.event_bus_topic(self._device_id, RxEvent.Test_Result)
244 // self.reactor.callLater(0, self.event_bus.publish, topic, msg)
245 //
246 return errors.New("RxTestResult unimplemented")
247 }
248 default:
249 {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000250 logger.Errorw(ctx,"rx-onu-unsupported-autonomous-message", log.Fields{"msgType": msgType})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000251 rxOnuDiscards++
252 return errors.New("RxOnuMsgType unimplemented")
253 }
254 }
255 */
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000256}
257
mpagenko80622a52021-02-09 16:53:23 +0000258func (oo *omciCC) printRxMessage(ctx context.Context, rxMsg []byte) {
259 //assuming omci message content is hex coded!
260 // with restricted output of 16bytes would be ...rxMsg[:16]
261 logger.Debugw(ctx, "omci-message-received:", log.Fields{
262 "RxOmciMessage": hex.EncodeToString(rxMsg),
263 "device-id": oo.deviceID})
264}
265
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000266// Rx handler for onu messages
267// e.g. would call ReceiveOnuMessage() in case of TID=0 or Action=test ...
Himani Chawla6d2ae152020-09-02 13:11:20 +0530268func (oo *omciCC) receiveMessage(ctx context.Context, rxMsg []byte) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000269 //logger.Debugw(ctx,"cc-receive-omci-message", log.Fields{"RxOmciMessage-x2s": hex.EncodeToString(rxMsg)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000270 if len(rxMsg) >= 44 { // then it should normally include the BaseFormat trailer Len
271 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
mpagenkoc8bba412021-01-15 15:38:44 +0000272 // (an extendedFormat message could be destroyed this way!)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000273 trailerLenData := rxMsg[42:44]
274 trailerLen := binary.BigEndian.Uint16(trailerLenData)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000275 //logger.Debugw(ctx,"omci-received-trailer-len", log.Fields{"Length": trailerLen})
mpagenkoc8bba412021-01-15 15:38:44 +0000276 if trailerLen != cOmciBaseMessageTrailerLen { // invalid base Format entry -> autocorrect
277 binary.BigEndian.PutUint16(rxMsg[42:44], cOmciBaseMessageTrailerLen)
278 if oo.rxOmciFrameError != cOmciMessageReceiveErrorTrailerLen {
279 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
280 logger.Errorw(ctx, "wrong omci-message trailer length: trailer len auto-corrected",
281 log.Fields{"trailer-length": trailerLen, "device-id": oo.deviceID})
282 oo.rxOmciFrameError = cOmciMessageReceiveErrorTrailerLen
283 }
284 }
285 } else if len(rxMsg) >= cOmciBaseMessageTrailerLen { // workaround for Adtran OLT Sim, which currently does not send trailer bytes at all!
286 // NOTE: autocorrection only valid for OmciBaseFormat, which is not specifically verified here!!!
287 // (an extendedFormat message could be destroyed this way!)
288 // extend/overwrite with trailer
289 trailer := make([]byte, 8)
290 binary.BigEndian.PutUint16(trailer[2:], cOmciBaseMessageTrailerLen) //set the defined baseline length
291 rxMsg = append(rxMsg[:cOmciBaseMessageTrailerLen], trailer...)
292 if oo.rxOmciFrameError != cOmciMessageReceiveErrorMissTrailer {
293 //do just one error log, expectation is: if seen once it should appear regularly - avoid to many log entries
294 logger.Errorw(ctx, "omci-message to short to include trailer len: trailer auto-corrected (added)",
295 log.Fields{"message-length": len(rxMsg), "device-id": oo.deviceID})
296 oo.rxOmciFrameError = cOmciMessageReceiveErrorMissTrailer
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000297 }
298 } else {
mpagenkoc8bba412021-01-15 15:38:44 +0000299 logger.Errorw(ctx, "received omci-message too small for OmciBaseFormat - abort",
300 log.Fields{"Length": len(rxMsg), "device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000301 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200302 return fmt.Errorf("rxOmciMessage too small for BaseFormat %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000303 }
304
305 packet := gopacket.NewPacket(rxMsg, omci.LayerTypeOMCI, gopacket.NoCopy)
306 if packet == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000307 logger.Errorw(ctx, "omci-message could not be decoded", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000308 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200309 return fmt.Errorf("could not decode rxMsg as OMCI %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000310 }
311 omciLayer := packet.Layer(omci.LayerTypeOMCI)
312 if omciLayer == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000313 logger.Errorw(ctx, "omci-message could not decode omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000314 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200315 return fmt.Errorf("could not decode omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000316 }
317 omciMsg, ok := omciLayer.(*omci.OMCI)
318 if !ok {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000319 logger.Errorw(ctx, "omci-message could not assign omci layer", log.Fields{"device-id": oo.deviceID})
mpagenko80622a52021-02-09 16:53:23 +0000320 oo.printRxMessage(ctx, rxMsg)
Andrea Campanella6515c582020-10-05 11:25:00 +0200321 return fmt.Errorf("could not assign omci layer %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000322 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000323 logger.Debugw(ctx, "omci-message-decoded:", log.Fields{"omciMsgType": omciMsg.MessageType,
mpagenko3dbcdd22020-07-22 07:38:45 +0000324 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "DeviceIdent": omciMsg.DeviceIdentifier})
Holger Hildebrandt2fb70892020-10-28 11:53:18 +0000325 if byte(omciMsg.MessageType)&me.AK == 0 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000326 // Not a response
mpagenko80622a52021-02-09 16:53:23 +0000327 oo.printRxMessage(ctx, rxMsg)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000328 logger.Debug(ctx, "RxMsg is no Omci Response Message")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000329 if omciMsg.TransactionID == 0 {
Himani Chawlaac1f5ad2021-02-04 21:21:54 +0530330 return oo.receiveOnuMessage(ctx, omciMsg, &packet)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000331 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000332 logger.Errorw(ctx, "Unexpected TransCorrId != 0 not accepted for autonomous messages",
Andrea Campanella6515c582020-10-05 11:25:00 +0200333 log.Fields{"msgType": omciMsg.MessageType, "payload": hex.EncodeToString(omciMsg.Payload),
mpagenko8b07c1b2020-11-26 10:36:31 +0000334 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200335 return fmt.Errorf("autonomous Omci Message with TranSCorrId != 0 not acccepted %s", oo.deviceID)
Himani Chawla4d908332020-08-31 12:30:20 +0530336
337 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000338 //logger.Debug(ctx,"RxMsg is a Omci Response Message: try to schedule it to the requester")
Himani Chawla4d908332020-08-31 12:30:20 +0530339 oo.mutexRxSchedMap.Lock()
340 rxCallbackEntry, ok := oo.rxSchedulerMap[omciMsg.TransactionID]
341 if ok && rxCallbackEntry.cbFunction != nil {
mpagenko80622a52021-02-09 16:53:23 +0000342 if rxCallbackEntry.framePrint {
343 oo.printRxMessage(ctx, rxMsg)
344 }
Himani Chawla4d908332020-08-31 12:30:20 +0530345 //disadvantage of decoupling: error verification made difficult, but anyway the question is
346 // how to react on erroneous frame reception, maybe can simply be ignored
dbainbri4d3a0dc2020-12-02 00:33:42 +0000347 go rxCallbackEntry.cbFunction(ctx, omciMsg, &packet, rxCallbackEntry.cbRespChannel)
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +0000348 if isResponseWithMibDataSync(omciMsg.MessageType) {
349 oo.pOnuDeviceEntry.incrementMibDataSync(ctx)
350 }
mpagenkoc8bba412021-01-15 15:38:44 +0000351
Himani Chawla4d908332020-08-31 12:30:20 +0530352 // having posted the response the request is regarded as 'done'
353 delete(oo.rxSchedulerMap, omciMsg.TransactionID)
354 oo.mutexRxSchedMap.Unlock()
mpagenko80622a52021-02-09 16:53:23 +0000355 return nil
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000356 }
mpagenko80622a52021-02-09 16:53:23 +0000357 oo.mutexRxSchedMap.Unlock()
358 logger.Errorw(ctx, "omci-message-response for not registered transCorrId", log.Fields{"device-id": oo.deviceID})
359 oo.printRxMessage(ctx, rxMsg)
360 return fmt.Errorf("could not find registered response handler tor transCorrId %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000361
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000362 /* py code was:
363 Receive and OMCI message from the proxy channel to the OLT.
364
365 Call this from your ONU Adapter on a new OMCI Rx on the proxy channel
366 :param msg: (str) OMCI binary message (used as input to Scapy packet decoder)
367 """
368 if not self.enabled:
369 return
370
371 try:
372 now = arrow.utcnow()
373 d = None
374
375 # NOTE: Since we may need to do an independent ME map on a per-ONU basis
376 # save the current value of the entity_id_to_class_map, then
377 # replace it with our custom one before decode, and then finally
378 # restore it later. Tried other ways but really made the code messy.
379 saved_me_map = omci_entities.entity_id_to_class_map
380 omci_entities.entity_id_to_class_map = self._me_map
381
382 try:
383 rx_frame = msg if isinstance(msg, OmciFrame) else OmciFrame(msg)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000384 self.logger.debug('recv-omci-msg', omci_msg=hexlify(msg))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000385 except KeyError as e:
386 # Unknown, Unsupported, or vendor-specific ME. Key is the unknown classID
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000387 self.logger.debug('frame-decode-key-error', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000388 rx_frame = self._decode_unknown_me(msg)
389 self._rx_unknown_me += 1
390
391 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000392 self.logger.exception('frame-decode', omci_msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000393 return
394
395 finally:
396 omci_entities.entity_id_to_class_map = saved_me_map # Always restore it.
397
398 rx_tid = rx_frame.fields['transaction_id']
399 msg_type = rx_frame.fields['message_type']
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000400 self.logger.debug('Received message for rx_tid', rx_tid = rx_tid, msg_type = msg_type)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000401 # Filter the Test Result frame and route through receive onu
402 # message method.
403 if rx_tid == 0 or msg_type == EntityOperations.TestResult.value:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000404 self.logger.debug('Receive ONU message', rx_tid=0)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000405 return self._receive_onu_message(rx_frame)
406
407 # Previously unreachable if this is the very first round-trip Rx or we
408 # have been running consecutive errors
409 if self._rx_frames == 0 or self._consecutive_errors != 0:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000410 self.logger.debug('Consecutive errors for rx', err = self._consecutive_errors)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000411 self.reactor.callLater(0, self._publish_connectivity_event, True)
412
413 self._rx_frames += 1
414 self._consecutive_errors = 0
415
416 try:
417 high_priority = self._tid_is_high_priority(rx_tid)
418 index = self._get_priority_index(high_priority)
419
420 # (timestamp, defer, frame, timeout, retry, delayedCall)
421 last_tx_tuple = self._tx_request[index]
422
423 if last_tx_tuple is None or \
424 last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id') != rx_tid:
425 # Possible late Rx on a message that timed-out
426 if last_tx_tuple:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000427 self.logger.debug('Unknown message', rx_tid=rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000428 tx_id=last_tx_tuple[OMCI_CC.REQUEST_FRAME].fields.get('transaction_id'))
429 self._rx_unknown_tid += 1
430 self._rx_late += 1
431 return
432
433 ts, d, tx_frame, timeout, retry, dc = last_tx_tuple
434 if dc is not None and not dc.cancelled and not dc.called:
435 dc.cancel()
436
437 _secs = self._update_rx_tx_stats(now, ts)
438
439 # Late arrival already serviced by a timeout?
440 if d.called:
441 self._rx_late += 1
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000442 self.logger.debug('Serviced by timeout. Late arrival', rx_late = self._rx_late)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000443 return
444
445 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000446 self.logger.exception('frame-match', msg=hexlify(msg), e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000447 if d is not None:
448 return d.errback(failure.Failure(e))
449 return
450
451 # Publish Rx event to listeners in a different task
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000452 self.logger.debug('Publish rx event', rx_tid = rx_tid,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000453 tx_tid = tx_frame.fields['transaction_id'])
454 reactor.callLater(0, self._publish_rx_frame, tx_frame, rx_frame)
455
456 # begin success callback chain (will cancel timeout and queue next Tx message)
457 self._rx_response[index] = rx_frame
458 d.callback(rx_frame)
459
460 except Exception as e:
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000461 self.logger.exception('rx-msg', e=e)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000462 */
463}
464
Himani Chawla6d2ae152020-09-02 13:11:20 +0530465/*
466func (oo *omciCC) publishRxResponseFrame(ctx context.Context, txFrame []byte, rxFrame []byte) error {
Himani Chawla4d908332020-08-31 12:30:20 +0530467 return errors.New("publishRxResponseFrame unimplemented")
Himani Chawla6d2ae152020-09-02 13:11:20 +0530468 //def _publish_rx_frame(self, tx_frame, rx_frame):
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000469}
Himani Chawla6d2ae152020-09-02 13:11:20 +0530470*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000471
472//Queue the OMCI Frame for a transmit to the ONU via the proxy_channel
Himani Chawla6d2ae152020-09-02 13:11:20 +0530473func (oo *omciCC) send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
474 receiveCallbackPair callbackPair) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000475
dbainbri4d3a0dc2020-12-02 00:33:42 +0000476 logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": receiveCallbackPair.cbKey})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000477 // it could be checked, if the callback keay is already registered - but simply overwrite may be acceptable ...
478 oo.mutexRxSchedMap.Lock()
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000479 oo.rxSchedulerMap[receiveCallbackPair.cbKey] = receiveCallbackPair.cbEntry
mpagenko80622a52021-02-09 16:53:23 +0000480 printFrame := receiveCallbackPair.cbEntry.framePrint //printFrame true means debug print of frame is requested
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000481 oo.mutexRxSchedMap.Unlock()
482
483 //just use a simple list for starting - might need some more effort, especially for multi source write access
484 omciTxRequest := omciTransferStructure{
485 txFrame,
486 timeout,
487 retry,
488 highPrio,
mpagenko80622a52021-02-09 16:53:23 +0000489 printFrame,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000490 }
491 oo.mutexTxQueue.Lock()
492 oo.txQueue.PushBack(omciTxRequest) // enqueue
493 oo.mutexTxQueue.Unlock()
494
495 // for first test just bypass and send directly:
496 go oo.sendNextRequest(ctx)
497 return nil
498}
499
500//Pull next tx request and send it
Himani Chawla6d2ae152020-09-02 13:11:20 +0530501func (oo *omciCC) sendNextRequest(ctx context.Context) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000502 // return errors.New("sendNextRequest unimplemented")
503
504 // just try to get something transferred !!
505 // avoid accessing the txQueue from parallel send requests
506 // block parallel omci send requests at least until SendIAP is 'committed'
507 // that should be feasible for an onu instance as on OMCI anyway window size 1 is assumed
508 oo.mutexTxQueue.Lock()
mpagenkodff5dda2020-08-28 11:52:01 +0000509 defer oo.mutexTxQueue.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000510 for oo.txQueue.Len() > 0 {
511 queueElement := oo.txQueue.Front() // First element
512 omciTxRequest := queueElement.Value.(omciTransferStructure)
513 /* compare olt device handler code:
514 func (dh *DeviceHandler) omciIndication(omciInd *oop.OmciIndication) {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000515 logger.Debugw(ctx,"omci indication", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000516 var deviceType string
517 var deviceID string
518 var proxyDeviceID string
519
520 onuKey := dh.formOnuKey(omciInd.IntfId, omciInd.OnuId)
521
522 if onuInCache, ok := dh.onus.Load(onuKey); !ok {
523
dbainbri4d3a0dc2020-12-02 00:33:42 +0000524 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 +0000525 ponPort := IntfIDToPortNo(omciInd.GetIntfId(), voltha.Port_PON_OLT)
526 kwargs := make(map[string]interface{})
527 kwargs["onu_id"] = omciInd.OnuId
528 kwargs["parent_port_no"] = ponPort
529
dbainbri4d3a0dc2020-12-02 00:33:42 +0000530 onuDevice, err := dh.coreProxy.GetChildDevice(log.WithSpanFromContext(context.TODO(), ctx), dh.device.Id, kwargs)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000531 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000532 logger.Errorw(ctx,"onu not found", log.Fields{"intfID": omciInd.IntfId, "onuID": omciInd.OnuId, "error": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000533 return
534 }
535 deviceType = onuDevice.Type
536 deviceID = onuDevice.Id
537 proxyDeviceID = onuDevice.ProxyAddress.DeviceId
538 //if not exist in cache, then add to cache.
539 dh.onus.Store(onuKey, NewOnuDevice(deviceID, deviceType, onuDevice.SerialNumber, omciInd.OnuId, omciInd.IntfId, proxyDeviceID))
540 } else {
541 //found in cache
dbainbri4d3a0dc2020-12-02 00:33:42 +0000542 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 +0000543 deviceType = onuInCache.(*OnuDevice).deviceType
544 deviceID = onuInCache.(*OnuDevice).deviceID
545 proxyDeviceID = onuInCache.(*OnuDevice).proxyDeviceID
546 }
547 */
548 /* and compare onu_adapter py code:
549 omci_msg = InterAdapterOmciMessage(
550 message=bytes(frame),
551 proxy_address=self._proxy_address,
552 connect_status=self._device.connect_status)
553
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000554 self.logger.debug('sent-omci-msg', tid=tx_tid, omci_msg=hexlify(bytes(frame)))
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000555
556 yield self._adapter_proxy.send_inter_adapter_message(
557 msg=omci_msg,
558 type=InterAdapterMessageType.OMCI_REQUEST,
559 from_adapter=self._device.type,
560 to_adapter=self._proxy_address.device_type,
561 to_device_id=self._device_id,
562 proxy_device_id=self._proxy_address.device_id
563 )
564 */
565 device, err := oo.coreProxy.GetDevice(ctx,
566 oo.pBaseDeviceHandler.deviceID, oo.deviceID) //parent, child
567 if err != nil || device == nil {
568 /*TODO: needs to handle error scenarios */
dbainbri4d3a0dc2020-12-02 00:33:42 +0000569 logger.Errorw(ctx, "Failed to fetch device", log.Fields{"err": err, "ParentId": oo.pBaseDeviceHandler.deviceID,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000570 "ChildId": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200571 return fmt.Errorf("failed to fetch device %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000572 }
573
mpagenko80622a52021-02-09 16:53:23 +0000574 if omciTxRequest.withFramePrint {
575 logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
576 "TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
577 "device-id": oo.deviceID,
578 "toDeviceType": oo.pBaseDeviceHandler.ProxyAddressType,
579 "proxyDeviceID": oo.pBaseDeviceHandler.ProxyAddressID})
580 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000581 omciMsg := &ic.InterAdapterOmciMessage{Message: omciTxRequest.txFrame}
dbainbri4d3a0dc2020-12-02 00:33:42 +0000582 if sendErr := oo.adapterProxy.SendInterAdapterMessage(log.WithSpanFromContext(context.Background(), ctx), omciMsg,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000583 ic.InterAdapterMessageType_OMCI_REQUEST,
Matteo Scandoloefbec272020-11-17 10:33:09 -0800584 //fromTopic,toType,toDevId, ProxyDevId
585 oo.pOnuDeviceEntry.baseDeviceHandler.pOpenOnuAc.config.Topic, oo.pBaseDeviceHandler.ProxyAddressType,
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000586 oo.deviceID, oo.pBaseDeviceHandler.ProxyAddressID, ""); sendErr != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000587 logger.Errorw(ctx, "send omci request error", log.Fields{"ChildId": oo.deviceID, "error": sendErr})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000588 return sendErr
589 }
590 oo.txQueue.Remove(queueElement) // Dequeue
591 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000592 return nil
593}
594
Himani Chawla6d2ae152020-09-02 13:11:20 +0530595func (oo *omciCC) getNextTid(highPriority bool) uint16 {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000596 var next uint16
597 if highPriority {
mpagenko900ee4b2020-10-12 11:56:34 +0000598 oo.mutexHpTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000599 next = oo.hpTid
Himani Chawla4d908332020-08-31 12:30:20 +0530600 oo.hpTid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000601 if oo.hpTid < 0x8000 {
602 oo.hpTid = 0x8000
603 }
mpagenko900ee4b2020-10-12 11:56:34 +0000604 oo.mutexHpTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000605 } else {
mpagenko900ee4b2020-10-12 11:56:34 +0000606 oo.mutexTid.Lock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000607 next = oo.tid
Himani Chawla4d908332020-08-31 12:30:20 +0530608 oo.tid++
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000609 if oo.tid >= 0x8000 {
610 oo.tid = 1
611 }
mpagenko900ee4b2020-10-12 11:56:34 +0000612 oo.mutexTid.Unlock()
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000613 }
614 return next
615}
616
617// ###################################################################################
618// # utility methods provided to work on OMCI messages
dbainbri4d3a0dc2020-12-02 00:33:42 +0000619func serialize(ctx context.Context, msgType omci.MessageType, request gopacket.SerializableLayer, tid uint16) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000620 omciLayer := &omci.OMCI{
621 TransactionID: tid,
622 MessageType: msgType,
623 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000624 return serializeOmciLayer(ctx, omciLayer, request)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000625}
626
dbainbri4d3a0dc2020-12-02 00:33:42 +0000627func serializeOmciLayer(ctx context.Context, aOmciLayer *omci.OMCI, aRequest gopacket.SerializableLayer) ([]byte, error) {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000628 var options gopacket.SerializeOptions
629 options.FixLengths = true
630
631 buffer := gopacket.NewSerializeBuffer()
Himani Chawla4d908332020-08-31 12:30:20 +0530632 err := gopacket.SerializeLayers(buffer, options, aOmciLayer, aRequest)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000633 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000634 logger.Errorw(ctx, "Could not create goPacket Omci serial buffer", log.Fields{"Err": err})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000635 return nil, err
636 }
637 return buffer.Bytes(), nil
638}
639
Himani Chawla4d908332020-08-31 12:30:20 +0530640/*
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000641func hexEncode(omciPkt []byte) ([]byte, error) {
642 dst := make([]byte, hex.EncodedLen(len(omciPkt)))
643 hex.Encode(dst, omciPkt)
644 return dst, nil
645}
Himani Chawla4d908332020-08-31 12:30:20 +0530646*/
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000647
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000648//supply a response handler for omci response messages to be transferred to the requested FSM
dbainbri4d3a0dc2020-12-02 00:33:42 +0000649func (oo *omciCC) receiveOmciResponse(ctx context.Context, omciMsg *omci.OMCI, packet *gp.Packet, respChan chan Message) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000650
dbainbri4d3a0dc2020-12-02 00:33:42 +0000651 logger.Debugw(ctx, "omci-message-response - transfer on omciRespChannel", log.Fields{"omciMsgType": omciMsg.MessageType,
divyadesai4d299552020-08-18 07:13:49 +0000652 "transCorrId": strconv.FormatInt(int64(omciMsg.TransactionID), 16), "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000653
654 if oo.pOnuDeviceEntry == nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000655 logger.Errorw(ctx, "Abort receiving OMCI response, DeviceEntryPointer is nil", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000656 "device-id": oo.deviceID})
Andrea Campanella6515c582020-10-05 11:25:00 +0200657 return fmt.Errorf("deviceEntryPointer is nil %s", oo.deviceID)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000658 }
659
660 // no further test on SeqNo is done here, assignment from rxScheduler is trusted
661 // MibSync responses are simply transferred via deviceEntry to MibSync, no specific analysis here
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000662 omciRespMsg := Message{
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000663 Type: OMCI,
664 Data: OmciMessage{
665 OmciMsg: omciMsg,
666 OmciPacket: packet,
667 },
668 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000669 //logger.Debugw(ctx,"Message to be sent into channel:", log.Fields{"mibSyncMsg": mibSyncMsg})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000670 respChan <- omciRespMsg
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000671
672 return nil
673}
674
Himani Chawla6d2ae152020-09-02 13:11:20 +0530675func (oo *omciCC) sendMibReset(ctx context.Context, timeout int, highPrio bool) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000676
dbainbri4d3a0dc2020-12-02 00:33:42 +0000677 logger.Debugw(ctx, "send MibReset-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000678 request := &omci.MibResetRequest{
679 MeBasePacket: omci.MeBasePacket{
680 EntityClass: me.OnuDataClassID,
681 },
682 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530683 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000684 pkt, err := serialize(ctx, omci.MibResetRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000685 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000686 logger.Errorw(ctx, "Cannot serialize MibResetRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000687 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000688 return err
689 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530690 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000691 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000692 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000693 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530694 return oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000695}
696
Himani Chawla6d2ae152020-09-02 13:11:20 +0530697func (oo *omciCC) sendReboot(ctx context.Context, timeout int, highPrio bool, responseChannel chan Message) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000698 logger.Debugw(ctx, "send Reboot-msg to:", log.Fields{"device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300699 request := &omci.RebootRequest{
700 MeBasePacket: omci.MeBasePacket{
701 EntityClass: me.OnuGClassID,
702 },
703 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530704 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000705 pkt, err := serialize(ctx, omci.RebootRequestType, request, tid)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300706 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000707 logger.Errorw(ctx, "Cannot serialize RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000708 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300709 return err
710 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530711 omciRxCallbackPair := callbackPair{
ozgecanetsiae11479f2020-07-06 09:44:47 +0300712 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000713 cbEntry: callbackPairEntry{oo.pOnuDeviceEntry.omciRebootMessageReceivedChannel, oo.receiveOmciResponse, true},
ozgecanetsiae11479f2020-07-06 09:44:47 +0300714 }
715
Himani Chawla6d2ae152020-09-02 13:11:20 +0530716 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300717 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000718 logger.Errorw(ctx, "Cannot send RebootRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000719 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300720 return err
721 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000722 err = oo.pOnuDeviceEntry.waitForRebootResponse(ctx, responseChannel)
ozgecanetsiae11479f2020-07-06 09:44:47 +0300723 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000724 logger.Errorw(ctx, "aborting ONU Reboot!", log.Fields{
Andrea Campanella6515c582020-10-05 11:25:00 +0200725 "Err": err, "device-id": oo.deviceID})
ozgecanetsiae11479f2020-07-06 09:44:47 +0300726 return err
727 }
728 return nil
729}
730
Himani Chawla6d2ae152020-09-02 13:11:20 +0530731func (oo *omciCC) sendMibUpload(ctx context.Context, timeout int, highPrio bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000732 logger.Debugw(ctx, "send MibUpload-msg to:", log.Fields{"device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000733 request := &omci.MibUploadRequest{
734 MeBasePacket: omci.MeBasePacket{
735 EntityClass: me.OnuDataClassID,
736 },
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.MibUploadRequestType, 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 MibUploadRequest", 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 = 0
746 oo.uploadNoOfCmds = 0
747
Himani Chawla6d2ae152020-09-02 13:11:20 +0530748 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000749 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000750 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000751 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530752 return oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000753}
754
Himani Chawla6d2ae152020-09-02 13:11:20 +0530755func (oo *omciCC) sendMibUploadNext(ctx context.Context, timeout int, highPrio bool) error {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000756 logger.Debugw(ctx, "send MibUploadNext-msg to:", log.Fields{"device-id": oo.deviceID, "uploadSequNo": oo.uploadSequNo})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000757 request := &omci.MibUploadNextRequest{
758 MeBasePacket: omci.MeBasePacket{
759 EntityClass: me.OnuDataClassID,
760 },
761 CommandSequenceNumber: oo.uploadSequNo,
762 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530763 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000764 pkt, err := serialize(ctx, omci.MibUploadNextRequestType, request, tid)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000765 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000766 logger.Errorw(ctx, "Cannot serialize MibUploadNextRequest", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000767 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000768 return err
769 }
770 oo.uploadSequNo++
771
Himani Chawla6d2ae152020-09-02 13:11:20 +0530772 omciRxCallbackPair := callbackPair{
mpagenko80622a52021-02-09 16:53:23 +0000773 cbKey: tid,
774 //frame printing for MibUpload frames disabled now per default to avoid log file abort situations (size/speed?)
775 // if wanted, rx frame printing should be specifically done within the MibUpload FSM or controlled via extra parameter
776 // compare also software upgrade download section handling
777 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibUploadFsm.commChan, oo.receiveOmciResponse, false},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000778 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530779 return oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000780}
781
Himani Chawla6d2ae152020-09-02 13:11:20 +0530782func (oo *omciCC) sendCreateGalEthernetProfile(ctx context.Context, timeout int, highPrio bool) *me.ManagedEntity {
783 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000784 logger.Debugw(ctx, "send GalEnetProfile-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000785 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000786
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000787 meParams := me.ParamData{
788 EntityID: galEthernetEID,
789 Attributes: me.AttributeValueMap{"MaximumGemPayloadSize": maxGemPayloadSize},
790 }
791 meInstance, omciErr := me.NewGalEthernetProfile(meParams)
792 if omciErr.GetError() == nil {
793 //all setByCreate parameters already set, no default option required ...
794 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
795 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000796 logger.Errorw(ctx, "Cannot encode GalEnetProfileInstance for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000797 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000798 return nil
799 }
800
dbainbri4d3a0dc2020-12-02 00:33:42 +0000801 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000802 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000803 logger.Errorw(ctx, "Cannot serialize GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000804 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000805 return nil
806 }
807
Himani Chawla6d2ae152020-09-02 13:11:20 +0530808 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000809 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000810 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000811 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530812 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000813 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000814 logger.Errorw(ctx, "Cannot send GalEnetProfile create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000815 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000816 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000817 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000818 logger.Debug(ctx, "send GalEnetProfile-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +0000819 return meInstance
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000820 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000821 logger.Errorw(ctx, "Cannot generate GalEnetProfileInstance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000822 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +0000823 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000824}
825
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000826// might be needed to extend for parameter arguments, here just for setting the ConnectivityMode!!
Himani Chawla6d2ae152020-09-02 13:11:20 +0530827func (oo *omciCC) sendSetOnu2g(ctx context.Context, timeout int, highPrio bool) *me.ManagedEntity {
828 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000829 logger.Debugw(ctx, "send ONU2-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000830 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000831
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000832 // ONU-G ME-ID is defined to be 0, but we could verify, if the ONU really supports the desired
833 // connectivity mode 5 (in ConnCap)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000834 // By now we just use fix values to fire - this is anyway what the python adapter does
835 // read ONU-2G from DB ???? //TODO!!!
836 meParams := me.ParamData{
837 EntityID: 0,
838 Attributes: me.AttributeValueMap{"CurrentConnectivityMode": connectivityModeValue},
839 }
840 meInstance, omciErr := me.NewOnu2G(meParams)
841 if omciErr.GetError() == nil {
842 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
843 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000844 logger.Errorw(ctx, "Cannot encode ONU2-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000845 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000846 return nil
847 }
848
dbainbri4d3a0dc2020-12-02 00:33:42 +0000849 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000850 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000851 logger.Errorw(ctx, "Cannot serialize ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000852 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000853 return nil
854 }
855
Himani Chawla6d2ae152020-09-02 13:11:20 +0530856 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000857 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000858 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000859 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530860 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000861 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000862 logger.Errorw(ctx, "Cannot send ONU2-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000863 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000864 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000865 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000866 logger.Debug(ctx, "send ONU2-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +0000867 return meInstance
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000868 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000869 logger.Errorw(ctx, "Cannot generate ONU2-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000870 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +0000871 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000872}
873
Himani Chawla6d2ae152020-09-02 13:11:20 +0530874func (oo *omciCC) sendCreateMBServiceProfile(ctx context.Context,
875 aPUniPort *onuUniPort, timeout int, highPrio bool) *me.ManagedEntity {
876 tid := oo.getNextTid(highPrio)
Himani Chawla4d908332020-08-31 12:30:20 +0530877 instID := macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000878 logger.Debugw(ctx, "send MBSP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000879 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000880
881 meParams := me.ParamData{
882 EntityID: instID,
883 Attributes: me.AttributeValueMap{
ozgecanetsiab5000ef2020-11-27 14:38:20 +0300884 "Priority": 0x8000,
885 "MaxAge": 20 * 256, //20s
886 "HelloTime": 2 * 256, //2s
887 "ForwardDelay": 15 * 256, //15s
888 "DynamicFilteringAgeingTime": 0,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000889 },
890 }
891
892 meInstance, omciErr := me.NewMacBridgeServiceProfile(meParams)
893 if omciErr.GetError() == nil {
894 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
895 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
896 omci.TransactionID(tid), omci.AddDefaults(true))
897 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000898 logger.Errorw(ctx, "Cannot encode MBSP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000899 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000900 return nil
901 }
902
dbainbri4d3a0dc2020-12-02 00:33:42 +0000903 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000904 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000905 logger.Errorw(ctx, "Cannot serialize MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000906 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000907 return nil
908 }
909
Himani Chawla6d2ae152020-09-02 13:11:20 +0530910 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000911 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000912 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000913 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530914 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000915 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000916 logger.Errorw(ctx, "Cannot send MBSP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000917 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000918 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000919 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000920 logger.Debug(ctx, "send MBSP-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +0000921 return meInstance
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000922 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000923 logger.Errorw(ctx, "Cannot generate MBSP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000924 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +0000925 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000926}
927
Himani Chawla6d2ae152020-09-02 13:11:20 +0530928func (oo *omciCC) sendCreateMBPConfigData(ctx context.Context,
929 aPUniPort *onuUniPort, timeout int, highPrio bool) *me.ManagedEntity {
930 tid := oo.getNextTid(highPrio)
Himani Chawla26e555c2020-08-31 12:30:20 +0530931 instID := macBridgePortAniEID + aPUniPort.entityID
dbainbri4d3a0dc2020-12-02 00:33:42 +0000932 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000933 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000934
935 meParams := me.ParamData{
936 EntityID: instID,
937 Attributes: me.AttributeValueMap{
Himani Chawla4d908332020-08-31 12:30:20 +0530938 "BridgeIdPointer": macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo),
939 "PortNum": aPUniPort.macBpNo,
940 "TpType": uint8(aPUniPort.portType),
Himani Chawla26e555c2020-08-31 12:30:20 +0530941 "TpPointer": aPUniPort.entityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000942 },
943 }
944 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
945 if omciErr.GetError() == nil {
946 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
947 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
948 omci.TransactionID(tid), omci.AddDefaults(true))
949 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000950 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000951 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000952 return nil
953 }
954
dbainbri4d3a0dc2020-12-02 00:33:42 +0000955 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000956 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000957 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000958 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000959 return nil
960 }
961
Himani Chawla6d2ae152020-09-02 13:11:20 +0530962 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000963 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +0000964 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +0000965 }
Himani Chawla6d2ae152020-09-02 13:11:20 +0530966 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000967 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +0000968 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000969 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000970 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000971 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000972 logger.Debug(ctx, "send MBPCD-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +0000973 return meInstance
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000974 }
dbainbri4d3a0dc2020-12-02 00:33:42 +0000975 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000976 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +0000977 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000978}
979
Himani Chawla6d2ae152020-09-02 13:11:20 +0530980func (oo *omciCC) sendCreateEVTOConfigData(ctx context.Context,
981 aPUniPort *onuUniPort, timeout int, highPrio bool) *me.ManagedEntity {
982 tid := oo.getNextTid(highPrio)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000983 //same entityId is used as for MBSP (see there), but just arbitrary ...
Himani Chawla4d908332020-08-31 12:30:20 +0530984 instID := macBridgeServiceProfileEID + uint16(aPUniPort.macBpNo)
dbainbri4d3a0dc2020-12-02 00:33:42 +0000985 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +0000986 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(instID), 16)})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000987
988 // compare python adapter code WA VOL-1311: this is not done here!
989 // (setting TPID values for the create would probably anyway be ignored by the omci lib)
990 // but perhaps we have to be aware of possible problems at get(Next) Request handling for EVTOOCD tables later ...
991 assType := uint8(2) // default AssociationType is PPTPEthUni
Himani Chawla6d2ae152020-09-02 13:11:20 +0530992 if aPUniPort.portType == uniVEIP {
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +0000993 assType = uint8(10) // for VEIP
994 }
995 meParams := me.ParamData{
996 EntityID: instID,
997 Attributes: me.AttributeValueMap{
998 "AssociationType": assType,
Himani Chawla26e555c2020-08-31 12:30:20 +0530999 "AssociatedMePointer": aPUniPort.entityID,
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001000 },
1001 }
1002 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(meParams)
1003 if omciErr.GetError() == nil {
1004 //all setByCreate parameters already set, no default option required ...
1005 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1006 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001007 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001008 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001009 return nil
1010 }
1011
dbainbri4d3a0dc2020-12-02 00:33:42 +00001012 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001013 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001014 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001015 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001016 return nil
1017 }
1018
Himani Chawla6d2ae152020-09-02 13:11:20 +05301019 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001020 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001021 cbEntry: callbackPairEntry{(*oo.pOnuDeviceEntry).pMibDownloadFsm.commChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001022 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301023 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001024 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001025 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001026 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001027 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001028 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001029 logger.Debug(ctx, "send EVTOCD-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001030 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001031 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001032 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001033 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001034 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001035}
1036
Himani Chawla6d2ae152020-09-02 13:11:20 +05301037func (oo *omciCC) sendSetOnuGLS(ctx context.Context, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001038 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301039 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001040 logger.Debugw(ctx, "send ONU-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001041 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001042
1043 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1044 meParams := me.ParamData{
1045 EntityID: 0,
1046 Attributes: requestedAttributes,
1047 }
1048 meInstance, omciErr := me.NewOnuG(meParams)
1049 if omciErr.GetError() == nil {
1050 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1051 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001052 logger.Errorw(ctx, "Cannot encode ONU-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001053 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001054 return nil
1055 }
1056
dbainbri4d3a0dc2020-12-02 00:33:42 +00001057 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001058 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001059 logger.Errorw(ctx, "Cannot serialize ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001060 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001061 return nil
1062 }
1063
Himani Chawla6d2ae152020-09-02 13:11:20 +05301064 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001065 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001066 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001067 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301068 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001069 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001070 logger.Errorw(ctx, "Cannot send ONU-G set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001071 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001072 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001073 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001074 logger.Debug(ctx, "send ONU-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001075 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001076 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001077 logger.Errorw(ctx, "Cannot generate ONU-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001078 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001079 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001080}
1081
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001082func (oo *omciCC) sendSetPptpEthUniLS(ctx context.Context, aInstNo uint16, timeout int,
1083 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
1084 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001085 logger.Debugw(ctx, "send PPTPEthUni-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001086 "SequNo": strconv.FormatInt(int64(tid), 16)})
1087
1088 // PPTPEthUni ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1089 meParams := me.ParamData{
1090 EntityID: aInstNo,
1091 Attributes: requestedAttributes,
1092 }
1093 meInstance, omciErr := me.NewPhysicalPathTerminationPointEthernetUni(meParams)
1094 if omciErr.GetError() == nil {
1095 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1096 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001097 logger.Errorw(ctx, "Cannot encode PPTPEthUni instance for set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001098 "Err": err, "device-id": oo.deviceID})
1099 return nil
1100 }
1101
dbainbri4d3a0dc2020-12-02 00:33:42 +00001102 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001103 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001104 logger.Errorw(ctx, "Cannot serialize PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001105 "Err": err, "device-id": oo.deviceID})
1106 return nil
1107 }
1108
1109 omciRxCallbackPair := callbackPair{
1110 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001111 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001112 }
1113 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1114 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001115 logger.Errorw(ctx, "Cannot send PPTPEthUni-Set", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001116 "Err": err, "device-id": oo.deviceID})
1117 return nil
1118 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001119 logger.Debug(ctx, "send PPTPEthUni-Set-msg done")
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001120 return meInstance
1121 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001122 logger.Errorw(ctx, "Cannot generate PPTPEthUni", log.Fields{
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001123 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1124 return nil
1125}
1126
1127/* UniG obsolete by now, left here in case it should be needed once again
1128 UniG AdminState anyway should be ignored by ONU acc. to G988
Himani Chawla6d2ae152020-09-02 13:11:20 +05301129func (oo *omciCC) sendSetUniGLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001130 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301131 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001132 logger.Debugw(ctx,"send UNI-G-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001133 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001134
1135 // UNI-G ME-ID is taken from Mib Upload stored OnuUniPort instance (argument)
1136 meParams := me.ParamData{
1137 EntityID: aInstNo,
1138 Attributes: requestedAttributes,
1139 }
1140 meInstance, omciErr := me.NewUniG(meParams)
1141 if omciErr.GetError() == nil {
1142 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1143 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001144 logger.Errorw(ctx,"Cannot encode UNI-G instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001145 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001146 return nil
1147 }
1148
1149 pkt, err := serializeOmciLayer(omciLayer, msgLayer)
1150 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001151 logger.Errorw(ctx,"Cannot serialize UNI-G-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001152 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001153 return nil
1154 }
1155
Himani Chawla6d2ae152020-09-02 13:11:20 +05301156 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001157 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001158 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001159 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301160 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001161 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001162 logger.Errorw(ctx,"Cannot send UNIG-G-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
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001165 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001166 logger.Debug(ctx,"send UNI-G-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001167 return meInstance
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001168 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001169 logger.Errorw(ctx,"Cannot generate UNI-G", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001170 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001171 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001172}
Holger Hildebrandt2fb70892020-10-28 11:53:18 +00001173*/
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001174
Himani Chawla6d2ae152020-09-02 13:11:20 +05301175func (oo *omciCC) sendSetVeipLS(ctx context.Context, aInstNo uint16, timeout int,
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001176 highPrio bool, requestedAttributes me.AttributeValueMap, rxChan chan Message) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301177 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001178 logger.Debugw(ctx, "send VEIP-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001179 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001180
1181 // ONU-G ME-ID is defined to be 0, no need to perform a DB lookup
1182 meParams := me.ParamData{
1183 EntityID: aInstNo,
1184 Attributes: requestedAttributes,
1185 }
1186 meInstance, omciErr := me.NewVirtualEthernetInterfacePoint(meParams)
1187 if omciErr.GetError() == nil {
1188 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1189 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001190 logger.Errorw(ctx, "Cannot encode VEIP instance for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001191 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001192 return nil
1193 }
1194
dbainbri4d3a0dc2020-12-02 00:33:42 +00001195 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001196 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001197 logger.Errorw(ctx, "Cannot serialize VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001198 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001199 return nil
1200 }
1201
Himani Chawla6d2ae152020-09-02 13:11:20 +05301202 omciRxCallbackPair := callbackPair{
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001203 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001204 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001205 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301206 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001207 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001208 logger.Errorw(ctx, "Cannot send VEIP-Set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001209 "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001210 return nil
Holger Hildebrandtccd390c2020-05-29 13:49:04 +00001211 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001212 logger.Debug(ctx, "send VEIP-Set-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001213 return meInstance
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001214 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001215 logger.Errorw(ctx, "Cannot generate VEIP", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001216 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001217 return nil
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +00001218}
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001219
Himani Chawla6d2ae152020-09-02 13:11:20 +05301220func (oo *omciCC) sendGetMe(ctx context.Context, classID me.ClassID, entityID uint16, requestedAttributes me.AttributeValueMap,
Girish Gowdrae09a6202021-01-12 18:10:59 -08001221 timeout int, highPrio bool, rxChan chan Message) *me.ManagedEntity {
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001222
Himani Chawla6d2ae152020-09-02 13:11:20 +05301223 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001224 logger.Debugw(ctx, "send get-request-msg", log.Fields{"classID": classID, "device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001225 "SequNo": strconv.FormatInt(int64(tid), 16)})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001226
1227 meParams := me.ParamData{
1228 EntityID: entityID,
1229 Attributes: requestedAttributes,
1230 }
1231 meInstance, omciErr := me.LoadManagedEntityDefinition(classID, meParams)
1232 if omciErr.GetError() == nil {
Himani Chawla4d908332020-08-31 12:30:20 +05301233 meClassIDName := meInstance.GetName()
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001234 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.GetRequestType, omci.TransactionID(tid))
1235 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001236 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 +00001237 return nil
1238 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001239 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001240 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001241 logger.Errorw(ctx, "Cannot serialize get-request", log.Fields{"meClassIDName": meClassIDName, "Err": err, "device-id": oo.deviceID})
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001242 return nil
1243 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301244 omciRxCallbackPair := callbackPair{
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001245 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001246 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001247 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301248 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001249 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001250 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 +00001251 return nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001252 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001253 logger.Debugw(ctx, "send get-request-msg done", log.Fields{"meClassIDName": meClassIDName, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001254 return meInstance
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001255 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001256 logger.Errorw(ctx, "Cannot generate meDefinition", log.Fields{"classID": classID, "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001257 return nil
1258}
1259
Himani Chawla6d2ae152020-09-02 13:11:20 +05301260func (oo *omciCC) sendCreateDot1PMapper(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001261 aInstID uint16, rxChan chan Message) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301262 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001263 logger.Debugw(ctx, "send .1pMapper-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001264 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(aInstID), 16)})
1265
1266 meParams := me.ParamData{
mpagenko8b5fdd22020-12-17 17:58:32 +00001267 EntityID: aInstID,
1268 Attributes: me.AttributeValueMap{
1269 //workaround for unsuitable omci-lib default values, cmp VOL-3729
1270 "TpPointer": 0xFFFF,
1271 "InterworkTpPointerForPBitPriority0": 0xFFFF,
1272 "InterworkTpPointerForPBitPriority1": 0xFFFF,
1273 "InterworkTpPointerForPBitPriority2": 0xFFFF,
1274 "InterworkTpPointerForPBitPriority3": 0xFFFF,
1275 "InterworkTpPointerForPBitPriority4": 0xFFFF,
1276 "InterworkTpPointerForPBitPriority5": 0xFFFF,
1277 "InterworkTpPointerForPBitPriority6": 0xFFFF,
1278 "InterworkTpPointerForPBitPriority7": 0xFFFF,
1279 },
mpagenko3dbcdd22020-07-22 07:38:45 +00001280 }
1281 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
1282 if omciErr.GetError() == nil {
1283 //we have to set all 'untouched' parameters to default by some additional option parameter!!
1284 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1285 omci.TransactionID(tid), omci.AddDefaults(true))
1286 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001287 logger.Errorw(ctx, "Cannot encode .1pMapper for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001288 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001289 return nil
1290 }
1291
dbainbri4d3a0dc2020-12-02 00:33:42 +00001292 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001293 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001294 logger.Errorw(ctx, "Cannot serialize .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001295 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001296 return nil
1297 }
1298
Himani Chawla6d2ae152020-09-02 13:11:20 +05301299 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001300 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001301 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001302 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301303 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001304 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001305 logger.Errorw(ctx, "Cannot send .1pMapper create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001306 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001307 return nil
1308 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001309 logger.Debug(ctx, "send .1pMapper-create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001310 return meInstance
1311 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001312 logger.Errorw(ctx, "Cannot generate .1pMapper", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001313 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001314 return nil
1315}
1316
Himani Chawla6d2ae152020-09-02 13:11:20 +05301317func (oo *omciCC) sendCreateMBPConfigDataVar(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001318 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301319 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001320 logger.Debugw(ctx, "send MBPCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001321 "SequNo": strconv.FormatInt(int64(tid), 16),
1322 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1323
1324 meInstance, omciErr := me.NewMacBridgePortConfigurationData(params[0])
1325 if omciErr.GetError() == nil {
1326 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1327 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1328 omci.TransactionID(tid), omci.AddDefaults(true))
1329 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001330 logger.Errorw(ctx, "Cannot encode MBPCD for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001331 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001332 return nil
1333 }
1334
dbainbri4d3a0dc2020-12-02 00:33:42 +00001335 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001336 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001337 logger.Errorw(ctx, "Cannot serialize MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001338 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001339 return nil
1340 }
1341
Himani Chawla6d2ae152020-09-02 13:11:20 +05301342 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001343 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001344 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001345 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301346 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001347 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001348 logger.Errorw(ctx, "Cannot send MBPCD create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001349 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001350 return nil
1351 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001352 logger.Debug(ctx, "send MBPCD-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001353 return meInstance
1354 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001355 logger.Errorw(ctx, "Cannot generate MBPCD Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001356 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001357 return nil
1358}
1359
Himani Chawla6d2ae152020-09-02 13:11:20 +05301360func (oo *omciCC) sendCreateGemNCTPVar(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001361 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301362 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001363 logger.Debugw(ctx, "send GemNCTP-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001364 "SequNo": strconv.FormatInt(int64(tid), 16),
1365 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1366
1367 meInstance, omciErr := me.NewGemPortNetworkCtp(params[0])
1368 if omciErr.GetError() == nil {
1369 //obviously we have to set all 'untouched' parameters to default by some additional option parameter!!
1370 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1371 omci.TransactionID(tid), omci.AddDefaults(true))
1372 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001373 logger.Errorw(ctx, "Cannot encode GemNCTP for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001374 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001375 return nil
1376 }
1377
dbainbri4d3a0dc2020-12-02 00:33:42 +00001378 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001379 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001380 logger.Errorw(ctx, "Cannot serialize GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001381 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001382 return nil
1383 }
1384
Himani Chawla6d2ae152020-09-02 13:11:20 +05301385 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001386 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001387 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001388 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301389 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001390 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001391 logger.Errorw(ctx, "Cannot send GemNCTP create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001392 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001393 return nil
1394 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001395 logger.Debug(ctx, "send GemNCTP-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001396 return meInstance
1397 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001398 logger.Errorw(ctx, "Cannot generate GemNCTP Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001399 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001400 return nil
1401}
1402
Himani Chawla6d2ae152020-09-02 13:11:20 +05301403func (oo *omciCC) sendCreateGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001404 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301405 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001406 logger.Debugw(ctx, "send GemIwTp-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001407 "SequNo": strconv.FormatInt(int64(tid), 16),
1408 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1409
1410 meInstance, omciErr := me.NewGemInterworkingTerminationPoint(params[0])
1411 if omciErr.GetError() == nil {
1412 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
1413 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1414 omci.TransactionID(tid))
1415 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001416 logger.Errorw(ctx, "Cannot encode GemIwTp for create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001417 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001418 return nil
1419 }
1420
dbainbri4d3a0dc2020-12-02 00:33:42 +00001421 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001422 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001423 logger.Errorw(ctx, "Cannot serialize GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001424 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001425 return nil
1426 }
1427
Himani Chawla6d2ae152020-09-02 13:11:20 +05301428 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001429 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001430 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001431 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301432 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001433 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001434 logger.Errorw(ctx, "Cannot send GemIwTp create", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001435 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001436 return nil
1437 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001438 logger.Debug(ctx, "send GemIwTp-Create-msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001439 return meInstance
1440 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001441 logger.Errorw(ctx, "Cannot generate GemIwTp Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001442 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001443 return nil
1444}
1445
Himani Chawla6d2ae152020-09-02 13:11:20 +05301446func (oo *omciCC) sendSetTcontVar(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001447 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301448 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001449 logger.Debugw(ctx, "send TCont-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001450 "SequNo": strconv.FormatInt(int64(tid), 16),
1451 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1452
1453 meInstance, omciErr := me.NewTCont(params[0])
1454 if omciErr.GetError() == nil {
1455 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1456 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001457 logger.Errorw(ctx, "Cannot encode TCont for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001458 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001459 return nil
1460 }
1461
dbainbri4d3a0dc2020-12-02 00:33:42 +00001462 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001463 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001464 logger.Errorw(ctx, "Cannot serialize TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001465 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001466 return nil
1467 }
1468
Himani Chawla6d2ae152020-09-02 13:11:20 +05301469 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001470 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001471 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001472 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301473 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001474 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001475 logger.Errorw(ctx, "Cannot send TCont set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001476 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001477 return nil
1478 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001479 logger.Debug(ctx, "send TCont-set msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001480 return meInstance
1481 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001482 logger.Errorw(ctx, "Cannot generate TCont Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001483 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001484 return nil
1485}
1486
Himani Chawla6d2ae152020-09-02 13:11:20 +05301487func (oo *omciCC) sendSetPrioQueueVar(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001488 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301489 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001490 logger.Debugw(ctx, "send PrioQueue-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001491 "SequNo": strconv.FormatInt(int64(tid), 16),
1492 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1493
1494 meInstance, omciErr := me.NewPriorityQueue(params[0])
1495 if omciErr.GetError() == nil {
1496 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1497 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001498 logger.Errorw(ctx, "Cannot encode PrioQueue for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001499 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001500 return nil
1501 }
1502
dbainbri4d3a0dc2020-12-02 00:33:42 +00001503 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001504 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001505 logger.Errorw(ctx, "Cannot serialize PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001506 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001507 return nil
1508 }
1509
Himani Chawla6d2ae152020-09-02 13:11:20 +05301510 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001511 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001512 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001513 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301514 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001515 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001516 logger.Errorw(ctx, "Cannot send PrioQueue set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001517 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001518 return nil
1519 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001520 logger.Debug(ctx, "send PrioQueue-set msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001521 return meInstance
1522 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001523 logger.Errorw(ctx, "Cannot generate PrioQueue Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001524 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001525 return nil
1526}
1527
Himani Chawla6d2ae152020-09-02 13:11:20 +05301528func (oo *omciCC) sendSetDot1PMapperVar(ctx context.Context, timeout int, highPrio bool,
mpagenko3dbcdd22020-07-22 07:38:45 +00001529 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301530 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001531 logger.Debugw(ctx, "send 1PMapper-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko3dbcdd22020-07-22 07:38:45 +00001532 "SequNo": strconv.FormatInt(int64(tid), 16),
1533 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1534
1535 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(params[0])
1536 if omciErr.GetError() == nil {
1537 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1538 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001539 logger.Errorw(ctx, "Cannot encode 1PMapper for set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001540 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001541 return nil
1542 }
1543
dbainbri4d3a0dc2020-12-02 00:33:42 +00001544 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko3dbcdd22020-07-22 07:38:45 +00001545 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001546 logger.Errorw(ctx, "Cannot serialize 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001547 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001548 return nil
1549 }
1550
Himani Chawla6d2ae152020-09-02 13:11:20 +05301551 omciRxCallbackPair := callbackPair{
mpagenko3dbcdd22020-07-22 07:38:45 +00001552 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001553 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko3dbcdd22020-07-22 07:38:45 +00001554 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301555 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenko3dbcdd22020-07-22 07:38:45 +00001556 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001557 logger.Errorw(ctx, "Cannot send 1PMapper set", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001558 "Err": err, "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001559 return nil
1560 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001561 logger.Debug(ctx, "send 1PMapper-set msg done")
mpagenko3dbcdd22020-07-22 07:38:45 +00001562 return meInstance
1563 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001564 logger.Errorw(ctx, "Cannot generate 1PMapper Instance", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +00001565 "Err": omciErr.GetError(), "device-id": oo.deviceID})
mpagenko3dbcdd22020-07-22 07:38:45 +00001566 return nil
Holger Hildebrandtc54939a2020-06-17 08:14:27 +00001567}
mpagenkodff5dda2020-08-28 11:52:01 +00001568
Himani Chawla6d2ae152020-09-02 13:11:20 +05301569func (oo *omciCC) sendCreateVtfdVar(ctx context.Context, timeout int, highPrio bool,
mpagenkodff5dda2020-08-28 11:52:01 +00001570 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301571 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001572 logger.Debugw(ctx, "send VTFD-Create-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001573 "SequNo": strconv.FormatInt(int64(tid), 16),
1574 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1575
1576 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1577 if omciErr.GetError() == nil {
1578 //all SetByCreate Parameters (assumed to be) set here, for optimisation no 'AddDefaults'
1579 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType,
1580 omci.TransactionID(tid))
1581 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001582 logger.Errorw(ctx, "Cannot encode VTFD for create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001583 "Err": err, "device-id": oo.deviceID})
1584 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1585 // return (dual format) error code that can be used at caller for immediate error treatment
1586 // (relevant to all used sendXX() methods and their error conditions)
1587 return nil
1588 }
1589
dbainbri4d3a0dc2020-12-02 00:33:42 +00001590 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001591 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001592 logger.Errorw(ctx, "Cannot serialize VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001593 "Err": err, "device-id": oo.deviceID})
1594 return nil
1595 }
1596
Himani Chawla6d2ae152020-09-02 13:11:20 +05301597 omciRxCallbackPair := callbackPair{
mpagenkodff5dda2020-08-28 11:52:01 +00001598 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001599 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001600 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301601 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001602 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001603 logger.Errorw(ctx, "Cannot send VTFD create", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001604 "Err": err, "device-id": oo.deviceID})
1605 return nil
1606 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001607 logger.Debug(ctx, "send VTFD-Create-msg done")
mpagenkodff5dda2020-08-28 11:52:01 +00001608 return meInstance
1609 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001610 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001611 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1612 return nil
1613}
1614
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001615// nolint: unused
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001616func (oo *omciCC) sendSetVtfdVar(ctx context.Context, timeout int, highPrio bool,
1617 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
1618 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001619 logger.Debugw(ctx, "send VTFD-Set-msg:", log.Fields{"device-id": oo.deviceID,
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001620 "SequNo": strconv.FormatInt(int64(tid), 16),
1621 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1622
1623 meInstance, omciErr := me.NewVlanTaggingFilterData(params[0])
1624 if omciErr.GetError() == nil {
1625 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType,
1626 omci.TransactionID(tid))
1627 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001628 logger.Errorw(ctx, "Cannot encode VTFD for set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001629 "Err": err, "device-id": oo.deviceID})
1630 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1631 // return (dual format) error code that can be used at caller for immediate error treatment
1632 // (relevant to all used sendXX() methods and their error conditions)
1633 return nil
1634 }
1635
dbainbri4d3a0dc2020-12-02 00:33:42 +00001636 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001637 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001638 logger.Errorw(ctx, "Cannot serialize VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001639 "Err": err, "device-id": oo.deviceID})
1640 return nil
1641 }
1642
1643 omciRxCallbackPair := callbackPair{
1644 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001645 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001646 }
1647 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1648 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001649 logger.Errorw(ctx, "Cannot send VTFD set", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001650 "Err": err, "device-id": oo.deviceID})
1651 return nil
1652 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001653 logger.Debug(ctx, "send VTFD-Set-msg done")
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001654 return meInstance
1655 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001656 logger.Errorw(ctx, "Cannot generate VTFD Instance", log.Fields{
Holger Hildebrandt394c5522020-09-11 11:23:01 +00001657 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1658 return nil
1659}
1660
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001661func (oo *omciCC) sendCreateEvtocdVar(ctx context.Context, timeout int, highPrio bool,
1662 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
1663 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001664 logger.Debugw(ctx, "send EVTOCD-Create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001665 "SequNo": strconv.FormatInt(int64(tid), 16),
1666 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1667
1668 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1669 if omciErr.GetError() == nil {
1670 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1671 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001672 logger.Errorw(ctx, "Cannot encode EVTOCD for create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001673 "Err": err, "device-id": oo.deviceID})
1674 return nil
1675 }
1676
dbainbri4d3a0dc2020-12-02 00:33:42 +00001677 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001678 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001679 logger.Errorw(ctx, "Cannot serialize EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001680 "Err": err, "device-id": oo.deviceID})
1681 return nil
1682 }
1683
1684 omciRxCallbackPair := callbackPair{
1685 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001686 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001687 }
1688 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1689 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001690 logger.Errorw(ctx, "Cannot send EVTOCD create", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001691 "Err": err, "device-id": oo.deviceID})
1692 return nil
1693 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001694 logger.Debug(ctx, "send EVTOCD-set msg done")
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001695 return meInstance
1696 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001697 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001698 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1699 return nil
1700}
1701
Himani Chawla6d2ae152020-09-02 13:11:20 +05301702func (oo *omciCC) sendSetEvtocdVar(ctx context.Context, timeout int, highPrio bool,
mpagenkodff5dda2020-08-28 11:52:01 +00001703 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
Himani Chawla6d2ae152020-09-02 13:11:20 +05301704 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001705 logger.Debugw(ctx, "send EVTOCD-Set-msg:", log.Fields{"device-id": oo.deviceID,
mpagenkodff5dda2020-08-28 11:52:01 +00001706 "SequNo": strconv.FormatInt(int64(tid), 16),
1707 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1708
1709 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1710 if omciErr.GetError() == nil {
1711 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1712 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001713 logger.Errorw(ctx, "Cannot encode EVTOCD for set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001714 "Err": err, "device-id": oo.deviceID})
1715 return nil
1716 }
1717
dbainbri4d3a0dc2020-12-02 00:33:42 +00001718 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenkodff5dda2020-08-28 11:52:01 +00001719 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001720 logger.Errorw(ctx, "Cannot serialize EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001721 "Err": err, "device-id": oo.deviceID})
1722 return nil
1723 }
1724
Himani Chawla6d2ae152020-09-02 13:11:20 +05301725 omciRxCallbackPair := callbackPair{
mpagenkodff5dda2020-08-28 11:52:01 +00001726 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001727 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenkodff5dda2020-08-28 11:52:01 +00001728 }
Himani Chawla6d2ae152020-09-02 13:11:20 +05301729 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
mpagenkodff5dda2020-08-28 11:52:01 +00001730 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001731 logger.Errorw(ctx, "Cannot send EVTOCD set", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001732 "Err": err, "device-id": oo.deviceID})
1733 return nil
1734 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001735 logger.Debug(ctx, "send EVTOCD-set msg done")
mpagenkodff5dda2020-08-28 11:52:01 +00001736 return meInstance
1737 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001738 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
mpagenkodff5dda2020-08-28 11:52:01 +00001739 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1740 return nil
1741}
mpagenko01e726e2020-10-23 09:45:29 +00001742
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001743func (oo *omciCC) sendDeleteEvtocd(ctx context.Context, timeout int, highPrio bool,
1744 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
1745 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001746 logger.Debugw(ctx, "send EVTOCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001747 "SequNo": strconv.FormatInt(int64(tid), 16),
1748 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1749
1750 meInstance, omciErr := me.NewExtendedVlanTaggingOperationConfigurationData(params[0])
1751 if omciErr.GetError() == nil {
1752 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid))
1753 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001754 logger.Errorw(ctx, "Cannot encode EVTOCD for delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001755 "Err": err, "device-id": oo.deviceID})
1756 return nil
1757 }
1758
dbainbri4d3a0dc2020-12-02 00:33:42 +00001759 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001760 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001761 logger.Errorw(ctx, "Cannot serialize EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001762 "Err": err, "device-id": oo.deviceID})
1763 return nil
1764 }
1765
1766 omciRxCallbackPair := callbackPair{
1767 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001768 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001769 }
1770 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1771 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001772 logger.Errorw(ctx, "Cannot send EVTOCD delete", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001773 "Err": err, "device-id": oo.deviceID})
1774 return nil
1775 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001776 logger.Debug(ctx, "send EVTOCD-delete msg done")
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001777 return meInstance
1778 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001779 logger.Errorw(ctx, "Cannot generate EVTOCD Instance", log.Fields{
ozgecanetsiab5000ef2020-11-27 14:38:20 +03001780 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1781 return nil
1782}
1783
mpagenko01e726e2020-10-23 09:45:29 +00001784func (oo *omciCC) sendDeleteVtfd(ctx context.Context, timeout int, highPrio bool,
1785 rxChan chan Message, aInstID uint16) *me.ManagedEntity {
1786 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001787 logger.Debugw(ctx, "send VTFD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko01e726e2020-10-23 09:45:29 +00001788 "SequNo": strconv.FormatInt(int64(tid), 16),
1789 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1790
1791 meParams := me.ParamData{EntityID: aInstID}
1792 meInstance, omciErr := me.NewVlanTaggingFilterData(meParams)
1793 if omciErr.GetError() == nil {
1794 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
1795 omci.TransactionID(tid))
1796 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001797 logger.Errorw(ctx, "Cannot encode VTFD for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001798 "Err": err, "device-id": oo.deviceID})
1799 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
1800 // return (dual format) error code that can be used at caller for immediate error treatment
1801 // (relevant to all used sendXX() methods and their error conditions)
1802 return nil
1803 }
1804
dbainbri4d3a0dc2020-12-02 00:33:42 +00001805 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko01e726e2020-10-23 09:45:29 +00001806 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001807 logger.Errorw(ctx, "Cannot serialize VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001808 "Err": err, "device-id": oo.deviceID})
1809 return nil
1810 }
1811
1812 omciRxCallbackPair := callbackPair{
1813 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00001814 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko01e726e2020-10-23 09:45:29 +00001815 }
1816 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1817 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001818 logger.Errorw(ctx, "Cannot send VTFD delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001819 "Err": err, "device-id": oo.deviceID})
1820 return nil
1821 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001822 logger.Debug(ctx, "send VTFD-Delete-msg done")
mpagenko01e726e2020-10-23 09:45:29 +00001823 return meInstance
1824 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00001825 logger.Errorw(ctx, "Cannot generate VTFD Instance for delete", log.Fields{
mpagenko01e726e2020-10-23 09:45:29 +00001826 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1827 return nil
1828}
ozgecanetsia422dbf32020-10-28 14:07:19 +03001829
ozgecanetsiab6441962021-03-10 10:58:48 +03001830// nolint: unused
1831func (oo *omciCC) sendCreateTDVar(ctx context.Context, timeout int, highPrio bool,
1832 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
1833 tid := oo.getNextTid(highPrio)
1834 logger.Debugw(ctx, "send TD-Create-msg:", log.Fields{"device-id": oo.deviceID,
1835 "SequNo": strconv.FormatInt(int64(tid), 16),
1836 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1837 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
1838 if omciErr.GetError() == nil {
1839 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid))
1840 if err != nil {
1841 logger.Errorw(ctx, "Cannot encode TD for create", log.Fields{"Err": err, "device-id": oo.deviceID})
1842 return nil
1843 }
1844 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
1845 if err != nil {
1846 logger.Errorw(ctx, "Cannot serialize TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
1847 return nil
1848 }
1849 omciRxCallbackPair := callbackPair{
1850 cbKey: tid,
1851 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1852 }
1853 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1854 if err != nil {
1855 logger.Errorw(ctx, "Cannot send TD create", log.Fields{"Err": err, "device-id": oo.deviceID})
1856 return nil
1857 }
1858 logger.Debug(ctx, "send TD-Create-msg done")
1859 return meInstance
1860 }
1861 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
1862 return nil
1863}
1864
1865// nolint: unused
1866func (oo *omciCC) sendSetTDVar(ctx context.Context, timeout int, highPrio bool,
1867 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
1868 tid := oo.getNextTid(highPrio)
1869 logger.Debugw(ctx, "send TD-Set-msg:", log.Fields{"device-id": oo.deviceID,
1870 "SequNo": strconv.FormatInt(int64(tid), 16),
1871 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
1872
1873 meInstance, omciErr := me.NewTrafficDescriptor(params[0])
1874 if omciErr.GetError() == nil {
1875 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid))
1876 if err != nil {
1877 logger.Errorw(ctx, "Cannot encode TD for set", log.Fields{"Err": err, "device-id": oo.deviceID})
1878 return nil
1879 }
1880 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
1881 if err != nil {
1882 logger.Errorw(ctx, "Cannot serialize TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
1883 return nil
1884 }
1885 omciRxCallbackPair := callbackPair{
1886 cbKey: tid,
1887 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1888 }
1889 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1890 if err != nil {
1891 logger.Errorw(ctx, "Cannot send TD set", log.Fields{"Err": err, "device-id": oo.deviceID})
1892 return nil
1893 }
1894 logger.Debug(ctx, "send TD-Set-msg done")
1895 return meInstance
1896 }
1897 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
1898 return nil
1899
1900}
1901
1902// nolint: unused
1903func (oo *omciCC) sendDeleteTD(ctx context.Context, timeout int, highPrio bool,
1904 rxChan chan Message, aInstID uint16) *me.ManagedEntity {
1905 tid := oo.getNextTid(highPrio)
1906 logger.Debugw(ctx, "send TD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
1907 "SequNo": strconv.FormatInt(int64(tid), 16),
1908 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1909
1910 meParams := me.ParamData{EntityID: aInstID}
1911 meInstance, omciErr := me.NewTrafficDescriptor(meParams)
1912 if omciErr.GetError() == nil {
1913 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid))
1914 if err != nil {
1915 logger.Errorw(ctx, "Cannot encode TD for delete", log.Fields{"Err": err, "device-id": oo.deviceID})
1916 return nil
1917 }
1918 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
1919 if err != nil {
1920 logger.Errorw(ctx, "Cannot serialize TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
1921 return nil
1922 }
1923 omciRxCallbackPair := callbackPair{
1924 cbKey: tid,
1925 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
1926 }
1927 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
1928 if err != nil {
1929 logger.Errorw(ctx, "Cannot send TD delete", log.Fields{"Err": err, "device-id": oo.deviceID})
1930 return nil
1931 }
1932 logger.Debug(ctx, "send TD-Delete-msg done")
1933 return meInstance
1934 }
1935 logger.Errorw(ctx, "Cannot generate TD Instance", log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID})
1936 return nil
1937
1938}
1939
mpagenko8b07c1b2020-11-26 10:36:31 +00001940func (oo *omciCC) sendDeleteGemIWTP(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 GemIwTp-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.NewGemInterworkingTerminationPoint(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 GemIwTp 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 GemIwTp 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,
mpagenko80622a52021-02-09 16:53:23 +00001970 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00001971 }
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 GemIwTp 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 GemIwTp-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 GemIwTp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00001982 "Err": omciErr.GetError(), "device-id": oo.deviceID})
1983 return nil
1984}
1985
1986func (oo *omciCC) sendDeleteGemNCTP(ctx context.Context, timeout int, highPrio bool,
1987 rxChan chan Message, aInstID uint16) *me.ManagedEntity {
1988 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00001989 logger.Debugw(ctx, "send GemNCtp-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00001990 "SequNo": strconv.FormatInt(int64(tid), 16),
1991 "InstId": strconv.FormatInt(int64(aInstID), 16)})
1992
1993 meParams := me.ParamData{EntityID: aInstID}
1994 meInstance, omciErr := me.NewGemPortNetworkCtp(meParams)
1995 if omciErr.GetError() == nil {
1996 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
1997 omci.TransactionID(tid))
1998 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00001999 logger.Errorw(ctx, "Cannot encode GemNCtp for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002000 "Err": err, "device-id": oo.deviceID})
2001 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2002 // return (dual format) error code that can be used at caller for immediate error treatment
2003 // (relevant to all used sendXX() methods and their error conditions)
2004 return nil
2005 }
2006
dbainbri4d3a0dc2020-12-02 00:33:42 +00002007 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002008 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002009 logger.Errorw(ctx, "Cannot serialize GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002010 "Err": err, "device-id": oo.deviceID})
2011 return nil
2012 }
2013
2014 omciRxCallbackPair := callbackPair{
2015 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002016 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002017 }
2018 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2019 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002020 logger.Errorw(ctx, "Cannot send GemNCtp delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002021 "Err": err, "device-id": oo.deviceID})
2022 return nil
2023 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002024 logger.Debug(ctx, "send GemNCtp-Delete-msg done")
mpagenko8b07c1b2020-11-26 10:36:31 +00002025 return meInstance
2026 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002027 logger.Errorw(ctx, "Cannot generate GemNCtp Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002028 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2029 return nil
2030}
2031
2032func (oo *omciCC) sendDeleteDot1PMapper(ctx context.Context, timeout int, highPrio bool,
2033 rxChan chan Message, aInstID uint16) *me.ManagedEntity {
2034 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002035 logger.Debugw(ctx, "send .1pMapper-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002036 "SequNo": strconv.FormatInt(int64(tid), 16),
2037 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2038
2039 meParams := me.ParamData{EntityID: aInstID}
2040 meInstance, omciErr := me.NewIeee8021PMapperServiceProfile(meParams)
2041 if omciErr.GetError() == nil {
2042 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2043 omci.TransactionID(tid))
2044 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002045 logger.Errorw(ctx, "Cannot encode .1pMapper for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002046 "Err": err, "device-id": oo.deviceID})
2047 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2048 // return (dual format) error code that can be used at caller for immediate error treatment
2049 // (relevant to all used sendXX() methods and their error conditions)
2050 return nil
2051 }
2052
dbainbri4d3a0dc2020-12-02 00:33:42 +00002053 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002054 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002055 logger.Errorw(ctx, "Cannot serialize .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002056 "Err": err, "device-id": oo.deviceID})
2057 return nil
2058 }
2059
2060 omciRxCallbackPair := callbackPair{
2061 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002062 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002063 }
2064 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2065 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002066 logger.Errorw(ctx, "Cannot send .1pMapper delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002067 "Err": err, "device-id": oo.deviceID})
2068 return nil
2069 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002070 logger.Debug(ctx, "send .1pMapper-Delete-msg done")
mpagenko8b07c1b2020-11-26 10:36:31 +00002071 return meInstance
2072 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002073 logger.Errorw(ctx, "Cannot generate .1pMapper Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002074 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2075 return nil
2076}
2077
2078func (oo *omciCC) sendDeleteMBPConfigData(ctx context.Context, timeout int, highPrio bool,
2079 rxChan chan Message, aInstID uint16) *me.ManagedEntity {
2080 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002081 logger.Debugw(ctx, "send MBPCD-Delete-msg:", log.Fields{"device-id": oo.deviceID,
mpagenko8b07c1b2020-11-26 10:36:31 +00002082 "SequNo": strconv.FormatInt(int64(tid), 16),
2083 "InstId": strconv.FormatInt(int64(aInstID), 16)})
2084
2085 meParams := me.ParamData{EntityID: aInstID}
2086 meInstance, omciErr := me.NewMacBridgePortConfigurationData(meParams)
2087 if omciErr.GetError() == nil {
2088 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.DeleteRequestType,
2089 omci.TransactionID(tid))
2090 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002091 logger.Errorw(ctx, "Cannot encode MBPCD for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002092 "Err": err, "device-id": oo.deviceID})
2093 //TODO!!: refactoring improvement requested, here as an example for [VOL-3457]:
2094 // return (dual format) error code that can be used at caller for immediate error treatment
2095 // (relevant to all used sendXX() methods and their error conditions)
2096 return nil
2097 }
2098
dbainbri4d3a0dc2020-12-02 00:33:42 +00002099 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
mpagenko8b07c1b2020-11-26 10:36:31 +00002100 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002101 logger.Errorw(ctx, "Cannot serialize MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002102 "Err": err, "device-id": oo.deviceID})
2103 return nil
2104 }
2105
2106 omciRxCallbackPair := callbackPair{
2107 cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002108 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
mpagenko8b07c1b2020-11-26 10:36:31 +00002109 }
2110 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2111 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002112 logger.Errorw(ctx, "Cannot send MBPCD delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002113 "Err": err, "device-id": oo.deviceID})
2114 return nil
2115 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002116 logger.Debug(ctx, "send MBPCD-Delete-msg done")
mpagenko8b07c1b2020-11-26 10:36:31 +00002117 return meInstance
2118 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002119 logger.Errorw(ctx, "Cannot generate MBPCD Instance for delete", log.Fields{
mpagenko8b07c1b2020-11-26 10:36:31 +00002120 "Err": omciErr.GetError(), "device-id": oo.deviceID})
2121 return nil
2122}
2123
ozgecanetsia422dbf32020-10-28 14:07:19 +03002124func (oo *omciCC) sendCreateMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
2125 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
2126 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002127 logger.Debugw(ctx, "send MulticastGemIWTP-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002128 "SequNo": strconv.FormatInt(int64(tid), 16),
2129 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2130
2131 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2132 if omciErr.GetError() == nil {
2133 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2134 omci.AddDefaults(true))
2135 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002136 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsia422dbf32020-10-28 14:07:19 +03002137 return nil
2138 }
2139
dbainbri4d3a0dc2020-12-02 00:33:42 +00002140 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002141 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002142 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsia422dbf32020-10-28 14:07:19 +03002143 return nil
2144 }
2145
2146 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002147 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002148 }
2149 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2150 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002151 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsia422dbf32020-10-28 14:07:19 +03002152 return nil
2153 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002154 logger.Debug(ctx, "send MulticastGEMIWTP-create-msg done")
ozgecanetsia422dbf32020-10-28 14:07:19 +03002155 return meInstance
2156 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002157 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002158 "device-id": oo.deviceID})
2159 return nil
2160}
2161
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002162func (oo *omciCC) sendSetMulticastGemIWTPVar(ctx context.Context, timeout int, highPrio bool,
2163 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
2164 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002165 logger.Debugw(ctx, "send MulticastGemIWTP-set-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002166 "SequNo": strconv.FormatInt(int64(tid), 16),
2167 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2168
2169 meInstance, omciErr := me.NewMulticastGemInterworkingTerminationPoint(params[0])
2170 if omciErr.GetError() == nil {
2171 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid),
2172 omci.AddDefaults(true))
2173 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002174 logger.Errorw(ctx, "Cannot encode MulticastGEMIWTP for set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002175 return nil
2176 }
2177
dbainbri4d3a0dc2020-12-02 00:33:42 +00002178 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002179 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002180 logger.Errorw(ctx, "Cannot serialize MulticastGEMIWTP create", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002181 return nil
2182 }
2183
2184 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002185 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002186 }
2187 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2188 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002189 logger.Errorw(ctx, "Cannot send MulticastGEMIWTP set", log.Fields{"Err": err, "device-id": oo.deviceID})
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002190 return nil
2191 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002192 logger.Debug(ctx, "send MulticastGEMIWTP-set-msg done")
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002193 return meInstance
2194 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002195 logger.Errorw(ctx, "Cannot generate MulticastGEMIWTP Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsiab5000ef2020-11-27 14:38:20 +03002196 "device-id": oo.deviceID})
2197 return nil
2198}
2199
ozgecanetsia422dbf32020-10-28 14:07:19 +03002200func (oo *omciCC) sendCreateMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
2201 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
2202 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002203 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002204 "SequNo": strconv.FormatInt(int64(tid), 16),
2205 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2206
2207 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2208 if omciErr.GetError() == nil {
2209 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2210 omci.AddDefaults(true))
2211 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002212 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002213 "device-id": oo.deviceID})
2214 return nil
2215 }
2216
dbainbri4d3a0dc2020-12-02 00:33:42 +00002217 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002218 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002219 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002220 "device-id": oo.deviceID})
2221 return nil
2222 }
2223
2224 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002225 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002226 }
2227 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2228 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002229 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002230 "device-id": oo.deviceID})
2231 return nil
2232 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002233 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsia422dbf32020-10-28 14:07:19 +03002234 return meInstance
2235 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002236 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002237 "device-id": oo.deviceID})
2238 return nil
2239}
2240
2241func (oo *omciCC) sendSetMulticastOperationProfileVar(ctx context.Context, timeout int, highPrio bool,
2242 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
2243 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002244 logger.Debugw(ctx, "send MulticastOperationProfile-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002245 "SequNo": strconv.FormatInt(int64(tid), 16),
2246 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2247
2248 meInstance, omciErr := me.NewMulticastOperationsProfile(params[0])
2249 if omciErr.GetError() == nil {
2250 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.SetRequestType, omci.TransactionID(tid),
2251 omci.AddDefaults(true))
2252 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002253 logger.Errorw(ctx, "Cannot encode MulticastOperationProfile for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002254 "device-id": oo.deviceID})
2255 return nil
2256 }
2257
dbainbri4d3a0dc2020-12-02 00:33:42 +00002258 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002259 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002260 logger.Errorw(ctx, "Cannot serialize MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002261 "device-id": oo.deviceID})
2262 return nil
2263 }
2264
2265 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002266 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002267 }
2268 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2269 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002270 logger.Errorw(ctx, "Cannot send MulticastOperationProfile create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002271 "device-id": oo.deviceID})
2272 return nil
2273 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002274 logger.Debug(ctx, "send MulticastOperationProfile-create-msg done")
ozgecanetsia422dbf32020-10-28 14:07:19 +03002275 return meInstance
2276 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002277 logger.Errorw(ctx, "Cannot generate MulticastOperationProfile Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002278 "device-id": oo.deviceID})
2279 return nil
2280}
2281
2282func (oo *omciCC) sendCreateMulticastSubConfigInfoVar(ctx context.Context, timeout int, highPrio bool,
2283 rxChan chan Message, params ...me.ParamData) *me.ManagedEntity {
2284 tid := oo.getNextTid(highPrio)
dbainbri4d3a0dc2020-12-02 00:33:42 +00002285 logger.Debugw(ctx, "send MulticastSubConfigInfo-create-msg:", log.Fields{"device-id": oo.deviceID,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002286 "SequNo": strconv.FormatInt(int64(tid), 16),
2287 "InstId": strconv.FormatInt(int64(params[0].EntityID), 16)})
2288
2289 meInstance, omciErr := me.NewMulticastSubscriberConfigInfo(params[0])
2290 if omciErr.GetError() == nil {
2291 omciLayer, msgLayer, err := omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2292 omci.AddDefaults(true))
2293 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002294 logger.Errorw(ctx, "Cannot encode MulticastSubConfigInfo for create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002295 "device-id": oo.deviceID})
2296 return nil
2297 }
2298
dbainbri4d3a0dc2020-12-02 00:33:42 +00002299 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
ozgecanetsia422dbf32020-10-28 14:07:19 +03002300 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002301 logger.Errorw(ctx, "Cannot serialize MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002302 "device-id": oo.deviceID})
2303 return nil
2304 }
2305
2306 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002307 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
ozgecanetsia422dbf32020-10-28 14:07:19 +03002308 }
2309 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2310 if err != nil {
dbainbri4d3a0dc2020-12-02 00:33:42 +00002311 logger.Errorw(ctx, "Cannot send MulticastSubConfigInfo create", log.Fields{"Err": err,
ozgecanetsia422dbf32020-10-28 14:07:19 +03002312 "device-id": oo.deviceID})
2313 return nil
2314 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002315 logger.Debug(ctx, "send MulticastSubConfigInfo-create-msg done")
ozgecanetsia422dbf32020-10-28 14:07:19 +03002316 return meInstance
2317 }
dbainbri4d3a0dc2020-12-02 00:33:42 +00002318 logger.Errorw(ctx, "Cannot generate MulticastSubConfigInfo Instance", log.Fields{"Err": omciErr.GetError(),
ozgecanetsia422dbf32020-10-28 14:07:19 +03002319 "device-id": oo.deviceID})
2320 return nil
2321}
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00002322
Girish Gowdrae0140f02021-02-02 16:55:09 -08002323func (oo *omciCC) sendSyncTime(ctx context.Context, timeout int, highPrio bool, rxChan chan Message) error {
2324 tid := oo.getNextTid(highPrio)
2325 logger.Debugw(ctx, "send synchronize time request:", log.Fields{"device-id": oo.deviceID,
2326 "SequNo": strconv.FormatInt(int64(tid), 16)})
2327
2328 omciLayer := &omci.OMCI{
2329 TransactionID: tid,
2330 MessageType: omci.SynchronizeTimeRequestType,
2331 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2332 // Length: 0x28, // Optional, defaults to 40 octets
2333 }
2334 utcTime := time.Now().UTC()
2335 request := &omci.SynchronizeTimeRequest{
2336 MeBasePacket: omci.MeBasePacket{
2337 EntityClass: me.OnuGClassID,
2338 // Default Instance ID is 0
2339 },
2340 Year: uint16(utcTime.Year()),
2341 Month: uint8(utcTime.Month()),
2342 Day: uint8(utcTime.Day()),
2343 Hour: uint8(utcTime.Hour()),
2344 Minute: uint8(utcTime.Minute()),
2345 Second: uint8(utcTime.Second()),
2346 }
2347
2348 pkt, err := serializeOmciLayer(ctx, omciLayer, request)
2349 if err != nil {
2350 logger.Errorw(ctx, "Cannot serialize synchronize time request", log.Fields{"Err": err,
2351 "device-id": oo.deviceID})
2352 return err
2353 }
2354
2355 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002356 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002357 }
2358 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2359 if err != nil {
2360 logger.Errorw(ctx, "Cannot send synchronize time request", log.Fields{"Err": err,
2361 "device-id": oo.deviceID})
2362 return err
2363 }
2364 logger.Debug(ctx, "send synchronize time request done")
2365 return nil
2366}
2367
2368func (oo *omciCC) sendCreateOrDeleteEthernetPerformanceMonitoringHistoryME(ctx context.Context, timeout int, highPrio bool,
2369 upstream bool, create bool, rxChan chan Message, entityID uint16) *me.ManagedEntity {
2370 tid := oo.getNextTid(highPrio)
2371 logger.Debugw(ctx, "send ethernet-performance-monitoring-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2372 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create, "upstream": upstream})
2373 meParam := me.ParamData{EntityID: entityID}
2374 var meInstance *me.ManagedEntity
2375 var omciErr me.OmciErrors
2376 if upstream {
2377 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataUpstream(meParam)
2378 } else {
2379 meInstance, omciErr = me.NewEthernetFramePerformanceMonitoringHistoryDataDownstream(meParam)
2380 }
2381 if omciErr.GetError() == nil {
2382 var omciLayer *omci.OMCI
2383 var msgLayer gopacket.SerializableLayer
2384 var err error
2385 if create {
2386 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2387 omci.AddDefaults(true))
2388 } else {
2389 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2390 omci.AddDefaults(true))
2391 }
2392 if err != nil {
2393 logger.Errorw(ctx, "Cannot encode ethernet frame performance monitoring history data ME",
2394 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2395 return nil
2396 }
2397
2398 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2399 if err != nil {
2400 logger.Errorw(ctx, "Cannot serialize ethernet frame performance monitoring history data ME",
2401 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2402 return nil
2403 }
2404
2405 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002406 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002407 }
2408 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2409 if err != nil {
2410 logger.Errorw(ctx, "Cannot send ethernet frame performance monitoring history data ME",
2411 log.Fields{"Err": err, "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2412 return nil
2413 }
2414 logger.Debugw(ctx, "send ethernet frame performance monitoring history data ME done",
2415 log.Fields{"device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2416 return meInstance
2417 }
2418 logger.Errorw(ctx, "Cannot generate ethernet frame performance monitoring history data ME Instance",
2419 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "upstream": upstream, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2420 return nil
2421}
2422
2423func (oo *omciCC) sendCreateOrDeleteEthernetUniHistoryME(ctx context.Context, timeout int, highPrio bool,
2424 create bool, rxChan chan Message, entityID uint16) *me.ManagedEntity {
2425 tid := oo.getNextTid(highPrio)
2426 logger.Debugw(ctx, "send ethernet-uni-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2427 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2428 meParam := me.ParamData{EntityID: entityID}
2429 var meInstance *me.ManagedEntity
2430 var omciErr me.OmciErrors
2431 meInstance, omciErr = me.NewEthernetPerformanceMonitoringHistoryData(meParam)
2432
2433 if omciErr.GetError() == nil {
2434 var omciLayer *omci.OMCI
2435 var msgLayer gopacket.SerializableLayer
2436 var err error
2437 if create {
2438 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2439 omci.AddDefaults(true))
2440 } else {
2441 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2442 omci.AddDefaults(true))
2443 }
2444 if err != nil {
2445 logger.Errorw(ctx, "Cannot encode ethernet uni history data ME",
2446 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2447 return nil
2448 }
2449
2450 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2451 if err != nil {
2452 logger.Errorw(ctx, "Cannot serialize ethernet uni history data ME",
2453 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2454 return nil
2455 }
2456
2457 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002458 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdrae0140f02021-02-02 16:55:09 -08002459 }
2460 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2461 if err != nil {
2462 logger.Errorw(ctx, "Cannot send ethernet uni history data ME",
2463 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2464 return nil
2465 }
2466 logger.Debugw(ctx, "send ethernet uni history data ME done",
2467 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2468 return meInstance
2469 }
2470 logger.Errorw(ctx, "Cannot generate ethernet uni history data ME Instance",
2471 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2472 return nil
2473}
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002474
2475func (oo *omciCC) sendCreateOrDeleteFecHistoryME(ctx context.Context, timeout int, highPrio bool,
2476 create bool, rxChan chan Message, entityID uint16) *me.ManagedEntity {
2477 tid := oo.getNextTid(highPrio)
2478 logger.Debugw(ctx, "send fec-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2479 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2480 meParam := me.ParamData{EntityID: entityID}
2481 var meInstance *me.ManagedEntity
2482 var omciErr me.OmciErrors
2483 meInstance, omciErr = me.NewFecPerformanceMonitoringHistoryData(meParam)
2484
2485 if omciErr.GetError() == nil {
2486 var omciLayer *omci.OMCI
2487 var msgLayer gopacket.SerializableLayer
2488 var err error
2489 if create {
2490 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2491 omci.AddDefaults(true))
2492 } else {
2493 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2494 omci.AddDefaults(true))
2495 }
2496 if err != nil {
2497 logger.Errorw(ctx, "Cannot encode fec history data ME",
2498 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2499 return nil
2500 }
2501
2502 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2503 if err != nil {
2504 logger.Errorw(ctx, "Cannot serialize fec history data ME",
2505 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2506 return nil
2507 }
2508
2509 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002510 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002511 }
2512 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2513 if err != nil {
2514 logger.Errorw(ctx, "Cannot send fec history data ME",
2515 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2516 return nil
2517 }
2518 logger.Debugw(ctx, "send fec history data ME done",
2519 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2520 return meInstance
2521 }
2522 logger.Errorw(ctx, "Cannot generate fec history data ME Instance",
2523 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2524 return nil
2525}
2526
2527func (oo *omciCC) sendCreateOrDeleteGemPortHistoryME(ctx context.Context, timeout int, highPrio bool,
2528 create bool, rxChan chan Message, entityID uint16) *me.ManagedEntity {
2529 tid := oo.getNextTid(highPrio)
2530 logger.Debugw(ctx, "send gemport-history-me-msg:", log.Fields{"device-id": oo.deviceID,
2531 "SequNo": strconv.FormatInt(int64(tid), 16), "InstId": strconv.FormatInt(int64(entityID), 16), "create": create})
2532 meParam := me.ParamData{EntityID: entityID}
2533 var meInstance *me.ManagedEntity
2534 var omciErr me.OmciErrors
2535 meInstance, omciErr = me.NewGemPortNetworkCtpPerformanceMonitoringHistoryData(meParam)
2536
2537 if omciErr.GetError() == nil {
2538 var omciLayer *omci.OMCI
2539 var msgLayer gopacket.SerializableLayer
2540 var err error
2541 if create {
2542 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.CreateRequestType, omci.TransactionID(tid),
2543 omci.AddDefaults(true))
2544 } else {
2545 omciLayer, msgLayer, err = omci.EncodeFrame(meInstance, omci.DeleteRequestType, omci.TransactionID(tid),
2546 omci.AddDefaults(true))
2547 }
2548 if err != nil {
2549 logger.Errorw(ctx, "Cannot encode gemport history data ME",
2550 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2551 return nil
2552 }
2553
2554 pkt, err := serializeOmciLayer(ctx, omciLayer, msgLayer)
2555 if err != nil {
2556 logger.Errorw(ctx, "Cannot serialize gemport history data ME",
2557 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2558 return nil
2559 }
2560
2561 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko80622a52021-02-09 16:53:23 +00002562 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
Girish Gowdra5c5aaf42021-02-17 19:40:50 -08002563 }
2564 err = oo.send(ctx, pkt, timeout, 0, highPrio, omciRxCallbackPair)
2565 if err != nil {
2566 logger.Errorw(ctx, "Cannot send gemport history data ME",
2567 log.Fields{"Err": err, "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2568 return nil
2569 }
2570 logger.Debugw(ctx, "send gemport history data ME done",
2571 log.Fields{"device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2572 return meInstance
2573 }
2574 logger.Errorw(ctx, "Cannot generate gemport history data ME Instance",
2575 log.Fields{"Err": omciErr.GetError(), "device-id": oo.deviceID, "create": create, "InstId": strconv.FormatInt(int64(entityID), 16)})
2576 return nil
2577}
2578
mpagenko80622a52021-02-09 16:53:23 +00002579func (oo *omciCC) sendStartSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
2580 rxChan chan Message, aImageMeID uint16, aDownloadWindowSize uint8, aFileLen uint32) error {
2581 tid := oo.getNextTid(highPrio)
2582 logger.Debugw(ctx, "send StartSwDlRequest:", log.Fields{"device-id": oo.deviceID,
2583 "SequNo": strconv.FormatInt(int64(tid), 16),
2584 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2585
2586 omciLayer := &omci.OMCI{
2587 TransactionID: tid,
2588 MessageType: omci.StartSoftwareDownloadRequestType,
2589 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2590 // Length: 0x28, // Optional, defaults to 40 octets
2591 }
2592 request := &omci.StartSoftwareDownloadRequest{
2593 MeBasePacket: omci.MeBasePacket{
2594 EntityClass: me.SoftwareImageClassID,
2595 EntityInstance: aImageMeID, //inactive image
2596 },
2597 WindowSize: aDownloadWindowSize,
2598 ImageSize: aFileLen,
2599 NumberOfCircuitPacks: 1, //parallel download to multiple circuit packs not supported
2600 CircuitPacks: []uint16{0}, //circuit pack indication don't care for NumberOfCircuitPacks=1, but needed by omci-lib
2601 }
2602
2603 var options gopacket.SerializeOptions
2604 options.FixLengths = true
2605 buffer := gopacket.NewSerializeBuffer()
2606 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2607 if err != nil {
2608 logger.Errorw(ctx, "Cannot serialize StartSwDlRequest", log.Fields{"Err": err,
2609 "device-id": oo.deviceID})
2610 return err
2611 }
2612 outgoingPacket := buffer.Bytes()
2613
2614 omciRxCallbackPair := callbackPair{cbKey: tid,
2615 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2616 }
2617 err = oo.send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
2618 if err != nil {
2619 logger.Errorw(ctx, "Cannot send StartSwDlRequest", log.Fields{"Err": err,
2620 "device-id": oo.deviceID})
2621 return err
2622 }
2623 logger.Debug(ctx, "send StartSwDlRequest done")
2624
mpagenko15ff4a52021-03-02 10:09:20 +00002625 go func() {
2626 //**** test simulation - as long as BBSIM does not support ONU SW upgrade *** start *****
2627 time.Sleep(time.Millisecond * 50) //give some response time
2628 respOmciLayer := &omci.OMCI{
2629 TransactionID: tid,
2630 MessageType: omci.StartSoftwareDownloadResponseType,
2631 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2632 // Length: 0x28, // Optional, defaults to 40 octets
2633 }
2634 response := &omci.StartSoftwareDownloadResponse{
2635 MeBasePacket: omci.MeBasePacket{
2636 EntityClass: me.SoftwareImageClassID,
2637 EntityInstance: aImageMeID, //inactive image
2638 },
2639 Result: 0,
2640 WindowSize: aDownloadWindowSize,
2641 NumberOfInstances: 0, //seems at the moment I can only generate 0 instances, using 1 here panics as MeResult can not be set below
2642 //MeResults: cannot set here: downloadResults type not exported from omci-lib!
2643 }
2644 var respOptions gopacket.SerializeOptions
2645 respOptions.FixLengths = true
2646 respBuffer := gopacket.NewSerializeBuffer()
2647 respErr := gopacket.SerializeLayers(respBuffer, respOptions, respOmciLayer, response)
2648 if respErr != nil {
2649 logger.Errorw(ctx, "Cannot serialize StartSwDlResponse", log.Fields{"Err": respErr,
2650 "device-id": oo.deviceID})
2651 return
2652 }
2653 respPacket := respBuffer.Bytes()
2654 logger.Debugw(ctx, "simulate StartSwDlResponse", log.Fields{"device-id": oo.deviceID,
2655 "SequNo": strconv.FormatInt(int64(tid), 16),
2656 "InstId": strconv.FormatInt(int64(aImageMeID), 16),
2657 "windowSize": aDownloadWindowSize})
2658 go func(oo *omciCC) {
2659 _ = oo.receiveMessage(ctx, respPacket)
2660 }(oo)
2661 //**** test simulation - as long as BBSIM does not support ONU SW upgrade *** stop *****
2662 }()
mpagenko80622a52021-02-09 16:53:23 +00002663 return nil
2664}
2665
2666func (oo *omciCC) sendDownloadSection(ctx context.Context, timeout int, highPrio bool,
2667 rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool) error {
2668 tid := oo.getNextTid(highPrio)
2669 logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
2670 "SequNo": strconv.FormatInt(int64(tid), 16),
mpagenko15ff4a52021-03-02 10:09:20 +00002671 "InstId": strconv.FormatInt(int64(aImageMeID), 16), "omci-ack": aAckRequest})
mpagenko80622a52021-02-09 16:53:23 +00002672
2673 //TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
2674 // by now just try to send it as defined by omci-lib
mpagenko15ff4a52021-03-02 10:09:20 +00002675 msgType := omci.DownloadSectionRequestType
2676 if aAckRequest > 0 {
2677 msgType = omci.DownloadSectionRequestWithResponseType
2678 }
mpagenko80622a52021-02-09 16:53:23 +00002679 omciLayer := &omci.OMCI{
2680 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002681 MessageType: msgType,
mpagenko80622a52021-02-09 16:53:23 +00002682 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2683 // Length: 0x28, // Optional, defaults to 40 octets
2684 }
Girish Gowdra8a7b4562021-02-23 16:27:42 -08002685 var localSectionData [31]byte
mpagenko15ff4a52021-03-02 10:09:20 +00002686 copy(localSectionData[:], aSection) // as long as DownloadSectionRequest defines array for SectionData we need to copy into the array
mpagenko80622a52021-02-09 16:53:23 +00002687 request := &omci.DownloadSectionRequest{
2688 MeBasePacket: omci.MeBasePacket{
2689 EntityClass: me.SoftwareImageClassID,
2690 EntityInstance: aImageMeID, //inactive image
2691 },
2692 SectionNumber: aDownloadSectionNo,
2693 SectionData: localSectionData,
2694 }
2695
2696 var options gopacket.SerializeOptions
2697 options.FixLengths = true
2698 buffer := gopacket.NewSerializeBuffer()
2699 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2700 if err != nil {
2701 logger.Errorw(ctx, "Cannot serialize DlSectionRequest", log.Fields{"Err": err,
2702 "device-id": oo.deviceID})
2703 return err
2704 }
2705 outgoingPacket := buffer.Bytes()
2706
mpagenko15ff4a52021-03-02 10:09:20 +00002707 //for initial debug purpose overrule the requested print state for some frames
2708 printFrame := aPrint
2709 if aAckRequest > 0 || aDownloadSectionNo == 0 {
2710 printFrame = true
2711 }
2712
mpagenko80622a52021-02-09 16:53:23 +00002713 omciRxCallbackPair := callbackPair{cbKey: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002714 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
mpagenko80622a52021-02-09 16:53:23 +00002715 }
2716 err = oo.send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
2717 if err != nil {
2718 logger.Errorw(ctx, "Cannot send DlSectionRequest", log.Fields{"Err": err,
2719 "device-id": oo.deviceID})
2720 return err
2721 }
2722 logger.Debug(ctx, "send DlSectionRequest done")
2723
mpagenko15ff4a52021-03-02 10:09:20 +00002724 go func() {
2725 //**** test simulation - as long as BBSIM does not support ONU SW upgrade *** start *****
2726 if aAckRequest > 0 {
2727 time.Sleep(time.Millisecond * 50) //give some response time
2728 respOmciLayer := &omci.OMCI{
2729 TransactionID: tid,
2730 MessageType: omci.DownloadSectionResponseType,
2731 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2732 // Length: 0x28, // Optional, defaults to 40 octets
2733 }
2734 response := &omci.DownloadSectionResponse{
2735 MeBasePacket: omci.MeBasePacket{
2736 EntityClass: me.SoftwareImageClassID,
2737 EntityInstance: aImageMeID, //inactive image
2738 },
2739 Result: 0,
2740 SectionNumber: aDownloadSectionNo,
2741 }
2742 var respOptions gopacket.SerializeOptions
2743 respOptions.FixLengths = true
2744 respBuffer := gopacket.NewSerializeBuffer()
2745 respErr := gopacket.SerializeLayers(respBuffer, respOptions, respOmciLayer, response)
2746 if respErr != nil {
2747 logger.Errorw(ctx, "Cannot serialize DlSectionResponse", log.Fields{"Err": respErr,
2748 "device-id": oo.deviceID})
2749 return
2750 }
2751 respPacket := respBuffer.Bytes()
2752 if aPrint {
2753 logger.Debugw(ctx, "simulate DlSectionResponse", log.Fields{"device-id": oo.deviceID,
2754 "SequNo": strconv.FormatInt(int64(tid), 16),
2755 "InstId": strconv.FormatInt(int64(aImageMeID), 16),
2756 "packet": hex.EncodeToString(respPacket)})
2757 } else {
2758 logger.Debugw(ctx, "simulate DlSectionResponse", log.Fields{"device-id": oo.deviceID,
2759 "SequNo": strconv.FormatInt(int64(tid), 16),
2760 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2761 }
2762 go func(oo *omciCC) {
2763 _ = oo.receiveMessage(ctx, respPacket)
2764 }(oo)
mpagenko80622a52021-02-09 16:53:23 +00002765 }
mpagenko15ff4a52021-03-02 10:09:20 +00002766 //**** test simulation - as long as BBSIM does not support ONU SW upgrade *** stop *****
2767 }()
mpagenko80622a52021-02-09 16:53:23 +00002768 return nil
2769}
2770
2771func (oo *omciCC) sendEndSoftwareDownload(ctx context.Context, timeout int, highPrio bool,
2772 rxChan chan Message, aImageMeID uint16, aFileLen uint32, aImageCrc uint32) error {
2773 tid := oo.getNextTid(highPrio)
2774 logger.Debugw(ctx, "send EndSwDlRequest:", log.Fields{"device-id": oo.deviceID,
2775 "SequNo": strconv.FormatInt(int64(tid), 16),
2776 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2777
mpagenko15ff4a52021-03-02 10:09:20 +00002778 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00002779 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002780 MessageType: omci.EndSoftwareDownloadRequestType,
mpagenko80622a52021-02-09 16:53:23 +00002781 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2782 // Length: 0x28, // Optional, defaults to 40 octets
2783 }
mpagenko15ff4a52021-03-02 10:09:20 +00002784 request := &omci.EndSoftwareDownloadRequest{
mpagenko80622a52021-02-09 16:53:23 +00002785 MeBasePacket: omci.MeBasePacket{
2786 EntityClass: me.SoftwareImageClassID,
2787 EntityInstance: aImageMeID, //inactive image
2788 },
mpagenko15ff4a52021-03-02 10:09:20 +00002789 CRC32: aImageCrc,
2790 ImageSize: aFileLen,
2791 NumberOfInstances: 1, //parallel download to multiple circuit packs not supported
2792 ImageInstances: []uint16{0}, //don't care for NumberOfInstances=1, but probably needed by omci-lib as in startSwDlRequest
mpagenko80622a52021-02-09 16:53:23 +00002793 }
mpagenko15ff4a52021-03-02 10:09:20 +00002794
2795 var options gopacket.SerializeOptions
2796 options.FixLengths = true
2797 buffer := gopacket.NewSerializeBuffer()
2798 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2799 if err != nil {
2800 logger.Errorw(ctx, "Cannot serialize EndSwDlRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00002801 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002802 return err
mpagenko80622a52021-02-09 16:53:23 +00002803 }
mpagenko15ff4a52021-03-02 10:09:20 +00002804 outgoingPacket := buffer.Bytes()
2805
2806 omciRxCallbackPair := callbackPair{cbKey: tid,
2807 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2808 }
2809 err = oo.send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
2810 if err != nil {
2811 logger.Errorw(ctx, "Cannot send EndSwDlRequest", log.Fields{"Err": err,
2812 "device-id": oo.deviceID})
2813 return err
2814 }
2815 logger.Debug(ctx, "send EndSwDlRequest done")
2816
2817 go func() {
2818 //**** test simulation - as long as BBSIM does not support ONU SW upgrade *** start *****
2819 time.Sleep(time.Millisecond * 50) //give some response time
2820 respOmciLayer := &omci.OMCI{
2821 TransactionID: tid,
2822 MessageType: omci.EndSoftwareDownloadResponseType,
2823 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2824 // Length: 0x28, // Optional, defaults to 40 octets
2825 }
2826 response := &omci.EndSoftwareDownloadResponse{
2827 MeBasePacket: omci.MeBasePacket{
2828 EntityClass: me.SoftwareImageClassID,
2829 EntityInstance: aImageMeID, //inactive image
2830 },
2831 Result: 0, //simulate done, option would be busy
2832 NumberOfInstances: 0, //basic ONU-G instance
2833 }
2834 var respOptions gopacket.SerializeOptions
2835 respOptions.FixLengths = true
2836 respBuffer := gopacket.NewSerializeBuffer()
2837 respErr := gopacket.SerializeLayers(respBuffer, respOptions, respOmciLayer, response)
2838 if respErr != nil {
2839 logger.Errorw(ctx, "Cannot serialize EndSwDlResponse", log.Fields{"Err": respErr,
2840 "device-id": oo.deviceID})
2841 return
2842 }
2843 respPacket := respBuffer.Bytes()
2844 logger.Debugw(ctx, "simulate EndSwDlResponse", log.Fields{"device-id": oo.deviceID,
2845 "SequNo": strconv.FormatInt(int64(tid), 16),
2846 "InstId": strconv.FormatInt(int64(aImageMeID), 16),
2847 "result": 0})
2848 go func(oo *omciCC) {
2849 _ = oo.receiveMessage(ctx, respPacket)
2850 }(oo)
2851 //**** test simulation - as long as BBSIM does not support ONU SW upgrade *** stop *****
2852 }()
mpagenko80622a52021-02-09 16:53:23 +00002853 return nil
2854}
2855
2856func (oo *omciCC) sendActivateSoftware(ctx context.Context, timeout int, highPrio bool,
2857 rxChan chan Message, aImageMeID uint16) error {
2858 tid := oo.getNextTid(highPrio)
2859 logger.Debugw(ctx, "send ActivateSwRequest:", log.Fields{"device-id": oo.deviceID,
2860 "SequNo": strconv.FormatInt(int64(tid), 16),
2861 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2862
2863 omciLayer := &omci.OMCI{
2864 TransactionID: tid,
2865 MessageType: omci.ActivateSoftwareRequestType,
2866 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2867 // Length: 0x28, // Optional, defaults to 40 octets
2868 }
2869 request := &omci.ActivateSoftwareRequest{
2870 MeBasePacket: omci.MeBasePacket{
2871 EntityClass: me.SoftwareImageClassID,
2872 EntityInstance: aImageMeID, //inactive image
2873 },
2874 ActivateFlags: 0, //unconditionally reset as the only relevant option here (regardless of VOIP)
2875 }
2876
2877 var options gopacket.SerializeOptions
2878 options.FixLengths = true
2879 buffer := gopacket.NewSerializeBuffer()
2880 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2881 if err != nil {
2882 logger.Errorw(ctx, "Cannot serialize ActivateSwRequest", log.Fields{"Err": err,
2883 "device-id": oo.deviceID})
2884 return err
2885 }
2886 outgoingPacket := buffer.Bytes()
2887
2888 omciRxCallbackPair := callbackPair{cbKey: tid,
2889 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2890 }
2891 err = oo.send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
2892 if err != nil {
2893 logger.Errorw(ctx, "Cannot send ActivateSwRequest", log.Fields{"Err": err,
2894 "device-id": oo.deviceID})
2895 return err
2896 }
2897 logger.Debug(ctx, "send ActivateSwRequest done")
2898
mpagenko15ff4a52021-03-02 10:09:20 +00002899 go func() {
2900 //**** test simulation - as long as BBSIM does not support ONU SW upgrade *** start *****
2901 time.Sleep(time.Millisecond * 50) //give some response time
mpagenko80622a52021-02-09 16:53:23 +00002902
mpagenko15ff4a52021-03-02 10:09:20 +00002903 respOmciLayer := &omci.OMCI{
2904 TransactionID: tid,
2905 MessageType: omci.ActivateSoftwareResponseType,
2906 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2907 // Length: 0x28, // Optional, defaults to 40 octets
2908 }
2909 response := &omci.ActivateSoftwareResponse{
2910 MeBasePacket: omci.MeBasePacket{
2911 EntityClass: me.SoftwareImageClassID,
2912 EntityInstance: aImageMeID, //inactive image
2913 },
2914 Result: 0, //simulate done, option would be busy
2915 }
2916 var respOptions gopacket.SerializeOptions
2917 respOptions.FixLengths = true
2918 respBuffer := gopacket.NewSerializeBuffer()
2919 respErr := gopacket.SerializeLayers(respBuffer, respOptions, respOmciLayer, response)
2920 if respErr != nil {
2921 logger.Errorw(ctx, "Cannot serialize ActivateSwResponse", log.Fields{"Err": respErr,
2922 "device-id": oo.deviceID})
2923 return
2924 }
2925 respPacket := respBuffer.Bytes()
2926 logger.Debugw(ctx, "simulate ActivateSwResponse", log.Fields{"device-id": oo.deviceID,
2927 "SequNo": strconv.FormatInt(int64(tid), 16),
2928 "InstId": strconv.FormatInt(int64(aImageMeID), 16),
2929 "result": 0})
2930 go func(oo *omciCC) {
2931 _ = oo.receiveMessage(ctx, respPacket)
2932 }(oo)
2933 //**** test simulation - as long as BBSIM does not support ONU SW upgrade *** stop *****
2934 }()
2935 return nil
2936}
mpagenko80622a52021-02-09 16:53:23 +00002937
mpagenko15ff4a52021-03-02 10:09:20 +00002938func (oo *omciCC) sendCommitSoftware(ctx context.Context, timeout int, highPrio bool,
2939 rxChan chan Message, aImageMeID uint16) error {
2940 tid := oo.getNextTid(highPrio)
2941 logger.Debugw(ctx, "send CommitSwRequest:", log.Fields{"device-id": oo.deviceID,
2942 "SequNo": strconv.FormatInt(int64(tid), 16),
2943 "InstId": strconv.FormatInt(int64(aImageMeID), 16)})
2944
2945 omciLayer := &omci.OMCI{
mpagenko80622a52021-02-09 16:53:23 +00002946 TransactionID: tid,
mpagenko15ff4a52021-03-02 10:09:20 +00002947 MessageType: omci.CommitSoftwareRequestType,
mpagenko80622a52021-02-09 16:53:23 +00002948 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2949 // Length: 0x28, // Optional, defaults to 40 octets
2950 }
mpagenko15ff4a52021-03-02 10:09:20 +00002951 request := &omci.CommitSoftwareRequest{
mpagenko80622a52021-02-09 16:53:23 +00002952 MeBasePacket: omci.MeBasePacket{
2953 EntityClass: me.SoftwareImageClassID,
2954 EntityInstance: aImageMeID, //inactive image
2955 },
mpagenko80622a52021-02-09 16:53:23 +00002956 }
mpagenko15ff4a52021-03-02 10:09:20 +00002957
2958 var options gopacket.SerializeOptions
2959 options.FixLengths = true
2960 buffer := gopacket.NewSerializeBuffer()
2961 err := gopacket.SerializeLayers(buffer, options, omciLayer, request)
2962 if err != nil {
2963 logger.Errorw(ctx, "Cannot serialize CommitSwRequest", log.Fields{"Err": err,
mpagenko80622a52021-02-09 16:53:23 +00002964 "device-id": oo.deviceID})
mpagenko15ff4a52021-03-02 10:09:20 +00002965 return err
mpagenko80622a52021-02-09 16:53:23 +00002966 }
mpagenko15ff4a52021-03-02 10:09:20 +00002967 outgoingPacket := buffer.Bytes()
2968
2969 omciRxCallbackPair := callbackPair{cbKey: tid,
2970 cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, true},
2971 }
2972 err = oo.send(ctx, outgoingPacket, timeout, 0, highPrio, omciRxCallbackPair)
2973 if err != nil {
2974 logger.Errorw(ctx, "Cannot send CommitSwRequest", log.Fields{"Err": err,
2975 "device-id": oo.deviceID})
2976 return err
2977 }
2978 logger.Debug(ctx, "send CommitSwRequest done")
2979
2980 go func() {
2981 //**** test simulation - as long as BBSIM does not support ONU SW upgrade *** start *****
2982 time.Sleep(time.Millisecond * 50) //give some response time
2983 respOmciLayer := &omci.OMCI{
2984 TransactionID: tid,
2985 MessageType: omci.CommitSoftwareResponseType,
2986 // DeviceIdentifier: omci.BaselineIdent, // Optional, defaults to Baseline
2987 // Length: 0x28, // Optional, defaults to 40 octets
2988 }
2989 response := &omci.CommitSoftwareResponse{
2990 MeBasePacket: omci.MeBasePacket{
2991 EntityClass: me.SoftwareImageClassID,
2992 EntityInstance: aImageMeID, //inactive image
2993 },
2994 //TODO: Not yet supported by omci-lib Result: 0, //simulate done
2995 }
2996 var respOptions gopacket.SerializeOptions
2997 respOptions.FixLengths = true
2998 respBuffer := gopacket.NewSerializeBuffer()
2999 respErr := gopacket.SerializeLayers(respBuffer, respOptions, respOmciLayer, response)
3000 if respErr != nil {
3001 logger.Errorw(ctx, "Cannot serialize CommitSwResponse", log.Fields{"Err": respErr,
3002 "device-id": oo.deviceID})
3003 return
3004 }
3005 respPacket := respBuffer.Bytes()
3006 logger.Debugw(ctx, "simulate CommitSwResponse", log.Fields{"device-id": oo.deviceID,
3007 "SequNo": strconv.FormatInt(int64(tid), 16),
3008 "InstId": strconv.FormatInt(int64(aImageMeID), 16),
3009 "result": 0})
3010 go func(oo *omciCC) {
3011 _ = oo.receiveMessage(ctx, respPacket)
3012 }(oo)
3013 //**** test simulation - as long as BBSIM does not support ONU SW upgrade *** stop *****
3014 }()
mpagenko80622a52021-02-09 16:53:23 +00003015 return nil
3016}
3017
Holger Hildebrandt0bd45f82021-01-11 13:29:37 +00003018func isResponseWithMibDataSync(msgType omci.MessageType) bool {
3019 for _, v := range responsesWithMibDataSync {
3020 if v == msgType {
3021 return true
3022 }
3023 }
3024 return false
3025}