# 通用模式加载 sudo ip linkset dev lo xdpgeneric obj xdp_pass_kern.o sec xdp
❯ ip link show dev lo 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 prog/xdp id 57 ❯ sudo ip link show dev lo 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 prog/xdp id 57 tag 3b185187f1855c4c jited
# 卸载 sudo ip linkset dev lo xdpgeneric off
ip 命令加载是直接加载到 nic, 因此一次 nic 只能加载一个 xdp 程序, 但是 xdp-loader 实现了 xdp nult-dispatch 更加强大更加丰富
1 2 3 4 5 6 7 8
❯ sudo xdp-loader load -m skb lo xdp_pass_kern.o ❯ sudo xdp-loader status lo CURRENT XDP PROGRAM STATUS:
Interface Prio Program name Mode ID Tag Chain actions -------------------------------------------------------------------------------------- lo xdp_dispatcher skb 67 90f686eb86991928 => 50 xdp_prog_simple 76 3b185187f1855c4c XDP_PASS
❯ sudo ./xdp_pass_user --dev lo libbpf: elf: skipping unrecognized data section(7) xdp_metadata libbpf: elf: skipping unrecognized data section(7) xdp_metadata libbpf: elf: skipping unrecognized data section(7) xdp_metadata libbpf: elf: skipping unrecognized data section(7) xdp_metadata Success: Loading XDP prog name:xdp_prog_simple(id:95) on device:lo(ifindex:1) ❯ sudo ./xdp_pass_user -d lo libbpf: elf: skipping unrecognized data section(7) xdp_metadata libbpf: elf: skipping unrecognized data section(7) xdp_metadata libbpf: elf: skipping unrecognized data section(7) xdp_metadata libbpf: elf: skipping unrecognized data section(7) xdp_metadata Success: Loading XDP prog name:xdp_prog_simple(id:114) on device:lo(ifindex:1) ❯ xdp-loader status lo This program must be run as root. ❯ sudo xdp-loader status lo CURRENT XDP PROGRAM STATUS:
Interface Prio Program name Mode ID Tag Chain actions -------------------------------------------------------------------------------------- lo xdp_dispatcher skb 105 90f686eb86991928 => 50 xdp_prog_simple 95 3b185187f1855c4c XDP_PASS => 50 xdp_prog_simple 114 3b185187f1855c4c XDP_PASS
这里警告似乎是无所谓;
两次加载的 Prio 是完全相同的, 使用其他加载方式也是一样
1 2 3 4
# 卸载 通过 fd sudo ./xdp_pass_user --dev lo -U 745 # 卸载全部 sudo ./xdp_pass_user --dev lo --unload-all
/* For percpu maps, user space gets a value per possible CPU */ unsignedint nr_cpus = libbpf_num_possible_cpus(); structdatarecvalues[nr_cpus];// 这里承载数据的是 数组!! __u64 sum_bytes = 0; __u64 sum_pkts = 0; int i; // 读取数据 if ((bpf_map_lookup_elem(fd, &key, values)) != 0) { fprintf(stderr, "ERR: bpf_map_lookup_elem failed key:0x%X\n", key); return; }
/* Sum values from each CPU */ for (i = 0; i < nr_cpus; i++) { sum_pkts += values[i].rx_packets; sum_bytes += values[i].rx_bytes; } value->rx_packets = sum_pkts; value->rx_bytes = sum_bytes;