ネットワーク名前空間を使用してDPDK転送アプリケーションのローカルテスト設定を作成しようとしています。私が作成した設定は次のとおりです。
veth0(10.0.0.1, namespace vnet0) <> veth1(no ip, host) <-DPDK forward-> veth3(no ip, host) <> veth2(10.0.0.2, namespace vnet1)
したがって、2つのネットワーク名前空間には、それぞれホスト側で転送DPDKアプリケーションを使用して「接続」するvethペアがあります。
以下は、この設定を作成するために使用した完全なコマンドです。
sudo ip link add veth0 type veth peer name veth1
sudo ip link add veth2 type veth peer name veth3
sudo ip netns add vnet0
sudo ip netns add vnet1
sudo ip link set veth0 netns vnet0
sudo ip link set veth2 netns vnet1
sudo ip -n vnet0 set veth0 up
sudo ip -n vnet1 set veth2 up
sudo ip link set veth1 up
sudo ip link set veth3 up
sudo ip -n vnet0 addr add 10.0.0.1/24 dev veth0
sudo ip -n vnet1 addr add 10.0.0.2/24 dev veth2
DPDKアプリケーション:
sudo dpdk-skeleton --vdev=net_af_packet0,iface=veth1 --vdev=net_af_packet1,iface=veth3
名前空間間でフレームが正しく渡され、ICMP ECHOが機能します。
sudo ip netns exec vnet1 ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.116 ms
ただし、UDP および TCP パケットはカーネルでは無視されます。
sudo ip netns exec vnet0 nc -l -p 8080
sudo ip netns exec vnet1 nc 10.0.0.1 8080
(TCPsyn
パケットを再送信していますが、syn+ack
10.0.0.1では応答がありません。)
両方の名前空間でWiresharkを実行すると、関連するフレームがすべて表示されますが、カーネルは挿入された(配信された)UDP / TCPパケットを無視するようです。私は何を見逃していますか?単一ホストで転送アプリケーションをテストする別の方法はありますか?
答え1
問題は、veth
インターフェイスがデフォルトでチェックサムオフロードを使用するため、転送されたパケットのチェックサムが誤ってカーネルで無視されることです。ethtool --offload IFACE rx off tx off
4つのインターフェイスすべてで実行するとveth
問題が解決しました。