libc/new/linux_uapi/linux/
can.rs

1//! Header: `uapi/linux/can.h`
2
3// FIXME(ctest): we shouldn't have to specify the path but garando doesn't find modules otherwise
4#[path = "can/j1939.rs"]
5pub(crate) mod j1939;
6#[path = "can/raw.rs"]
7pub(crate) mod raw;
8
9pub use j1939::*;
10pub use raw::*;
11
12use crate::prelude::*;
13
14pub const CAN_EFF_FLAG: canid_t = 0x80000000;
15pub const CAN_RTR_FLAG: canid_t = 0x40000000;
16pub const CAN_ERR_FLAG: canid_t = 0x20000000;
17
18pub const CAN_SFF_MASK: canid_t = 0x000007FF;
19pub const CAN_EFF_MASK: canid_t = 0x1FFFFFFF;
20pub const CAN_ERR_MASK: canid_t = 0x1FFFFFFF;
21pub const CANXL_PRIO_MASK: crate::canid_t = CAN_SFF_MASK;
22
23pub type canid_t = u32;
24
25pub const CAN_SFF_ID_BITS: c_int = 11;
26pub const CAN_EFF_ID_BITS: c_int = 29;
27pub const CANXL_PRIO_BITS: c_int = CAN_SFF_ID_BITS;
28
29pub type can_err_mask_t = u32;
30
31pub const CAN_MAX_DLC: c_int = 8;
32pub const CAN_MAX_DLEN: usize = 8;
33
34pub const CANFD_MAX_DLC: c_int = 15;
35pub const CANFD_MAX_DLEN: usize = 64;
36
37pub const CANXL_MIN_DLC: c_int = 0;
38pub const CANXL_MAX_DLC: c_int = 2047;
39pub const CANXL_MAX_DLC_MASK: c_int = 0x07FF;
40pub const CANXL_MIN_DLEN: usize = 1;
41pub const CANXL_MAX_DLEN: usize = 2048;
42
43s! {
44    #[repr(align(8))]
45    pub struct can_frame {
46        pub can_id: canid_t,
47        // FIXME(1.0): this field was renamed to `len` in Linux 5.11
48        pub can_dlc: u8,
49        __pad: u8,
50        __res0: u8,
51        pub len8_dlc: u8,
52        pub data: [u8; CAN_MAX_DLEN],
53    }
54}
55
56pub const CANFD_BRS: c_int = 0x01;
57pub const CANFD_ESI: c_int = 0x02;
58pub const CANFD_FDF: c_int = 0x04;
59
60s! {
61    #[repr(align(8))]
62    pub struct canfd_frame {
63        pub can_id: canid_t,
64        pub len: u8,
65        pub flags: u8,
66        __res0: u8,
67        __res1: u8,
68        pub data: [u8; CANFD_MAX_DLEN],
69    }
70}
71
72pub const CANXL_XLF: c_int = 0x80;
73pub const CANXL_SEC: c_int = 0x01;
74
75s! {
76    #[repr(align(8))]
77    pub struct canxl_frame {
78        pub prio: canid_t,
79        pub flags: u8,
80        pub sdt: u8,
81        pub len: u16,
82        pub af: u32,
83        pub data: [u8; CANXL_MAX_DLEN],
84    }
85}
86
87pub const CAN_MTU: usize = size_of::<can_frame>();
88pub const CANFD_MTU: usize = size_of::<canfd_frame>();
89pub const CANXL_MTU: usize = size_of::<canxl_frame>();
90// FIXME(offset_of): use `core::mem::offset_of!` once that is available
91// https://github.com/rust-lang/rfcs/pull/3308
92// pub const CANXL_HDR_SIZE: usize = core::mem::offset_of!(canxl_frame, data);
93pub const CANXL_HDR_SIZE: usize = 12;
94pub const CANXL_MIN_MTU: usize = CANXL_HDR_SIZE + 64;
95pub const CANXL_MAX_MTU: usize = CANXL_MTU;
96
97pub const CAN_RAW: c_int = 1;
98pub const CAN_BCM: c_int = 2;
99pub const CAN_TP16: c_int = 3;
100pub const CAN_TP20: c_int = 4;
101pub const CAN_MCNET: c_int = 5;
102pub const CAN_ISOTP: c_int = 6;
103pub const CAN_J1939: c_int = 7;
104pub const CAN_NPROTO: c_int = 8;
105
106pub const SOL_CAN_BASE: c_int = 100;
107
108s_no_extra_traits! {
109    pub struct sockaddr_can {
110        pub can_family: crate::sa_family_t,
111        pub can_ifindex: c_int,
112        pub can_addr: __c_anonymous_sockaddr_can_can_addr,
113    }
114
115    pub union __c_anonymous_sockaddr_can_can_addr {
116        pub tp: __c_anonymous_sockaddr_can_tp,
117        pub j1939: __c_anonymous_sockaddr_can_j1939,
118    }
119}
120
121s! {
122    pub struct __c_anonymous_sockaddr_can_tp {
123        pub rx_id: canid_t,
124        pub tx_id: canid_t,
125    }
126
127    pub struct __c_anonymous_sockaddr_can_j1939 {
128        pub name: u64,
129        pub pgn: u32,
130        pub addr: u8,
131    }
132
133    pub struct can_filter {
134        pub can_id: canid_t,
135        pub can_mask: canid_t,
136    }
137}
138
139pub const CAN_INV_FILTER: canid_t = 0x20000000;