iso13400_2/
lib.rs

1//! Table 1 — Vehicle identification parameter values (value not set)
2//!
3//! Table 2 — Payload type vehicle identification request message — No message parameters
4//!
5//! Table 3 — Payload type vehicle identification request message with EID
6//!
7//! Table 4 — Payload type vehicle identification request message with VIN
8//!
9//! Table 5 — Payload type vehicle announcement/identification response message
10//!
11//! Table 6 — Definition of further action code values
12//!
13//! Table 7 — Definition of VIN/GID synchronization status code values
14//!
15//! Table 8 — Diagnostic power mode information request
16//!
17//! Table 9 — Diagnostic power mode information response
18//!
19//! Table 10 — DoIP entity status request
20//!
21//! Table 11 — DoIP entity status response
22//!
23//! Table 12 — DoIP timing and communication parameters
24//!
25//! Table 13 — Logical address overview
26//!
27//! Table 14 — DHCP on OSI layers
28//!
29//! Table 15 — IETF RFC 3927 adapted timings
30//!
31//! Table 16 — Generic DoIP header structure
32//!
33//! Table 17 — Overview of DoIP payload types
34//!
35//! Table 18 — Generic DoIP header negative acknowledge structure
36//!
37//! Table 19 — Generic DoIP header NACK codes
38//!
39//! Table 20 — UDP and TCP port usage
40//!
41//! Table 21 — Payload type diagnostic message structure
42//!
43//! Table 22 — Example of ISO 27145-3 request message transported by a DoIP message frame
44//!
45//! Table 23 — Payload type diagnostic message positive acknowledgment structure
46//!
47//! Table 24 — Diagnostic message positive acknowledge codes
48//!
49//! Table 25 — Payload type diagnostic message negative acknowledgment structure
50//!
51//! Table 26 — Diagnostic message negative acknowledge codes
52//!
53//! Table 27 — Payload type alive check request structure
54//!
55//! Table 28 — Payload type alive check response structure
56//!
57//! Table 29 — TLS authentication type
58//!
59//! Table 30 — TLS 1.2 version cipher suites
60//!
61//! Table 31 — TLS 1.3 version cipher suites
62//!
63//! Table 32 — TLS 1.2 version supported TLS extensions
64//!
65//! Table 33 — TLS 1.2 version optional TLS extensions
66//!
67//! Table 34 — TLS 1.2 version not supported TLS extensions
68//!
69//! Table 35 — TLS 1.3 version supported TLS extensions
70//!
71//! Table 36 — TLS 1.3 version optional TLS extensions
72//!
73//! Table 37 — TLS 1.3 version not supported TLS extensions
74//!
75//! Table 38 — TCP on OSI layers
76//!
77//! Table 39 — Supported TCP ports
78//!
79//! Table 40 — UDP on OSI layers
80//!
81//! Table 41 — UDP ports
82//!
83//! Table 42 — IPv4/IPv6 on OSI layers
84//!
85//! Table 43 — ARP on OSI layers
86//!
87//! Table 44 — NDP on OSI layers
88//!
89//! Table 45 — ICMP on OSI layers
90//!
91//! Table 46 — Payload type routing activation request
92//!
93//! Table 47 — Routing activation request activation types
94//!
95//! Table 48 — Payload type routing activation response
96//!
97//! Table 49 — Routing activation response code values
98mod constants;
99pub use constants::*;
100mod common;
101pub use common::*;
102mod error;
103pub use error::Error as Iso13400Error;
104pub mod request;
105pub mod response;
106
107pub(crate) mod utils;
108
109#[derive(Debug, Copy, Clone, Eq, PartialEq)]
110pub struct Id(pub(crate) u64);
111
112impl Id {
113    pub fn new(id: u64) -> Result<Self, error::Error> {
114        if (id & 0xFFFF0000_00000000) > 0 {
115            return Err(error::Error::InvalidParam(format!(
116                "id: {} out of range",
117                id
118            )));
119        }
120
121        Ok(Self(id))
122    }
123
124    #[inline]
125    pub const fn length() -> usize {
126        SIZE_OF_ID
127    }
128}
129
130impl TryFrom<&[u8]> for Id {
131    type Error = error::Error;
132
133    #[inline]
134    fn try_from(data: &[u8]) -> Result<Self, Self::Error> {
135        let _ = utils::data_len_check(data, Self::length(), false)?;
136        let id = u64::from_be_bytes([
137            0x00, 0x00, data[0], data[1], data[2], data[3], data[4], data[5],
138        ]);
139
140        Self::new(id)
141    }
142}
143
144impl From<Id> for Vec<u8> {
145    #[inline]
146    fn from(val: Id) -> Self {
147        let mut result = val.0.to_le_bytes().to_vec();
148        result.resize(Id::length(), Default::default());
149        result.reverse();
150
151        result
152    }
153}
154
155#[repr(u16)]
156#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
157pub enum PayloadType {
158    RespHeaderNegative = HEADER_NEGATIVE,
159    ReqVehicleId = UDP_REQ_VEHICLE_IDENTIFIER,
160    ReqVehicleWithEid = UDP_REQ_VEHICLE_ID_WITH_EID,
161    ReqVehicleWithVIN = UDP_REQ_VEHICLE_ID_WITH_VIN,
162    RespVehicleId = UDP_RESP_VEHICLE_IDENTIFIER,
163    ReqRoutingActive = TCP_REQ_ROUTING_ACTIVE,
164    RespRoutingActive = TCP_RESP_ROUTING_ACTIVE,
165    ReqAliveCheck = TCP_REQ_ALIVE_CHECK,
166    RespAliveCheck = TCP_RESP_ALIVE_CHECK,
167    ReqEntityStatus = UDP_REQ_ENTITY_STATUS,
168    RespEntityStatus = UDP_RESP_ENTITY_STATUS,
169    ReqDiagPowerMode = UDP_REQ_DIAGNOSTIC_POWER_MODE,
170    RespDiagPowerMode = UDP_RESP_DIAGNOSTIC_POWER_MODE,
171    Diagnostic = TCP_DIAGNOSTIC,
172    RespDiagPositive = TCP_RESP_DIAGNOSTIC_POSITIVE,
173    RespDiagNegative = TCP_RESP_DIAGNOSTIC_NEGATIVE,
174}
175
176impl TryFrom<u16> for PayloadType {
177    type Error = error::Error;
178    fn try_from(value: u16) -> Result<Self, Self::Error> {
179        match value {
180            HEADER_NEGATIVE => Ok(Self::RespHeaderNegative),
181            UDP_REQ_VEHICLE_IDENTIFIER => Ok(Self::ReqVehicleId),
182            UDP_REQ_VEHICLE_ID_WITH_EID => Ok(Self::ReqVehicleWithEid),
183            UDP_REQ_VEHICLE_ID_WITH_VIN => Ok(Self::ReqVehicleWithVIN),
184            UDP_RESP_VEHICLE_IDENTIFIER => Ok(Self::RespVehicleId),
185            TCP_REQ_ROUTING_ACTIVE => Ok(Self::ReqRoutingActive),
186            TCP_RESP_ROUTING_ACTIVE => Ok(Self::RespRoutingActive),
187            TCP_REQ_ALIVE_CHECK => Ok(Self::ReqAliveCheck),
188            TCP_RESP_ALIVE_CHECK => Ok(Self::RespAliveCheck),
189            UDP_REQ_ENTITY_STATUS => Ok(Self::ReqEntityStatus),
190            UDP_RESP_ENTITY_STATUS => Ok(Self::RespEntityStatus),
191            UDP_REQ_DIAGNOSTIC_POWER_MODE => Ok(Self::ReqDiagPowerMode),
192            UDP_RESP_DIAGNOSTIC_POWER_MODE => Ok(Self::RespDiagPowerMode),
193            TCP_DIAGNOSTIC => Ok(Self::Diagnostic),
194            TCP_RESP_DIAGNOSTIC_POSITIVE => Ok(Self::RespDiagPositive),
195            TCP_RESP_DIAGNOSTIC_NEGATIVE => Ok(Self::RespDiagNegative),
196            _ => Err(error::Error::InvalidPayloadType(value)),
197        }
198    }
199}
200
201impl From<PayloadType> for u16 {
202    fn from(val: PayloadType) -> Self {
203        val as u16
204    }
205}
206
207pub type Eid = Id;
208pub type Gid = Id;
209
210/// It will be removed in a future version. Use [NodeType] instead
211#[deprecated(
212    since = "0.1.0",
213    note = "It will be removed in a future version. Use 'NodeType` instead"
214)]
215pub type Entity = NodeType;