2    データ・リンク・プロバイダ・インタフェース

Tru64 UNIX では,データ・リンク・プロバイダ・インタフェース (DLPI) の部分的なインプリメンテーションである dlb STREAMS 擬似ドライバを提供します。

この章では, dlb STREAMS 擬似ドライバおよび DLPI の基礎について説明します。 DLPI 仕様の PostScript ファイル (dlpi.ps) が,/usr/share/doclib/dlpi ディレクトリにあります。

注意

オンラインの DLPI 仕様にアクセスするには,OSFPGMRnnn サブセットがインストールされていなければなりません。

図 2-1 は,データ・リンク・インタフェースを強調表示して,ネットワーク・プログラミング環境の他の部分との関係を示しています。

図 2-1:  DLPI インタフェース

注意

dlb STREAMS 擬似ドライバは DLPI プリミティブのサブセットをサポートしています。 サポートしているプリミティブの一覧については,2.4 節を参照してください。

データ・リンク・インタフェースは,OSI 参照モデルのネットワーク層とデータ・リンク層の境界です。 ネットワーク・アプリケーション,つまりデータ・リンク・サービス・ユーザ (DLSユーザ) は,データ・リンク・インタフェースのサービスを使用します。 ドライバ,擬似ドライバ,つまりデータ・リンク・サービス・プロバイダ (DLSプロバイダ) は,データ・リンク層に対するサービスを提供します。

DLPI は,OSI 参照モデルへマップする,STREAMS カーネル・レベルのサービス・インタフェースを指定します。 これは,データ・リンク層のサービスに対するインタフェースを定義し,そのインタフェースを構成するサービス・プリミティブを定義します。

図 2-2 は,DLPI の構成要素を示しています。 DLS ユーザは,要求/応答プリミティブを使用して,DLS プロバイダと通信します。 一方,DLS プロバイダは,指示/確認プリミティブを使用して,DLS ユーザと通信します。

図 2-2:  DLPI サービス・インタフェース

2.4 節にサポートされているプリミティブの一覧を記載しています。

2.1    通信モード

DLPI は,次の 3 つの通信モードをサポートします。

2.2    サービスの種類

この節では,サービスの種類,つまり DLPI がサポートする通信フェーズについて説明します。 利用できるサービスの種類は,DLS プロバイダと DLS ユーザ間の通信モード (コネクション,コネクションレス,肯定応答コネクションレス) によって異なることに注意してください。

DLPI がサポートするサービスの種類を次に示します。

2.2.1    ローカル管理サービス

ローカル管理サービスは,DLPI がサポートする 3 つの通信モードすべてに適用されます。 このサービスを使用すると,DLS ユーザは,DLS プロバイダに接続されているストリームを初期化し,そのプロバイダに対する ID を設定できます。 ローカル管理サービスは,次のサービスをサポートします。

2.2.2    コネクション・モード・サービス

コネクション・モード・サービスを使用すると,2 人の DLS ユーザが,データ・リンク接続を確立してデータを交換できます。 また,会話の終了時に,リンクをリセットして,接続を解放することも可能です。 コネクション・モード・サービスでは,次のサービスをサポートします。

2.2.3    コネクションレス・モード・サービス

コネクションレス・モード・サービスを使用すると,DLS ユーザは,接続の確立および解放のオーバヘッドを発生することなく,データを交換できます。 コネクションレス・モード・サービスでは,次のサービスをサポートします。

2.2.4    肯定応答コネクションレス・モード・データ転送

肯定応答コネクションレス・モード・データ転送サービスは,対等 DLS ユーザ間で信頼性の高いデータ転送を行うために,一般に使用されるものです。 これらのサービスは,ローカル・エリア・ネットワーク間のデータ転送に肯定応答が必要であるが,コネクション・モード・サービスの使用を避けたいアプリケーションに適しています。 開始ステーションによって送信されたデータは,確実に正しい順序で引き渡されます。 次のサービスがサポートされます。

2.3    DLPI アドレッシング

各 DLPI ユーザは,他のデータ・リンク・ユーザと通信するために,ID を設定しなければなりません。 この ID は,次の情報から構成されます。

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 を選択できるようにする方法が異なっています。

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 ユーザの代わりに送信するように要求する。

2.5    利用できる PPA の識別

次のプログラムは,ルートとしてコンパイルおよび実行すると,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
#