From 19792d9706dd1dbc64bb234dc661c7d3c9d692fa Mon Sep 17 00:00:00 2001 From: Shaun S Date: Wed, 14 Apr 2021 23:49:39 +0800 Subject: [PATCH 1/2] Fix flow of ACKs to ensure we do not hang on final buf write --- rshell/main.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/rshell/main.py b/rshell/main.py index 23b64d3..b6fa353 100755 --- a/rshell/main.py +++ b/rshell/main.py @@ -1093,8 +1093,6 @@ def recv_file_from_host(src_file, dst_filename, filesize, dst_mode='wb'): write_buf = bytearray(buf_size) read_buf = bytearray(buf_size) while bytes_remaining > 0: - # Send back an ack as a form of flow control - sys.stdout.write('\x06') read_size = min(bytes_remaining, buf_size) buf_remaining = read_size buf_index = 0 @@ -1116,6 +1114,10 @@ def recv_file_from_host(src_file, dst_filename, filesize, dst_mode='wb'): if hasattr(os, 'sync'): os.sync() bytes_remaining -= read_size + + # Send back an ack as a form of flow control + sys.stdout.write('\x06') + return True except: return False @@ -1129,12 +1131,6 @@ def send_file_to_remote(dev, src_file, dst_filename, filesize, dst_mode='wb'): save_timeout = dev.timeout dev.timeout = 2 while bytes_remaining > 0: - # Wait for ack so we don't get too far ahead of the remote - ack = dev.read(1) - if ack is None or ack != b'\x06': - sys.stderr.write("timed out or error in transfer to remote: {!r}\n".format(ack)) - sys.exit(2) - if HAS_BUFFER: buf_size = BUFFER_SIZE else: @@ -1147,6 +1143,13 @@ def send_file_to_remote(dev, src_file, dst_filename, filesize, dst_mode='wb'): dev.write(buf) else: dev.write(binascii.hexlify(buf)) + + # Wait for ack so we don't get too far ahead of the remote + ack = dev.read(1) + if ack is None or ack != b'\x06': + sys.stderr.write("timed out or error in transfer to remote: {!r}\n".format(ack)) + sys.exit(2) + bytes_remaining -= read_size #sys.stdout.write('\r') dev.timeout = save_timeout From 9da4ca11d4d884c788a5ad2bb914ada41ab3601a Mon Sep 17 00:00:00 2001 From: Shaun S Date: Mon, 9 Aug 2021 21:28:13 +0800 Subject: [PATCH 2/2] Add DC1 for start of transmission --- rshell/main.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/rshell/main.py b/rshell/main.py index b6fa353..aea7871 100755 --- a/rshell/main.py +++ b/rshell/main.py @@ -1092,6 +1092,10 @@ def recv_file_from_host(src_file, dst_filename, filesize, dst_mode='wb'): buf_size = BUFFER_SIZE write_buf = bytearray(buf_size) read_buf = bytearray(buf_size) + + # Send XON (DC1) signal to the host to inform it we are ready to receive new data + sys.stdout.write('\x11') + while bytes_remaining > 0: read_size = min(bytes_remaining, buf_size) buf_remaining = read_size @@ -1130,6 +1134,13 @@ def send_file_to_remote(dev, src_file, dst_filename, filesize, dst_mode='wb'): bytes_remaining = filesize save_timeout = dev.timeout dev.timeout = 2 + + # Block waiting for XON (DC1) signal from remote before sending data + xon = dev.read(1) + if not xon or xon != b'\x11': + sys.stderr.write("timed out expecting XON signal from remote, received: {!r}\n".format(xon)) + sys.exit(2) + while bytes_remaining > 0: if HAS_BUFFER: buf_size = BUFFER_SIZE