From edcd0fe4d41be59b7a5f046e68fee93e6898357f Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 17 Apr 2024 23:23:50 -0700 Subject: [PATCH] IsoTpMessage: extend timeout on first frame response (#1933) * extend on first frame too * debug/checks * fix able to go from single to first to single etc forever * more clean up * more clean up * comments! --- python/uds.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/python/uds.py b/python/uds.py index 12b4fcdc2..32b0de096 100644 --- a/python/uds.py +++ b/python/uds.py @@ -455,7 +455,8 @@ class IsoTpMessage(): for msg in self._can_client.recv(): frame_type = self._isotp_rx_next(msg) start_time = time.monotonic() - rx_in_progress = frame_type == ISOTP_FRAME_TYPE.CONSECUTIVE + # Anything that signifies we're building a response + rx_in_progress = frame_type in (ISOTP_FRAME_TYPE.FIRST, ISOTP_FRAME_TYPE.CONSECUTIVE) if self.tx_done and self.rx_done: return self.rx_dat, False # no timeout indicates non-blocking @@ -473,6 +474,7 @@ class IsoTpMessage(): # assert len(rx_data) == self.max_len, f"isotp - rx: invalid CAN frame length: {len(rx_data)}" if rx_data[0] >> 4 == ISOTP_FRAME_TYPE.SINGLE: + assert self.rx_dat == b"" or self.rx_done, "isotp - rx: single frame with active frame" self.rx_len = rx_data[0] & 0x0F assert self.rx_len < self.max_len, f"isotp - rx: invalid single frame length: {self.rx_len}" self.rx_dat = rx_data[1:1 + self.rx_len] @@ -483,8 +485,11 @@ class IsoTpMessage(): return ISOTP_FRAME_TYPE.SINGLE elif rx_data[0] >> 4 == ISOTP_FRAME_TYPE.FIRST: + # Once a first frame is received, further frames must be consecutive + assert self.rx_dat == b"" or self.rx_done, "isotp - rx: first frame with active frame" self.rx_len = ((rx_data[0] & 0x0F) << 8) + rx_data[1] - assert self.max_len <= self.rx_len, f"isotp - rx: invalid first frame length: {self.rx_len}" + assert self.rx_len >= self.max_len, f"isotp - rx: invalid first frame length: {self.rx_len}" + assert len(rx_data) == self.max_len, f"isotp - rx: invalid CAN frame length: {len(rx_data)}" self.rx_dat = rx_data[2:] self.rx_idx = 0 self.rx_done = False