pf は、マルチスレッド化された、読み込みや複製が可能な STREAMS ハードウェアデバイスドライバです。このドライバでは、PCI カード内の PBS FDDI コントローラにおいてコネクションレス型のデータリンクプロバイダインタフェース (dlpi(7P)) を使用することができます。また、このドライバでは、ステーション管理の統計情報と状態情報を取得するためのアプリケーションを使用することができます。このドライバで使用することができる FDDI カードの数には制限がありません。pf ドライバは、PBS、BMAC、PLAYER+ ハードウェアの基本的な機能を提供します。機能には、チップの初期化、LLC/SMT フレームの転送と受信、マルチキャストとプロミスキュアスへの対応、エラーからの回復および報告が含まれます。
複製された文字型特殊デバイスの /dev/pf は、システムにインストールされたすべての PBS コントローラに接続するために使用します。
pf ドライバは、「スタイル 2」のデータリンクサービスプロバイダです。すべての M_PROTO 型および M_PCPROTO 型のメッセージは、DLPI 基本式として解釈されます。開いているストリームに特殊デバイス (ppa) を関連付けるには、ユーザーからの明示的な DL_ATTACH_REQ メッセージが必要となります。この ppa ID は、符号なしの長整数として解釈され、対応するデバイスインスタンス (ユニット) 番号を示します。ppa フィールドの値がシステムにおける有効なデバイスインスタンス番号に対応していない場合は、エラー (DL_ERROR_ACK) が pf ドライバによって返されます。デバイス は最初の接続時に初期化され、最後の切り離し時に終了 (停止)します。
ユーザーからの DL_INFO_REQ に応答して qfe ドライバが返す DL_INFO_ACK 基本式の値を以下に示します。
SDU の最大値は 4352 (FDDIMTU) です。
SDU の最小値は 0 です。
dlsap アドレス長は 8 です。
MAC 形式は DL_FDDI です。
sap 長の値は -2 で、これは、DLSAP アドレスの中で物理アドレス構成要素のすぐ後に 2 バイト長の sap 構成要素が位置することを意味します。
サービスモードは DL_CLDLS です。
サービスの品質 (QOS: quality of service) オプションは現在のところ含まれていないため、QOS フィールドは 0 です。
プロバイダスタイルは DL_STYLE2 です。
バージョンは DL_VERSION_2 です。
ブロードキャストアドレスの値は Ethernet/IEEE のブロードキャストアドレス (0xFFFFFF) です。
DL_ATTACHED 状態になると、特定の SAP (Service Access Pointer)をストリームと関連付けるために、ユーザーは DL_BIND_REQ を送る必要があります。pf ドライバは、DL_BIND_REQ 内の sap フィールドを Ethernet の「タイプ」として解釈します。したがって、sap フィールドの有効な値は [0-0xFFFF] の範囲になります。一度にストリームに接続できるのは 1 つのタイプの Ethernet だけです。
Ethernet V2 サービスに加えて、「802.3 モード」が pf ドライバによって提供され、次のように機能します。sap 値 0 は、ユーザーによる 802.3 モードの要求を示します。DL_BIND_REQ の sap フィールドの値が 0 の場合、pf ドライバは最初のメッセージの長さを M_PROTO mblk を含まずに計算し、MAC フレームヘッダーの長さフィールドにこの値を持ち、スナップヘッダーに 0xaaaa030000 の値を持つ 802.3 フレームを転送します。タイプフィールドが [0-1500] の範囲内にある媒体から受信したすべてのフレームは 802.3 フレームとみなされ、sap 値が 0 のすべての開いているストリームに配信されます。複数のストリームが 802.3 モードにある場合は、フレームは複製され、DL_UNITDATA_IND メッセージとして複数のストリームに配信されます。
pf ドライバの DLSAP アドレス形式は、6 バイトの物理 (FDDI) アドレス部分と、それに続く 2 バイトの sap (タイプ) 部分とで構成されます。アプリケーションでは、DLSAP アドレスの作成や削除を行う際に、実装に依存した DLSAP アドレス形式を明示的に使用せずに、DL_INFO_ACK 基本式で返される情報を使用してください。 sap 長、完全な DLSAP 長、sap/物理の順序は DL_INFO_ACK に含まれます。物理アドレス長は、完全な DLSAP アドレス長から sap 長を引くか、DL_PHYS_ADDR_REQ を発行して、ストリームに対応する現在の物理アドレスを取得することによって計算することができます。
DL_BOUND 状態になると、pf ドライバ に DL_UNITDATA_REQ メッセージを送信することによって、ユーザーは FDDI 上でフレームを送信することができます。pf ドライバは、DL_UNITDATA_IND メッセージの FDDI のタイプと一致する sap 値を持ち、開いていて結合されているストリームすべてに、受信された FDDI フレームを配信します。受信された FDDI フレームは複製され、必要に応じて複数の開いているストリームに配信されます。DL_UNITDATA_REQ および DL_UNITDATA_IND メッセージに含まれる DLSAP アドレスは、sap (タイプ) と物理 (FDDI) 部分で構成されます。
pf ドライバは、強制的なコネクションレス DLPI メッセージセットに加えて、以下の基本式に対応しています。
DL_ENABMULTI_REQ および DL_DISABMULTI_REQ 基本式は、個々のマルチキャストグループアドレスの受信を有効または無効にします。 これらの基本式を使用して、一群のマルチキャストアドレスをストリームごとに繰り返し作成および変更することができます。これらの基本式は、DL_ATTACHED 後の状態にある場合に、qfe ドライバによって受け付けられます。
dl_level フィールド内に DL_PROMISC_PHYS フラグが設定された状態での DL_PROMISCON_REQ および DL_PROMISCOFF_REQ の基本式は、ローカルホストによって生成されたフレームを含む、媒体上のすべての (「プロミスキュアスモード」の) フレームの受信を有効または無効にします。DL_PROMISC_SAP フラグが設定されている状態で使用すると、sap 値 (Ethernet のタイプ) の受信を有効または無効にします。DL_PROMISC_MULTI フラグが設定されている状態で使用すると、すべてのマルチキャストグループアドレスの受信を有効または無効にします。どちら効果も、常にストリームごとに適用され、当該ストリームやその他のストリームの sap および物理レベルの設定の影響は受けません。
DL_PHYS_ADDR_REQ 基本式は、DL_PHYS_ADDR_ACK 基本式の中のストリームに対応する (接続されている) MAC アドレス (6 桁の数) を返します。この基本式は、DL_ATTACH_REQ の成功後の状態においてのみ有効です。
DL_SET_PHYS_ADDR_REQ 基本式は、このストリームに対応する (接続されている) MAC アドレスを変更します。このストリームを最初に開く処理は、スーパーユーザーのみが行うことができます。スーパーユーザーでない場合は、DL_ERROR_ACK で EPERM が返されます。この基本式は、このデバイスに接続された現在および未来のすべてのストリームに影響する意味で破壊的です。この基本式がこのストリームに対して成功すると、このデバイスに接続された他のすべてのストリームに M_ERROR が送信されます。物理アドレスが一度変更されると、その後開かれ、このデバイスに接続されたストリームは、この新しい物理アドレスを取得します。物理アドレスが一度変更されると、物理アドレスを再び変更するためにこの基本式が使用されるか、システムが再起動されるまでこの物理アドレスは存続します。
デフォルトでは、最初のインタフェースはシステムの MAC アドレスを使用しますが、後続のインタフェースは FDDI ローカルアドレスを使用します。
smt ドライバは、パケットのスループット統計情報、再構成イベント、インタフェース例外情報を提供します。また、PHY に関する情報と FORMAC エラーカウンタを提供します。
ユーザーは、プログラム中の #include <pfsmt.h> の行の前に次の 2 行を追加する必要があります。
#define SMT7_2 0 #define CFG_YES 1 |
ドライバにアクセスするには、複製された文字型特殊デバイスの /dev/pf が使用されます。開かれたストリームを特定のデバイス (ppa) に関連付けるには、明示的に DL_ATTACH_REQ メッセージを使用する必要があります (ppa はインタフェースインスタンス番号に対応します)。
DL_ATTACHED 状態になると、DL_BIND_REQ を送信する必要はありません。ioctl(2) 呼び出しを使用して、ドライバと対話することができます。ioctl に対する引数は、以下の形式で指定します。
ioctl (int fd, int request, SMTCB *smtp) |
request は、smt ドライバに固有であり、SMT_GET と SMT_ACT のいずれかを指定することができます。SMTCB は、ヘッダーファイルの pfsmt.h に以下のように定義されています。
typedef struct { int command; int sub_command; int param1; int param2; int param3; char *where; int length; } SMTCB; |
SMT_GET:
SMT_GET は、HPC レジスタを読み取ったり smt 状態を取得したりするためのさまざまな関数を提供します。smtp の command フィールドは、以下のいずれかの値に初期化する必要があります。
HPC_BMAC1_REGS : BMAC レジスタの読み取り HPC_READ : HPC レジスタの読み取り HPC_PORT1_REGS : RMT ポート 1 および HPC_PORT2_REGS ポート 2 レジスタの読み取り |
これらのコマンドには、サブコマンドが用意されているものがあります。sub_command フィールドは、以下のいずれかのサブコマンドに初期化する必要があります。
1. HPC_BMAC1_REGS
HPC_BMAC1_REGS は、BMAC レジスタの読み取りを可能にします。 HPC_BMAC1_REGS には、 GET_COUNTER_GROUP および GET_NEIGHBOR_ADDR の 2 つのサブコマンドがあります。
GET_COUNTER_GROUP は、さまざまな SMT カウンタ値を取得するために使用されます。 GET_COUNTER_GROUP を使用するには、SMTCB *smtp を以下のように初期化する必要があります。
COUNTER_GROUP ct; smtp->command = HPC_BMAC1_REGS; smtp->sub_command = GET_COUNTER_GROUP; smtp->where = (char *) &ct; smtp->length = sizeof (ct); |
GET_NEIGHBOR_ADDR は、隣接ステーションの MAC アドレスの取得を可能にします。GET_NEIGHBOR_ADDR を使用するには、SMTCB *smtp を以下のように初期化する必要があります。
char addr_buf[12]; smtp->command = HPC_BMAC1_REGS; smtp->sub_command = GET_NEIGHBOR_ADDR; smtp->where = addr_buf; smtp->length = 12; |
2. HPC_READ
HPC_READ は、HPC レジスタの読み取りを可能にします。HPC_READ には、サブコマンドはありません。HPC_READ を使用するには、SMTCB *smtp を以下のように初期化する必要があります。
smtp->command = HPC_READ; smtp->param1 = HPC_READ | HPC_SIZE_BYTE | <HPC_reg_offset>; smtp->where = (char *) smtp; |
HPC_register_offset オフセットは、HPC が提供するレジスタ空間です。レジスタのオフセットについては、pfsmt.h ファイルを参照してください。
3. HPC_PORT1_REGS と HPC_PORT2_REGS
HPC_PORT1_REGS は、接続管理の状態の取得を可能にします。 HPC_PORT2_REGS は 第 2 ポート用です (DAS インタフェースのみ)。HPC_PORT1_REGS には、GET_PORT_GROUP というサブコマンドがあります。HPC_PORT1_REGS を使用するには、SMTCB *smtp を以下のように初期化する必要があります。
FDDI_PORT_GROUP port; smtp->command = HPC_PORT1_REGS; smtp->sub_command = GET_PORT_GROUP; smtp->where = (char *) &port; smtp->length = sizeof (port); |
port.ecm_state および port.pcm_state は、構造体の port に返される 2 つの重要な状態を表します。port.ecm_state は、ECM 状態マシンの現在の状態に対応しています。有効な値は、OUT、IN、TRACE、PATHTEST、INSERT、CHECK、DEINSERT です。 port.ecm_state に返される値は、ECM 状態のリストへのインデックスになります。port.pcm_state は、PCM 状態マシンの現在の状態に対応しています。有効な値は、OFF、BREAK、TRACE、CONNECT、NEXT、SIGNAL、JOIN、VERIFY、ACTIVE、MAINT です。 port.pcm_state に返される値は、PCM の状態のリストへのインデックスになります。
SMT_ACT:
SMT_ACT は、smt ドライバの状態を設定するためのコマンドです。 command フィールドには、必ず SMT_CTL を設定します。SMT_ACT には、SMT_ACCEPT_FRAME と SMT_CLOSE の 2 つのサブコマンドがあります。SMT_ACCEPT_FRAME は、SMT API クライアントが活動中のときに使用する必要があります。
smtp->command = SMT_CTL; smtp->sub_command = SMT_ACCEPT_FRAME; |
SMT_CLOSE は、API クライアントが終了するときに使用する必要があります。
smtp->command = SMT_CTL; smtp->sub_command = SMT_CLOSE; |
SMT NSA フレームを転送するには、ユーザーは FDDI_NSA sap に接続する必要があります。他の SMT フレームを転送するには、FDDI SMTINFO sap に結合することができます。