1pub(crate) mod bcm;
4pub(crate) mod error;
5pub(crate) mod j1939;
6pub(crate) mod netlink;
7pub(crate) mod raw;
8
9use crate::prelude::*;
10
11pub const CAN_EFF_FLAG: canid_t = 0x80000000;
12pub const CAN_RTR_FLAG: canid_t = 0x40000000;
13pub const CAN_ERR_FLAG: canid_t = 0x20000000;
14
15pub const CAN_SFF_MASK: canid_t = 0x000007FF;
16pub const CAN_EFF_MASK: canid_t = 0x1FFFFFFF;
17pub const CAN_ERR_MASK: canid_t = 0x1FFFFFFF;
18pub const CANXL_PRIO_MASK: crate::canid_t = CAN_SFF_MASK;
19
20pub type canid_t = u32;
21
22pub const CAN_SFF_ID_BITS: c_int = 11;
23pub const CAN_EFF_ID_BITS: c_int = 29;
24pub const CANXL_PRIO_BITS: c_int = CAN_SFF_ID_BITS;
25
26pub type can_err_mask_t = u32;
27
28pub const CAN_MAX_DLC: c_int = 8;
29pub const CAN_MAX_DLEN: usize = 8;
30
31pub const CANFD_MAX_DLC: c_int = 15;
32pub const CANFD_MAX_DLEN: usize = 64;
33
34pub const CANXL_MIN_DLC: c_int = 0;
35pub const CANXL_MAX_DLC: c_int = 2047;
36pub const CANXL_MAX_DLC_MASK: c_int = 0x07FF;
37pub const CANXL_MIN_DLEN: usize = 1;
38pub const CANXL_MAX_DLEN: usize = 2048;
39
40#[allow(clippy :: manual_non_exhaustive)]
#[repr(C)]
#[allow(deprecated)]
#[repr(align(8))]
pub struct can_frame {
pub can_id: canid_t,
pub can_dlc: u8,
__pad: Padding<u8>,
__res0: Padding<u8>,
pub len8_dlc: u8,
pub data: [u8; CAN_MAX_DLEN],
__non_exhaustive: (),
}
#[automatically_derived]
#[doc(hidden)]
#[allow(clippy :: manual_non_exhaustive)]
#[allow(deprecated)]
unsafe impl ::core::clone::TrivialClone for can_frame { }
#[automatically_derived]
#[allow(clippy :: manual_non_exhaustive)]
#[allow(deprecated)]
impl ::core::clone::Clone for can_frame {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<canid_t>;
let _: ::core::clone::AssertParamIsClone<u8>;
let _: ::core::clone::AssertParamIsClone<Padding<u8>>;
let _: ::core::clone::AssertParamIsClone<Padding<u8>>;
let _: ::core::clone::AssertParamIsClone<[u8; CAN_MAX_DLEN]>;
let _: ::core::clone::AssertParamIsClone<()>;
*self
}
}
#[automatically_derived]
#[allow(clippy :: manual_non_exhaustive)]
#[allow(deprecated)]
impl ::core::marker::Copy for can_frame { }
#[automatically_derived]
#[allow(clippy :: manual_non_exhaustive)]
#[allow(deprecated)]
impl ::core::fmt::Debug for can_frame {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["can_id", "can_dlc", "__pad", "__res0", "len8_dlc", "data",
"__non_exhaustive"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.can_id, &self.can_dlc, &self.__pad, &self.__res0,
&self.len8_dlc, &self.data, &&self.__non_exhaustive];
::core::fmt::Formatter::debug_struct_fields_finish(f, "can_frame",
names, values)
}
}
#[allow(deprecated)]
impl ::core::default::Default for can_frame {
#[allow(unused_doc_comments)]
fn default() -> Self {
Self {
can_id: ::core::default::Default::default(),
can_dlc: ::core::default::Default::default(),
__pad: ::core::default::Default::default(),
__res0: ::core::default::Default::default(),
len8_dlc: ::core::default::Default::default(),
data: ::core::default::Default::default(),
__non_exhaustive: (),
}
}
}s2! {
41 #[repr(align(8))]
42 pub struct can_frame {
43 pub can_id: canid_t,
44 pub can_dlc: u8,
46 __pad: Padding<u8>,
47 __res0: Padding<u8>,
48 pub len8_dlc: u8,
49 pub data: [u8; CAN_MAX_DLEN],
50 }
51}
52
53pub const CANFD_BRS: c_int = 0x01;
54pub const CANFD_ESI: c_int = 0x02;
55pub const CANFD_FDF: c_int = 0x04;
56
57#[allow(clippy :: manual_non_exhaustive)]
#[repr(C)]
#[allow(deprecated)]
#[repr(align(8))]
pub struct canfd_frame {
pub can_id: canid_t,
pub len: u8,
pub flags: u8,
__res0: Padding<u8>,
__res1: Padding<u8>,
pub data: [u8; CANFD_MAX_DLEN],
__non_exhaustive: (),
}
#[automatically_derived]
#[doc(hidden)]
#[allow(clippy :: manual_non_exhaustive)]
#[allow(deprecated)]
unsafe impl ::core::clone::TrivialClone for canfd_frame { }
#[automatically_derived]
#[allow(clippy :: manual_non_exhaustive)]
#[allow(deprecated)]
impl ::core::clone::Clone for canfd_frame {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<canid_t>;
let _: ::core::clone::AssertParamIsClone<u8>;
let _: ::core::clone::AssertParamIsClone<Padding<u8>>;
let _: ::core::clone::AssertParamIsClone<Padding<u8>>;
let _: ::core::clone::AssertParamIsClone<[u8; CANFD_MAX_DLEN]>;
let _: ::core::clone::AssertParamIsClone<()>;
*self
}
}
#[automatically_derived]
#[allow(clippy :: manual_non_exhaustive)]
#[allow(deprecated)]
impl ::core::marker::Copy for canfd_frame { }
#[automatically_derived]
#[allow(clippy :: manual_non_exhaustive)]
#[allow(deprecated)]
impl ::core::fmt::Debug for canfd_frame {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["can_id", "len", "flags", "__res0", "__res1", "data",
"__non_exhaustive"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.can_id, &self.len, &self.flags, &self.__res0,
&self.__res1, &self.data, &&self.__non_exhaustive];
::core::fmt::Formatter::debug_struct_fields_finish(f, "canfd_frame",
names, values)
}
}
#[allow(deprecated)]
impl ::core::default::Default for canfd_frame {
#[allow(unused_doc_comments)]
fn default() -> Self {
Self {
can_id: ::core::default::Default::default(),
len: ::core::default::Default::default(),
flags: ::core::default::Default::default(),
__res0: ::core::default::Default::default(),
__res1: ::core::default::Default::default(),
data: [0; CANFD_MAX_DLEN],
__non_exhaustive: (),
}
}
}s2! {
58 #[repr(align(8))]
59 pub struct canfd_frame {
60 pub can_id: canid_t,
61 pub len: u8,
62 pub flags: u8,
63 __res0: Padding<u8>,
64 __res1: Padding<u8>,
65 #[custom_default([0; CANFD_MAX_DLEN])]
66 pub data: [u8; CANFD_MAX_DLEN],
67 }
68}
69
70pub const CANXL_XLF: c_int = 0x80;
71pub const CANXL_SEC: c_int = 0x01;
72
73#[repr(C)]
#[allow(deprecated)]
pub struct canxl_frame {
pub prio: canid_t,
pub flags: u8,
pub sdt: u8,
pub len: u16,
pub af: u32,
pub data: [u8; CANXL_MAX_DLEN],
}
#[automatically_derived]
#[doc(hidden)]
#[allow(deprecated)]
unsafe impl ::core::clone::TrivialClone for canxl_frame { }
#[automatically_derived]
#[allow(deprecated)]
impl ::core::clone::Clone for canxl_frame {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<canid_t>;
let _: ::core::clone::AssertParamIsClone<u8>;
let _: ::core::clone::AssertParamIsClone<u16>;
let _: ::core::clone::AssertParamIsClone<u32>;
let _: ::core::clone::AssertParamIsClone<[u8; CANXL_MAX_DLEN]>;
*self
}
}
#[automatically_derived]
#[allow(deprecated)]
impl ::core::marker::Copy for canxl_frame { }
#[automatically_derived]
#[allow(deprecated)]
impl ::core::fmt::Debug for canxl_frame {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["prio", "flags", "sdt", "len", "af", "data"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.prio, &self.flags, &self.sdt, &self.len, &self.af,
&&self.data];
::core::fmt::Formatter::debug_struct_fields_finish(f, "canxl_frame",
names, values)
}
}
#[allow(deprecated)]
impl ::core::default::Default for canxl_frame {
#[allow(unused_doc_comments)]
fn default() -> Self {
Self {
prio: ::core::default::Default::default(),
flags: ::core::default::Default::default(),
sdt: ::core::default::Default::default(),
len: ::core::default::Default::default(),
af: ::core::default::Default::default(),
data: [0; CANXL_MAX_DLEN],
}
}
}s2! {
74 #[exhaustive]
75 pub struct canxl_frame {
76 pub prio: canid_t,
77 pub flags: u8,
78 pub sdt: u8,
79 pub len: u16,
80 pub af: u32,
81 #[custom_default([0; CANXL_MAX_DLEN])]
82 pub data: [u8; CANXL_MAX_DLEN],
83 }
84}
85
86pub const CAN_MTU: usize = size_of::<can_frame>();
87pub const CANFD_MTU: usize = size_of::<canfd_frame>();
88pub const CANXL_MTU: usize = size_of::<canxl_frame>();
89pub const CANXL_HDR_SIZE: usize = 12;
93pub const CANXL_MIN_MTU: usize = CANXL_HDR_SIZE + 64;
94pub const CANXL_MAX_MTU: usize = CANXL_MTU;
95
96pub const CAN_RAW: c_int = 1;
97pub const CAN_BCM: c_int = 2;
98pub const CAN_TP16: c_int = 3;
99pub const CAN_TP20: c_int = 4;
100pub const CAN_MCNET: c_int = 5;
101pub const CAN_ISOTP: c_int = 6;
102pub const CAN_J1939: c_int = 7;
103pub const CAN_NPROTO: c_int = 8;
104
105pub const SOL_CAN_BASE: c_int = 100;
106
107#[repr(C)]
pub struct sockaddr_can {
pub can_family: crate::sa_family_t,
pub can_ifindex: c_int,
pub can_addr: __c_anonymous_sockaddr_can_can_addr,
}
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for sockaddr_can { }
#[automatically_derived]
impl ::core::clone::Clone for sockaddr_can {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<crate::sa_family_t>;
let _: ::core::clone::AssertParamIsClone<c_int>;
let _:
::core::clone::AssertParamIsClone<__c_anonymous_sockaddr_can_can_addr>;
*self
}
}
#[automatically_derived]
impl ::core::marker::Copy for sockaddr_can { }
#[automatically_derived]
impl ::core::fmt::Debug for sockaddr_can {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "sockaddr_can",
"can_family", &self.can_family, "can_ifindex", &self.can_ifindex,
"can_addr", &&self.can_addr)
}
}
#[allow(deprecated)]
impl ::core::default::Default for sockaddr_can {
#[allow(unused_doc_comments)]
fn default() -> Self {
Self {
can_family: ::core::default::Default::default(),
can_ifindex: ::core::default::Default::default(),
can_addr: unsafe {
mem::zeroed::<__c_anonymous_sockaddr_can_can_addr>()
},
}
}
}
#[repr(C)]
pub union __c_anonymous_sockaddr_can_can_addr {
pub tp: __c_anonymous_sockaddr_can_tp,
pub j1939: __c_anonymous_sockaddr_can_j1939,
}
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for
__c_anonymous_sockaddr_can_can_addr {
}
#[automatically_derived]
impl ::core::clone::Clone for __c_anonymous_sockaddr_can_can_addr {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsCopy<Self>;
*self
}
}
#[automatically_derived]
impl ::core::marker::Copy for __c_anonymous_sockaddr_can_can_addr { }
#[allow(deprecated)]
impl ::core::fmt::Debug for __c_anonymous_sockaddr_can_can_addr {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
f.debug_struct("__c_anonymous_sockaddr_can_can_addr").finish_non_exhaustive()
}
}s_no_extra_traits2! {
108 #[exhaustive]
109 pub struct sockaddr_can {
110 pub can_family: crate::sa_family_t,
111 pub can_ifindex: c_int,
112 #[custom_default(unsafe { mem::zeroed::<__c_anonymous_sockaddr_can_can_addr>() })]
113 pub can_addr: __c_anonymous_sockaddr_can_can_addr,
114 }
115
116 pub union __c_anonymous_sockaddr_can_can_addr {
117 pub tp: __c_anonymous_sockaddr_can_tp,
118 pub j1939: __c_anonymous_sockaddr_can_j1939,
119 }
120}
121
122#[repr(C)]
#[allow(deprecated)]
pub struct __c_anonymous_sockaddr_can_tp {
pub rx_id: canid_t,
pub tx_id: canid_t,
}
#[automatically_derived]
#[doc(hidden)]
#[allow(deprecated)]
unsafe impl ::core::clone::TrivialClone for __c_anonymous_sockaddr_can_tp { }
#[automatically_derived]
#[allow(deprecated)]
impl ::core::clone::Clone for __c_anonymous_sockaddr_can_tp {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<canid_t>;
*self
}
}
#[automatically_derived]
#[allow(deprecated)]
impl ::core::marker::Copy for __c_anonymous_sockaddr_can_tp { }
#[automatically_derived]
#[allow(deprecated)]
impl ::core::fmt::Debug for __c_anonymous_sockaddr_can_tp {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"__c_anonymous_sockaddr_can_tp", "rx_id", &self.rx_id, "tx_id",
&&self.tx_id)
}
}
#[allow(deprecated)]
impl ::core::default::Default for __c_anonymous_sockaddr_can_tp {
#[allow(unused_doc_comments)]
fn default() -> Self {
Self {
rx_id: ::core::default::Default::default(),
tx_id: ::core::default::Default::default(),
}
}
}
#[repr(C)]
#[allow(deprecated)]
pub struct __c_anonymous_sockaddr_can_j1939 {
pub name: u64,
pub pgn: u32,
pub addr: u8,
}
#[automatically_derived]
#[doc(hidden)]
#[allow(deprecated)]
unsafe impl ::core::clone::TrivialClone for __c_anonymous_sockaddr_can_j1939 {
}
#[automatically_derived]
#[allow(deprecated)]
impl ::core::clone::Clone for __c_anonymous_sockaddr_can_j1939 {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<u64>;
let _: ::core::clone::AssertParamIsClone<u32>;
let _: ::core::clone::AssertParamIsClone<u8>;
*self
}
}
#[automatically_derived]
#[allow(deprecated)]
impl ::core::marker::Copy for __c_anonymous_sockaddr_can_j1939 { }
#[automatically_derived]
#[allow(deprecated)]
impl ::core::fmt::Debug for __c_anonymous_sockaddr_can_j1939 {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"__c_anonymous_sockaddr_can_j1939", "name", &self.name, "pgn",
&self.pgn, "addr", &&self.addr)
}
}
#[allow(deprecated)]
impl ::core::default::Default for __c_anonymous_sockaddr_can_j1939 {
#[allow(unused_doc_comments)]
fn default() -> Self {
Self {
name: ::core::default::Default::default(),
pgn: ::core::default::Default::default(),
addr: ::core::default::Default::default(),
}
}
}
#[repr(C)]
#[allow(deprecated)]
pub struct can_filter {
pub can_id: canid_t,
pub can_mask: canid_t,
}
#[automatically_derived]
#[doc(hidden)]
#[allow(deprecated)]
unsafe impl ::core::clone::TrivialClone for can_filter { }
#[automatically_derived]
#[allow(deprecated)]
impl ::core::clone::Clone for can_filter {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<canid_t>;
*self
}
}
#[automatically_derived]
#[allow(deprecated)]
impl ::core::marker::Copy for can_filter { }
#[automatically_derived]
#[allow(deprecated)]
impl ::core::fmt::Debug for can_filter {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "can_filter",
"can_id", &self.can_id, "can_mask", &&self.can_mask)
}
}
#[allow(deprecated)]
impl ::core::default::Default for can_filter {
#[allow(unused_doc_comments)]
fn default() -> Self {
Self {
can_id: ::core::default::Default::default(),
can_mask: ::core::default::Default::default(),
}
}
}s2! {
123 #[exhaustive]
124 pub struct __c_anonymous_sockaddr_can_tp {
125 pub rx_id: canid_t,
126 pub tx_id: canid_t,
127 }
128
129 #[exhaustive]
130 pub struct __c_anonymous_sockaddr_can_j1939 {
131 pub name: u64,
132 pub pgn: u32,
133 pub addr: u8,
134 }
135
136 #[exhaustive]
137 pub struct can_filter {
138 pub can_id: canid_t,
139 pub can_mask: canid_t,
140 }
141}
142
143pub const CAN_INV_FILTER: canid_t = 0x20000000;