Кадр CAN без FD («устаревший») имеет следующий формат в SocketCAN:
struct can_frame {
canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
__u8 can_dlc; /* frame payload length in byte (0 .. 8) */
__u8 __pad; /* padding */
__u8 __res0; /* reserved / padding */
__u8 __res1; /* reserved / padding */
__u8 data[8] __attribute__((aligned(8)));
};
Идентификатор кадра, длина и данные имеют четкие места, а также некоторые отступы, о которых мы не беспокоимся. Однако для кадра CAN-FD есть дополнительное поле:
struct canfd_frame {
canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
__u8 len; /* frame payload length in byte (0 .. 64) */
__u8 flags; /* additional flags for CAN FD */
__u8 __res0; /* reserved / padding */
__u8 __res1; /* reserved / padding */
__u8 data[64] __attribute__((aligned(8)));
};
Поле flags
выглядит полезным, но я не нашел документации о том, что оно на самом деле содержит. Является ли он внутренним (т.е. установленным ядром)? Каковы возможные флаги и что они означают?
Благодарю вас!