ONC+ 開発ガイド

SAC とポートモニタのインタフェース

sac は、起動するポートモニタごとに次の 2 つの環境変数を作成します。

  1. PMTAG

  2. ISTATE

    sac は、この変数を一意的に識別できるポートモニタタグに設定します。ポートモニタは sac メッセージに応答するときに、このタグを使用して自分自身を示します。ISTATE は、ポートモニタの起動時の内部状態を指定するのに使用します。ISTATE は、ポートモニタが許可状態でスタートするときに enable に、禁止状態でスタートするときに disable に設定されます。sac はポートモニタの正常なポーリングを定期的に実行します。

sac とポートモニタは FIFO を使用して通信します。ポートモニタは、sac からのメッセージを受信するためにカレントディレクトリに _pmpipe をオープンし、sac に応答メッセージを返すために ../_sacpipe をオープンします。

メッセージ形式

この節では、sac からポートモニタに送るメッセージ (sac メッセージ) と、ポートモニタから sac に送るメッセージ (ポートモニタメッセージ) について説明します。メッセージは、FIFO を通して C の構造体形式で送信されます。例 F-2 を参照してください。

sac メッセージ

sac から送られるメッセージの形式は、次の構造体 sacmsg で定義されています。

struct sacmsg {
 	int sc_size; /* オプションデータ部分のサイズ */
 	char sc_type; /* メッセージのタイプ */
};

sac からポートモニタに送られるメッセージには 4 つのタイプがあります。メッセージがどのタイプなのかは、sacmsg 構造体の sc_type フィールドに次のどれかの値を設定して示します。

SC_STATUS

ステータス要求

SC_ENABLE

有効設定メッセージ

SC_DISABLE

無効設定メッセージ

SC_READDB

ポートモニタの _pmtab ファイルを読み込むように指示するメッセージ

sc_size はメッセージのオプションデータ部分のサイズを示します。「メッセージクラス」 を参照してください。sc_size では、sc_size は常に 0 です。

ポートモニタは、sac からのメッセージには必ず応答しなければなりません。

ポートモニタメッセージ

ポートモニタから sac に送られるメッセージの形式は、次の構造体 pmmsg で定義されています。

struct pmmsg {
 	char pm_type;                /* メッセージのタイプ */
 	unchar pm_state;             /* ポートモニタの現在の状態 */
 	char pm_maxclass;            /* このポートモニタが解釈できる
                                   最大メッセージクラス */
 	char pm_tag[PMTAGSIZE + 1];  /* ポートモニタのタグ */
 	int pm_size;                 /* オプションデータ部分のサイズ */
};

ポートモニタから sac に送られるメッセージには、2 つのタイプがあります。メッセージがどのタイプなのかは、pmmsg 構造体の pm_type フィールドに次のどちらかの値を設定して示します。

PM_STATUS

状態情報

PM_UNKNOWN

否定応答

どちらのタイプのメッセージの場合も、pm_tag フィールドにはポートモニタのタグが、pm_state フィールドにはポートモニタの現在の状態が設定されます。pm_state フィールドに設定できる状態は次の 4 つです。

PM_STARTING

起動

PM_ENABLED

有効

PM_DISABLED

無効

PM_STOPPING

停止

現在の状態は、sac からの最後のメッセージによる状態変更を反映しています。

通常の応答メッセージは状態メッセージです。否定応答メッセージを返すのは、sac から受信したメッセージが理解できなかったときだけです。

pm_size はメッセージのオプションデータ部分のサイズを示します。pm_maxclass はメッセージクラスを指定するのに使用します。この 2 つのフィールドは、「メッセージクラス」 の項で説明します。Solaris では常に pm_maxclass1sc_size0 です。

ポートモニタから先にメッセージを送ることはありません。ポートモニタは、受信したメッセージに応答するだけです。

メッセージクラス

メッセージクラスの概念は、SAF の拡張性に含まれています。これまでに説明したメッセージはすべてクラス 1 のメッセージです。どのメッセージにも可変長データは含まれておらず、必要な情報はすべてメッセージヘッダーに入っていました。

新たなメッセージをプロトコルに加えると、それによって新たなメッセージクラス (たとえば、クラス 2) が定義されます。sac からポートモニタに送られる最初のメッセージは常にクラス 1 のメッセージです。どのポートモニタもクラス 1 のメッセージは理解できますから、sac が送る最初のメッセージは必ず理解されます。ポートモニタは、それに対する sac への応答の中で、ポートモニタが理解できる最大メッセージクラス番号を pm_maxclass フィールドに設定します。sac は、ポートモニタに対して、pm_maxclass の値より大きいクラスのメッセージは送りません。ポートモニタが理解できるクラスより上のクラスのメッセージを必要とする要求は、失敗に終わります。Solaris では、pm_maxclass は常に 1 です。


注 -

どのポートモニタも、pm_maxclass の値と等しいクラスかそれより小さいクラスのメッセージを受信できます。したがって、pm_maxclass フィールドが 3 の場合、このポートモニタはクラス 123 のメッセージを理解できます。ポートモニタはメッセージを生成することはありません。受信したメッセージに応答するだけです。ポートモニタからの応答は、元のメッセージと同じクラスでなければなりません。


sac の側からだけメッセージが生成されるので、sac が生成できるクラスより上のクラスのメッセージをポートモニタが処理できる場合も、このプロトコルは正しく機能します。

pm_size (pmmsg 構造体の要素) と sc_size (sacmsg 構造体の要素) は、メッセージの中のオプションデータ部分のサイズを示します。オプションデータ部分の形式は未定義です。オプションデータ部分の形式定義は、メッセージのタイプによって決まっています。Solaris では、sc_sizepm_size は常に 0 です。