ネットワークコントローラ雑考

0. 修正履歴

1. はじめに

CATVやADSLの普及により、2〜3年前では高嶺の花だった100BASE-TXのネットワークカードが\1k〜2k程度で入手することができるようになった。

かつてはネットワークカードを買うなら定番と言われるNE2000互換を買っておけば困ることはなかったが、現在はその定番に相当する物は無いようだ。おそらく、企業などで高度な信頼性を求めるのでない限り、何を買っても十分に目的を果たすことができるからなのだろう。

これは、別に何処のメーカーが良いとか悪いとか、そういうことを書くことを目的としていない。単にネットワークコントローラについて興味を持った人間が、仕様書やLinux/FreeBSDのドライバソースコードを読んで感じたことをメモしているに過ぎない。

また、この記事を書いている現在、1000BASE-TXのネットワークカードが\15k程度で入手できるようになっている。おそらく、この記事は数年もしないうちに内容が風化してしまうだろうが、記録という意味でここに残すことにする。

注:この文章の初版は07-Aug-2001に作成されている。また、作者のきまぐれで、内容には細かい修正が加わることがある。

2. コントローラ各論

2.1 Realtek RTL8019AS/RTL8029ASに代表される、DP8390互換のコントローラ

DP8390って何?と思う人も多いだろうが、NE2000に積まれていた石である。現在では色々なメーカーがこれと互換性を持ったコントローラを発売しており、その例としてRealtekのRTL8019AS(ISA版)とRTL8029AS(PCI版)を挙げておく。今から約2〜3年前に\1〜2kで入手可能なLANカードと言えば、大抵はこれらのチップが載った物が多かったように思う。また、Realtekのチップは数が多く出ているために人によって好き嫌いは分かれるようだ。

個人的な経験を書くなら、RTL8029ASを使用したPCIのカードでトラブルは起こらなかったものの、RTL8019ASを使用したISAのカードはマシンとの相性問題を起こして使えなかったことがあった。また、RTL8019ASはISA Plug & Playを使用できるものの、どちらかと言えばPlug & Pray(挿して、動くよう祈れ)と揶揄されることが多いようで、自分もPlug & PlayではなくLegacy(IRQとI/Oアドレスを指定する)モードでしか使用したことがない。どちらも、動いてしまえばまあ悪い物ではないのだが。

DP8390はISAバスの時代に作られているため、ネットワークコントローラがメインメモリ上にあるデータを直接やりとりする(バスマスタと呼ばれる)方法でデータをやりとりするのではなく、ネットワークコントローラ側が持っているバッファにCPUがアクセスしてデータのやりとりを行うように作られている。よって、どうしても今日使われている(バスマスタを使用した)コントローラに比べ、CPU負荷率が高くなり、速度的にも劣ったものになってしまう。

しかし、NE2000といえば大抵のOSで使えるし、10BASE-Tが通る環境なら上記の欠点を気にしない限り今でも十分現役で使えることだろう。

2.2 digital 21140とその仲間達

今は亡きDigital Equipment(DEC)が作った、PCIバス用の100BASE-TX用コントローラ。これよりも前のコントローラとして10BASE-T用の21040/21041があるが、実物を見たことがない。また、これらのコントローラはtulip等と呼ばれることもあるが、何故そう呼ばれるかについても知らない。おそらく、開発コードか何かなのだろうが…

冒頭に100BASE-TX用と書いているが、100Mbpsの転送にも対応した、と書くのが本当は正しいのかもしれない。というのも、このコントローラにはMIIやPCSと呼ばれるインターフェースが装備されており、これを使用したPHY(物理層LSI)を使用すれば100BASE-TXだろうが100BASE-FXだろうが対応できてしまうからである。

基本的に、digitalが出していた2114x系の石は10BASE-2/5/T用のPHYは内蔵しているものの、それ以上の速度を使用する場合はそれに対応したPHYを外付けする必要がある。自分は、21140にNational SemiocnductorあるいはDAVICOM製のMII-PHYを使用したカードと、21143にKendin製のPCS-PHYを使用した物を見たことがあるが、どちらにせよ、今日売られている格安LANカードに比べて部品点数が多く、価格も比較的高めである。

