use netlink_packet_core::{DefaultNla, Emitable, NlaBuffer, Parseable};
use crate::link::{xdp::VecLinkXdp, LinkXdp, XdpAttached};
static ATTACHED: [u8; 48] = [
0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0xfc, 0x00, 0x00, 0x00, ];
#[test]
fn parse_xdp_attached() {
let nla = NlaBuffer::new_checked(&ATTACHED[..]).unwrap();
let parsed = VecLinkXdp::parse(&nla).unwrap().0;
let expected = vec![
LinkXdp::Attached(XdpAttached::None),
LinkXdp::Attached(XdpAttached::Driver),
LinkXdp::Attached(XdpAttached::SocketBuffer),
LinkXdp::Attached(XdpAttached::Hardware),
LinkXdp::Attached(XdpAttached::Multiple),
LinkXdp::Attached(XdpAttached::Other(252)),
];
assert_eq!(expected, parsed);
}
#[test]
fn emit_xdp_attached() {
let nlas = vec![LinkXdp::Attached(XdpAttached::None)];
assert_eq!(nlas.as_slice().buffer_len(), 8);
let mut vec = vec![0xff; 8];
nlas.as_slice().emit(&mut vec);
assert_eq!(&vec[..], &ATTACHED[..8]);
let nlas = vec![LinkXdp::Attached(XdpAttached::Driver)];
assert_eq!(nlas.as_slice().buffer_len(), 8);
let mut vec = vec![0xff; 8];
nlas.as_slice().emit(&mut vec);
assert_eq!(&vec[..], &ATTACHED[8..16]);
let nlas = vec![LinkXdp::Attached(XdpAttached::SocketBuffer)];
assert_eq!(nlas.as_slice().buffer_len(), 8);
let mut vec = vec![0xff; 8];
nlas.as_slice().emit(&mut vec);
assert_eq!(&vec[..], &ATTACHED[16..24]);
let nlas = vec![LinkXdp::Attached(XdpAttached::Hardware)];
assert_eq!(nlas.as_slice().buffer_len(), 8);
let mut vec = vec![0xff; 8];
nlas.as_slice().emit(&mut vec);
assert_eq!(&vec[..], &ATTACHED[24..32]);
let nlas = vec![LinkXdp::Attached(XdpAttached::Multiple)];
assert_eq!(nlas.as_slice().buffer_len(), 8);
let mut vec = vec![0xff; 8];
nlas.as_slice().emit(&mut vec);
assert_eq!(&vec[..], &ATTACHED[32..40]);
let nlas = vec![LinkXdp::Attached(XdpAttached::Other(252))];
assert_eq!(nlas.as_slice().buffer_len(), 8);
let mut vec = vec![0xff; 8];
nlas.as_slice().emit(&mut vec);
assert_eq!(&vec[..], &ATTACHED[40..48]);
}
#[rustfmt::skip]
static XDP: [u8; 72] = [
0x08, 0x00, 0x01, 0x00, 0xA0, 0x74, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x67, 0x00, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00, 0x65, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x65, 0x00, 0x00, 0x00, 0x08, 0x00, 0x07, 0x00, 0x65, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0xA1, 0x74, 0x00, 0x00, 0x08, 0x00, 0xfc, 0x00, 0xA1, 0x74, 0x00, 0x00, 0x06, 0x00, 0xfb, 0x00, 0xaa, 0xab, 0x00, 0x00, ];
#[test]
fn parse_xdp() {
let nla = NlaBuffer::new_checked(&XDP[..]).unwrap();
let parsed = VecLinkXdp::parse(&nla).unwrap().0;
let expected = vec![
LinkXdp::Fd(29856),
LinkXdp::Flags(0),
LinkXdp::ProgId(103),
LinkXdp::DrvProgId(101),
LinkXdp::SkbProgId(101),
LinkXdp::HwProgId(101),
LinkXdp::ExpectedFd(29857),
LinkXdp::Other(
DefaultNla::parse(&NlaBuffer::new(&XDP[56..64])).unwrap(),
),
LinkXdp::Other(DefaultNla::parse(&NlaBuffer::new(&XDP[64..])).unwrap()),
];
assert_eq!(expected, parsed);
}
#[test]
fn emit_xdp() {
let nlas = vec![
LinkXdp::Fd(29856),
LinkXdp::Flags(0),
LinkXdp::ProgId(103),
LinkXdp::DrvProgId(101),
LinkXdp::SkbProgId(101),
LinkXdp::HwProgId(101),
LinkXdp::ExpectedFd(29857),
LinkXdp::Other(
DefaultNla::parse(&NlaBuffer::new(&XDP[56..64])).unwrap(),
),
LinkXdp::Other(DefaultNla::parse(&NlaBuffer::new(&XDP[64..])).unwrap()),
];
assert_eq!(nlas.as_slice().buffer_len(), XDP.len());
let mut vec = vec![0xff; XDP.len()];
nlas.as_slice().emit(&mut vec);
assert_eq!(&vec[..], &XDP[..]);
}