+
+canfd_frame CanBus_t::can_read()
+{
+ ssize_t nbytes;
+ int maxdlen;
+ canfd_frame canfd_frame;
+
+ /* Test that socket is really opened */
+ if (can_socket_ < 0)
+ {
+ ERROR(interface_, "read_can: Socket unavailable. Closing thread.");
+ is_running_ = false;
+ }
+
+ nbytes = ::read(can_socket_, &canfd_frame, CANFD_MTU);
+
+ switch(nbytes)
+ {
+ case CANFD_MTU:
+ DEBUG(interface_, "read_can: Got an CAN FD frame with length %d", canfd_frame.len);
+ maxdlen = CANFD_MAX_DLEN;
+ break;
+ case CAN_MTU:
+ DEBUG(interface_, "read_can: Got a legacy CAN frame with length %d", canfd_frame.len);
+ maxdlen = CAN_MAX_DLEN;
+ break;
+ default:
+ if (errno == ENETDOWN)
+ ERROR(interface_, "read_can: %s interface down", device);
+ ERROR(interface_, "read_can: Error reading CAN bus");
+ ::memset(&canfd_frame, 0, sizeof(canfd_frame));
+ break;
+ }
+
+ return canfd_frame;
+}
+
+void CanBus_t::start_threads()