@@ -114,7 +114,11 @@ ProtocolError FirmwareUpdate::responseAck(Message* msg, bool* handled) {
114
114
LOG (INFO, " Duplicate chunks: %u" , stats_.duplicateChunks );
115
115
LOG (INFO, " Out-of-order chunks: %u" , stats_.outOfOrderChunks );
116
116
LOG (INFO, " Applying firmware update" );
117
- r = callbacks_->finish_firmware_update (0 );
117
+ FirmwareUpdateFlags flags;
118
+ if (discardData_) {
119
+ flags |= FirmwareUpdateFlag::DISCARD_DATA;
120
+ }
121
+ r = callbacks_->finish_firmware_update (flags.value ());
118
122
if (r < 0 ) {
119
123
LOG (ERROR, " Failed to apply firmware update: %d" , r);
120
124
cancelUpdate ();
@@ -361,22 +365,34 @@ int FirmwareUpdate::handleFinishRequest(const CoapMessageDecoder& d, CoapMessage
361
365
FirmwareUpdateFlags flags;
362
366
if (discardData) {
363
367
LOG (INFO, " Discard data: %u" , (unsigned )discardData);
364
- flags |= FirmwareUpdateFlag::DISCARD_DATA;
365
368
}
366
369
if (cancelUpdate) {
367
370
LOG (INFO, " Cancel update: %u" , (unsigned )cancelUpdate);
368
- LOG (INFO , " Cancelling firmware update" );
371
+ LOG (WARN , " Cancelling firmware update" );
369
372
flags |= FirmwareUpdateFlag::CANCEL;
373
+ if (discardData) {
374
+ flags |= FirmwareUpdateFlag::DISCARD_DATA;
375
+ }
370
376
} else {
371
377
if (fileOffset_ != fileSize_) {
372
378
SYSTEM_ERROR_MESSAGE (" Incomplete file transfer" );
373
379
return SYSTEM_ERROR_PROTOCOL;
374
380
}
375
381
LOG (INFO, " Validating firmware update" );
376
382
flags |= FirmwareUpdateFlag::VALIDATE_ONLY;
383
+ // The DISCARD_DATA flag has no effect when combined with VALIDATE_ONLY. The flag will be
384
+ // set later, when a response for the UpdateFinish request is received
385
+ discardData_ = discardData;
377
386
}
378
387
const auto t1 = millis ();
379
- CHECK (callbacks_->finish_firmware_update (flags.value ()));
388
+ int r = callbacks_->finish_firmware_update (flags.value ());
389
+ if (r < 0 ) {
390
+ if (!cancelUpdate) {
391
+ // Make sure the module data is going to be discarded
392
+ discardData_ = true ;
393
+ }
394
+ return r;
395
+ }
380
396
stats_.processingTime += millis () - t1;
381
397
e->type (d.type ());
382
398
e->code (CoapCode::CHANGED);
@@ -739,7 +755,11 @@ int FirmwareUpdate::sendEmptyAck(Message* msg, CoapType type, CoapMessageId id)
739
755
740
756
void FirmwareUpdate::cancelUpdate () {
741
757
if (updating_) {
742
- const int r = callbacks_->finish_firmware_update ((unsigned )FirmwareUpdateFlag::CANCEL);
758
+ FirmwareUpdateFlags flags = FirmwareUpdateFlag::CANCEL;
759
+ if (discardData_) {
760
+ flags |= FirmwareUpdateFlag::DISCARD_DATA;
761
+ }
762
+ const int r = callbacks_->finish_firmware_update (flags.value ());
743
763
if (r < 0 ) {
744
764
LOG (ERROR, " Failed to cancel the update: %d" , r);
745
765
}
@@ -765,6 +785,8 @@ void FirmwareUpdate::reset() {
765
785
finishRespId_ = -1 ;
766
786
errorRespId_ = -1 ;
767
787
hasGaps_ = false ;
788
+ discardData_ = false ;
789
+ // updating_ is cleared separately
768
790
}
769
791
770
792
} // namespace protocol
0 commit comments