Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /* Copyright (C) 2020 Oliver Hartkopp <socketcan@hartkopp.net>
0003  * Copyright (C) 2020 Marc Kleine-Budde <kernel@pengutronix.de>
0004  */
0005 
0006 #ifndef _CAN_LENGTH_H
0007 #define _CAN_LENGTH_H
0008 
0009 /*
0010  * Size of a Classical CAN Standard Frame
0011  *
0012  * Name of Field            Bits
0013  * ---------------------------------------------------------
0014  * Start-of-frame           1
0015  * Identifier               11
0016  * Remote transmission request (RTR)    1
0017  * Identifier extension bit (IDE)   1
0018  * Reserved bit (r0)            1
0019  * Data length code (DLC)       4
0020  * Data field               0...64
0021  * CRC                  15
0022  * CRC delimiter            1
0023  * ACK slot             1
0024  * ACK delimiter            1
0025  * End-of-frame (EOF)           7
0026  * Inter frame spacing          3
0027  *
0028  * rounded up and ignoring bitstuffing
0029  */
0030 #define CAN_FRAME_OVERHEAD_SFF DIV_ROUND_UP(47, 8)
0031 
0032 /*
0033  * Size of a Classical CAN Extended Frame
0034  *
0035  * Name of Field            Bits
0036  * ---------------------------------------------------------
0037  * Start-of-frame           1
0038  * Identifier A             11
0039  * Substitute remote request (SRR)  1
0040  * Identifier extension bit (IDE)   1
0041  * Identifier B             18
0042  * Remote transmission request (RTR)    1
0043  * Reserved bits (r1, r0)       2
0044  * Data length code (DLC)       4
0045  * Data field               0...64
0046  * CRC                  15
0047  * CRC delimiter            1
0048  * ACK slot             1
0049  * ACK delimiter            1
0050  * End-of-frame (EOF)           7
0051  * Inter frame spacing          3
0052  *
0053  * rounded up and ignoring bitstuffing
0054  */
0055 #define CAN_FRAME_OVERHEAD_EFF DIV_ROUND_UP(67, 8)
0056 
0057 /*
0058  * Size of a CAN-FD Standard Frame
0059  *
0060  * Name of Field            Bits
0061  * ---------------------------------------------------------
0062  * Start-of-frame           1
0063  * Identifier               11
0064  * Reserved bit (r1)            1
0065  * Identifier extension bit (IDE)   1
0066  * Flexible data rate format (FDF)  1
0067  * Reserved bit (r0)            1
0068  * Bit Rate Switch (BRS)        1
0069  * Error Status Indicator (ESI)     1
0070  * Data length code (DLC)       4
0071  * Data field               0...512
0072  * Stuff Bit Count (SBC)        0...16: 4 20...64:5
0073  * CRC                  0...16: 17 20...64:21
0074  * CRC delimiter (CD)           1
0075  * ACK slot (AS)            1
0076  * ACK delimiter (AD)           1
0077  * End-of-frame (EOF)           7
0078  * Inter frame spacing          3
0079  *
0080  * assuming CRC21, rounded up and ignoring bitstuffing
0081  */
0082 #define CANFD_FRAME_OVERHEAD_SFF DIV_ROUND_UP(61, 8)
0083 
0084 /*
0085  * Size of a CAN-FD Extended Frame
0086  *
0087  * Name of Field            Bits
0088  * ---------------------------------------------------------
0089  * Start-of-frame           1
0090  * Identifier A             11
0091  * Substitute remote request (SRR)  1
0092  * Identifier extension bit (IDE)   1
0093  * Identifier B             18
0094  * Reserved bit (r1)            1
0095  * Flexible data rate format (FDF)  1
0096  * Reserved bit (r0)            1
0097  * Bit Rate Switch (BRS)        1
0098  * Error Status Indicator (ESI)     1
0099  * Data length code (DLC)       4
0100  * Data field               0...512
0101  * Stuff Bit Count (SBC)        0...16: 4 20...64:5
0102  * CRC                  0...16: 17 20...64:21
0103  * CRC delimiter (CD)           1
0104  * ACK slot (AS)            1
0105  * ACK delimiter (AD)           1
0106  * End-of-frame (EOF)           7
0107  * Inter frame spacing          3
0108  *
0109  * assuming CRC21, rounded up and ignoring bitstuffing
0110  */
0111 #define CANFD_FRAME_OVERHEAD_EFF DIV_ROUND_UP(80, 8)
0112 
0113 /*
0114  * Maximum size of a Classical CAN frame
0115  * (rounded up and ignoring bitstuffing)
0116  */
0117 #define CAN_FRAME_LEN_MAX (CAN_FRAME_OVERHEAD_EFF + CAN_MAX_DLEN)
0118 
0119 /*
0120  * Maximum size of a CAN-FD frame
0121  * (rounded up and ignoring bitstuffing)
0122  */
0123 #define CANFD_FRAME_LEN_MAX (CANFD_FRAME_OVERHEAD_EFF + CANFD_MAX_DLEN)
0124 
0125 /*
0126  * can_cc_dlc2len(value) - convert a given data length code (dlc) of a
0127  * Classical CAN frame into a valid data length of max. 8 bytes.
0128  *
0129  * To be used in the CAN netdriver receive path to ensure conformance with
0130  * ISO 11898-1 Chapter 8.4.2.3 (DLC field)
0131  */
0132 #define can_cc_dlc2len(dlc) (min_t(u8, (dlc), CAN_MAX_DLEN))
0133 
0134 /* helper to get the data length code (DLC) for Classical CAN raw DLC access */
0135 static inline u8 can_get_cc_dlc(const struct can_frame *cf, const u32 ctrlmode)
0136 {
0137     /* return len8_dlc as dlc value only if all conditions apply */
0138     if ((ctrlmode & CAN_CTRLMODE_CC_LEN8_DLC) &&
0139         (cf->len == CAN_MAX_DLEN) &&
0140         (cf->len8_dlc > CAN_MAX_DLEN && cf->len8_dlc <= CAN_MAX_RAW_DLC))
0141         return cf->len8_dlc;
0142 
0143     /* return the payload length as dlc value */
0144     return cf->len;
0145 }
0146 
0147 /* helper to set len and len8_dlc value for Classical CAN raw DLC access */
0148 static inline void can_frame_set_cc_len(struct can_frame *cf, const u8 dlc,
0149                     const u32 ctrlmode)
0150 {
0151     /* the caller already ensured that dlc is a value from 0 .. 15 */
0152     if (ctrlmode & CAN_CTRLMODE_CC_LEN8_DLC && dlc > CAN_MAX_DLEN)
0153         cf->len8_dlc = dlc;
0154 
0155     /* limit the payload length 'len' to CAN_MAX_DLEN */
0156     cf->len = can_cc_dlc2len(dlc);
0157 }
0158 
0159 /* get data length from raw data length code (DLC) */
0160 u8 can_fd_dlc2len(u8 dlc);
0161 
0162 /* map the sanitized data length to an appropriate data length code */
0163 u8 can_fd_len2dlc(u8 len);
0164 
0165 /* calculate the CAN Frame length in bytes of a given skb */
0166 unsigned int can_skb_get_frame_len(const struct sk_buff *skb);
0167 
0168 /* map the data length to an appropriate data link layer length */
0169 static inline u8 canfd_sanitize_len(u8 len)
0170 {
0171     return can_fd_dlc2len(can_fd_len2dlc(len));
0172 }
0173 
0174 #endif /* !_CAN_LENGTH_H */