내 eBPF 패킷은 어디로 가나요?

내 eBPF 패킷은 어디로 가나요?

2개의 네임스페이스 사이에 'ping'을 설정하는 eBPF를 사용하는 테스트 케이스가 있습니다. 내 eBPF 프로그램은 흐름의 첫 번째 패킷을 가로채서 이를 사용자 공간으로 보냅니다. 여기서 이는 흐름의 후속 패킷이 수신 eth에서 ping 응답이 생성되는 커널로 직접 전달되도록 맵을 구성하는 데 사용됩니다. 그런 다음 첫 번째 패킷은 eBPF 전송 대기열에 공급되어 커널로 이동하여 핑 응답을 생성할 것으로 예상되지만 실제로는 이 패킷에 대한 더 이상 추적이 표시되지 않습니다. 인터페이스의 'tcpdump'에는 없고 'pwru'에는 없습니다. 내가 뭘 잘못하고 있는지 말해 줄 수 있는 사람이 있나요?

내 테스트 케이스는 여기에 있습니다https://github.com/tjcw/bpf-examples/tree/tjcw-send-first-packet-debug-20221210.1121/AF_XDP-filter; 실행 스크립트는 여기에 있습니다https://github.com/tjcw/bpf-examples/blob/tjcw-send-first-packet-debug-20221210.1121/AF_XDP-filter/ping-namespace-direct-with-dummy/run.sh.

실행 로그(형식화된 tcpdump 포함)는 여기에 있습니다.https://github.com/tjcw/bpf-examples/blob/tjcw-send-first-packet-debug-20221210.1121/AF_XDP-filter/ping-namespace-direct-with-dummy/runlog.txt그리고 그 로그는 pwru여기에 있어요https://github.com/tjcw/bpf-examples/blob/tjcw-send-first-packet-debug-20221210.1121/AF_XDP-filter/ping-namespace-direct-with-dummy/pwru.txt.

완전히 업데이트된 Ubuntu 22.04에서 실행 중입니다.

죄송합니다. 위의 실행 로그에는 tcpdump 출력이 없습니다. 여기https://github.com/tjcw/bpf-examples/blob/tjcw-send-first-packet-debug-20221210.1121/AF_XDP-filter/ping-namespace-direct-with-dummy/run2.txttcpdumps를 사용하여 게시하려고 했던 것입니다.

디렉토리에 UDP 테스트를 추가했습니다https://github.com/tjcw/bpf-examples/tree/tjcw-send-first-packet-debug-20221212.1400/AF_XDP-filter(udp-sender-count.c 및 udp-receiver.c 파일을 참조하고 udp-namespace-direct-with-dummy 디렉토리에서 스크립트와 로그 파일을 실행하십시오). 이 테스트 사례에서는 첫 번째 패킷이 사용자 공간으로 리디렉션된 후 손실되고, 두 번째 패킷이 UDP 리스너를 통과하는 것을 보여줍니다.

답변1

관련 정보