Eu tenho um caso de teste semelhante ao código emhttps://github.com/xdp-project/xdp-tutorial/que mantém um mapa estatístico em uma matriz por CPU e código de espaço do usuário que exibe as estatísticas periodicamente.
Quando executo isso, o código do espaço do usuário sempre exibe zeros. Instrumentei meu código do kernel eBPF com bpf_trace_printk e parece estar colocando os valores corretos no mapa. O código do usuário está iterando em todas as CPUs possíveis, mas sempre encontra zeros nos slots da matriz por CPU.
Alguém pode me dizer o que está errado?
Meu caso de teste éaqui ; af_xdp_kern.c é o código eBPF, af_xdp_user.c é o código do espaço do usuário que orienta o código eBPF e filter-xdp_stats.c é o código que deve exibir as estatísticas. Tudo é compilado com 'make' nesse diretório, e há um script de execução que eu uso com
tjcw@r28b29-n10:~/workspace/bpf-examples/AF_XDP-filter/netperf-namespace$ sudo FILTER=af_xdp_kern ./run.sh
para executar o código do usuário e o código eBPF com os dados sendo transferidos entre 2 namespaces de rede na máquina. Enquanto estiver em execução,
tjcw@r28b29-n10:~/workspace/bpf-examples/AF_XDP-filter$ sudo ./filter-xdp_stats
deve exibir estatísticas, mas na verdade exibe zeros.
Meu caso de teste é codificado para a interface BPF '1.0', onde o código no xdp-tutorial é codificado para a interface BPF de pré-lançamento.
Estou executando o Ubuntu 22.04 com uname -a dando
tjcw@r28b29-n10:~/workspace/bpf-examples/AF_XDP-filter$ uname -a
Linux r28b29-n10 5.15.0-48-generic #54-Ubuntu SMP Fri Aug 26 13:26:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
tjcw@r28b29-n10:~/workspace/bpf-examples/AF_XDP-filter$
Obrigado por toda a ajuda que você pode dar!
Responder1
É necessário executar a aplicação de exibição de estatísticas no mesmo namespace de rede do usuário e da aplicação eBPF; mesmo na mesma instância de ip netns exec
.