libc/new/linux_uapi/linux/
can.rs

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