From 73c26dcf897ad04ee8263decacf9574e0606fc7c Mon Sep 17 00:00:00 2001 From: Thad House Date: Sat, 16 Aug 2025 22:51:45 -0700 Subject: [PATCH] [hal] Enable CAN FD on bus when bus is configured for FD (#8175) Without this, FD reads would not be supported, however FD writes would still work. --- hal/src/main/native/systemcore/CAN.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/hal/src/main/native/systemcore/CAN.cpp b/hal/src/main/native/systemcore/CAN.cpp index 1b6bc4b290..e7a7fc7929 100644 --- a/hal/src/main/native/systemcore/CAN.cpp +++ b/hal/src/main/native/systemcore/CAN.cpp @@ -186,6 +186,25 @@ bool SocketCanState::InitializeBuses() { return; } + if (ioctl(socketHandle[i], SIOCGIFMTU, &ifr) == -1) { + wpi::print("ioctl(SIOCGIFMTU) for CAN {} failed with {}\n", + ifr.ifr_name, std::strerror(errno)); + success = false; + return; + } + + if (ifr.ifr_mtu == CANFD_MTU) { + int fdSet = 1; + if (setsockopt(socketHandle[i], SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &fdSet, + sizeof(fdSet)) != 0) { + wpi::print( + "setsockopt(CAN_RAW_FD_FRAMES) for CAN {} failed with {}\n", + ifr.ifr_name, std::strerror(errno)); + success = false; + return; + } + } + auto poll = wpi::uv::Poll::Create(loop, socketHandle[i]); if (!poll) { wpi::print("wpi::uv::Poll::Create for CAN {} failed\n", ifr.ifr_name);