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#[derive(Clone, Debug)]
14pub struct RawDataItem {
15 pub type_id: DataItemType,
16 pub value: Bytes,
17}
18
19#[derive(Clone, Copy, Debug, Default)]
21pub struct PeerFlags {
22 pub smi: bool,
23}
24
25#[derive(Clone, Copy, Debug, Default)]
27pub struct ConnectionPointFlags {
28 pub use_tls: bool,
29}
30
31#[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}