1use std::net::{Ipv4Addr, Ipv6Addr};
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
12pub struct MacAddress(pub [u8; 6]);
13
14impl MacAddress {
15 pub const fn new(bytes: [u8; 6]) -> Self {
17 Self(bytes)
18 }
19
20 pub const fn as_bytes(&self) -> &[u8; 6] {
22 &self.0
23 }
24
25 pub fn is_broadcast(&self) -> bool {
27 self.0 == [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
28 }
29
30 pub fn is_multicast(&self) -> bool {
32 self.0[0] & 0x01 != 0
33 }
34
35 pub fn is_unicast(&self) -> bool {
37 !self.is_multicast()
38 }
39}
40
41impl std::fmt::Display for MacAddress {
42 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
43 write!(
44 f,
45 "{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}",
46 self.0[0], self.0[1], self.0[2], self.0[3], self.0[4], self.0[5]
47 )
48 }
49}
50
51impl From<[u8; 6]> for MacAddress {
52 fn from(bytes: [u8; 6]) -> Self {
53 Self(bytes)
54 }
55}
56
57impl From<MacAddress> for [u8; 6] {
58 fn from(mac: MacAddress) -> Self {
59 mac.0
60 }
61}
62
63#[derive(Debug, Clone, Copy, PartialEq, Eq)]
65pub enum DatagramVersion {
66 Version5 = 5,
67}
68
69#[derive(Debug, Clone, PartialEq, Eq)]
71pub enum Address {
72 Unknown,
73 IPv4(Ipv4Addr),
74 IPv6(Ipv6Addr),
75}
76
77#[derive(Debug, Clone, Copy, PartialEq, Eq)]
80pub struct DataFormat(pub u32);
81
82impl DataFormat {
83 pub fn new(enterprise: u32, format: u32) -> Self {
84 Self((enterprise << 12) | (format & 0xFFF))
85 }
86
87 pub fn enterprise(&self) -> u32 {
88 self.0 >> 12
89 }
90
91 pub fn format(&self) -> u32 {
92 self.0 & 0xFFF
93 }
94}
95
96#[derive(Debug, Clone, Copy, PartialEq, Eq)]
98pub struct DataSource(pub u32);
99
100impl DataSource {
101 pub fn new(source_type: u8, index: u32) -> Self {
102 Self(((source_type as u32) << 24) | (index & 0xFFFFFF))
103 }
104
105 pub fn source_type(&self) -> u8 {
106 (self.0 >> 24) as u8
107 }
108
109 pub fn index(&self) -> u32 {
110 self.0 & 0xFFFFFF
111 }
112}
113
114#[derive(Debug, Clone, Copy, PartialEq, Eq)]
116pub struct DataSourceExpanded {
117 pub source_id_type: u32,
118 pub source_id_index: u32,
119}
120
121#[derive(Debug, Clone, Copy, PartialEq, Eq)]
123pub struct Interface(pub u32);
124
125impl Interface {
126 pub fn format(&self) -> u8 {
127 (self.0 >> 30) as u8
128 }
129
130 pub fn value(&self) -> u32 {
131 self.0 & 0x3FFFFFFF
132 }
133
134 pub fn is_single(&self) -> bool {
135 self.format() == 0
136 }
137
138 pub fn is_discarded(&self) -> bool {
139 self.format() == 1
140 }
141
142 pub fn is_multiple(&self) -> bool {
143 self.format() == 2
144 }
145}
146
147#[derive(Debug, Clone, Copy, PartialEq, Eq)]
149pub struct InterfaceExpanded {
150 pub format: u32,
151 pub value: u32,
152}
153
154#[derive(Debug, Clone, PartialEq, Eq)]
156pub enum FlowData {
157 SampledHeader(crate::models::record_flows::SampledHeader),
159 SampledEthernet(crate::models::record_flows::SampledEthernet),
161 SampledIpv4(crate::models::record_flows::SampledIpv4),
163 SampledIpv6(crate::models::record_flows::SampledIpv6),
165 ExtendedSwitch(crate::models::record_flows::ExtendedSwitch),
167 ExtendedRouter(crate::models::record_flows::ExtendedRouter),
169 ExtendedGateway(crate::models::record_flows::ExtendedGateway),
171 ExtendedUser(crate::models::record_flows::ExtendedUser),
173 ExtendedUrl(crate::models::record_flows::ExtendedUrl),
176 ExtendedMpls(crate::models::record_flows::ExtendedMpls),
178 ExtendedNat(crate::models::record_flows::ExtendedNat),
180 ExtendedMplsTunnel(crate::models::record_flows::ExtendedMplsTunnel),
182 ExtendedMplsVc(crate::models::record_flows::ExtendedMplsVc),
184 ExtendedMplsFec(crate::models::record_flows::ExtendedMplsFec),
186 ExtendedMplsLvpFec(crate::models::record_flows::ExtendedMplsLvpFec),
188 ExtendedVlanTunnel(crate::models::record_flows::ExtendedVlanTunnel),
190 Extended80211Payload(crate::models::record_flows::Extended80211Payload),
192 Extended80211Rx(crate::models::record_flows::Extended80211Rx),
194 Extended80211Tx(crate::models::record_flows::Extended80211Tx),
196 Extended80211Aggregation(crate::models::record_flows::Extended80211Aggregation),
198 ExtendedOpenFlowV1(crate::models::record_flows::ExtendedOpenFlowV1),
200 ExtendedL2TunnelEgress(crate::models::record_flows::ExtendedL2TunnelEgress),
202 ExtendedL2TunnelIngress(crate::models::record_flows::ExtendedL2TunnelIngress),
204 ExtendedIpv4TunnelEgress(crate::models::record_flows::ExtendedIpv4TunnelEgress),
206 ExtendedIpv4TunnelIngress(crate::models::record_flows::ExtendedIpv4TunnelIngress),
208 ExtendedIpv6TunnelEgress(crate::models::record_flows::ExtendedIpv6TunnelEgress),
210 ExtendedIpv6TunnelIngress(crate::models::record_flows::ExtendedIpv6TunnelIngress),
212 ExtendedDecapsulateEgress(crate::models::record_flows::ExtendedDecapsulateEgress),
214 ExtendedDecapsulateIngress(crate::models::record_flows::ExtendedDecapsulateIngress),
216 ExtendedVniEgress(crate::models::record_flows::ExtendedVniEgress),
218 ExtendedVniIngress(crate::models::record_flows::ExtendedVniIngress),
220 ExtendedEgressQueue(crate::models::record_flows::ExtendedEgressQueue),
222 ExtendedAcl(crate::models::record_flows::ExtendedAcl),
224 ExtendedFunction(crate::models::record_flows::ExtendedFunction),
226 ExtendedTransit(crate::models::record_flows::ExtendedTransit),
228 ExtendedQueue(crate::models::record_flows::ExtendedQueue),
230 ExtendedSocketIpv4(crate::models::record_flows::ExtendedSocketIpv4),
232 ExtendedSocketIpv6(crate::models::record_flows::ExtendedSocketIpv6),
234 AppOperation(crate::models::record_flows::AppOperation),
236 AppParentContext(crate::models::record_flows::AppParentContext),
238 AppInitiator(crate::models::record_flows::AppInitiator),
240 AppTarget(crate::models::record_flows::AppTarget),
242 Unknown { format: DataFormat, data: Vec<u8> },
244}
245
246#[derive(Debug, Clone, PartialEq, Eq)]
248pub struct FlowRecord {
249 pub flow_format: DataFormat,
250 pub flow_data: FlowData,
251}
252
253#[derive(Debug, Clone, PartialEq)]
255pub enum CounterData {
256 GenericInterface(crate::models::record_counters::GenericInterfaceCounters),
258 EthernetInterface(crate::models::record_counters::EthernetInterfaceCounters),
260 TokenRing(crate::models::record_counters::TokenRingCounters),
262 Vg100Interface(crate::models::record_counters::Vg100InterfaceCounters),
264 Vlan(crate::models::record_counters::VlanCounters),
266 Ieee80211(crate::models::record_counters::Ieee80211Counters),
268 Processor(crate::models::record_counters::ProcessorCounters),
270 RadioUtilization(crate::models::record_counters::RadioUtilization),
272 HostDescription(crate::models::record_counters::HostDescription),
274 HostAdapters(crate::models::record_counters::HostAdapters),
276 HostParent(crate::models::record_counters::HostParent),
278 HostCpu(crate::models::record_counters::HostCpu),
280 HostMemory(crate::models::record_counters::HostMemory),
282 HostDiskIo(crate::models::record_counters::HostDiskIo),
284 HostNetIo(crate::models::record_counters::HostNetIo),
286 VirtualNode(crate::models::record_counters::VirtualNode),
288 VirtualCpu(crate::models::record_counters::VirtualCpu),
290 VirtualMemory(crate::models::record_counters::VirtualMemory),
292 VirtualDiskIo(crate::models::record_counters::VirtualDiskIo),
294 VirtualNetIo(crate::models::record_counters::VirtualNetIo),
296 OpenFlowPort(crate::models::record_counters::OpenFlowPort),
298 OpenFlowPortName(crate::models::record_counters::OpenFlowPortName),
300 AppOperations(crate::models::record_counters::AppOperations),
302 AppResources(crate::models::record_counters::AppResources),
304 AppWorkers(crate::models::record_counters::AppWorkers),
306 Unknown { format: DataFormat, data: Vec<u8> },
308}
309
310#[derive(Debug, Clone, PartialEq)]
312pub struct CounterRecord {
313 pub counter_format: DataFormat,
314 pub counter_data: CounterData,
315}
316
317#[derive(Debug, Clone, PartialEq, Eq)]
319pub struct FlowSample {
320 pub sequence_number: u32,
321 pub source_id: DataSource,
322 pub sampling_rate: u32,
323 pub sample_pool: u32,
324 pub drops: u32,
325 pub input: Interface,
326 pub output: Interface,
327 pub flow_records: Vec<FlowRecord>,
328}
329
330#[derive(Debug, Clone, PartialEq)]
332pub struct CountersSample {
333 pub sequence_number: u32,
334 pub source_id: DataSource,
335 pub counters: Vec<CounterRecord>,
336}
337
338#[derive(Debug, Clone, PartialEq, Eq)]
340pub struct FlowSampleExpanded {
341 pub sequence_number: u32,
342 pub source_id: DataSourceExpanded,
343 pub sampling_rate: u32,
344 pub sample_pool: u32,
345 pub drops: u32,
346 pub input: InterfaceExpanded,
347 pub output: InterfaceExpanded,
348 pub flow_records: Vec<FlowRecord>,
349}
350
351#[derive(Debug, Clone, PartialEq)]
353pub struct CountersSampleExpanded {
354 pub sequence_number: u32,
355 pub source_id: DataSourceExpanded,
356 pub counters: Vec<CounterRecord>,
357}
358
359#[derive(Debug, Clone, PartialEq, Eq)]
391pub struct DiscardedPacket {
392 pub sequence_number: u32,
394
395 pub source_id: DataSourceExpanded,
397
398 pub drops: u32,
400
401 pub input_ifindex: u32,
403
404 pub output_ifindex: u32,
406
407 pub reason: crate::models::record_flows::DropReason,
409
410 pub flow_records: Vec<FlowRecord>,
412}
413
414#[derive(Debug, Clone, PartialEq)]
416pub enum SampleData {
417 FlowSample(FlowSample),
418 CountersSample(CountersSample),
419 FlowSampleExpanded(FlowSampleExpanded),
420 CountersSampleExpanded(CountersSampleExpanded),
421 DiscardedPacket(DiscardedPacket),
422 Unknown { format: DataFormat, data: Vec<u8> },
423}
424
425#[derive(Debug, Clone, PartialEq)]
427pub struct SampleRecord {
428 pub sample_type: DataFormat,
429 pub sample_data: SampleData,
430}
431
432#[derive(Debug, Clone, PartialEq)]
434pub struct SFlowDatagram {
435 pub version: DatagramVersion,
436 pub agent_address: Address,
437 pub sub_agent_id: u32,
438 pub sequence_number: u32,
439 pub uptime: u32,
440 pub samples: Vec<SampleRecord>,
441}
442
443impl SFlowDatagram {
444 pub fn new(
446 agent_address: Address,
447 sub_agent_id: u32,
448 sequence_number: u32,
449 uptime: u32,
450 ) -> Self {
451 Self {
452 version: DatagramVersion::Version5,
453 agent_address,
454 sub_agent_id,
455 sequence_number,
456 uptime,
457 samples: Vec::new(),
458 }
459 }
460}