こんにちは、
私は S32G と SJA1110 で bsp43 を実行しており、IGMP スヌーピングを有効にしてマルチキャスト ストリームを動的にルーティングしようとしています。IGMP に関連するいくつかの固有の問題を特定しましたが、解決方法がわかりません。IGMP スヌーピングを無効にすると、マルチキャスト パケットがスイッチに溢れるようになることを確認しました。SO、IGMP スヌーピング オプションが何かを実行しているということです... ただし、これは予期された動作ではありません。
これが Linux 構成の問題なのか、スイッチ ハードウェアの制限なのかはわかりません。
ご提案があればよろしくお願いします。
NXP は私のサポートチケットに応答しておらず、この投稿にも応答がないため、ここで私が見つけた内容を文書化します。
BSP43 について。SJA1105 DSA ドライバーは、ポートがブリッジによってリンクされている場合、SJA1110 の IGMP スヌーピングをサポートしていないようです。ドライバーのセットアップ中に、sja1110 ポートはスタンドアロン モードでセットアップされ、 dsa `tag_8021q` によってスイッチの各ポートに異なる VLAN ルックアップ ルールがインストールされます。vlan-lookup ルールは、入力パケットに `tag_8021q` イーサタイプ `0xDADB` と、ポート ID を含むメタデータを持つ VLAN をタグ付けします。これにより、ホスト プロセッサがパケットがどのポートから受信されたかを認識し、特定のポートでパケットを出力するためのメカニズムが作成されます。ポートがブリッジでリンクされている場合、 `tag_8021q` はポートごとの VLAN ルックアップ ルールを、ブリッジに関連付けられた単一のルールに置き換えます。ホスト プロセッサは、パケットがどのポートから発信されたのかを判断できなくなり、特定のポートにパケットを送信できなくなります。ここで説明されているように、`vlan-filtering` を使用するとこのメカニズムも壊れると思います (sja1110 は `dsa_tag_8021q_bridge_join` を呼び出すため、明らかに 2 番目のタイプです)。
ホスト プロセッサによって作成された IGMP クエリ パケットには、引き続きポートごとの VLAN がタグ付けされますが、VLAN ルックアップにはブリッジのルールのみが含まれるため、IGMP クエリ パケットはボイドに送信されます。それらはゴミ箱に捨てられます。スイッチからは出力されません。この動作は、次の行を変更することで変更できます。
if (!dp->bridge) {
tx_vid = dsa_tag_8021q_standalone_vid(dp);
} else {
tx_vid = dsa_tag_8021q_bridge_vid(dp->bridge->num);
}IGMP クエリー メッセージはスイッチから出力されるようになりましたが、これだけでは IGMP スヌーピングは有効になりません。これは、`tag_8021q` がまだブリッジ全体であり、ポート固有ではないため、ホスト プロセッサが IGMP 参加/離脱がどのポートで受信されたかを認識しないためです。IGMP スヌーピングを有効にするには、スイッチはパケットをトラップし、ネイティブ sja1110 タグ (イーサタイプ 0xdadc) を適用する必要があります。スイッチは 2 つの `mac_fltres` を通じてパケットをトラップし、タグを追加できますが、ドライバーは既にこれらを PTP と STP に使用しています。ユーザー空間ユーティリティ `tc` はパケットをトラップするように設定できますが、これはトラップされたパケットにタグを追加しない仮想リンクを通じて実装されます。最後の 2 つのオプションは、L2 ルックアップまたはディープ パケット インスペクションを使用することです。l2-lookup を使用すると、トラップ ビットを設定して宛先 MAC アドレス 01:00:5E:00:00:16 をトラップすることにより、IGMPv3 を有効にすることができます。これは、*.0.0.22 で終わるマルチキャスト IP グループにも一致するため、適切な解決策ではありません。ブリッジを使用するときに IGMP スヌーピングを有効にする唯一の方法は、ディープ パケット インスペクションのようです。どのようなトラッピング メカニズムが使用されても、このコミットは必要です。そうしないと、sja1110 タグが、やはりブリッジのみを表す `tag_8021q` によって上書きされてしまいます。
上記で提案した解決策では、ブリッジ上の各 DSA ポートに対して IGMP クエリが送信されることに注意してください。VLAN ルックアップ ルールを再インストールして、パケットを正しいポートから出力することも解決策になりますが、ポート 0 はブリッジによってインストールされた VLAN ルックアップと競合する可能性があるため、これも適切な解決策ではありません。IGMP クエリを過剰に送信しても、トラフィックの増加以外には副作用はないようです。