二種類のPHYが出てきたのでこれらの違いについて書くとするならば、MIIを使用するPHYは10/100BASEの切り替えに関する面倒を全てPHY側で見てくれるものの、PCSを使用するPHYは100BASEのみ外付けPHYを使用し、10BASEでは2114x内蔵のPHYを使用するようになっている(つまり、ソフトウェアによって速度を切り替えることになる)、ということくらいしか自分は知らない。ネットワークの通信速度は頻繁に変化するものではない以上、あまり気にすることではないのだが…どちらかと言えばMII-PHYを使用したカードの方が安心して使えそうな気がする。

コントローラのインターフェースに関しては、MACアドレスを納めたSerial ROMやMII関連のレジスタをアクセスする部分に違いはあるものの、それを除けば21040の頃からほとんど同じようなスタイルになっている。当然、DP8390と異なり、バスマスタを使用してデータ転送を行っている。

また、このdigital 21x4xのインターフェースを真似ているものの、機能を削ったり付加したりした互換コントローラも多数存在している。互換、と言っても実際に互換性があるのはEthernetとパケットのやりとりを行う極一部の部分だけで、それ以外の部分に関してはデバイスドライバの製作者を悩ませる程バリエーションに富んでいる(実際に、Linux用tulipドライバを読んでみると良いだろう)。

自分が見た物はADMtek製のコントローラを載せたカードだけだったが、他にもASIXMacronix等から出ているようだ。ADMtekの物はMII-PHYが内蔵されているが、ASIXの物は外付けのMII-PHYが必要であると、またMacronixの物はPCS-PHYが内蔵されていると聞く。

いづれにせよ、これらのコントローラを載せたカードは最近のパソコンショップから姿を消しつつあるようだ。

しかし一部ではまだ根強く残っているようで、秋葉原界隈を歩いているとDAVICOM DM9102, Macronix MX98715AECを載せたカードを見ることがある。また、3Comの3C910-A01なる石は3Com独自のアーキテクチャに従った石ではなく、ADMtek AN981のOEMのようなので注意されたい。

2.3 Intel EtherExpress Pro/100

高価なIntel製。価格が高いのは性能というよりも安心料なのかもしれない。82557/82558/82559というシリーズと、i810に含まれているものがあると聞く。自分が見た物は、82559が載ったカードだったと思うのだが…

自分は、使用するI/O空間が非常に少ないというのがこのコントローラの特徴だと思っている。というのも、コントローラへの指示はほとんどがメモリ上に配置したdescriptor(指示子、という表現もあるが敢えてこう書かせてもらう)を使用して行われるからである。もちろん、他のコントローラも送受信に関してはdescriptorを使用して行っているのだが、Intelの場合はコントローラそのものに対するコマンドもこれを使ってしまう。

Linux用ドライバのソースコードには、このカードの設計をかなり悪く言うコメントが載っているらしいのだが、これはそういう意図があって作られたのでは?と自分は思う。これがIntelのやり方なのだろう、と。確かに、わざわざコマンド実行後にsuspendを行うようにし、次のコマンドを書き込んだ後にそのsuspendを解いてやらなきゃいけないというのはなかなか迷惑な作りとも言えるのだが…

また、チップのrevisionによっては受信部分がハングアップしてしまうという問題があるようだ。ドライバ側で対策を行えば全く問題無く使用できるので(実際、Linux/FreeBSD用ドライバには対策用のコードが含まれている)、それほど心配する必要は無いのだろうが、あまり気分が良いものではないことも確かだ。おそらく、現在出回っている物はそういうトラブルを起こさないよう改良されているとは思うのだが。

このネットワークコントローラは、Intel製チップセットに統合されるケースが増えているようだ。しかし、同じPRO/100(EtherExpress PRO/100)を搭載しているとはいえチップセットが変わる度にPCI device IDも変わっていくため、ドライバを開発する人間は頭を抱えていると聞く。

かつてはNDAを締結しないとチップの詳細に関する資料が得られなかったが、現在はオープンソースソフトウェア開発者向けの詳細なマニュアルが公開されるようになったようだ(URLはこのドキュメントの一番最後にある、参考資料の項に示す)。

2.4 Realtek RTL8129/8139

2.1に出てきた、RTL8019AS/8029ASとは別物で、Realtekオリジナルの100BASE-TX用コントローラ。お目にかかったことのないRTL8129はMII-PHYを外付けにするタイプだと言われるのに対し、どこでも見かけるRTL8139はMII-PHYを内蔵している。また、RTL8139は名称を変えて売られていることもあり、有名な例としてMPXのEN5038が挙げられる。

