Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

can: canxl: introduce CAN XL data structure

This patch adds defines for data structures and length information for
CAN XL (CAN with eXtended data Length) which can transfer up to 2048
byte inside a single frame.

Notable changes from CAN FD:

- the 11 bit arbitration field is now named 'priority' instead of 'can_id'
(there are no 29 bit identifiers nor RTR frames anymore)
- the data length needs a uint16 value to cover up to 2048 byte
(the length element position is different to struct can[fd]_frame)
- new fields (SDT, AF) and a SEC bit have been introduced
- the virtual CAN interface identifier is not part if the CAN XL frame
struct as this VCID value is stored in struct skbuff (analog to vlan id)

Acked-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Link: https://lore.kernel.org/all/20220912170725.120748-5-socketcan@hartkopp.net
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>

authored by

Oliver Hartkopp and committed by
Marc Kleine-Budde
1a3e3034 06183462

+51
+51
include/uapi/linux/can.h
··· 48 48 49 49 #include <linux/types.h> 50 50 #include <linux/socket.h> 51 + #include <linux/stddef.h> /* for offsetof */ 51 52 52 53 /* controller area network (CAN) kernel definitions */ 53 54 ··· 61 60 #define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */ 62 61 #define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */ 63 62 #define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */ 63 + #define CANXL_PRIO_MASK CAN_SFF_MASK /* 11 bit priority mask */ 64 64 65 65 /* 66 66 * Controller Area Network Identifier structure ··· 75 73 76 74 #define CAN_SFF_ID_BITS 11 77 75 #define CAN_EFF_ID_BITS 29 76 + #define CANXL_PRIO_BITS CAN_SFF_ID_BITS 78 77 79 78 /* 80 79 * Controller Area Network Error Message Frame Mask structure ··· 93 90 /* CAN FD payload length and DLC definitions according to ISO 11898-7 */ 94 91 #define CANFD_MAX_DLC 15 95 92 #define CANFD_MAX_DLEN 64 93 + 94 + /* 95 + * CAN XL payload length and DLC definitions according to ISO 11898-1 96 + * CAN XL DLC ranges from 0 .. 2047 => data length from 1 .. 2048 byte 97 + */ 98 + #define CANXL_MIN_DLC 0 99 + #define CANXL_MAX_DLC 2047 100 + #define CANXL_MAX_DLC_MASK 0x07FF 101 + #define CANXL_MIN_DLEN 1 102 + #define CANXL_MAX_DLEN 2048 96 103 97 104 /** 98 105 * struct can_frame - Classical CAN frame structure (aka CAN 2.0B) ··· 179 166 __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8))); 180 167 }; 181 168 169 + /* 170 + * defined bits for canxl_frame.flags 171 + * 172 + * The canxl_frame.flags element contains two bits CANXL_XLF and CANXL_SEC 173 + * and shares the relative position of the struct can[fd]_frame.len element. 174 + * The CANXL_XLF bit ALWAYS needs to be set to indicate a valid CAN XL frame. 175 + * As a side effect setting this bit intentionally breaks the length checks 176 + * for Classical CAN and CAN FD frames. 177 + * 178 + * Undefined bits in canxl_frame.flags are reserved and shall be set to zero. 179 + */ 180 + #define CANXL_XLF 0x80 /* mandatory CAN XL frame flag (must always be set!) */ 181 + #define CANXL_SEC 0x01 /* Simple Extended Content (security/segmentation) */ 182 + 183 + /** 184 + * struct canxl_frame - CAN with e'X'tended frame 'L'ength frame structure 185 + * @prio: 11 bit arbitration priority with zero'ed CAN_*_FLAG flags 186 + * @flags: additional flags for CAN XL 187 + * @sdt: SDU (service data unit) type 188 + * @len: frame payload length in byte (CANXL_MIN_DLEN .. CANXL_MAX_DLEN) 189 + * @af: acceptance field 190 + * @data: CAN XL frame payload (CANXL_MIN_DLEN .. CANXL_MAX_DLEN byte) 191 + * 192 + * @prio shares the same position as @can_id from struct can[fd]_frame. 193 + */ 194 + struct canxl_frame { 195 + canid_t prio; /* 11 bit priority for arbitration (canid_t) */ 196 + __u8 flags; /* additional flags for CAN XL */ 197 + __u8 sdt; /* SDU (service data unit) type */ 198 + __u16 len; /* frame payload length in byte */ 199 + __u32 af; /* acceptance field */ 200 + __u8 data[CANXL_MAX_DLEN]; 201 + }; 202 + 182 203 #define CAN_MTU (sizeof(struct can_frame)) 183 204 #define CANFD_MTU (sizeof(struct canfd_frame)) 205 + #define CANXL_MTU (sizeof(struct canxl_frame)) 206 + #define CANXL_HDR_SIZE (offsetof(struct canxl_frame, data)) 207 + #define CANXL_MIN_MTU (CANXL_HDR_SIZE + 64) 208 + #define CANXL_MAX_MTU CANXL_MTU 184 209 185 210 /* particular protocols of the protocol family PF_CAN */ 186 211 #define CAN_RAW 1 /* RAW sockets */