DPAA2のLX2160プロセッサ搭載のイーサネット・スイッチ(DPSW)で問題や制限に直面しました。
dpsw は、パケットの宛先 MAC が既にそのポートで学習されている場合 (つまり、宛先 MAC がそのポートの FDB に登録されている場合) に、そのパケットを受信ポートに返送します。
これにより、スイッチがCiscoのイーサネット・スイッチに接続されている場合に問題が生じます。Cisco イーサネット・スイッチ CDPは、同じ送信元と宛先MACでパケットを送信することでループバックテストを行うためです。DPSWはCisco Switchがポートをシャットダウンさせます。
NXP社が提案している回避策があります。各ポートのFDBに登録されているMACアドレスをスキャンし、それらをACLに追加して、受信ポートへの送信をブロックするスクリプトを作成してください。
例えば、eth2 の問題を修正する必要がある場合は、次のスクリプトを使用します。
tc qdisc add dev eth2 clsact
dest=`bridge fdb show | grep -i eth2 | grep -i self | awk '{print substr($1,0,17)}'`
for dmac in $dest; do
tc filter add dev eth2 ingress flower dst_mac $dmac skip_sw action drop doneコマンドの機能:
- qdiscを作成します(ACLについては、お送りしたリンクを参照してください)。
- ブリッジFDBをダンプし、宛先ポートがeth2で、かつタイプが「self」であるすべてのエントリを表示します。
ダンプの結果はawkに渡され、FDBからdmacのみを出力します。
例: 00:04:9f:05:c3:c8 00:04:9f:05:c3:c9 00:04:9f:05:85:b2
-結果をdestに保存します。- dest を反復処理し、dest 内の各 MAC に対してイングレスに ACL フィルタを追加します。
eth2で受信されるすべてのフローのうち、上記の範囲内のdmacを持つものは、作成されたACLルールによって破棄されます。
しかし、この回避策は場当たり的なやり方のように思える。いくつか問題点があります。
- MACが学習されACLに割り当てられる間には小さなウィンドウが存在し、パケットが受信ポートにループバックされる可能性があります。
- また、デバイスが移動しても、ACL内のMACアドレスは削除されません。移動したデバイスは現在アクセスできない可能性があります。
- 継続的な走査、ACLへの追加およびACLプロセッシングによるパフォーマンスへの影響。
私の質問:これに対処するもっと良い方法はありますか?
「もしかしたら」この方法が効果的か、役立つかもしれませんか?内容を確認し、動作するか、あるいは理にかなっているかどうかについてフィードバックをお願いします。
--------------------------------------------------------------------------------------------------
DPSWポートに受信するeth型ループバック検出フレーム0x9000ドロップするための代替サンプル方法
----------------------------------------------------------------------------------------------
例えば、ループバック検出フレーム(ethタイプ0x9000)パケットがeth5 dpswポート経由で受信されている場合(そして、例えばdpmac-18がこのdpswポートにリンクされている場合)、
その場合、汎用的なethタイプ0x9000フレーム(MACアドレスに関係なく)を破棄することで、ハードウェアオフロードルールを実行する方がより良い選択肢となるでしょう。
1. 一時的または既存の設定をすべて削除します。
tc qdisc del dev eth5 clsact 2>/dev/null
tc qdisc add dev eth5 clsact
2. 厳格なハードウェアオフロードのドロップルールを適用する
tc filter add dev eth5 ingress protocol 0x9000 flower skip_sw action drop
----------------------
3. ステータスチェック:
tc -s filter show dev eth5 ingress
restool dpsw info dpsw.0 | grep -A 10 "dpmac.18"| grep "fltr_frame"
または
while :; do restool dpsw info dpsw.0 | grep -A 10 "dpmac.18"| grep "fltr_frame"; sleep 1; done
簡単に言えば、お客様に実装を提供する可能性は非常に低いです:
-ハードウェアはソースポートのプリミュニングをサポートしておらず、その機能を実現するにはファームウェアも大幅な変更が必要です(実現可能かどうかも不明です)。なぜなら、プリンを自律的にエミュレートする方法が不可能なからです。
AEチームと話し合っています。