Tru64 UNIX では,データ・リンク・プロバイダ・インタフェース (DLPI) の部分的なインプリメンテーションである
dlb
STREAMS 擬似ドライバを提供します。
この章では,
dlb
STREAMS 擬似ドライバおよび DLPI の基礎について説明します。
DLPI 仕様の PostScript ファイル (dlpi.ps
) が,/usr/share/doclib/dlpi
ディレクトリにあります。
注意
オンラインの DLPI 仕様にアクセスするには,OSFPGMRnnn サブセットがインストールされていなければなりません。
図 2-1 は,データ・リンク・インタフェースを強調表示して,ネットワーク・プログラミング環境の他の部分との関係を示しています。
注意
dlb
STREAMS 擬似ドライバは DLPI プリミティブのサブセットをサポートしています。 サポートしているプリミティブの一覧については,2.4 節を参照してください。
データ・リンク・インタフェースは,OSI 参照モデルのネットワーク層とデータ・リンク層の境界です。 ネットワーク・アプリケーション,つまりデータ・リンク・サービス・ユーザ (DLSユーザ) は,データ・リンク・インタフェースのサービスを使用します。 ドライバ,擬似ドライバ,つまりデータ・リンク・サービス・プロバイダ (DLSプロバイダ) は,データ・リンク層に対するサービスを提供します。
DLPI は,OSI 参照モデルへマップする,STREAMS カーネル・レベルのサービス・インタフェースを指定します。 これは,データ・リンク層のサービスに対するインタフェースを定義し,そのインタフェースを構成するサービス・プリミティブを定義します。
図 2-2 は,DLPI の構成要素を示しています。 DLS ユーザは,要求/応答プリミティブを使用して,DLS プロバイダと通信します。 一方,DLS プロバイダは,指示/確認プリミティブを使用して,DLS ユーザと通信します。
2.4 節にサポートされているプリミティブの一覧を記載しています。
2.1 通信モード
DLS ユーザがデータ・リンク接続を確立し,その接続を通してデータを転送したり,リンクをリセットしたり,会話の終了時に接続を解放できるようにします。
接続確立サービスは,ローカル DLS ユーザとリモート DLS ユーザの間に,データの送信を目的としてデータ・リンク接続を確立します。 1 つのストリームには,1 つのデータ・リンク接続しか許可されません。
DLS ユーザが,接続の確立および解放のオーバヘッドを発生することなく,データ・ユニットを対等 DLS ユーザに転送できるようにします。 ただし,コネクションレス型サービスは,対等 DLS ユーザ間のデータ・ユニットの引き渡しにおける信頼性が高くありません。 たとえば,フロー制御がないため,バッファ・リソースが不足し,データが破棄されることがあります。
ストリームは,ローカル管理サービスを使用して一度初期化されると,コネクションレス型データ・ユニットの送受信に使用できます。
注意
Tru64 UNIX は,コネクションレス型の通信モードだけをサポートします。
一般に,対等 DLS ユーザ間で,情報を高い信頼性で転送する場合に使用します。 このサービスは,LAN 間のデータ・ユニット転送に肯定応答が必要であるが,コネクション・モード・サービスに関連する煩雑さを避けたいアプリケーション用に設計されています。 交換サービスはコネクションレス型ですが,開始ステーションによって送信されたデータは,確実に正しい順序で引き渡されます。
この節では,サービスの種類,つまり DLPI がサポートする通信フェーズについて説明します。 利用できるサービスの種類は,DLS プロバイダと DLS ユーザ間の通信モード (コネクション,コネクションレス,肯定応答コネクションレス) によって異なることに注意してください。
DLPI がサポートするサービスの種類を次に示します。
ローカル管理サービス
情報報告サービス
アタッチ・サービス
バインド・サービス
コネクション・モード・サービス
接続確立
データ転送
接続解放
リセット・サービス
コネクションレス・モード・サービス
コネクションレス型データ転送
サービス品質 (QOS) 管理
エラー報告
肯定応答コネクションレス・モード・サービス
肯定応答コネクションレス・モード・データ転送
サービス品質 (QOS) 管理
エラー報告
ローカル管理サービスは,DLPI がサポートする 3 つの通信モードすべてに適用されます。 このサービスを使用すると,DLS ユーザは,DLS プロバイダに接続されているストリームを初期化し,そのプロバイダに対する ID を設定できます。 ローカル管理サービスは,次のサービスをサポートします。
情報報告サービス
DLPI ストリームに関する情報を DLS ユーザに提供します。
アタッチ・サービス
アタッチメントの物理ポイント (PPA : physical point of attachment) をストリームに割り当てます。 詳細は,2.3 節を参照してください。
バインド・サービス
データ・リンク・サービス・アクセス・ポイント (DLSAP) をストリームに関連付けます。
コネクション・モード・サービスを使用すると,2 人の DLS ユーザが,データ・リンク接続を確立してデータを交換できます。 また,会話の終了時に,リンクをリセットして,接続を解放することも可能です。 コネクション・モード・サービスでは,次のサービスをサポートします。
接続確立サービス
ローカル DLS ユーザとリモート DLS ユーザの間に,データの送信を目的として,データ・リンク接続を確立します。
データ転送サービス
ユーザ・データを片方向または双方向で同時に交換します。 データは,データ・リンク・サービス・データ・ユニット (DLSDU) という論理グループで送信され,送信された順序で確実に引き渡されます。
接続解放サービス
DLS ユーザまたは DLS プロバイダのどちらかが,確立された接続を切断できるようにします。
リセット・サービス
DLS ユーザが,データ・リンク接続の使用を再同期できるか,または DLS プロバイダが,データ・リンク・サービス内で回復不可能なデータ損失の検出を報告できるようにします。
コネクションレス・モード・サービスを使用すると,DLS ユーザは,接続の確立および解放のオーバヘッドを発生することなく,データを交換できます。 コネクションレス・モード・サービスでは,次のサービスをサポートします。
コネクションレス型データ転送サービス
ユーザ・データ (DLSDU) を,片方向または双方向で同時に交換します。
サービス品質 (QOS) 管理サービス
DLS ユーザが,コネクションレス型データ転送サービスの各呼び出しに対して,予測可能なサービス品質を指定できるようにします。
エラー報告サービス
以前に送信されたデータ・ユニットでエラーが発生したこと,またはそのデータ・ユニットが引き渡しできなかったことを,DLS ユーザに通知する機能を提供します。 ただし,エラー報告サービスは必ずしも,データ・ユニットの引き渡しができないたびに,エラーを報告するわけではありません。
肯定応答コネクションレス・モード・データ転送サービスは,対等 DLS ユーザ間で信頼性の高いデータ転送を行うために,一般に使用されるものです。 これらのサービスは,ローカル・エリア・ネットワーク間のデータ転送に肯定応答が必要であるが,コネクション・モード・サービスの使用を避けたいアプリケーションに適しています。 開始ステーションによって送信されたデータは,確実に正しい順序で引き渡されます。 次のサービスがサポートされます。
肯定応答コネクションレス・モード・データ転送サービス
LLC 下位層で肯定応答された DLSDU を交換できるようにします。
サービス品質 (QOS) 管理サービス
DLS ユーザが,コネクションレス型データ転送サービスの各呼び出しに対して,予測可能なサービス品質を指定できるようにします。
エラー報告サービス
以前に送信されたデータ・ユニットでエラーが発生したこと,またはそのデータ・ユニットが引き渡しできなかったことを,DLS ユーザに通知する機能を提供します。 ただし,エラー報告サービスは必ずしも,データ・ユニットの引き渡しができないたびに,エラーを報告するわけではありません。
各 DLPI ユーザは,他のデータ・リンク・ユーザと通信するために,ID を設定しなければなりません。 この ID は,次の情報から構成されます。
物理アタッチメント識別
これは,DLS ユーザが通信に使用する物理メディアを識別します。 物理メディアの識別は,複数の物理メディアにアタッチされたシステム上で特に重要です。 システムで利用できるアタッチメントの物理ポイント (PPA) の識別については,2.5 節を参照してください。
データ・リンク・ユーザ識別
DLS ユーザは DLS プロバイダに登録して,プロバイダがそのユーザ宛のプロトコル・データ・ユニットを引き渡せるようにしなければなりません。
DLSAP アドレスのフォーマットには,MAC アドレスの後にバインドされるサービス・アクセス・ポイント (SAP) が続く,符号なしの文字配列を使用します。
通常 SAP はイーサネットの場合 2 バイト,ISO 8802-2 (IEEE 802.2) の場合 1 バイトです。
ただし,例外として HIERACHICAL
DL_SUBS_BIND_REQ
が処理される場合,DLSAP アドレスは,MAC アドレス,SNAP SAP (0xAA) および 5 バイトの SNAP で構成されます。
図 2-3は,この識別方式の構成要素を示しています。
図 2-3: DLPI アドレスの識別構成要素
PPA は,システムが自分自身を物理通信メディアにアタッチするポイントです。 この物理メディアを通るすべての通信は,PPA をファネルします。 DLS プロバイダが複数の物理メディアをサポートするシステムでは,DLS ユーザは,通信に使用するメディアを識別しなければなりません。 PPA は,一意の PPA 識別子によって識別されます。
DLPI は,次の 2 つのスタイルの DLS プロバイダを定義します。 この 2 つのスタイルは,DLS ユーザが特定の PPA を選択できるようにする方法が異なっています。
スタイル 1
スタイル 1 のプロバイダは,DLS ユーザがオープンした主デバイスまたは副デバイスに基づいて,PPA を割り当てます。 スタイル 1 のドライバをインプリメントして,データ・リンク・ドライバがサポートする各 PPA 用に主デバイスを予約できるようにすることができます。
スタイル 1 のドライバをインプリメントすると,構成された各 PPA に対して,STREAMS の
clone open
機能を使用できるようになります。
スタイル 1 のプロバイダは,サポートする PPA の数が少ない場合に適しています。
スタイル 2
スタイル 2 のプロバイダは,DLS ユーザが特殊な
attach
サービス・プリミティブを使用して,PPA を明示的に識別することを要求します。
スタイル 2 のドライバでは,open
システム・コールが,DLS ユーザと DLS プロバイダ間にストリームを作成します。
次に,attach
プリミティブが,特定の PPA をそのストリームに関連付けます。
PPA 識別子のフォーマットは,DLS プロバイダによって異なります。
Tru64 UNIX は,スタイル 2 のプロバイダだけをサポートします。
これは,スタイル 2 のプロバイダの方が多数の PPA をサポートするのに適しているからです。
2.4 DLPI プリミティブ
表 2-1は,dlb
STREAMS 擬似ドライバでサポートされている DLPI プリミティブの一覧とその説明です。
DLPI プリミティブの完全な一覧については,/usr/share/doclib/dlpi/dlpi.ps
ファイルの DLPI 仕様を参照してください。
表 2-1: サポートされている DLPI プリミティブ
プリミティブ | 説明 |
DL_ATTACH_REQ |
DLS プロバイダに,PPA をストリームに関連付けるように要求する。 スタイル 2 のプロバイダに対してのみ使用する。 |
DL_BIND_REQ |
DLS プロバイダに,DLSAP をストリームにバインドするように要求する。 DLS ユーザは,ストリームにバインドされる DLSAP のアドレスを識別しなければならない。 |
DL_BIND_ACK |
DLSAP のストリームへのバインドが正常に行われたことを報告し,バインドされた DLSAP アドレスを DLS ユーザに返す。 DL_BIND_REQ への応答として生成される。 |
DL_DETTACH_REQ |
DLS プロバイダに,PPA のストリームへの関連付けを解除するように要求する。 |
DL_DISABMULTI_REQ |
DLS プロバイダにマルチキャスト・アドレスを使用不可にするように要求する。 |
DL_ENABMULTI_REQ |
DLS プロバイダに特定のマルチキャスト・アドレスを使用可能にするように要求する (DLB ドライバの現在のインプリメンテーションでは,DL_IDLE
の状態であることが要求される)。 |
DL_ERROR_ACK |
直前に発行された誤った要求を DLS ユーザに報告する。 |
DL_INFO_ACK |
DL_INFO_REQ
プリミティブに応答し,DLPI ストリームについての情報を伝送する。 |
DL_INFO_REQ |
DLPI ストリームについての情報を返すように DLS プロバイダに要求する。 |
DL_OK_ACK |
DLS ユーザに,以前に発行された要求プリミティブが正常に受信されたことを肯定応答する。 |
DL_PHYS_ADDR_REQ |
要求で選択されたアドレス型の値に応じて,ストリームに関連付けられた物理アドレスの省略時の値 (工場出荷時の値),または現在の値のいずれかを返すように,DLS プロバイダに要求する。 |
DL_PHYS_ADDR_ACK |
DL_PHYS_ADDR_REQ への応答として,DLS ユーザに物理アドレスの値を返す。 |
DL_SUBS_BIND_ACK |
DLS プロバイダからの
DL_SUBS_BIND_REQ
への肯定応答する。 |
DL_SUBS_BIND_REQ |
DLS プロバイダに,順次 DLSAP をストリームにバインドするように要求する。
順次バインド要求には HIERACHICAL と PEER の 2 つのクラスがある。
HIERACHICAL 要求は SNAP (詳細は IEEE 802.1 仕様を参照) についてのみ有効で,SNAP に
DL_SUBS_BIND_REQ
を発行する前に,SNAP SAP (0xAA) が
DL_BINDS_REQ
とバインドされている必要がある。
PEER 要求は追加 SAP とバインドするが,ストリームの DLSAP アドレスは変更しない。 |
DL_SUBS_UNBIND_REQ |
DLS プロバイダに,既に
DL_SUBS_BIND_REQ
によってバインドされた SAP のバインドを解除するように要求する。 |
DL_TEST_CON |
DL_TEST_REQ
への応答として,DLSDU TEST 応答が受信されたことを伝達する。 |
DL_TEST_IND |
DLS ユーザに TEST コマンド DLSDU が受信されたことを伝達する。 |
DL_TEST_REQ |
DLS プロバイダに,TEST コマンド DLSDU を DLS ユーザに代わって伝送することを要求する。 |
DL_TEST_RES |
DLS プロバイダに TEST 応答コマンドを DLS ユーザに代わって送信するように要求する。 |
DL_UDERROR_IND |
DLS ユーザに直前に送信した
DL_UNITDATA_REQ
が失敗したことを報告する。 |
DL_UNBIND_REQ |
DLS プロバイダに,直前の DL_BIND_REQ によってバインドされた DLSAP を,このストリームからバインド解除するように要求する。 |
DL_UNITDATA_REQ |
対等 DLS ユーザへ伝送するために,1 つの DLSDU を DLS ユーザから DLS プロバイダへ引き渡す。 |
DL_UNITDATA_IND |
DLS プロバイダから DLS ユーザに,1 つの DLSDU を引き渡す。 |
DL_XID_CON |
DL_XID_REQ
への応答として,XID DLSDU が受信されたことを伝達する。 |
DL_XID_IND |
DLS ユーザに XID DLSDU が受信されたことを伝達する。 |
DL_XID_REQ |
DLS プロバイダに,XID DLSDU をユーザの代わりに伝送するように要求する。 |
DL_XID_RES |
DL_XID_RES
への応答として,XID DLSDU を DLS ユーザの代わりに送信するように要求する。 |
次のプログラムは,ルートとしてコンパイルおよび実行すると,STREAMS デバイス
/dev/streams/dlb
をオープンし,システムで利用できる PPA をスクリーンに表示します。
PPA 番号は,DL_ATTACH_REQ
DLPI プリミティブの
dl_ppa
フィールドを使用して渡します。
#include <sys/ioctl.h> #include <stropts.h> #include <errno.h> #include <fcntl.h> #define ND_GET ('N' << 8 + 0) #define BUFSIZE 256 main() { int i; int fd; char buf [BUFSIZE]; struct strioctl stri; fd = open("/dev/streams/dlb", O_RDWR, 0); if (fd < 0) { perror("open"); exit(1); } sprintf(buf, "dl_ifnames"); stri.ic_cmd = ND_GET; stri.ic_timout = -1; stri.ic_len = BUFSIZE; stri.ic_dp = buf; if (ioctl(fd, I_STR, &stri) < 0) { perror("ioctl"); exit(1); } printf("Valid PPA names on this system are:\n"); for (i=0; i<stri.ic_len; i++) { if (buf[i] == 0) printf(" "); else printf("%c",buf[i]); } printf("\n"); }
# a.out Valid PPA names on this system are: sscc0 (PPA 1) ln0 (PPA 2) dsy0 (PPA 3) dsy1 (PPA 4) \ sl0 (PPA 5) sl1 (PPA 6) lo0 #