RTL8139を載せたカードは基本的に安い。\1k台がほとんどで、運が良ければ\1k以下の値段で入手することも可能だろう。ここまで安くて良いのか?と思ってしまうくらい、安い。しかし、コントローラへのインターフェースを見るとこうすれば確かに安くできるなあと思わせる(そう思うのは自分だけか?)作りだとも言える。

先に、他のコントローラに関する事情を書いてしまうなら、送受信どちらも「どこのアドレスにデータを置く(置くべき)か」というdescriptorのリストをメインメモリ上に作成し、これをコントローラに渡すことで転送を行うことがほとんどである。

しかし、RTL8139の場合はそんなものは使用しない。送信は、メインメモリ上に置いた送信すべきデータのアドレスをI/Oポートに書き込むことで送信を行う。別にそれに関しては問題は無いが、この送信すべきデータを書き込むためのスロットが4つしかない。受信は、メインメモリ上に確保したRTL8139用のリングバッファ(サイズは8/16/32/64kByteから選択する)に蓄積されたデータを、それを必要とするメモリ領域にコピーすることで行われる。

ある人は、「NE2000をPCI化して、拡張した感じ」と言ったが、言われてみれば確かにそう思えてくる。コントローラ内のバッファをメインメモリに置いて、送信する指示を出せる数を増やしたPCI版DP8390…作り方としては面白いのだが、性能的に犠牲となる部分もあるのでは、と思う。

…とりあえず使う分にはこれで良いのだろうが。

2.5 SiS 7016/900とNational Semiconductor DP83815

格安LANカードに使われているコントローラチップのメーカーの中で、比較的影が薄いのがこの2つ。特に、National Semiconductorの石は自分が知る限りだとNETGEARというメーカーのカードに載っているものしか見たことがない。使われているところでは使われているらしいと聞くのだが…

PC/AT互換機用チップセットメーカーで有名なSiSとNational Semiconductorのコントローラが何故同じ項目に書かれているかというと、この2社のコントローラは基本的なレジスタ構成がほとんど同じというのがその理由。実際、FreeBSD用のドライバ(if_sis.c)ではこれ一つで両方のコントローラを使うことができる。

それでも嘘だと思うのなら、SiSのサイトとNational Semiconductorのサイトからこれらのチップに関するデータシートを入手して比較してみると良いだろう。MII-PHY操作用レジスタとマルチキャストパケットフィルタ設定用レジスタに微妙な違いがあるが(この微妙な違いっていうのが厄介なのだが)、それ以外はほとんど同じと言っても良い。

影が薄いだけあって、良いという話も悪いという話もあまり聞かないのだが…実際はどうなのだろうか?と書いておきながら、自分はDP83815の載ったLANカードを使っている。少なくともこれを載せて1ヶ月程経過しているが、今のところ特にこれといったトラブルは発生していない。

2.6 VIA VT86C100A/VT6102

国内で有名なP社とC社が出しているVT6102を使用したカードを触ったことがあるが、箱を開けてみるとどちらも同じ物が入っていた。物が同じ筈なのに、値段が違っていたというのも奇妙な話だ。

VT6102はVT86C100Aと基本的に互換性があるものの、デバイスドライバを書く人は細かい部分で違いがあるということに注意した方が良さそうだ。データシートを見比べると、送受信を行ったパケットのステータスビットや、descriptorを配置できるアドレスが16byte単位になっているという違いがあるように見える。

良いという評判を聞いたことが無いが、使ってみるとそれほど悪い物でもないようだ。

PHYを統合した、VT6105というチップも存在するようだ。

2.7 IntersilとLucentのIEEE 802.11b対応無線LAN

この文章を書き初めてから大体半年が経過し、IEEE 802.11bに準拠した無線LANが至るところで使われるようになった。基本的にはこの2社のコントローラ、特にIntersilのPrismII/Prism2.5と呼ばれる物が使用されているようだ。

LinuxやFreeBSDのドライバを読む限りではIntersil/Lucent共に基本的な通信部分は同じであるものの、WEP(暗号化)や通信速度制御の部分が異なっている。また、ファームウェアのバージョンによってWEPや低消費電力モードの対応状況に違いがあり、ドライバ製作者は苦労しているようだ。

偶然にも両社のコントローラを使用した無線LAN製品を使用する機会があったが、Windows 98SEで使う限りにおいては別に違いは無いように思える。

