doip_definitions/doip_payload/
routing_activation_request.rs

1use crate::{
2    definitions::{DOIP_ROUTING_ACTIVATION_REQ_ISO_LEN, DOIP_ROUTING_ACTIVATION_REQ_SRC_LEN},
3    error::{Error, Result},
4    payload::ActivationType,
5};
6
7/// Request for routing activation.
8///
9/// Usually routing activation is required for `DoipMessage` passing to a `DoIP` server,
10/// the `RoutingActivationRequest` details the activation type required.
11#[cfg_attr(feature = "python-bindings", pyo3::pyclass)]
12#[derive(Copy, Clone, Debug, PartialEq)]
13pub struct RoutingActivationRequest {
14    /// Source address of the requesting entity
15    pub source_address: [u8; DOIP_ROUTING_ACTIVATION_REQ_SRC_LEN],
16
17    /// Activation type
18    pub activation_type: ActivationType,
19
20    /// ISO reserved buffer, currently left empty
21    pub buffer: [u8; DOIP_ROUTING_ACTIVATION_REQ_ISO_LEN],
22}
23
24impl From<RoutingActivationRequest>
25    for [u8; DOIP_ROUTING_ACTIVATION_REQ_SRC_LEN + 1 + DOIP_ROUTING_ACTIVATION_REQ_ISO_LEN]
26{
27    fn from(value: RoutingActivationRequest) -> Self {
28        let mut buffer =
29            [0u8; DOIP_ROUTING_ACTIVATION_REQ_SRC_LEN + 1 + DOIP_ROUTING_ACTIVATION_REQ_ISO_LEN];
30
31        let mut offset = 0;
32
33        buffer[offset..offset + DOIP_ROUTING_ACTIVATION_REQ_SRC_LEN]
34            .copy_from_slice(&value.source_address);
35        offset += DOIP_ROUTING_ACTIVATION_REQ_SRC_LEN;
36
37        buffer[offset] = value.activation_type.into();
38        offset += 1;
39
40        buffer[offset..offset + DOIP_ROUTING_ACTIVATION_REQ_ISO_LEN].copy_from_slice(&value.buffer);
41
42        buffer
43    }
44}
45
46impl TryFrom<&[u8]> for RoutingActivationRequest {
47    type Error = Error;
48
49    fn try_from(value: &[u8]) -> Result<Self> {
50        let mut offset = 0;
51
52        let source_address = value
53            .get(offset..DOIP_ROUTING_ACTIVATION_REQ_SRC_LEN)
54            .ok_or(Error::OutOfBounds {
55                source: "RoutingActivationRequest",
56                variable: "Source Address",
57            })?
58            .try_into()?;
59
60        offset += DOIP_ROUTING_ACTIVATION_REQ_SRC_LEN;
61
62        let activation_type = value
63            .get(offset)
64            .ok_or(Error::OutOfBounds {
65                source: "RoutingActivationRequest",
66                variable: "Vin",
67            })?
68            .try_into()?;
69
70        offset += 1;
71
72        let buffer = value
73            .get(offset..offset + DOIP_ROUTING_ACTIVATION_REQ_ISO_LEN)
74            .ok_or(Error::OutOfBounds {
75                source: "RoutingActivationResponse",
76                variable: "Buffer",
77            })?
78            .try_into()?;
79
80        Ok(RoutingActivationRequest {
81            source_address,
82            activation_type,
83            buffer,
84        })
85    }
86}