Browse Source

ignore repeated block 0 packets

simon 1 day ago
parent
commit
b1c6f76ee3
1 changed files with 16 additions and 3 deletions
  1. 16 3
      src/shellmatta_ymodem.c

+ 16 - 3
src/shellmatta_ymodem.c

@@ -187,10 +187,23 @@ static shellmatta_retCode_t ymodem_stateMachine(shellmatta_handle_t handle, uint
             }
             else
             {
-                if(((0xffu - byte) != inst->ymodem.packet.packetNumber) ||
-                  (inst->ymodem.packetCounter % 256u != inst->ymodem.packet.packetNumber))
+                if((0xffu - byte) != inst->ymodem.packet.packetNumber)
                 {
-                    /** -# return error on packet number mismatch or on unexpected packet numbers */
+                    /** -# return error on packet number complement mismatch */
+                    inst->ymodem.state = SHELLMATTA_YMODEM_WAIT_FOR_START;
+                    shellmatta_ymodem_control(handle, YMODEM_NAK);
+                    ret = SHELLMATTA_ERROR;
+                }
+                else if((1u == inst->ymodem.packetCounter) && 
+                        (0 == inst->ymodem.packet.packetNumber))
+                {
+                    /** -# ignore duplicate header packets after first successful reception during */
+                    inst->ymodem.state = SHELLMATTA_YMODEM_WAIT_FOR_START;
+                    ret = SHELLMATTA_OK;
+                }
+                else if(inst->ymodem.packetCounter % 256u != inst->ymodem.packet.packetNumber)
+                {
+                    /** -# return error on unexpected packet numbers */
                     inst->ymodem.state = SHELLMATTA_YMODEM_WAIT_FOR_START;
                     shellmatta_ymodem_control(handle, YMODEM_NAK);
                     ret = SHELLMATTA_ERROR;