From 1bd5250e5e723d162592f78785b2e9434b368aab Mon Sep 17 00:00:00 2001 From: Martin Teichmann <martin.teichmann@xfel.eu> Date: Tue, 27 Feb 2024 16:01:28 +0000 Subject: [PATCH] do not send to big packets --- ebpfcat/ethercat.py | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/ebpfcat/ethercat.py b/ebpfcat/ethercat.py index c7d54aa..b6e02a7 100644 --- a/ebpfcat/ethercat.py +++ b/ebpfcat/ethercat.py @@ -215,7 +215,7 @@ class Packet: packets. We implicitly add a datagram in the front which later serves as an identifier for the packet. """ - MAXSIZE = 1000 # maximum size we use for an EtherCAT packet + MAXSIZE = 1500 # maximum size we use for an EtherCAT packet ETHERNET_HEADER = 14 PACKET_HEADER = 16 DATAGRAM_HEADER = 10 @@ -236,8 +236,15 @@ class Packet: Depending on the command, one or two more parameters represent the address, either terminal and offset for position or node addressing, or one value for logical addressing.""" + newsize = self.size + len(data) + self.DATAGRAM_HEADER \ + + self.DATAGRAM_TAIL + if newsize > self.MAXSIZE: + raise OverflowError("ethercat packet size too big") + elif len(self.data) > 14: + raise OverflowError("Too many datagrams per packet") + self.data.append((cmd, data, idx) + address) - self.size += len(data) + self.DATAGRAM_HEADER + self.DATAGRAM_TAIL + self.size = newsize def assemble(self, index): """Assemble the datagrams into a packet @@ -306,17 +313,24 @@ class EtherCat(Protocol): to be sent from a queue, packs them in a packet and ships them out. """ try: - packet = Packet() dgrams = [] + packet = Packet() + sent = True while True: - *dgram, future = await self.send_queue.get() - lastsize = packet.size - packet.append(*dgram) - dgrams.append((lastsize + 10, packet.size - 2, future)) - if packet.full() or self.send_queue.empty(): - ensure_future(self.process_packet(dgrams, packet)) - dgrams = [] - packet = Packet() + if sent: + *dgram, future = await self.send_queue.get() + try: + lastsize = packet.size + packet.append(*dgram) + dgrams.append((lastsize + 10, packet.size - 2, future)) + sent = True + if not self.send_queue.empty(): + continue + except OverflowError: + sent = False + ensure_future(self.process_packet(dgrams, packet)) + dgrams = [] + packet = Packet() except CancelledError: raise except Exception: -- GitLab