ただし、Intersilのコントローラを使用した物はレジストリに大量の設定項目があり、その中にはWEP関連の処理をドライバ側で行うかどうかという設定があった。この手のコントローラはPC/ATに限らず、さまざまな製品で使用されるであろうことを考えると、WEPに関する処理は全てコントローラ側で行われるのが自然なのだが…

(Linuxで使用する場合はWEPをoffにするようにというC社の無線LANカードや、ドライバにWEPを実装することができなかったために初期バージョンではWEPが使用不可になっていたというP社の無線LANカードがあったと記憶している…どちらもPrismIIを使用していたような気がするが、気のせいかもしれない)

また、WEP鍵を生のままレジストリに書き込むドライバが存在するようだ。秘匿性を重視する向きには、その辺りも注意して機器を選択するよう勧告したいと思う。

コントローラではなく製品の話になってしまったので、多少コントローラについても触れておきたい。

基本的にはNE2000と同様に、受信したパケットや送信しようとするパケットはコントローラ側のバッファに蓄えられ、パケットはI/Oポート経由でやりとりされる。ただし、メモリの管理はNE2000より進んだ形になっており、バッファのアドレスではなくバッファのIDで管理するようになっている。つまり、送信する際にはmalloc()のようなコマンドで送信用のバッファIDを取得し、受信した際は受信したパケットが格納されているバッファのIDが得られるという訳だ。また、特殊なバッファIDに対する書き込み・読み出しという形で管理情報等にアクセスできる。

メーカーが公開している、現在入手可能な資料としてIntersilにあるHFA3842のデータシートがある。少なくともこれに書かれている情報だけでデバイスドライバを書くことはできないが、有用な情報が多いので興味のある方は読んでみると良いだろう。

このデータシートを読んでふと気づいたのだが、使用するI/Oポートの範囲が64byteとかなり大きいようだ。今時はそれほど気にする必要は無いのかもしれないが、古いノートパソコンなどで使用する場合はI/Oリソースが不足する可能性もあるので、注意されたい。

2.8 ASIX AX88190やD-Link DL10022などの、NE2000風100BASE-TX対応チップ

NE2000風、としているのには理由がある。Linuxのドライバソースコードを見れば分かるが、(特に、ASIX用ドライバはバグ対策のためもあって)NE2000から派生した別物として扱われている。DL10022に関してはよく分からないが、AX88190に関してはASIXのweb pageからデータシートを入手できるようだ。

レジスタに関しては基本的にNE2000互換だが、MII-PHYやSerial EEPROMにアクセスするためのレジスタが拡張されていたり、DL10022の場合はMACアドレスがI/Oポートの特定の領域(6byte分)に直接書かれていたりするなど、油断ができない。

最近よく見かける、16bitのPCMCIAカードで100BASE-TXを使用できるLANカードには大抵これらの石が使用されている。自分が試した環境ではどちらの石とも10Mbpsより多少速いくらいの速度しか出ていなかった。

あくまでも「100BASE-TXを喋れるNE2000」であり、速度を期待して使う石ではないように思われる。

なお、PCカード用のAX88190に対してISA等のLocal bus用にAX88796というのが用意されている。これはチップの起動時にSerial EEPROMからMACアドレスをロードしてくれない(ドライバがチップを叩いてSerial EEPROMを読み出す必要がある)。やはり、NE2000「風」チップとして扱う必要がありそうだ。

2.9 SMSC LAN91C111/100

PC/ATで使用することは滅多に無いが、組み込み系では割とよく使われている。

かつては、PC/AT用にLAN91C100を載せたISAバス向けのカードがあったらしいが、ISAが特殊な用途でしか使われなくなってしまった現在にそれを見つけるのはかなり難しい。真偽は不明であるが、メーカーから提供されている、これらのチップの評価用基板はISAバスを使ったものらしいという話を聞いたことがある。

レジスタ構成としては、SMSC(かつてはSMCと呼ばれていた)LAN91C9xシリーズのそれと同じ物であり、NE2000とは全く別物である。送受信用バッファの管理も、「2.7 IntersilとLucentのIEEE 802.11b対応無線LAN」の項に挙げたPrismII等のように、malloc()風のコマンドを発行して確保するようなスタイルの物である(流石に、管理情報を特殊なバッファに書き込むことは無いが)。

LAN91C100(もしくは110)およびLAN91C111の違いは、前者はバッファ用のRAMを外部で128kbyte用意する必要があるのに対し後者は8kbyteのバッファ(2kbyte×4packet分)を内蔵していることである。他にも細かい部分では違いがあるが、ここでは触れない。

