From 9aefd9058d1a74032265446c5c8b4c3abfc045de Mon Sep 17 00:00:00 2001 From: Peter van der Perk Date: Wed, 25 Mar 2026 17:22:54 +0100 Subject: [PATCH] fix(uavcan): Change SocketCAN return code handling Don't forward posix return codes and parse errno instead so api knows it neeeds to do a retry instead of a discard --- .../socketcan/driver/src/socketcan.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/drivers/uavcan/uavcan_drivers/socketcan/driver/src/socketcan.cpp b/src/drivers/uavcan/uavcan_drivers/socketcan/driver/src/socketcan.cpp index 8df5c21b5e..b16950c009 100644 --- a/src/drivers/uavcan/uavcan_drivers/socketcan/driver/src/socketcan.cpp +++ b/src/drivers/uavcan/uavcan_drivers/socketcan/driver/src/socketcan.cpp @@ -200,7 +200,11 @@ uavcan::int16_t CanIface::send(const uavcan::CanFrame &frame, uavcan::MonotonicT return 1; } else { - return res; + if (errno == ENOBUFS || errno == EAGAIN || errno == EWOULDBLOCK) { + return 0; // Transmit queue is full, retry + } + + return -1; } } @@ -210,7 +214,11 @@ uavcan::int16_t CanIface::receive(uavcan::CanFrame &out_frame, uavcan::Monotonic int32_t result = recvmsg(_fd, &_recv_msg, MSG_DONTWAIT); if (result < 0) { - return result; + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return 0; + } + + return -1; } /* Copy SocketCAN frame to CanardFrame */ @@ -220,7 +228,7 @@ uavcan::int16_t CanIface::receive(uavcan::CanFrame &out_frame, uavcan::Monotonic out_frame.id = recv_frame->can_id; if (recv_frame->len > CANFD_MAX_DLEN) { - return -EFAULT; + return -1; } out_frame.dlc = recv_frame->len; @@ -231,7 +239,7 @@ uavcan::int16_t CanIface::receive(uavcan::CanFrame &out_frame, uavcan::Monotonic out_frame.id = recv_frame->can_id; if (recv_frame->can_dlc > CAN_MAX_DLEN) { - return -EFAULT; + return -1; } out_frame.dlc = recv_frame->can_dlc; @@ -245,7 +253,7 @@ uavcan::int16_t CanIface::receive(uavcan::CanFrame &out_frame, uavcan::Monotonic out_ts_monotonic = uavcan::MonotonicTime::fromUSec(tv->tv_sec * 1000000ULL + tv->tv_usec); } - return result; + return 1; }