summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config.tests/socketcan_fd/main.cpp3
-rw-r--r--src/plugins/canbus/socketcan/socketcanbackend.cpp24
2 files changed, 27 insertions, 0 deletions
diff --git a/config.tests/socketcan_fd/main.cpp b/config.tests/socketcan_fd/main.cpp
index d499f4b..966c390 100644
--- a/config.tests/socketcan_fd/main.cpp
+++ b/config.tests/socketcan_fd/main.cpp
@@ -39,6 +39,9 @@
int main()
{
canfd_frame frame;
+ int fd_payload = CANFD_MAX_DLEN;
+ fd_payload = CAN_RAW_FD_FRAMES;
+ fd_payload = CANFD_MTU;
return 0;
}
diff --git a/src/plugins/canbus/socketcan/socketcanbackend.cpp b/src/plugins/canbus/socketcan/socketcanbackend.cpp
index 122b546..48a2aaf 100644
--- a/src/plugins/canbus/socketcan/socketcanbackend.cpp
+++ b/src/plugins/canbus/socketcan/socketcanbackend.cpp
@@ -48,6 +48,30 @@
#include <sys/ioctl.h>
#include <sys/time.h>
+#ifndef CANFD_MTU
+// CANFD support was added by Linux kernel 3.6
+// For prior kernels we redefine the missing defines here
+// they are taken from linux/can/raw.h & linux/can.h
+
+enum {
+ CAN_RAW_FD_FRAMES = 5
+};
+
+#define CAN_MAX_DLEN 8
+#define CANFD_MAX_DLEN 64
+struct canfd_frame {
+ canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
+ __u8 len; /* frame payload length in byte */
+ __u8 flags; /* additional flags for CAN FD */
+ __u8 __res0; /* reserved / padding */
+ __u8 __res1; /* reserved / padding */
+ __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
+};
+#define CAN_MTU (sizeof(struct can_frame))
+#define CANFD_MTU (sizeof(struct canfd_frame))
+
+#endif
+
QT_BEGIN_NAMESPACE
SocketCanBackend::SocketCanBackend(const QString &name) :