Skip to content

Commit 8854aa7

Browse files
rumpelsepppeckto
andcommitted
feat(fr): Handle FlowControl messages for large messages
Co-authored-by: Tobias Specht <tobias.specht@aisec.fraunhofer.de>
1 parent 3b93bfe commit 8854aa7

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

src/gallia/transports/flexray_vector.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,19 @@ async def read_tp_frame(self) -> FlexRayTPFrame:
421421
logger.trace("read FlexRayTPFrame %s", repr(frame))
422422
return frame
423423

424+
def _require_fc_frame(self, block_size: int, read_bytes: int) -> bool:
425+
# 6 bytes already read in first frame.
426+
return ((read_bytes - 6) & block_size) == 0
427+
428+
async def _send_flow_control_frame(self) -> None:
429+
block_size = self.config.fc_block_size
430+
fc_frame = FlexRayTPFlowControlFrame(
431+
flag=FlexRayTPFlowControlFlag.CONTINUE_TO_SEND,
432+
separation_time=self.config.fc_separation_time,
433+
block_size=block_size,
434+
)
435+
await self.write_tp_frame(fc_frame)
436+
424437
async def _handle_fragmented(self, expected_len: int) -> bytes:
425438
# 6 bytes already read in first frame.
426439
# Headersize is 2 byte.
@@ -431,6 +444,10 @@ async def _handle_fragmented(self, expected_len: int) -> bytes:
431444
while read_bytes < expected_len:
432445
# Reordering is not implemented.
433446
logger.debug(f"expected_len: {expected_len}; read_bytes: {read_bytes}")
447+
448+
if self._require_fc_frame(self.config.fc_block_size, read_bytes):
449+
await self._send_flow_control_frame()
450+
434451
frame = await self.read_tp_frame()
435452
if not isinstance(frame, FlexRayTPConsecutiveFrame):
436453
raise RuntimeError(f"expected consecutive frame, got: {frame}")
@@ -455,15 +472,6 @@ async def read_unsafe(
455472
case FlexRayTPSingleFrame():
456473
return frame.data
457474
case FlexRayTPFirstFrame():
458-
fc_frame = FlexRayTPFlowControlFrame(
459-
flag=FlexRayTPFlowControlFlag.CONTINUE_TO_SEND,
460-
separation_time=self.config.fc_separation_time,
461-
# TODO: send again after block_size number of frames is read.
462-
# Maybe move sending the flow control frame into the
463-
# _handle_fragmented() function and create a loop.
464-
block_size=self.config.fc_block_size,
465-
)
466-
await self.write_tp_frame(fc_frame)
467475
data = frame.data + await self._handle_fragmented(frame.size)
468476
data = data[: frame.size]
469477
logger.debug("read data: %s", data.hex())

0 commit comments

Comments
 (0)