ネットワーク内のLinuxベースのソフトウェアブリッジよりもトラフィックを優先させようとしています。ローカルで(ブリッジをホストしているマシンで)トラフィックを生成すると、トラフィックの優先順位が正しく設定されます。ただし、「ブリッジ」を通過する他のノードからの「リモート」トラフィックは優先されません(すべての送信者への同じ帯域幅配分)。多分誰かが理由を知っていますか?
I350ネットワークアダプター用のブリッジは次のように設定されています(Linux 5.1.8-1-MANJARO#1 SMP PREEMPT Sun Jun 9 20:44:14 UTC 2019 x86_64 GNU/Linux):
brctl addbr br0
ip link set dev enp1s0f0 promisc on
ip link set dev enp1s0f1 promisc on
ip link set dev enp1s0f2 promisc on
ip link set dev enp1s0f3 promisc on
brctl addif br0 enp1s0f0
brctl addif br0 enp1s0f1
brctl addif br0 enp1s0f2
brctl addif br0 enp1s0f3
ip link set dev br0 up
tc qdisc del dev enp1s0f0 root
tc qdisc add dev enp1s0f0 root prio
tc qdisc del dev enp1s0f1 root
tc qdisc add dev enp1s0f1 root prio
tc qdisc del dev enp1s0f2 root
tc qdisc add dev enp1s0f2 root prio
tc qdisc del dev enp1s0f3 root
tc qdisc add dev enp1s0f3 root prio
ip addr add 192.168.1.1/24 dev br0
UDPトラフィックはiperf3で生成され、TOSフィールドを適切に設定することで生成されます。
Low-Prio Sender: iperf3 -c 192.168.1.140 -u -b 100m -S 0x2 -p 5201 -t 30
Hi-Prio Sender : iperf3 -c 192.168.1.140 -u -b 100m -S 0x0 -p 5202 -t 30
Prioマップはデフォルト設定のままです:priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
トラフィックを明示的に分類すると、リモートトラフィックの優先順位付けが機能します。
tc filter add dev enp1s0f1 parent 1: protocol ip prio 10 u32 match ip dst 192.168.1.140 match ip dport 5201 0xffff flowid 1:1
tc filter add dev enp1s0f1 parent 1: protocol ip prio 20 u32 match ip dst 192.168.1.140 match ip dport 5202 0xffff flowid 1:2
しかし、デフォルト設定ではありません...多分それはレイヤー2 /レイヤー3の問題ですか?
それまでの間、私はなんとか解決策を見つけました:)
Linuxブリッジ(brctl)は、レイヤー2デバイスとして機能します。
TOSマーキングはIEEE P802.1p(これはIEEE_802.1Qに属します)の一部であり、IPヘッダーに属しています( https://en.wikipedia.org/wiki/IEEE_802.1Q )
Linuxブリッジはレイヤー2で動作するため、このフィールドは無視されるようです。 (ただし、OSIモデルによると https://en.wikipedia.org/wiki/OSI_model 802.1Qはレイヤー2に属します)その結果、すべてのパケットが同じqdiscクラス(私の設定ではクラス1:2)私は次のコマンドでそれを理解しました:
tc -s -s -d c ls dev enp1s0f1
これにより、実行時にさまざまなqdiscクラスのキューを監視できます。後で、「リモート」トラフィックは、他のストリーム(たとえば、ブリッジをホストするマシンからの「ローカル」ストリーム)を使用してクラス1:2からのトラフィックとしてスケジュールされ、正しい結果が得られました。いくつかのユースケース.....だから注意してください! ;)
私のために働いたのは、プロキシARPでネットワーク接続をブリッジすることでした(つまり、レイヤー3を強制する https://wiki.debian.org/BridgeNetworkConnectionsProxyArp )
まず、IP転送とプロキシARPをアクティブにします。
echo 1 > /proc/sys/net/ipv4/conf/all/proxy_arp
echo 1 > /proc/sys/net/ipv4/ip_forward
その後、ルートをノードに追加します。
ip ro add <node IP>/32 dev <local interface>
例:
ip ro add 192.168.1.12/32 dev enp1s0f0
ブリッジングとプリオキュースケジューラのソースコードを読みました。そして、私はいくつかの結果を持っています:
skb->priority
フィールドを使用して、priomapでパケットを分類します。skb-priority
フィールドは入力されていません。1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
のように見えます。1:0
なので、子クラスは1:1
-1:3
のクラスIDを持ちます):tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x00 classid 1:2
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x02 classid 1:3
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x04 classid 1:3
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x06 classid 1:3
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x08 classid 1:2
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x0a classid 1:3
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x0c classid 1:1
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x0e classid 1:1
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x10 classid 1:2
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x12 classid 1:2
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x14 classid 1:2
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x16 classid 1:2
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x18 classid 1:2
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x1a classid 1:2
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x1c classid 1:2
tc filter add dev eth0 parent 1: protocol ip flower ip_tos 0x1e classid 1:2