ONU SW upgrade API change - step 1 to allow for straightforward upgrade (with activate/commit options)
Signed-off-by: mpagenko <michael.pagenkopf@adtran.com>
Change-Id: I6808f8f41db40faa060ed7198025abdda8506ae7
diff --git a/internal/pkg/onuadaptercore/omci_cc.go b/internal/pkg/onuadaptercore/omci_cc.go
index f371379..0e3b8a5 100644
--- a/internal/pkg/onuadaptercore/omci_cc.go
+++ b/internal/pkg/onuadaptercore/omci_cc.go
@@ -492,13 +492,15 @@
func (oo *omciCC) send(ctx context.Context, txFrame []byte, timeout int, retry int, highPrio bool,
receiveCallbackPair callbackPair) error {
- logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": receiveCallbackPair.cbKey})
- // it could be checked, if the callback keay is already registered - but simply overwrite may be acceptable ...
- oo.mutexRxSchedMap.Lock()
- oo.rxSchedulerMap[receiveCallbackPair.cbKey] = receiveCallbackPair.cbEntry
- printFrame := receiveCallbackPair.cbEntry.framePrint //printFrame true means debug print of frame is requested
- oo.mutexRxSchedMap.Unlock()
+ if timeout != 0 {
+ logger.Debugw(ctx, "register-response-callback:", log.Fields{"for TansCorrId": receiveCallbackPair.cbKey})
+ oo.mutexRxSchedMap.Lock()
+ // it could be checked, if the callback key is already registered - but simply overwrite may be acceptable ...
+ oo.rxSchedulerMap[receiveCallbackPair.cbKey] = receiveCallbackPair.cbEntry
+ oo.mutexRxSchedMap.Unlock()
+ } //else timeout 0 indicates that no response is expected - fire and forget
+ printFrame := receiveCallbackPair.cbEntry.framePrint //printFrame true means debug print of frame is requested
//just use a simple list for starting - might need some more effort, especially for multi source write access
omciTxRequest := omciTransferStructure{
txFrame,
@@ -585,15 +587,6 @@
proxy_device_id=self._proxy_address.device_id
)
*/
- device, err := oo.coreProxy.GetDevice(ctx,
- oo.pBaseDeviceHandler.deviceID, oo.deviceID) //parent, child
- if err != nil || device == nil {
- /*TODO: needs to handle error scenarios */
- logger.Errorw(ctx, "Failed to fetch device", log.Fields{"err": err, "ParentId": oo.pBaseDeviceHandler.deviceID,
- "ChildId": oo.deviceID})
- return fmt.Errorf("failed to fetch device %s", oo.deviceID)
- }
-
if omciTxRequest.withFramePrint {
logger.Debugw(ctx, "omci-message-to-send:", log.Fields{
"TxOmciMessage": hex.EncodeToString(omciTxRequest.txFrame),
@@ -2706,7 +2699,7 @@
return nil
}
-func (oo *omciCC) sendDownloadSection(ctx context.Context, timeout int, highPrio bool,
+func (oo *omciCC) sendDownloadSection(ctx context.Context, aTimeout int, highPrio bool,
rxChan chan Message, aImageMeID uint16, aAckRequest uint8, aDownloadSectionNo uint8, aSection []byte, aPrint bool) error {
tid := oo.getNextTid(highPrio)
logger.Debugw(ctx, "send DlSectionRequest:", log.Fields{"device-id": oo.deviceID,
@@ -2716,8 +2709,10 @@
//TODO!!!: don't know by now on how to generate the possibly needed AR (or enforce it to 0) with current omci-lib
// by now just try to send it as defined by omci-lib
msgType := omci.DownloadSectionRequestType
+ var timeout int = 0 //default value for no response expected
if aAckRequest > 0 {
msgType = omci.DownloadSectionRequestWithResponseType
+ timeout = aTimeout
}
omciLayer := &omci.OMCI{
TransactionID: tid,
@@ -2754,6 +2749,8 @@
}
omciRxCallbackPair := callbackPair{cbKey: tid,
+ // the callback is set even though no response might be required here, the tid (key) setting is needed here anyway
+ // (used to avoid retransmission of frames with the same TID)
cbEntry: callbackPairEntry{rxChan, oo.receiveOmciResponse, printFrame /*aPrint*/},
}
err = oo.send(ctx, outgoingPacket, timeout, cDefaultRetries, highPrio, omciRxCallbackPair)
@@ -3014,52 +3011,58 @@
func (oo *omciCC) processRequestMonitoring(ctx context.Context, aOmciTxRequest omciTransferStructure) {
- chSuccess := make(chan bool)
- aOmciTxRequest.chSuccess = chSuccess
-
- tid := aOmciTxRequest.cbPair.cbKey
timeout := aOmciTxRequest.timeout
- retries := aOmciTxRequest.retries
-
- oo.mutexMonReq.Lock()
- oo.monitoredRequests[tid] = aOmciTxRequest
- oo.mutexMonReq.Unlock()
-
- retryCounter := 0
-loop:
- for retryCounter <= retries {
-
+ if timeout == 0 {
+ //timeout 0 indicates that no response is expected - fire and forget
oo.mutexTxQueue.Lock()
oo.txQueue.PushBack(aOmciTxRequest) // enqueue
oo.mutexTxQueue.Unlock()
-
go oo.sendNextRequest(ctx)
+ } else {
+ chSuccess := make(chan bool)
+ aOmciTxRequest.chSuccess = chSuccess
+ tid := aOmciTxRequest.cbPair.cbKey
+ retries := aOmciTxRequest.retries
- select {
- case success := <-chSuccess:
- if success {
- logger.Debugw(ctx, "reqMon: response received in time",
- log.Fields{"tid": tid, "device-id": oo.deviceID})
- } else {
- logger.Debugw(ctx, "reqMon: wait for response aborted",
- log.Fields{"tid": tid, "device-id": oo.deviceID})
- }
- break loop
- case <-time.After(time.Duration(timeout) * time.Second):
- if retryCounter == retries {
- logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached!",
- log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
+ oo.mutexMonReq.Lock()
+ oo.monitoredRequests[tid] = aOmciTxRequest
+ oo.mutexMonReq.Unlock()
+
+ retryCounter := 0
+ loop:
+ for retryCounter <= retries {
+
+ oo.mutexTxQueue.Lock()
+ oo.txQueue.PushBack(aOmciTxRequest) // enqueue
+ oo.mutexTxQueue.Unlock()
+ go oo.sendNextRequest(ctx)
+
+ select {
+ case success := <-chSuccess:
+ if success {
+ logger.Debugw(ctx, "reqMon: response received in time",
+ log.Fields{"tid": tid, "device-id": oo.deviceID})
+ } else {
+ logger.Debugw(ctx, "reqMon: wait for response aborted",
+ log.Fields{"tid": tid, "device-id": oo.deviceID})
+ }
break loop
- } else {
- logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
- log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
+ case <-time.After(time.Duration(timeout) * time.Second):
+ if retryCounter == retries {
+ logger.Errorw(ctx, "reqMon: timeout waiting for response - no of max retries reached!",
+ log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
+ break loop
+ } else {
+ logger.Infow(ctx, "reqMon: timeout waiting for response - retry",
+ log.Fields{"tid": tid, "retries": retryCounter, "device-id": oo.deviceID})
+ }
}
+ retryCounter++
}
- retryCounter++
+ oo.mutexMonReq.Lock()
+ delete(oo.monitoredRequests, tid)
+ oo.mutexMonReq.Unlock()
}
- oo.mutexMonReq.Lock()
- delete(oo.monitoredRequests, tid)
- oo.mutexMonReq.Unlock()
}
//CancelRequestMonitoring terminates monitoring of outstanding omci requests