Skip to content

Commit 1a84fee

Browse files
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
1 parent 4a48525 commit 1a84fee

File tree

1 file changed

+13
-5
lines changed
  • src/drivers/uavcan/uavcan_drivers/socketcan/driver/src

1 file changed

+13
-5
lines changed

src/drivers/uavcan/uavcan_drivers/socketcan/driver/src/socketcan.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,11 @@ uavcan::int16_t CanIface::send(const uavcan::CanFrame &frame, uavcan::MonotonicT
200200
return 1;
201201

202202
} else {
203-
return res;
203+
if (errno == ENOBUFS || errno == EAGAIN || errno == EWOULDBLOCK) {
204+
return 0; // Transmit queue is full, retry
205+
}
206+
207+
return -1;
204208
}
205209
}
206210

@@ -210,7 +214,11 @@ uavcan::int16_t CanIface::receive(uavcan::CanFrame &out_frame, uavcan::Monotonic
210214
int32_t result = recvmsg(_fd, &_recv_msg, MSG_DONTWAIT);
211215

212216
if (result < 0) {
213-
return result;
217+
if (errno == EAGAIN || errno == EWOULDBLOCK) {
218+
return 0;
219+
}
220+
221+
return -1;
214222
}
215223

216224
/* Copy SocketCAN frame to CanardFrame */
@@ -220,7 +228,7 @@ uavcan::int16_t CanIface::receive(uavcan::CanFrame &out_frame, uavcan::Monotonic
220228
out_frame.id = recv_frame->can_id;
221229

222230
if (recv_frame->len > CANFD_MAX_DLEN) {
223-
return -EFAULT;
231+
return -1;
224232
}
225233

226234
out_frame.dlc = recv_frame->len;
@@ -231,7 +239,7 @@ uavcan::int16_t CanIface::receive(uavcan::CanFrame &out_frame, uavcan::Monotonic
231239
out_frame.id = recv_frame->can_id;
232240

233241
if (recv_frame->can_dlc > CAN_MAX_DLEN) {
234-
return -EFAULT;
242+
return -1;
235243
}
236244

237245
out_frame.dlc = recv_frame->can_dlc;
@@ -245,7 +253,7 @@ uavcan::int16_t CanIface::receive(uavcan::CanFrame &out_frame, uavcan::Monotonic
245253
out_ts_monotonic = uavcan::MonotonicTime::fromUSec(tv->tv_sec * 1000000ULL + tv->tv_usec);
246254
}
247255

248-
return result;
256+
return 1;
249257
}
250258

251259

0 commit comments

Comments
 (0)