Skip to main content

dlep_core/
data_item.rs

1use std::net::{Ipv4Addr, Ipv6Addr};
2use std::time::Duration;
3
4use bytes::Bytes;
5use ipnet::{Ipv4Net, Ipv6Net};
6
7use crate::ids::{DataItemType, ExtensionId};
8use crate::mac::MacAddress;
9use crate::status::StatusCode;
10
11/// Low-level, untyped TLV data item. Useful for forward-compat and for
12/// extensions that carry their own value encoding.
13#[derive(Clone, Debug)]
14pub struct RawDataItem {
15    pub type_id: DataItemType,
16    pub value: Bytes,
17}
18
19/// Peer Type flags (RFC 8175 §13.4).
20#[derive(Clone, Copy, Debug, Default)]
21pub struct PeerFlags {
22    pub smi: bool,
23}
24
25/// IPv4/IPv6 Connection Point sub-flags (RFC 8175 §13.2 / §13.3).
26#[derive(Clone, Copy, Debug, Default)]
27pub struct ConnectionPointFlags {
28    pub use_tls: bool,
29}
30
31/// Typed DLEP Data Item. `Unknown` preserves forward compatibility: the
32/// decoder never fails on an unrecognized type_id and extension code paths
33/// can introspect the raw bytes.
34#[derive(Clone, Debug)]
35pub enum DataItem {
36    Status {
37        code: StatusCode,
38        text: String,
39    },
40    Ipv4ConnectionPoint {
41        flags: ConnectionPointFlags,
42        addr: Ipv4Addr,
43        port: Option<u16>,
44    },
45    Ipv6ConnectionPoint {
46        flags: ConnectionPointFlags,
47        addr: Ipv6Addr,
48        port: Option<u16>,
49    },
50    PeerType {
51        flags: PeerFlags,
52        description: String,
53    },
54    HeartbeatInterval(Duration),
55    ExtensionsSupported(Vec<ExtensionId>),
56    MacAddress(MacAddress),
57    Ipv4Address {
58        add: bool,
59        addr: Ipv4Addr,
60    },
61    Ipv6Address {
62        add: bool,
63        addr: Ipv6Addr,
64    },
65    Ipv4AttachedSubnet {
66        add: bool,
67        subnet: Ipv4Net,
68    },
69    Ipv6AttachedSubnet {
70        add: bool,
71        subnet: Ipv6Net,
72    },
73    MaxDataRateReceive(u64),
74    MaxDataRateTransmit(u64),
75    CurrentDataRateReceive(u64),
76    CurrentDataRateTransmit(u64),
77    Latency(Duration),
78    Resources(u8),
79    RelativeLinkQualityReceive(u8),
80    RelativeLinkQualityTransmit(u8),
81    Mtu(u16),
82    Unknown(RawDataItem),
83}
84
85impl DataItem {
86    pub fn type_id(&self) -> DataItemType {
87        match self {
88            DataItem::Status { .. } => DataItemType::STATUS,
89            DataItem::Ipv4ConnectionPoint { .. } => DataItemType::IPV4_CONNECTION_POINT,
90            DataItem::Ipv6ConnectionPoint { .. } => DataItemType::IPV6_CONNECTION_POINT,
91            DataItem::PeerType { .. } => DataItemType::PEER_TYPE,
92            DataItem::HeartbeatInterval(_) => DataItemType::HEARTBEAT_INTERVAL,
93            DataItem::ExtensionsSupported(_) => DataItemType::EXTENSIONS_SUPPORTED,
94            DataItem::MacAddress(_) => DataItemType::MAC_ADDRESS,
95            DataItem::Ipv4Address { .. } => DataItemType::IPV4_ADDRESS,
96            DataItem::Ipv6Address { .. } => DataItemType::IPV6_ADDRESS,
97            DataItem::Ipv4AttachedSubnet { .. } => DataItemType::IPV4_ATTACHED_SUBNET,
98            DataItem::Ipv6AttachedSubnet { .. } => DataItemType::IPV6_ATTACHED_SUBNET,
99            DataItem::MaxDataRateReceive(_) => DataItemType::MAXIMUM_DATA_RATE_RECEIVE,
100            DataItem::MaxDataRateTransmit(_) => DataItemType::MAXIMUM_DATA_RATE_TRANSMIT,
101            DataItem::CurrentDataRateReceive(_) => DataItemType::CURRENT_DATA_RATE_RECEIVE,
102            DataItem::CurrentDataRateTransmit(_) => DataItemType::CURRENT_DATA_RATE_TRANSMIT,
103            DataItem::Latency(_) => DataItemType::LATENCY,
104            DataItem::Resources(_) => DataItemType::RESOURCES,
105            DataItem::RelativeLinkQualityReceive(_) => DataItemType::RELATIVE_LINK_QUALITY_RECEIVE,
106            DataItem::RelativeLinkQualityTransmit(_) => {
107                DataItemType::RELATIVE_LINK_QUALITY_TRANSMIT
108            }
109            DataItem::Mtu(_) => DataItemType::MTU,
110            DataItem::Unknown(r) => r.type_id,
111        }
112    }
113}