mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	can: add optional DLC element to Classical CAN frame structure
ISO 11898-1 Chapter 8.4.2.3 defines a 4 bit data length code (DLC) table which
maps the DLC to the payload length of the CAN frame in bytes:
    DLC      ->  payload length
    0 .. 8   ->  0 .. 8
    9 .. 15  ->  8
Although the DLC values 8 .. 15 in Classical CAN always result in a payload
length of 8 bytes these DLC values are transparently transmitted on the CAN
bus. As the struct can_frame only provides a 'len' element (formerly 'can_dlc')
which contains the plain payload length ( 0 .. 8 ) of the CAN frame, the raw
DLC is not visible to the application programmer, e.g. for testing use-cases.
To access the raw DLC values 9 .. 15 the len8_dlc element is introduced, which
is only valid when the payload length 'len' is 8 and the DLC is greater than 8.
The len8_dlc element is filled by the CAN interface driver and used for CAN
frame creation by the CAN driver when the CAN_CTRLMODE_CC_LEN8_DLC flag is
supported by the driver and enabled via netlink configuration interface.
Reported-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Link: https://lore.kernel.org/r/20201110101852.1973-2-socketcan@hartkopp.net
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
			
			
This commit is contained in:
		
							parent
							
								
									b7d3c0e593
								
							
						
					
					
						commit
						ea7800565a
					
				
					 2 changed files with 25 additions and 14 deletions
				
			
		| 
						 | 
					@ -84,6 +84,7 @@ typedef __u32 can_err_mask_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* CAN payload length and DLC definitions according to ISO 11898-1 */
 | 
					/* CAN payload length and DLC definitions according to ISO 11898-1 */
 | 
				
			||||||
#define CAN_MAX_DLC 8
 | 
					#define CAN_MAX_DLC 8
 | 
				
			||||||
 | 
					#define CAN_MAX_RAW_DLC 15
 | 
				
			||||||
#define CAN_MAX_DLEN 8
 | 
					#define CAN_MAX_DLEN 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* CAN FD payload length and DLC definitions according to ISO 11898-7 */
 | 
					/* CAN FD payload length and DLC definitions according to ISO 11898-7 */
 | 
				
			||||||
| 
						 | 
					@ -91,23 +92,32 @@ typedef __u32 can_err_mask_t;
 | 
				
			||||||
#define CANFD_MAX_DLEN 64
 | 
					#define CANFD_MAX_DLEN 64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * struct can_frame - basic CAN frame structure
 | 
					 * struct can_frame - Classical CAN frame structure (aka CAN 2.0B)
 | 
				
			||||||
 * @can_id:  CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
 | 
					 * @can_id:   CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
 | 
				
			||||||
 * @can_dlc: frame payload length in byte (0 .. 8) aka data length code
 | 
					 * @len:      CAN frame payload length in byte (0 .. 8)
 | 
				
			||||||
 *           N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1
 | 
					 * @can_dlc:  deprecated name for CAN frame payload length in byte (0 .. 8)
 | 
				
			||||||
 *           mapping of the 'data length code' to the real payload length
 | 
					 * @__pad:    padding
 | 
				
			||||||
 * @__pad:   padding
 | 
					 * @__res0:   reserved / padding
 | 
				
			||||||
 * @__res0:  reserved / padding
 | 
					 * @len8_dlc: optional DLC value (9 .. 15) at 8 byte payload length
 | 
				
			||||||
 * @__res1:  reserved / padding
 | 
					 *            len8_dlc contains values from 9 .. 15 when the payload length is
 | 
				
			||||||
 * @data:    CAN frame payload (up to 8 byte)
 | 
					 *            8 bytes but the DLC value (see ISO 11898-1) is greater then 8.
 | 
				
			||||||
 | 
					 *            CAN_CTRLMODE_CC_LEN8_DLC flag has to be enabled in CAN driver.
 | 
				
			||||||
 | 
					 * @data:     CAN frame payload (up to 8 byte)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct can_frame {
 | 
					struct can_frame {
 | 
				
			||||||
	canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
 | 
						canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
 | 
				
			||||||
	__u8    can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
 | 
						union {
 | 
				
			||||||
	__u8    __pad;   /* padding */
 | 
							/* CAN frame payload length in byte (0 .. CAN_MAX_DLEN)
 | 
				
			||||||
	__u8    __res0;  /* reserved / padding */
 | 
							 * was previously named can_dlc so we need to carry that
 | 
				
			||||||
	__u8    __res1;  /* reserved / padding */
 | 
							 * name for legacy support
 | 
				
			||||||
	__u8    data[CAN_MAX_DLEN] __attribute__((aligned(8)));
 | 
							 */
 | 
				
			||||||
 | 
							__u8 len;
 | 
				
			||||||
 | 
							__u8 can_dlc; /* deprecated */
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						__u8 __pad; /* padding */
 | 
				
			||||||
 | 
						__u8 __res0; /* reserved / padding */
 | 
				
			||||||
 | 
						__u8 len8_dlc; /* optional DLC for 8 byte payload length (9 .. 15) */
 | 
				
			||||||
 | 
						__u8 data[CAN_MAX_DLEN] __attribute__((aligned(8)));
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -100,6 +100,7 @@ struct can_ctrlmode {
 | 
				
			||||||
#define CAN_CTRLMODE_FD			0x20	/* CAN FD mode */
 | 
					#define CAN_CTRLMODE_FD			0x20	/* CAN FD mode */
 | 
				
			||||||
#define CAN_CTRLMODE_PRESUME_ACK	0x40	/* Ignore missing CAN ACKs */
 | 
					#define CAN_CTRLMODE_PRESUME_ACK	0x40	/* Ignore missing CAN ACKs */
 | 
				
			||||||
#define CAN_CTRLMODE_FD_NON_ISO		0x80	/* CAN FD in non-ISO mode */
 | 
					#define CAN_CTRLMODE_FD_NON_ISO		0x80	/* CAN FD in non-ISO mode */
 | 
				
			||||||
 | 
					#define CAN_CTRLMODE_CC_LEN8_DLC	0x100	/* Classic CAN DLC option */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * CAN device statistics
 | 
					 * CAN device statistics
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue