1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
//! Tests for the XDP functionality.
#[allow(dead_code)]
mod common;
use std::os::fd::AsFd;
use scopeguard::defer;
use test_tag::tag;
use libbpf_rs::Xdp;
use libbpf_rs::XdpFlags;
use crate::common::get_prog_mut;
use crate::common::get_test_object;
const LO_IFINDEX: i32 = 1;
#[tag(root)]
#[test]
fn test_xdp() {
let mut obj = get_test_object("xdp.bpf.o");
let prog = get_prog_mut(&mut obj, "xdp_filter");
let fd = prog.as_fd();
let mut obj1 = get_test_object("xdp.bpf.o");
let prog1 = get_prog_mut(&mut obj1, "xdp_filter");
let fd1 = prog1.as_fd();
let xdp_prog = Xdp::new(fd);
let xdp_prog1 = Xdp::new(fd1);
defer! {
xdp_prog.detach(LO_IFINDEX, XdpFlags::UPDATE_IF_NOEXIST).unwrap();
}
assert!(xdp_prog
.attach(LO_IFINDEX, XdpFlags::UPDATE_IF_NOEXIST)
.is_ok());
// Second attach should fail as a prog is already loaded
assert!(xdp_prog
.attach(LO_IFINDEX, XdpFlags::UPDATE_IF_NOEXIST)
.is_err());
assert!(xdp_prog
.query_id(LO_IFINDEX, XdpFlags::UPDATE_IF_NOEXIST)
.is_ok());
assert!(xdp_prog
.query(LO_IFINDEX, XdpFlags::UPDATE_IF_NOEXIST)
.is_ok());
let old_prog_id = xdp_prog
.query_id(LO_IFINDEX, XdpFlags::UPDATE_IF_NOEXIST)
.unwrap();
assert!(xdp_prog1.replace(LO_IFINDEX, fd).is_ok());
let new_prog_id = xdp_prog1
.query_id(LO_IFINDEX, XdpFlags::UPDATE_IF_NOEXIST)
.unwrap();
// If xdp prog is replaced, prog id should change.
assert!(old_prog_id != new_prog_id);
assert!(xdp_prog
.detach(LO_IFINDEX, XdpFlags::UPDATE_IF_NOEXIST)
.is_ok());
}
|