Для чего нужно поле «флаги» в canfd_frame в SocketCAN?

Кадр 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 выглядит полезным, но я не нашел документации о том, что оно на самом деле содержит. Является ли он внутренним (т.е. установленным ядром)? Каковы возможные флаги и что они означают?

Благодарю вас!


person Adam Selker    schedule 30.06.2017    source источник


Ответы (1)


Я нашел немного информации здесь:

http://elixir.free-electrons.com/linux/latest/source/include/uapi/linux/can.h#L112

/*
 * defined bits for canfd_frame.flags
 *
 * The use of struct canfd_frame implies the Extended Data Length (EDL) bit to
 * be set in the CAN frame bitstream on the wire. The EDL bit switch turns
 * the CAN controllers bitstream processor into the CAN FD mode which creates
 * two new options within the CAN FD frame specification:
 *
 * Bit Rate Switch - to indicate a second bitrate is/was used for the payload
 * Error State Indicator - represents the error state of the transmitting node
 *
 * As the CANFD_ESI bit is internally generated by the transmitting CAN
 * controller only the CANFD_BRS bit is relevant for real CAN controllers when
 * building a CAN FD frame for transmission. Setting the CANFD_ESI bit can make
 * sense for virtual CAN interfaces to test applications with echoed frames.
 */

Если я правильно понимаю, бит ESI полезен только для тестирования виртуальных интерфейсов CAN. Однако бит BRS довольно низкоуровневый, и здесь не указано, будет ли аппаратное обеспечение устанавливать его автоматически или отключать.

person Adam Selker    schedule 30.06.2017