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では以下の点が機能的に不十分である。
- 一つの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