use std::net::{Ipv4Addr, Ipv6Addr};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MacAddress(pub [u8; 6]);
impl MacAddress {
pub const fn new(bytes: [u8; 6]) -> Self {
Self(bytes)
}
pub const fn as_bytes(&self) -> &[u8; 6] {
&self.0
}
pub fn is_broadcast(&self) -> bool {
self.0 == [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
}
pub fn is_multicast(&self) -> bool {
self.0[0] & 0x01 != 0
}
pub fn is_unicast(&self) -> bool {
!self.is_multicast()
}
}
impl std::fmt::Display for MacAddress {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}",
self.0[0], self.0[1], self.0[2], self.0[3], self.0[4], self.0[5]
)
}
}
impl From<[u8; 6]> for MacAddress {
fn from(bytes: [u8; 6]) -> Self {
Self(bytes)
}
}
impl From<MacAddress> for [u8; 6] {
fn from(mac: MacAddress) -> Self {
mac.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum DatagramVersion {
Version5 = 5,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Address {
Unknown,
IPv4(Ipv4Addr),
IPv6(Ipv6Addr),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DataFormat(pub u32);
impl DataFormat {
pub fn new(enterprise: u32, format: u32) -> Self {
Self((enterprise << 12) | (format & 0xFFF))
}
pub fn enterprise(&self) -> u32 {
self.0 >> 12
}
pub fn format(&self) -> u32 {
self.0 & 0xFFF
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DataSource(pub u32);
impl DataSource {
pub fn new(source_type: u8, index: u32) -> Self {
Self(((source_type as u32) << 24) | (index & 0xFFFFFF))
}
pub fn source_type(&self) -> u8 {
(self.0 >> 24) as u8
}
pub fn index(&self) -> u32 {
self.0 & 0xFFFFFF
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DataSourceExpanded {
pub source_id_type: u32,
pub source_id_index: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Interface(pub u32);
impl Interface {
pub fn format(&self) -> u8 {
(self.0 >> 30) as u8
}
pub fn value(&self) -> u32 {
self.0 & 0x3FFFFFFF
}
pub fn is_single(&self) -> bool {
self.format() == 0
}
pub fn is_discarded(&self) -> bool {
self.format() == 1
}
pub fn is_multiple(&self) -> bool {
self.format() == 2
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct InterfaceExpanded {
pub format: u32,
pub value: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FlowData {
SampledHeader(crate::models::record_flows::SampledHeader),
SampledEthernet(crate::models::record_flows::SampledEthernet),
SampledIpv4(crate::models::record_flows::SampledIpv4),
SampledIpv6(crate::models::record_flows::SampledIpv6),
ExtendedSwitch(crate::models::record_flows::ExtendedSwitch),
ExtendedRouter(crate::models::record_flows::ExtendedRouter),
ExtendedGateway(crate::models::record_flows::ExtendedGateway),
ExtendedUser(crate::models::record_flows::ExtendedUser),
ExtendedUrl(crate::models::record_flows::ExtendedUrl),
ExtendedMpls(crate::models::record_flows::ExtendedMpls),
ExtendedNat(crate::models::record_flows::ExtendedNat),
ExtendedMplsTunnel(crate::models::record_flows::ExtendedMplsTunnel),
ExtendedMplsVc(crate::models::record_flows::ExtendedMplsVc),
ExtendedMplsFec(crate::models::record_flows::ExtendedMplsFec),
ExtendedMplsLvpFec(crate::models::record_flows::ExtendedMplsLvpFec),
ExtendedVlanTunnel(crate::models::record_flows::ExtendedVlanTunnel),
Extended80211Payload(crate::models::record_flows::Extended80211Payload),
Extended80211Rx(crate::models::record_flows::Extended80211Rx),
Extended80211Tx(crate::models::record_flows::Extended80211Tx),
Extended80211Aggregation(crate::models::record_flows::Extended80211Aggregation),
ExtendedOpenFlowV1(crate::models::record_flows::ExtendedOpenFlowV1),
ExtendedFc(crate::models::record_flows::ExtendedFc),
ExtendedQueueLength(crate::models::record_flows::ExtendedQueueLength),
ExtendedNatPort(crate::models::record_flows::ExtendedNatPort),
ExtendedL2TunnelEgress(crate::models::record_flows::ExtendedL2TunnelEgress),
ExtendedL2TunnelIngress(crate::models::record_flows::ExtendedL2TunnelIngress),
ExtendedIpv4TunnelEgress(crate::models::record_flows::ExtendedIpv4TunnelEgress),
ExtendedIpv4TunnelIngress(crate::models::record_flows::ExtendedIpv4TunnelIngress),
ExtendedIpv6TunnelEgress(crate::models::record_flows::ExtendedIpv6TunnelEgress),
ExtendedIpv6TunnelIngress(crate::models::record_flows::ExtendedIpv6TunnelIngress),
ExtendedDecapsulateEgress(crate::models::record_flows::ExtendedDecapsulateEgress),
ExtendedDecapsulateIngress(crate::models::record_flows::ExtendedDecapsulateIngress),
ExtendedVniEgress(crate::models::record_flows::ExtendedVniEgress),
ExtendedVniIngress(crate::models::record_flows::ExtendedVniIngress),
ExtendedInfiniBandLrh(crate::models::record_flows::ExtendedInfiniBandLrh),
ExtendedInfiniBandGrh(crate::models::record_flows::ExtendedInfiniBandGrh),
ExtendedInfiniBandBth(crate::models::record_flows::ExtendedInfiniBandBth),
ExtendedVlanIn(crate::models::record_flows::ExtendedVlanIn),
ExtendedVlanOut(crate::models::record_flows::ExtendedVlanOut),
ExtendedEgressQueue(crate::models::record_flows::ExtendedEgressQueue),
ExtendedAcl(crate::models::record_flows::ExtendedAcl),
ExtendedFunction(crate::models::record_flows::ExtendedFunction),
ExtendedTransit(crate::models::record_flows::ExtendedTransit),
ExtendedQueue(crate::models::record_flows::ExtendedQueue),
ExtendedHwTrap(crate::models::record_flows::ExtendedHwTrap),
ExtendedLinuxDropReason(crate::models::record_flows::ExtendedLinuxDropReason),
Transaction(crate::models::record_flows::Transaction),
ExtendedNfsStorageTransaction(crate::models::record_flows::ExtendedNfsStorageTransaction),
ExtendedScsiStorageTransaction(crate::models::record_flows::ExtendedScsiStorageTransaction),
ExtendedHttpTransaction(crate::models::record_flows::ExtendedHttpTransaction),
ExtendedSocketIpv4(crate::models::record_flows::ExtendedSocketIpv4),
ExtendedSocketIpv6(crate::models::record_flows::ExtendedSocketIpv6),
ExtendedProxySocketIpv4(crate::models::record_flows::ExtendedProxySocketIpv4),
ExtendedProxySocketIpv6(crate::models::record_flows::ExtendedProxySocketIpv6),
MemcacheOperation(crate::models::record_flows::MemcacheOperation),
HttpRequestDeprecated(crate::models::record_flows::HttpRequestDeprecated),
AppOperation(crate::models::record_flows::AppOperation),
AppParentContext(crate::models::record_flows::AppParentContext),
AppInitiator(crate::models::record_flows::AppInitiator),
AppTarget(crate::models::record_flows::AppTarget),
HttpRequest(crate::models::record_flows::HttpRequest),
ExtendedProxyRequest(crate::models::record_flows::ExtendedProxyRequest),
ExtendedNavTiming(crate::models::record_flows::ExtendedNavTiming),
ExtendedTcpInfo(crate::models::record_flows::ExtendedTcpInfo),
ExtendedEntities(crate::models::record_flows::ExtendedEntities),
ExtendedBstEgressQueue(crate::models::record_flows::ExtendedBstEgressQueue),
Unknown { format: DataFormat, data: Vec<u8> },
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FlowRecord {
pub flow_format: DataFormat,
pub flow_data: FlowData,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum CounterData {
GenericInterface(crate::models::record_counters::GenericInterfaceCounters),
EthernetInterface(crate::models::record_counters::EthernetInterfaceCounters),
TokenRing(crate::models::record_counters::TokenRingCounters),
Vg100Interface(crate::models::record_counters::Vg100InterfaceCounters),
Vlan(crate::models::record_counters::VlanCounters),
Ieee80211(crate::models::record_counters::Ieee80211Counters),
LagPortStats(crate::models::record_counters::LagPortStats),
SlowPathCounts(crate::models::record_counters::SlowPathCounts),
InfiniBandCounters(crate::models::record_counters::InfiniBandCounters),
OpticalSfpQsfp(crate::models::record_counters::OpticalSfpQsfp),
Processor(crate::models::record_counters::ProcessorCounters),
RadioUtilization(crate::models::record_counters::RadioUtilization),
QueueLength(crate::models::record_counters::QueueLength),
OpenFlowPort(crate::models::record_counters::OpenFlowPort),
OpenFlowPortName(crate::models::record_counters::OpenFlowPortName),
HostDescription(crate::models::record_counters::HostDescription),
HostAdapters(crate::models::record_counters::HostAdapters),
HostParent(crate::models::record_counters::HostParent),
HostCpu(crate::models::record_counters::HostCpu),
HostMemory(crate::models::record_counters::HostMemory),
HostDiskIo(crate::models::record_counters::HostDiskIo),
HostNetIo(crate::models::record_counters::HostNetIo),
Mib2IpGroup(crate::models::record_counters::Mib2IpGroup),
Mib2IcmpGroup(crate::models::record_counters::Mib2IcmpGroup),
Mib2TcpGroup(crate::models::record_counters::Mib2TcpGroup),
Mib2UdpGroup(crate::models::record_counters::Mib2UdpGroup),
VirtualNode(crate::models::record_counters::VirtualNode),
VirtualCpu(crate::models::record_counters::VirtualCpu),
VirtualMemory(crate::models::record_counters::VirtualMemory),
VirtualDiskIo(crate::models::record_counters::VirtualDiskIo),
VirtualNetIo(crate::models::record_counters::VirtualNetIo),
JvmRuntime(crate::models::record_counters::JvmRuntime),
JvmStatistics(crate::models::record_counters::JvmStatistics),
MemcacheCountersDeprecated(crate::models::record_counters::MemcacheCountersDeprecated),
HttpCounters(crate::models::record_counters::HttpCounters),
AppOperations(crate::models::record_counters::AppOperations),
AppResources(crate::models::record_counters::AppResources),
MemcacheCounters(crate::models::record_counters::MemcacheCounters),
AppWorkers(crate::models::record_counters::AppWorkers),
OvsDpStats(crate::models::record_counters::OvsDpStats),
Energy(crate::models::record_counters::Energy),
Temperature(crate::models::record_counters::Temperature),
Humidity(crate::models::record_counters::Humidity),
Fans(crate::models::record_counters::Fans),
BroadcomDeviceBuffers(crate::models::record_counters::BroadcomDeviceBuffers),
BroadcomPortBuffers(crate::models::record_counters::BroadcomPortBuffers),
BroadcomTables(crate::models::record_counters::BroadcomTables),
NvidiaGpu(crate::models::record_counters::NvidiaGpu),
Unknown { format: DataFormat, data: Vec<u8> },
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CounterRecord {
pub counter_format: DataFormat,
pub counter_data: CounterData,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FlowSample {
pub sequence_number: u32,
pub source_id: DataSource,
pub sampling_rate: u32,
pub sample_pool: u32,
pub drops: u32,
pub input: Interface,
pub output: Interface,
pub flow_records: Vec<FlowRecord>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CountersSample {
pub sequence_number: u32,
pub source_id: DataSource,
pub counters: Vec<CounterRecord>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FlowSampleExpanded {
pub sequence_number: u32,
pub source_id: DataSourceExpanded,
pub sampling_rate: u32,
pub sample_pool: u32,
pub drops: u32,
pub input: InterfaceExpanded,
pub output: InterfaceExpanded,
pub flow_records: Vec<FlowRecord>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CountersSampleExpanded {
pub sequence_number: u32,
pub source_id: DataSourceExpanded,
pub counters: Vec<CounterRecord>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(u32)]
pub enum DropReason {
NetUnreachable = 0,
HostUnreachable = 1,
ProtocolUnreachable = 2,
PortUnreachable = 3,
FragNeeded = 4,
SrcRouteFailed = 5,
DstNetUnknown = 6,
DstHostUnknown = 7,
SrcHostIsolated = 8,
DstNetProhibited = 9,
DstHostProhibited = 10,
DstNetTosUnreachable = 11,
DstHostTosUnreachable = 12,
CommAdminProhibited = 13,
HostPrecedenceViolation = 14,
PrecedenceCutoff = 15,
Unknown = 256,
TtlExceeded = 257,
Acl = 258,
NoBufferSpace = 259,
Red = 260,
TrafficShaping = 261,
PktTooBig = 262,
SrcMacIsMulticast = 263,
VlanTagMismatch = 264,
IngressVlanFilter = 265,
IngressSpanningTreeFilter = 266,
PortListIsEmpty = 267,
PortLoopbackFilter = 268,
BlackholeRoute = 269,
NonIp = 270,
UcDipOverMcDmac = 271,
DipIsLoopbackAddress = 272,
SipIsMc = 273,
SipIsLoopbackAddress = 274,
IpHeaderCorrupted = 275,
Ipv4SipIsLimitedBc = 276,
Ipv6McDipReservedScope = 277,
Ipv6McDipInterfaceLocalScope = 278,
UnresolvedNeigh = 279,
McReversePathForwarding = 280,
NonRoutablePacket = 281,
DecapError = 282,
OverlaySmacIsMc = 283,
UnknownL2 = 284,
UnknownL3 = 285,
UnknownL3Exception = 286,
UnknownBuffer = 287,
UnknownTunnel = 288,
UnknownL4 = 289,
SipIsUnspecified = 290,
MlagPortIsolation = 291,
BlackholeArpNeigh = 292,
SrcMacIsDmac = 293,
DmacIsReserved = 294,
SipIsClassE = 295,
McDmacMismatch = 296,
SipIsDip = 297,
DipIsLocalNetwork = 298,
DipIsLinkLocal = 299,
OverlaySmacIsDmac = 300,
EgressVlanFilter = 301,
UcReversePathForwarding = 302,
SplitHorizon = 303,
}
impl DropReason {
pub fn from_u32(value: u32) -> Option<Self> {
match value {
0 => Some(DropReason::NetUnreachable),
1 => Some(DropReason::HostUnreachable),
2 => Some(DropReason::ProtocolUnreachable),
3 => Some(DropReason::PortUnreachable),
4 => Some(DropReason::FragNeeded),
5 => Some(DropReason::SrcRouteFailed),
6 => Some(DropReason::DstNetUnknown),
7 => Some(DropReason::DstHostUnknown),
8 => Some(DropReason::SrcHostIsolated),
9 => Some(DropReason::DstNetProhibited),
10 => Some(DropReason::DstHostProhibited),
11 => Some(DropReason::DstNetTosUnreachable),
12 => Some(DropReason::DstHostTosUnreachable),
13 => Some(DropReason::CommAdminProhibited),
14 => Some(DropReason::HostPrecedenceViolation),
15 => Some(DropReason::PrecedenceCutoff),
256 => Some(DropReason::Unknown),
257 => Some(DropReason::TtlExceeded),
258 => Some(DropReason::Acl),
259 => Some(DropReason::NoBufferSpace),
260 => Some(DropReason::Red),
261 => Some(DropReason::TrafficShaping),
262 => Some(DropReason::PktTooBig),
263 => Some(DropReason::SrcMacIsMulticast),
264 => Some(DropReason::VlanTagMismatch),
265 => Some(DropReason::IngressVlanFilter),
266 => Some(DropReason::IngressSpanningTreeFilter),
267 => Some(DropReason::PortListIsEmpty),
268 => Some(DropReason::PortLoopbackFilter),
269 => Some(DropReason::BlackholeRoute),
270 => Some(DropReason::NonIp),
271 => Some(DropReason::UcDipOverMcDmac),
272 => Some(DropReason::DipIsLoopbackAddress),
273 => Some(DropReason::SipIsMc),
274 => Some(DropReason::SipIsLoopbackAddress),
275 => Some(DropReason::IpHeaderCorrupted),
276 => Some(DropReason::Ipv4SipIsLimitedBc),
277 => Some(DropReason::Ipv6McDipReservedScope),
278 => Some(DropReason::Ipv6McDipInterfaceLocalScope),
279 => Some(DropReason::UnresolvedNeigh),
280 => Some(DropReason::McReversePathForwarding),
281 => Some(DropReason::NonRoutablePacket),
282 => Some(DropReason::DecapError),
283 => Some(DropReason::OverlaySmacIsMc),
284 => Some(DropReason::UnknownL2),
285 => Some(DropReason::UnknownL3),
286 => Some(DropReason::UnknownL3Exception),
287 => Some(DropReason::UnknownBuffer),
288 => Some(DropReason::UnknownTunnel),
289 => Some(DropReason::UnknownL4),
290 => Some(DropReason::SipIsUnspecified),
291 => Some(DropReason::MlagPortIsolation),
292 => Some(DropReason::BlackholeArpNeigh),
293 => Some(DropReason::SrcMacIsDmac),
294 => Some(DropReason::DmacIsReserved),
295 => Some(DropReason::SipIsClassE),
296 => Some(DropReason::McDmacMismatch),
297 => Some(DropReason::SipIsDip),
298 => Some(DropReason::DipIsLocalNetwork),
299 => Some(DropReason::DipIsLinkLocal),
300 => Some(DropReason::OverlaySmacIsDmac),
301 => Some(DropReason::EgressVlanFilter),
302 => Some(DropReason::UcReversePathForwarding),
303 => Some(DropReason::SplitHorizon),
_ => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DiscardedPacket {
pub sequence_number: u32,
pub source_id: DataSourceExpanded,
pub drops: u32,
pub input_ifindex: u32,
pub output_ifindex: u32,
pub reason: DropReason,
pub flow_records: Vec<FlowRecord>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SampleData {
FlowSample(FlowSample),
CountersSample(CountersSample),
FlowSampleExpanded(FlowSampleExpanded),
CountersSampleExpanded(CountersSampleExpanded),
DiscardedPacket(DiscardedPacket),
RtMetric {
format: DataFormat,
data: Vec<u8>,
},
RtFlow {
format: DataFormat,
data: Vec<u8>,
},
Unknown {
format: DataFormat,
data: Vec<u8>,
},
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SampleRecord {
pub sample_type: DataFormat,
pub sample_data: SampleData,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SFlowDatagram {
pub version: DatagramVersion,
pub agent_address: Address,
pub sub_agent_id: u32,
pub sequence_number: u32,
pub uptime: u32,
pub samples: Vec<SampleRecord>,
}
impl SFlowDatagram {
pub fn new(
agent_address: Address,
sub_agent_id: u32,
sequence_number: u32,
uptime: u32,
) -> Self {
Self {
version: DatagramVersion::Version5,
agent_address,
sub_agent_id,
sequence_number,
uptime,
samples: Vec::new(),
}
}
}