仮想ethのLinuxカーネルは、挿入されたTCP / UDPパケットを無視します。

仮想ethのLinuxカーネルは、挿入されたTCP / UDPパケットを無視します。

ネットワーク名前空間を使用して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+ack10.0.0.1では応答がありません。)

両方の名前空間でWiresharkを実行すると、関連するフレームがすべて表示されますが、カーネルは挿入された(配信された)UDP / TCPパケットを無視するようです。私は何を見逃していますか?単一ホストで転送アプリケーションをテストする別の方法はありますか?

答え1

問題は、vethインターフェイスがデフォルトでチェックサムオフロードを使用するため、転送されたパケットのチェックサムが誤ってカーネルで無視されることです。ethtool --offload IFACE rx off tx off4つのインターフェイスすべてで実行するとveth問題が解決しました。

関連情報