From e1a9368cc175536ff20f76ddbe312bbf1cdea355 Mon Sep 17 00:00:00 2001 From: Hashem Hashem Date: Tue, 27 Jan 2026 15:29:50 +0100 Subject: [PATCH] linux: add CAN error types Port libc "error.h" file for SocketCAN subsystem and expose through can.rs. --- libc-test/build.rs | 1 + libc-test/semver/linux.txt | 62 +++++++++++++++++++++++ src/new/linux_uapi/linux/can.rs | 1 + src/new/linux_uapi/linux/can/error.rs | 73 +++++++++++++++++++++++++++ src/new/mod.rs | 1 + 5 files changed, 138 insertions(+) create mode 100644 src/new/linux_uapi/linux/can/error.rs diff --git a/libc-test/build.rs b/libc-test/build.rs index 0e6a543861621..a8b8e046ebf71 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -3859,6 +3859,7 @@ fn test_linux(target: &str) { (gnu, "linux/aio_abi.h"), "linux/can.h", "linux/can/bcm.h", + "linux/can/error.h", "linux/can/raw.h", "linux/can/j1939.h", "linux/cn_proc.h", diff --git a/libc-test/semver/linux.txt b/libc-test/semver/linux.txt index 928b94e48c3c7..016b120b0e316 100644 --- a/libc-test/semver/linux.txt +++ b/libc-test/semver/linux.txt @@ -230,11 +230,73 @@ CANXL_PRIO_MASK CANXL_SEC CANXL_XLF CAN_BCM +CAN_BUS_OFF_THRESHOLD CAN_EFF_FLAG CAN_EFF_ID_BITS CAN_EFF_MASK +CAN_ERROR_PASSIVE_THRESHOLD +CAN_ERROR_WARNING_THRESHOLD +CAN_ERR_ACK +CAN_ERR_BUSERROR +CAN_ERR_BUSOFF +CAN_ERR_CNT +CAN_ERR_CRTL +CAN_ERR_CRTL_ACTIVE +CAN_ERR_CRTL_RX_OVERFLOW +CAN_ERR_CRTL_RX_PASSIVE +CAN_ERR_CRTL_RX_WARNING +CAN_ERR_CRTL_TX_OVERFLOW +CAN_ERR_CRTL_TX_PASSIVE +CAN_ERR_CRTL_TX_WARNING +CAN_ERR_CRTL_UNSPEC +CAN_ERR_DLC CAN_ERR_FLAG +CAN_ERR_LOSTARB +CAN_ERR_LOSTARB_UNSPEC CAN_ERR_MASK +CAN_ERR_PROT +CAN_ERR_PROT_ACTIVE +CAN_ERR_PROT_BIT +CAN_ERR_PROT_BIT0 +CAN_ERR_PROT_BIT1 +CAN_ERR_PROT_FORM +CAN_ERR_PROT_LOC_ACK +CAN_ERR_PROT_LOC_ACK_DEL +CAN_ERR_PROT_LOC_CRC_DEL +CAN_ERR_PROT_LOC_CRC_SEQ +CAN_ERR_PROT_LOC_DATA +CAN_ERR_PROT_LOC_DLC +CAN_ERR_PROT_LOC_EOF +CAN_ERR_PROT_LOC_ID04_00 +CAN_ERR_PROT_LOC_ID12_05 +CAN_ERR_PROT_LOC_ID17_13 +CAN_ERR_PROT_LOC_ID20_18 +CAN_ERR_PROT_LOC_ID28_21 +CAN_ERR_PROT_LOC_IDE +CAN_ERR_PROT_LOC_INTERM +CAN_ERR_PROT_LOC_RES0 +CAN_ERR_PROT_LOC_RES1 +CAN_ERR_PROT_LOC_RTR +CAN_ERR_PROT_LOC_SOF +CAN_ERR_PROT_LOC_SRTR +CAN_ERR_PROT_LOC_UNSPEC +CAN_ERR_PROT_OVERLOAD +CAN_ERR_PROT_STUFF +CAN_ERR_PROT_TX +CAN_ERR_PROT_UNSPEC +CAN_ERR_RESTARTED +CAN_ERR_TRX +CAN_ERR_TRX_CANH_NO_WIRE +CAN_ERR_TRX_CANH_SHORT_TO_BAT +CAN_ERR_TRX_CANH_SHORT_TO_GND +CAN_ERR_TRX_CANH_SHORT_TO_VCC +CAN_ERR_TRX_CANL_NO_WIRE +CAN_ERR_TRX_CANL_SHORT_TO_BAT +CAN_ERR_TRX_CANL_SHORT_TO_CANH +CAN_ERR_TRX_CANL_SHORT_TO_GND +CAN_ERR_TRX_CANL_SHORT_TO_VCC +CAN_ERR_TRX_UNSPEC +CAN_ERR_TX_TIMEOUT CAN_FD_FRAME CAN_INV_FILTER CAN_ISOTP diff --git a/src/new/linux_uapi/linux/can.rs b/src/new/linux_uapi/linux/can.rs index 6bacd9d36da4c..d984835a6c10f 100644 --- a/src/new/linux_uapi/linux/can.rs +++ b/src/new/linux_uapi/linux/can.rs @@ -1,6 +1,7 @@ //! Header: `uapi/linux/can.h` pub(crate) mod bcm; +pub(crate) mod error; pub(crate) mod j1939; pub(crate) mod raw; diff --git a/src/new/linux_uapi/linux/can/error.rs b/src/new/linux_uapi/linux/can/error.rs new file mode 100644 index 0000000000000..1b298ca40eca0 --- /dev/null +++ b/src/new/linux_uapi/linux/can/error.rs @@ -0,0 +1,73 @@ +//! Header: `linux/can/error.h` + +pub use crate::linux::can::*; + +pub const CAN_ERR_DLC: c_int = 8; + +pub const CAN_ERR_TX_TIMEOUT: c_uint = 0x00000001; +pub const CAN_ERR_LOSTARB: c_uint = 0x00000002; +pub const CAN_ERR_CRTL: c_uint = 0x00000004; +pub const CAN_ERR_PROT: c_uint = 0x00000008; +pub const CAN_ERR_TRX: c_uint = 0x00000010; +pub const CAN_ERR_ACK: c_uint = 0x00000020; +pub const CAN_ERR_BUSOFF: c_uint = 0x00000040; +pub const CAN_ERR_BUSERROR: c_uint = 0x00000080; +pub const CAN_ERR_RESTARTED: c_uint = 0x00000100; +pub const CAN_ERR_CNT: c_uint = 0x00000200; + +pub const CAN_ERR_LOSTARB_UNSPEC: c_int = 0x00; + +pub const CAN_ERR_CRTL_UNSPEC: c_int = 0x00; +pub const CAN_ERR_CRTL_RX_OVERFLOW: c_int = 0x01; +pub const CAN_ERR_CRTL_TX_OVERFLOW: c_int = 0x02; +pub const CAN_ERR_CRTL_RX_WARNING: c_int = 0x04; +pub const CAN_ERR_CRTL_TX_WARNING: c_int = 0x08; +pub const CAN_ERR_CRTL_RX_PASSIVE: c_int = 0x10; +pub const CAN_ERR_CRTL_TX_PASSIVE: c_int = 0x20; +pub const CAN_ERR_CRTL_ACTIVE: c_int = 0x40; + +pub const CAN_ERR_PROT_UNSPEC: c_int = 0x00; +pub const CAN_ERR_PROT_BIT: c_int = 0x01; +pub const CAN_ERR_PROT_FORM: c_int = 0x02; +pub const CAN_ERR_PROT_STUFF: c_int = 0x04; +pub const CAN_ERR_PROT_BIT0: c_int = 0x08; +pub const CAN_ERR_PROT_BIT1: c_int = 0x10; +pub const CAN_ERR_PROT_OVERLOAD: c_int = 0x20; +pub const CAN_ERR_PROT_ACTIVE: c_int = 0x40; +pub const CAN_ERR_PROT_TX: c_int = 0x80; + +pub const CAN_ERR_PROT_LOC_UNSPEC: c_int = 0x00; +pub const CAN_ERR_PROT_LOC_SOF: c_int = 0x03; +pub const CAN_ERR_PROT_LOC_ID28_21: c_int = 0x02; +pub const CAN_ERR_PROT_LOC_ID20_18: c_int = 0x06; +pub const CAN_ERR_PROT_LOC_SRTR: c_int = 0x04; +pub const CAN_ERR_PROT_LOC_IDE: c_int = 0x05; +pub const CAN_ERR_PROT_LOC_ID17_13: c_int = 0x07; +pub const CAN_ERR_PROT_LOC_ID12_05: c_int = 0x0F; +pub const CAN_ERR_PROT_LOC_ID04_00: c_int = 0x0E; +pub const CAN_ERR_PROT_LOC_RTR: c_int = 0x0C; +pub const CAN_ERR_PROT_LOC_RES1: c_int = 0x0D; +pub const CAN_ERR_PROT_LOC_RES0: c_int = 0x09; +pub const CAN_ERR_PROT_LOC_DLC: c_int = 0x0B; +pub const CAN_ERR_PROT_LOC_DATA: c_int = 0x0A; +pub const CAN_ERR_PROT_LOC_CRC_SEQ: c_int = 0x08; +pub const CAN_ERR_PROT_LOC_CRC_DEL: c_int = 0x18; +pub const CAN_ERR_PROT_LOC_ACK: c_int = 0x19; +pub const CAN_ERR_PROT_LOC_ACK_DEL: c_int = 0x1B; +pub const CAN_ERR_PROT_LOC_EOF: c_int = 0x1A; +pub const CAN_ERR_PROT_LOC_INTERM: c_int = 0x12; + +pub const CAN_ERR_TRX_UNSPEC: c_int = 0x00; +pub const CAN_ERR_TRX_CANH_NO_WIRE: c_int = 0x04; +pub const CAN_ERR_TRX_CANH_SHORT_TO_BAT: c_int = 0x05; +pub const CAN_ERR_TRX_CANH_SHORT_TO_VCC: c_int = 0x06; +pub const CAN_ERR_TRX_CANH_SHORT_TO_GND: c_int = 0x07; +pub const CAN_ERR_TRX_CANL_NO_WIRE: c_int = 0x40; +pub const CAN_ERR_TRX_CANL_SHORT_TO_BAT: c_int = 0x50; +pub const CAN_ERR_TRX_CANL_SHORT_TO_VCC: c_int = 0x60; +pub const CAN_ERR_TRX_CANL_SHORT_TO_GND: c_int = 0x70; +pub const CAN_ERR_TRX_CANL_SHORT_TO_CANH: c_int = 0x80; + +pub const CAN_ERROR_WARNING_THRESHOLD: c_int = 96; +pub const CAN_ERROR_PASSIVE_THRESHOLD: c_int = 128; +pub const CAN_BUS_OFF_THRESHOLD: c_int = 256; diff --git a/src/new/mod.rs b/src/new/mod.rs index 078200ae6258c..8b1fdc2317436 100644 --- a/src/new/mod.rs +++ b/src/new/mod.rs @@ -177,6 +177,7 @@ cfg_if! { pub use sys::socket::*; } else if #[cfg(target_os = "linux")] { pub use linux::can::bcm::*; + pub use linux::can::error::*; pub use linux::can::j1939::*; pub use linux::can::raw::*; pub use linux::can::*;