From 0e782abcb4a0bcbbd40a68105f8a15d39560bc6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Caruso?= <nicolo.caruso@skywarder.eu> Date: Thu, 17 Apr 2025 12:00:11 +0200 Subject: [PATCH] [Wiz5500] Fix on the recvfrom not handling more than one packet The Wizznet driver in recvfrom was failing in case of received more than one packet. In that case the recvlength was greater than the length, making fail the recvfrom. Also it did not consume the data therefore not recovering from the failure. --- src/shared/drivers/WIZ5500/WIZ5500.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/shared/drivers/WIZ5500/WIZ5500.cpp b/src/shared/drivers/WIZ5500/WIZ5500.cpp index 4f0159743..3407a8b39 100644 --- a/src/shared/drivers/WIZ5500/WIZ5500.cpp +++ b/src/shared/drivers/WIZ5500/WIZ5500.cpp @@ -26,6 +26,7 @@ #include <interfaces/endianness.h> #include <kernel/scheduler/scheduler.h> #include <utils/KernelTime.h> +#include <algorithm> #include "WIZ5500Defs.h" @@ -378,18 +379,19 @@ ssize_t Wiz5500::recvfrom(int sock_n, uint8_t* data, size_t len, WizIp& dst_ip, // Remove what we have already read. recv_len -= sizeof(WizIp) + sizeof(uint16_t) + sizeof(uint16_t); - // Check if we actually have space - if (recv_len < len) - spiRead(Wiz::getSocketRxBlock(sock_n), addr, data, recv_len); + // Read the minimum between the received length and the maximum length + uint16_t read_len = std::min(static_cast<size_t>(recv_len), len); - addr += recv_len; + spiRead(Wiz::getSocketRxBlock(sock_n), addr, data, read_len); + + addr += read_len; spiWrite16(Wiz::getSocketRegBlock(sock_n), Wiz::Socket::REG_RX_RD, addr); // Finally tell the device that we correctly received and read the data spiWrite8(Wiz::getSocketRegBlock(sock_n), Wiz::Socket::REG_CR, Wiz::Socket::CMD_RECV); - return recv_len < len ? recv_len : -1; + return read_len; } void Wiz5500::close(int sock_n, int timeout) -- GitLab