- Make sure you run
doca_flow_*_destroyfor everything that need s to have it.
На сетевой карте создаются два SF, в них создаются eth порты, забрасываются в
отдельные netns. Нужно организовать L3 связанность между ними, один SF - префикс
2001:db8::1/56, второй - 2001:db8:2::/56. Остальной (не попадающий по dst ip)
трафик должен дропаться.
Все современные облака имеют L3 Only сеть, виртуалки/контейнеры имеют связанность только через IPv4/IPv6, соответственно они находятся в L2 сегменте, где есть только виртуалка/контейнер и некстхоп (виртуальный роутер), который через LPM направляет трафик куда надо. В пределах одной ноды будет делаться просто форвард в другую SF, а если виртуалка/контейнер уже на другой ноде, то трафик будет передаваться через ipip overlay с SRv6 controlplane.
Виртуалки у нас будут подключаться к NIC через SF vnet (vDPA) порт, трафик будет уходить сразу в железо. Это что-то наподобие SR-IOV (VF), но немного другое.
В первую очередь, необходимо реализовать минималистичные, безопасные, highlevel обёртки над низкоуровневыми примитивами DOCA Flow, basic/lpm pipe и энтри для них, ну и actions для свопа mac адресов.
Поверх этого уже реализовать L3 Forwarding, нужно определять порт, с которого пришёл пакет, на основании этого определять тенант -> форвардать в LPM пайп тенанта, там уже в энтри форвардит в порт с action на swap мак адресов.
Мак адреса статические - 52:ed:ed:ed:ed:ed со стороны некстхопа,
52:ec:ec:ec:ec:ec со стороны SF, ARP/ND не нужен.
Желательно реализовать ttl decrement, пример есть в doca-samples - flow_modify_header. Кейс с TTL=0/1 можно пока не учитывать.
Использовать нужно switch режим, в isolated режиме и ставить fwd_miss в drop
руками. Ну и NIC переводить в esw_multiport (mpesw) режим желательно сразу, ибо
именно так в проде оно и будет.
Также большим плюсом будет реализация динамического добавления/изменения настроек оффлоада - создание/удаление пайпов, добавление/удаление entries в них.
vm/netns
˅
virtio-net nic
˅
vdpa
˅
hardware sf
˅
(doca flow) switch port
˅
(doca flow) basic decision (by port) pipe (determine tenant)
˅
(doca flow) lpm pipe (for tenant)
˅
(doca flow) forward to port with mac swap action
˅
hardware sf
˅
vdpa
˅
virtio-net nic
˅
another vm/netns