Line data Source code
1 1 : /** @file
2 : * @brief SocketCAN definitions.
3 : *
4 : * Definitions for SocketCAN support.
5 : */
6 :
7 : /*
8 : * Copyright (c) 2019 Intel Corporation
9 : *
10 : * SPDX-License-Identifier: Apache-2.0
11 : */
12 :
13 : #ifndef ZEPHYR_INCLUDE_NET_SOCKETCAN_H_
14 : #define ZEPHYR_INCLUDE_NET_SOCKETCAN_H_
15 :
16 : #include <zephyr/types.h>
17 : #include <zephyr/net/net_ip.h>
18 : #include <zephyr/net/net_if.h>
19 :
20 : #ifdef __cplusplus
21 : extern "C" {
22 : #endif
23 :
24 : /**
25 : * @brief SocketCAN library
26 : * @defgroup socket_can SocketCAN library
27 : * @since 1.14
28 : * @version 0.8.0
29 : * @ingroup networking
30 : * @{
31 : */
32 :
33 : /** Protocols of the protocol family PF_CAN */
34 1 : #define CAN_RAW 1
35 :
36 : /** @cond INTERNAL_HIDDEN */
37 :
38 : /* SocketCAN options */
39 : #define SOL_CAN_BASE 100
40 : #define SOL_CAN_RAW (SOL_CAN_BASE + CAN_RAW)
41 :
42 : enum {
43 : CAN_RAW_FILTER = 1,
44 : };
45 :
46 : /** @endcond */
47 :
48 : /* SocketCAN MTU size compatible with Linux */
49 : #ifdef CONFIG_CAN_FD_MODE
50 : /** SocketCAN max data length */
51 : #define SOCKETCAN_MAX_DLEN 64U
52 : /** CAN FD frame MTU */
53 : #define CANFD_MTU (sizeof(struct socketcan_frame))
54 : /** CAN frame MTU */
55 : #define CAN_MTU (CANFD_MTU - 56U)
56 : #else /* CONFIG_CAN_FD_MODE */
57 : /** SocketCAN max data length */
58 1 : #define SOCKETCAN_MAX_DLEN 8U
59 : /** CAN frame MTU */
60 1 : #define CAN_MTU (sizeof(struct socketcan_frame))
61 : #endif /* !CONFIG_CAN_FD_MODE */
62 :
63 : /* CAN FD specific flags from Linux Kernel (include/uapi/linux/can.h) */
64 1 : #define CANFD_BRS 0x01 /**< Bit rate switch (second bitrate for payload data) */
65 1 : #define CANFD_ESI 0x02 /**< Error state indicator of the transmitting node */
66 1 : #define CANFD_FDF 0x04 /**< Mark CAN FD for dual use of struct canfd_frame */
67 :
68 : /**
69 : * struct sockaddr_can - The sockaddr structure for CAN sockets
70 : *
71 : */
72 1 : struct sockaddr_can {
73 1 : sa_family_t can_family; /**< Address family */
74 1 : int can_ifindex; /**< SocketCAN network interface index */
75 : };
76 :
77 : /**
78 : * @name Linux SocketCAN compatibility
79 : *
80 : * The following structures and functions provide compatibility with the CAN
81 : * frame and CAN filter formats used by Linux SocketCAN.
82 : *
83 : * @{
84 : */
85 :
86 : /**
87 : * CAN Identifier structure for Linux SocketCAN compatibility.
88 : *
89 : * The fields in this type are:
90 : *
91 : * @code{.text}
92 : *
93 : * +------+--------------------------------------------------------------+
94 : * | Bits | Description |
95 : * +======+==============================================================+
96 : * | 0-28 | CAN identifier (11/29 bit) |
97 : * +------+--------------------------------------------------------------+
98 : * | 29 | Error message frame flag (0 = data frame, 1 = error message) |
99 : * +------+--------------------------------------------------------------+
100 : * | 30 | Remote transmission request flag (1 = RTR frame) |
101 : * +------+--------------------------------------------------------------+
102 : * | 31 | Frame format flag (0 = standard 11 bit, 1 = extended 29 bit) |
103 : * +------+--------------------------------------------------------------+
104 : *
105 : * @endcode
106 : */
107 1 : typedef uint32_t socketcan_id_t;
108 :
109 : /**
110 : * @brief CAN frame for Linux SocketCAN compatibility.
111 : */
112 1 : struct socketcan_frame {
113 : /** 32-bit CAN ID + EFF/RTR/ERR flags. */
114 1 : socketcan_id_t can_id;
115 : /** Frame payload length in bytes. */
116 1 : uint8_t len;
117 : /** Additional flags for CAN FD. */
118 1 : uint8_t flags;
119 : /** @cond INTERNAL_HIDDEN */
120 : uint8_t res0; /* reserved/padding. */
121 : uint8_t res1; /* reserved/padding. */
122 : /** @endcond */
123 :
124 : /** The payload data. */
125 1 : uint8_t data[SOCKETCAN_MAX_DLEN];
126 : };
127 :
128 : /**
129 : * @brief CAN filter for Linux SocketCAN compatibility.
130 : *
131 : * A filter is considered a match when `received_can_id & mask == can_id & can_mask`.
132 : */
133 1 : struct socketcan_filter {
134 : /** The CAN identifier to match. */
135 1 : socketcan_id_t can_id;
136 : /** The mask applied to @a can_id for matching. */
137 1 : socketcan_id_t can_mask;
138 : /** Additional flags for FD frame filter. */
139 1 : uint8_t flags;
140 : };
141 :
142 : /** @} */
143 :
144 : /**
145 : * @}
146 : */
147 :
148 : #ifdef __cplusplus
149 : }
150 : #endif
151 :
152 : #endif /* ZEPHYR_INCLUDE_NET_SOCKETCAN_H_ */
|