高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先


テクニカルQ&A

NW57 - Power Mac G3 で旧 Ethernet ドライバプロセスを使う
(1999 年 2 月 8 日)


Q: 私が持っている旧式のアプリケーションは、ENET.h インタフェースファイルに記述された時代遅れの Ethernet Driver API を使用しています。そのアプリケーションはすべての Power Macintosh で動作していたのですが、Mac OS 8.1 をインストールした Power Macintosh G3 システムでは動作しません。このアプリケーションを Power Macintosh G3 システムで動作させる方法はありますか?

A: Power Macintosh G3 の旧機種では、「以前の Ethernet プロセスから内蔵 Ethernet ドライバを開くことができない」という問題が明らかになりました。そのため、旧 Ethernet API はPower Macintosh G3 の旧機種では動作しません。1999 年 1 月の初旬以降にリリースされた Power Macintosh G3 シリーズでは、この問題は修正されています。



Ethernet Shim の歴史

最初のPCI Power Macintosh がリリースされて以来、System ファイル には「Ethernet Shim」と呼ばれる修正コードが内蔵され、Ethernet Driver API を使用するプロセスがサポートされています。PCI Power Macintosh の Ethernet ドライバはネイティブ PowerPC コードで書かれており、クライアントプロセスによる通信は Data Link Provider Interface (DLPI) に基づいて処理されます。Ethernet Shim は、Ethernet Driver API コールを DLPI 相当のコールに翻訳し、内蔵ドライバに渡します。外部からのパケットを受信すると、DLPI ドライバは適切なパケットを Ethernet Shim に渡し、それを受けた Ethernet Shim は Ethernet プロトコルハンドラを呼び出すか、ENETRead パラメータブロックコールがキューに入っているかどうかを調べてパケットを渡します。

Ethernet Shim は内蔵 Ethernet デバイスのみサポートするよう設計されています。拡張スロットに装着した PCI Ethernet カードはサポートされていません。したがって、Ethernet Shim を (PCI Ethernet カードに) 使用するには、ある特定のコードを変更する必要があります。Ethernet Shim を使用する場合は、プロセスから OpenDriver コールを使用してはいけません。代わりに、プロセスからは、まず SGetTypeSRsrc スロットマネージャコールを使用して内蔵 Ethernet デバイスを特定し、次に OpenSlot コールを使用して スロット 0 の Ethernet デバイスを開きます。それからデバイス refNum を取得してください。この refNum は .ENET API を呼び出すすべての派生コールで使用されます。このメソッドの例については、『Inside Macintosh:Networking, Chapter 11 Listing 11-1』を参照してください。そこで紹介したコード変更例は、旧 Ethernet プロセスにのみ適用されます。



Ethernet Shim の仕組み

Ethernet Shim は、内蔵 Ethernet ドライバのスロットマネージャにデバイス sRsrc を登録することによって動作します。SGetTypeSRsrc コールが作成され、Ethernet サービスが提供されているのが確認されると、内蔵ポートのデバイス sRsrc が戻り値として渡されます。OpenSlot コールを使用することによってEthernet Shim ユニットテーブルドライバが読み込まれ、コールの作成元にはドライバ refNum が戻り値として渡されます。Ethernet Shim は Ethernet ドライバ用標準コールである Open、Control、Status、Close を処理します。その処理内容は「各コールを DLPI (Data Link Provider Interface) 相当のメッセージに翻訳し、それらを内蔵 Ethernet ハードウェア用 DLPI ドライバへ渡す」というものです。Ethernet Shim ドライバはパケットハンドラをDLPI ドライバにインストールします。これにより、外部から Ethernet Shim のクライアントに向けられてパケットが送信された場合は、その旨が通知されます。

Ethernet Shim によるドライバプロセスは、Power Macintosh G3 システムがリリースされるまでの間、良好に動作していました。しかし、1997 - 1998 年に登場した Power Macintosh G3 では ROM に変更が加えられたため、「Ethernet Shim を利用して内蔵 Ethernet サービスをスロットマネージャに登録する」というメカニズムは利用できなくなりました。その結果、SGetNextSRsrc と OpenSlot の各コールは動作しなくなったのです。



対策

この問題への対策は、Mac OS 8.5 で実装されました。システムの起動時に、マシンの種類がオリジナル Power Macintosh G3 であることが確認されると、ユニットテーブルに .ENET デバイスドライバがインストールされるというものです。この解決法の問題は「すでにこの時点で、旧プロセスの大半が OpenSlot コールに変更を加えている」という点です。つまり、これらのプロセスは OpenDriver コールを使用しなくなります。そこで、これら旧プロセスの大半にバックアップコードを内蔵し、スロットベースの Ethernet ドライバを開くコールが失敗した場合は OpenDriver コールを使用して .ENET0 ドライバを開こうとします。以上のプロセスを実現するために、Mac OS 8.5 では Ethernet Shim ドライバのコピーが「.ENET0」という名前でインストールされます。それでも旧式のソフトウェアが動作しなくなる場合、残された選択肢としては「OpenSlot コールが失敗したら、コードを修正して .ENET ドライバに対して OpenDriver コールを発行する」という方法が考えられます。

要約すると、次のようになります。
1997 年 または 1998 年に発表された Power Macintosh G3 で Mac OS 8.0 または 8.1 が動作している場合、旧 Ethernet API を使用するプロセスが失敗するという問題が判明しています。対象となるシステムに Mac OS 8.5 をインストールすれば、この問題は解決します。


Rich Kubota
Worldwide Developer Technical Support