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;