Я основан на этом уроке: https://github.com/xdp-project/xdp-tutorial/tree/master/advanced03-AF_XDP
Я создаю сокет с Queue-ID 0
в пространстве пользователя. В моей программе ядра af-xdp я фильтрую UDP-пакеты и перенаправляю их в сокет пространства пользователя через xskmap
.
Поскольку я, очевидно, хочу, чтобы программа пользователя пространства принимала пакеты, я перенаправляю пакеты в Программа ядра для индексации 0
:
int index = 0;
if (bpf_map_lookup_elem(&xsks_map, &index)) {
return bpf_redirect_map(&xsks_map, index, 0);
} else {
bpf_printk("Didn't find connected socket for index %d!\n", index);
}
Я не получает сообщение об ошибке Didn't find connected socket for index 0!
через sudo cat /sys/kernel/debug/tracing/trace_pipe
, но я не получаю никаких пакетов в пользовательском пространстве!
Если я просто продолжу запускать программу и одновременно добавлю правило ethtool, например:
sudo ethtool -N <eth> flow-type udp4 dst-ip <ip> action 0
, моя программа в пользовательском пространстве внезапно начнет получать пакеты, и сообщение об ошибке исчезнет.
Я думал, что программа ядра будет получать каждый пакет, отправленный на этот интерфейс, но почему-то это не так. Что я сделал не так?