100BASE-TXに対応し、PCIバスではなくローカルバスを使用して接続するコントローラには「2.8 ASIX AX88190やD-Link DL10022などの、NE2000風100BASE-TX対応チップ」で挙げた物もあり、これらとライバル同士の関係にあるのかもしれない。

リングバッファの管理の手間を考えるとNE2000系(および100BASE-TXに対応したNE2000風の石)よりこちらの方が扱いやすそうにも見えるが、これはデバイスドライバを作る人間の好みの問題と思われる。むしろ、コストパフォーマンスが重視される組み込み系においては、制約の中できちんと目的を果たせるかどうかでどちらを選択するかが決まってくるであろう。

通信速度はそれなり、つまりPCIバスで接続したネットワークコントローラには敵わないものの、ローカルバスで接続したものとしてはきちんとしたドライバがあれば実用的な速度は出せる、と聞いている。

同一の環境でNE2000系100BASE-TX対応チップとLAN91C111とを比べたことが無いので優劣を付けることはできないが、十分なCPU性能があれば少なくとも10BASE-Tより高速に動作することは言えそうだ。

2.10 AMD PCnet-FAST III(Am79C973)とその仲間達

由緒正しいAMDのネットワークコントローラ。実はLANCE(Am79C960)と呼ばれるISAバス用のコントローラとの互換性をしっかり持っているらしいのだが、自分が知っているのはPCnet-PCI II(Am79C970A)以降のコントローラなのでそれについて書くことにする。

PCnet-PCI II(Am79C970A)自体は10BASE-Tのコントローラであり、PCnet-FAST(Am79C971)/PCnet-FAST+(Am79C972)/PCnet-FAST III(Am79C973/Am79C975)/PCnet-PRO(Am79C976)/PCnet-Home(Am79C978)という進化を遂げる。この辺りは、digitalの21040/21041/21140/21141/21142/21143とよく似ているかもしれない。

PHYは基本的にMII PHYを使用する。Am79C973〜Am79C976に関しては100BASE-TX対応のPHYを内蔵しているが、Am79C971は10BASE-T対応のPHYを内蔵し、Am79C978はHomePNAおよび10BASE-T対応のMII PHYを内蔵している。よって、コントローラによっては100BASE-TXに対応する際に外付けのPHYを接続することになるので、少しややこしいことになる(どのPHYを使用するかについては、大抵はドライバ側で面倒を見てくれるはずなのであまり意識する必要は無いのだが)。

コントローラの持つバッファもチップによってまちまちである。Am79C971とAm79C976は外付け、Am79C972〜Am79C975, Am79C978は12kbyteのSRAMを内蔵している。確か、Am79C976はPCnet-PROという名の通り、ネットワーク機器を意識しているのかかなり大量のSRAMを接続することができたと記憶している。

転送の指示に関しては、2のべき乗個のdescriptorを連続して配置しなければならない(つまり、descriptorには次のdescriptorを示すアドレスが含まれない)という特徴を持つ。これは、あくまでもネットワークコントローラはネットワークコントローラという名のハードウェアであるべきだと主張しているように見える。IntelのEtherExpress Pro/100の場合(BROADCOMのGiga-bit Ethernetコントローラも該当しそうだが)はプロセッサ+マイクロコードで柔軟にやろうという考え方とは対照的だ。

(現在執筆・推敲中)

3. 参考資料・より詳しく知るためには

以下のweb pageを参考にすると良いだろう。また、これらの情報源には色々助けられたことがあり、この場を借りてお礼申し上げたい。

Scyld ComputingのLinux Network Driversのページ
http://www.scyld.com/network/
DEC Documentation References
http://gatekeeper.dec.com/pub/BSD/NetBSD/misc/dec-docs/
LANLANWorld(閉鎖?)
http://www.lanlanworld.com/ (on Internet Archive)
Wireless LAN Laboratory
http://www.avis.ne.jp/~ibook/
Linux Wireless LAN Howto
http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Linux.Wireless.html
Intel(R) 8255x 10/100 Mbps Ethernet Controller Family Open Source Software Developer Manual
http://www.intel.com/design/network/manuals/8255X_OpenSDM.htm
3Com NIC Driver Developer Registration
http://support.3com.com/partners/developer/license.html

4. おまけ

kids.goo.ne.jpによるフィルタリングに抗議します。


uaa@uaa.org.uk