use netlink_packet_core::{Emitable, Parseable};
use crate::{
stats::{
HwStats64, HwStatsInfo, OffloadXstat, StatsAttribute, StatsFilterMask,
StatsHeader, StatsMessage, StatsMessageBuffer,
},
AddressFamily,
};
#[test]
fn test_parsing_offload_xstats() {
let raw = vec![
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00,
0x18, 0x00, 0x02, 0x80,
0x14, 0x00, 0x03, 0x80,
0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
];
let expected = StatsMessage {
header: StatsHeader {
family: AddressFamily::Unspec,
ifindex: 1,
filter_mask: StatsFilterMask::LinkOffloadXstats,
},
attributes: vec![StatsAttribute::LinkOffloadXstats(vec![
OffloadXstat::HwStatsInfo(HwStatsInfo {
request: Some(0),
used: Some(0),
}),
])],
};
assert_eq!(
expected,
StatsMessage::parse(&StatsMessageBuffer::new(&raw)).unwrap()
);
let mut buf = vec![0; expected.buffer_len()];
expected.emit(&mut buf);
assert_eq!(buf, raw);
}
#[test]
fn test_parsing_offload_l3_stats() {
let raw: Vec<u8> = {
let mut v = vec![
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, ];
let l3_nla_len: u16 = 76;
let outer_nla_len: u16 = 80;
v.extend_from_slice(&outer_nla_len.to_ne_bytes());
v.extend_from_slice(&4u16.to_ne_bytes()); v.extend_from_slice(&l3_nla_len.to_ne_bytes());
v.extend_from_slice(&3u16.to_ne_bytes()); v.extend_from_slice(&100u64.to_ne_bytes());
v.extend_from_slice(&200u64.to_ne_bytes());
v.extend_from_slice(&[0u8; 56]); v
};
let expected = StatsMessage {
header: StatsHeader {
family: AddressFamily::Unspec,
ifindex: 1,
filter_mask: StatsFilterMask::LinkOffloadXstats,
},
attributes: vec![StatsAttribute::LinkOffloadXstats(vec![
OffloadXstat::L3Stats(HwStats64 {
rx_packets: 100,
tx_packets: 200,
..Default::default()
}),
])],
};
assert_eq!(
expected,
StatsMessage::parse(&StatsMessageBuffer::new(&raw)).unwrap()
);
let mut buf = vec![0; expected.buffer_len()];
expected.emit(&mut buf);
assert_eq!(buf, raw);
}