aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/can.h59
-rw-r--r--include/linux/if_ether.h3
-rw-r--r--net/can/af_can.c7
3 files changed, 63 insertions, 6 deletions
diff --git a/include/linux/can.h b/include/linux/can.h
index 17334c09bd93..1a66cf6112ae 100644
--- a/include/linux/can.h
+++ b/include/linux/can.h
@@ -46,18 +46,67 @@ typedef __u32 canid_t;
46 */ 46 */
47typedef __u32 can_err_mask_t; 47typedef __u32 can_err_mask_t;
48 48
49/* CAN payload length and DLC definitions according to ISO 11898-1 */
50#define CAN_MAX_DLC 8
51#define CAN_MAX_DLEN 8
52
53/* CAN FD payload length and DLC definitions according to ISO 11898-7 */
54#define CANFD_MAX_DLC 15
55#define CANFD_MAX_DLEN 64
56
49/** 57/**
50 * struct can_frame - basic CAN frame structure 58 * struct can_frame - basic CAN frame structure
51 * @can_id: the CAN ID of the frame and CAN_*_FLAG flags, see above. 59 * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
52 * @can_dlc: the data length field of the CAN frame 60 * @can_dlc: frame payload length in byte (0 .. 8) aka data length code
53 * @data: the CAN frame payload. 61 * N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1
62 * mapping of the 'data length code' to the real payload length
63 * @data: CAN frame payload (up to 8 byte)
54 */ 64 */
55struct can_frame { 65struct can_frame {
56 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ 66 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
57 __u8 can_dlc; /* data length code: 0 .. 8 */ 67 __u8 can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
58 __u8 data[8] __attribute__((aligned(8))); 68 __u8 data[CAN_MAX_DLEN] __attribute__((aligned(8)));
59}; 69};
60 70
71/*
72 * defined bits for canfd_frame.flags
73 *
74 * As the default for CAN FD should be to support the high data rate in the
75 * payload section of the frame (HDR) and to support up to 64 byte in the
76 * data section (EDL) the bits are only set in the non-default case.
77 * Btw. as long as there's no real implementation for CAN FD network driver
78 * these bits are only preliminary.
79 *
80 * RX: NOHDR/NOEDL - info about received CAN FD frame
81 * ESI - bit from originating CAN controller
82 * TX: NOHDR/NOEDL - control per-frame settings if supported by CAN controller
83 * ESI - bit is set by local CAN controller
84 */
85#define CANFD_NOHDR 0x01 /* frame without high data rate */
86#define CANFD_NOEDL 0x02 /* frame without extended data length */
87#define CANFD_ESI 0x04 /* error state indicator */
88
89/**
90 * struct canfd_frame - CAN flexible data rate frame structure
91 * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
92 * @len: frame payload length in byte (0 .. CANFD_MAX_DLEN)
93 * @flags: additional flags for CAN FD
94 * @__res0: reserved / padding
95 * @__res1: reserved / padding
96 * @data: CAN FD frame payload (up to CANFD_MAX_DLEN byte)
97 */
98struct canfd_frame {
99 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
100 __u8 len; /* frame payload length in byte */
101 __u8 flags; /* additional flags for CAN FD */
102 __u8 __res0; /* reserved / padding */
103 __u8 __res1; /* reserved / padding */
104 __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
105};
106
107#define CAN_MTU (sizeof(struct can_frame))
108#define CANFD_MTU (sizeof(struct canfd_frame))
109
61/* particular protocols of the protocol family PF_CAN */ 110/* particular protocols of the protocol family PF_CAN */
62#define CAN_RAW 1 /* RAW sockets */ 111#define CAN_RAW 1 /* RAW sockets */
63#define CAN_BCM 2 /* Broadcast Manager */ 112#define CAN_BCM 2 /* Broadcast Manager */
diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h
index 56d907a2c804..167ce5b363d2 100644
--- a/include/linux/if_ether.h
+++ b/include/linux/if_ether.h
@@ -105,7 +105,8 @@
105#define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/ 105#define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/
106#define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */ 106#define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */
107#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */ 107#define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */
108#define ETH_P_CAN 0x000C /* Controller Area Network */ 108#define ETH_P_CAN 0x000C /* CAN: Controller Area Network */
109#define ETH_P_CANFD 0x000D /* CANFD: CAN flexible data rate*/
109#define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/ 110#define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/
110#define ETH_P_TR_802_2 0x0011 /* 802.2 frames */ 111#define ETH_P_TR_802_2 0x0011 /* 802.2 frames */
111#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */ 112#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */
diff --git a/net/can/af_can.c b/net/can/af_can.c
index 6efcd37b4bd0..c96140a1458e 100644
--- a/net/can/af_can.c
+++ b/net/can/af_can.c
@@ -41,6 +41,7 @@
41 */ 41 */
42 42
43#include <linux/module.h> 43#include <linux/module.h>
44#include <linux/stddef.h>
44#include <linux/init.h> 45#include <linux/init.h>
45#include <linux/kmod.h> 46#include <linux/kmod.h>
46#include <linux/slab.h> 47#include <linux/slab.h>
@@ -824,6 +825,12 @@ static struct notifier_block can_netdev_notifier __read_mostly = {
824 825
825static __init int can_init(void) 826static __init int can_init(void)
826{ 827{
828 /* check for correct padding to be able to use the structs similarly */
829 BUILD_BUG_ON(offsetof(struct can_frame, can_dlc) !=
830 offsetof(struct canfd_frame, len) ||
831 offsetof(struct can_frame, data) !=
832 offsetof(struct canfd_frame, data));
833
827 printk(banner); 834 printk(banner);
828 835
829 memset(&can_rx_alldev_list, 0, sizeof(can_rx_alldev_list)); 836 memset(&can_rx_alldev_list, 0, sizeof(can_rx_alldev_list));