UNIX用ユニバーサルブリッジインタフェースの開発

第1版: 2005年12月26日
公開: 2007年4月6日
著者: 木本雅彦

1. 背景

厳密なリアルタイム性を要求しない組み込み用途に、UNIXを用いることは今日 ではめずらしくない。この場合、対象としているアーキテクチャで動きさえす れば、どのUNIXを使うかについては、それほど大きな問題にはならないはずで ある。だが、現実問題として、組み込みUNIX用のミドルウェアなどを購入しよ うとすると「Linuxしかサポートしていません」という回答が来ることが多い。 これはとても悲しいし、不健全である。

特に筆者が直面したのは、L2インテリジェントスイッチのプロトコルスタック でNetBSDをサポートしているものがほとんどないという現実であった。しかし これは無理がない話である。ルーティングデーモンなどのL3機能と異なり、 UNIXではL2機能の標準的なインタフェースが存在していなかった。結果的に、 ベンダは独自実装でL2機能をサポートするためのカーネルモジュールなどを実 装する必要があり、その上で動くアプリケーションもOS依存のものになった訳 である。

NetBSDではbridgeインタフェースが標準実装されている。これは、イーサネッ トインタフェースを集めてL2ブリッジとして機能させる仮想インタフェースで、 STP機能を含んでいる。しかし、RSTPやMSTPなどのより複雑なL2プロトコルを ユーザプロセスとして実装するためには、userlandとのインタフェースが貧弱 である(注: 2007年4月現在、FreeBSDのbridgeインタフェースにはRSTPが 実装されているが、カーネル内での実装である)。 また、802.1xなどのプロトコルの実装も考慮されていない。Linuxに もbridgeインタフェースが存在するが、NetBSDとの互換性はない。

多くのUNIXで利用可能なbridgeインタフェース機能を実装し、ユーザランドと のインタフェースを統一することができれば、RSTP, MSTP, 802.1x, LLDPなど のL2プロトコルスタックが多くのUNIXで共通して利用できることになり、UNIX ベースでのL2インテリジェントスイッチのプラットフォームに健全な競争が生 まれることが期待できる。

2. 要件

ブリッジインタフェースは以下の機能を持つ必要がある。

2-1. パケット入出力

BSDにおけるBPFに相当する、生パケットの入出力が可能な機能が必要である。 しかしBPFでは以下の点が機能的に不十分である。

2-2. リンク状態

現在UNIXでは、リンクの状態をリアルタイムで把握する方法がない。socketに 対するioctlで検出は出来るが、変化したことを知るためにはpollingをする 必要がある。selectによるイベントループで、リンク状態の変化を検出する 方法が必要である。

2-3. STPポート状態

STP関係のデーモンをユーザランドで実装するためには、各ポートのSTP状態を ユーザランドから設定できる必要がある。また、MSTPを実装するためには、 MSTPのインスタンスの管理も行なえる必要がある。

2-4. アクセス制御

802.1xやDHCP snoopingなどのプロトコルを実装するために、ポート単位での アクセス制御の仕組みが必要である。

2-5. LAG

本来LAGはSTPの下位層に位置し、LLDPなどは更にその下位に位置付けられる。 NetBSDにはagrインタフェースでリンク集約とLACPが実装されているが、 ブリッジインタフェースと並用した場合のレイヤリングを明確にする必要がある。 例えば、fxp0〜4までが存在してブリッジングされており、fxp0とfxp1がLAGを 構成してagg0というインタフェースを生成している場合、STPはagg0に対して 状態を設定するが、LLDPはfxp0とfxp1それぞれに対してLLDPDUを送信する。 これらの制御や送受信を一つのブリッジインタフェースで行なえなければ ならない。

2-6. VLAN

VLANについても同様のことが言える。NetBSDやLinuxではVLANを使うためには VIDを割り当てた仮想インタフェースを作成する必然的に、そのポートはtrunk ポートとなるが、accessポートをどう処理するべきかというVLANインタフェースの 問題がある。また、これらのVLANインタフェースがブリッジに含まれた場合に、 同じVLAN間のみでブリッジするように正しく動作する必要がある。現状のbridge は同じVLANごとにインタフェースを作成することを期待しているのではないか。

2-7. FDBの制御

FDBの制御はポート、VLAN単位で行なえる必要がある。

2-8. スイッチLSIのサポート

ハードウェアでスイッチ機能を持っているLSI上に、このインタフェースを実装 可能なようにしなければならない。このため、kernel内部では、ハード依存の 箇所と非依存の箇所を分離しておく必要があるだろう。

3. 設計

2-1.と2-2.については、BPFヘッダの直後にブリッジヘッダを追加することで 解決する。ブリッジヘッダには、入力ポートのifindex,リンク状態 (up/down/speed)の変化、入力パケットのVLAN IDなどが含まれる。送信する際 にもブリッジヘッダを付与して出力ポートを指定できるようにする。

2-3.と2-7.はioctl経由で制御するようにすれば良く、それほど困難ではない。 2-4.どこまで複雑な機能を持たせるか、既存のpfなどの機能は流用できないか、 などを検討する必要があるだろう。

2-5.と2-6.については要検討。

2-8.はスイッチLSIのデータシートなどを眺めつつ考える必要があると思われ るが、簡単に手に入るデータシート(というかそもそもLSIが載った基板) とい うのがないのではないかという問題がある。

なお、ターゲットのOSは、FreeBSD, NetBSD, OpenBSD, Linux kernel 2.6系列、 とする。このくらいサポートすればL2 switchへの組み込み用途としては充分 だろう。

4. 問題点

実装する人が欲しい。

でも、これ実装できたらUSENIXのFreeNIX trackとかには十分発表できそうな んだけど。

[目次へ]


Masahiko KIMOTO, Ph.D. <kimoto@ohnolab.org>
Last modified: Fri Apr 6 16:45:25 JST 2007