WANポリシーの構成

WANポリシーは次の3つのセクションから構成されます。


宣言セクション

ポリシーの宣言セクションには、ローカル変数およびクライアントの要求を通して入力される変数の定義が含まれています。これらの定義は、セレクタセクションおよびプロバイダセクションで使用されます。これらの変数は、システム定義の変数とともに保存されます。

変数の宣言はセミコロンで区切られます。同じタイプの宣言が複数ある場合は、複数の宣言を1行に結合するか、または次の行にまたがって記述できます。行によって宣言が区別されることはありません。宣言セクションの例を次に示します。

REQUIRED INT R1;
REQUIRED TIME R2;
REQUIRED BOOLEAN R3,R4;
REQUIRED NETADDRESS R5,R6;
OPTIONAL INT P1 := 10;
OPTIONAL BOOLEAN := FALSE;
LOCAL INT L1 :=10;
LOCAL INT L2;
LOCAL TIME L3;
LOCAL BOOLEAN L4 :=TRUE, L5 :=FALSE;
LOCAL NETADDRESS L6;

使用される必須宣言およびオプション宣言の種類は、トラフィックタイプにより異なります。必須変数が含まれていないポリシーは実行されません。オプション宣言には、何も値が渡されない場合にデフォルトとして使用される値が指定されている必要があります。WANトラフィックマネージャにより、すべてのトラフィックタイプで使用できるシステムシンボル(定義済み変数)が提供されます。

各宣言は次の3つの部分から構成されます。


スコープ

有効なスコープを「表 93」に示します。


表 93. 有効な宣言スコープ

スコープ 説明

REQUIRED

スコープがREQUIREDとして定義された変数は複数のセクションで使用できますが、宣言セクションでは1回しか指定できません。

REQUIREDスコープ変数に対して値を定義することはできません。この変数の値はGetWanPolicy要求を通して入力される必要があります。

OPTIONAL

スコープがOPTIONALとして定義された変数は1つのポリシーの複数のセクションで使用できますが、宣言セクションでは1回しか指定できません。

OPTIONALスコープ変数にはデフォルト値が割り当てられます。これらの値は初期化されません。これらは、値が渡されない場合にのみ設定されます。名前とタイプの両方が一致するパラメータへWANポリシー要求から新しい値が渡されない場合、ポリシーの処理では宣言で定義された値が使用されます。

スコープがOPTIONALとして定義された変数には値を割り当てる必要があります。TIMEタイプおよびNETADDRESSタイプは宣言セクションで初期化できないため、これらの変数タイプではOPTIONALスコープは使用しないでください。

LOCAL

スコープがLOCALとして定義された変数は複数のセクションで使用できますが、宣言セクションでは1回しか指定できません。

LOCALスコープ変数は特定のポリシーに対してのみ指定されます。つまり、これらの変数の値は呼び出し側クライアントには返されません。

すべてのパラメータタイプを定義できます。ただし、TIMEタイプおよびNETADDRESSタイプは宣言セクションで初期化できないため、これらのタイプには値を割り当てないでください。

SYSTEM

スコープがSYSTEMとして定義された変数は複数のセクションで使用できますが、宣言セクションでは1回しか指定できません。


タイプ

有効なタイプを「表 94」に示します。


表 94. 有効な宣言タイプ

タイプ 説明

INT

ポリシー実行を開始したGetWanPolicy要求のトラフィックタイプを反映します。たとえば、次のポリシーではNDS_SYNCのトラフィックタイプが指定されます。

IF TrafficType=NDS_SYNC THEN action END.

BOOLEAN

TRUEまたはFALSEのいずれかの値である場合に使用します。宣言またはWANポリシー要求で値が設定されていない場合には、値は不定です。

TIME

TIMEスコープ変数は、セレクタセクションまたはプロバイダセクションで、あるいはWANポリシー要求から値を受け取る必要があります。宣言ではTIMEスコープ変数に値を割り当てないでください。

NETADDRESS

NETADDRESSスコープ変数は、セレクタセクションまたはプロバイダセクションで値を受け取る必要があります。宣言ではNETADDRESSスコープ変数に値を割り当てないでください。

宣言セクションでは、TIMEタイプおよびNETADDRESSタイプに値を割り当てることはできません。TIMEタイプおよびNETADDRESSタイプが値を持っていない場合、これらのタイプはセレクタセクションまたはプロバイダセクションで値を受け取ります。宣言セクションでは、シングルタイプのみ初期化されます。


名前とオプション値の対

変数名は、英数字を組み合わせた任意の長さの文字列です。最初の31文字だけが使用されるため、変数名の最初の31文字は固有の文字列にする必要があります。変数名の最初の文字は英字、または定数値として解釈されるシンボルにする必要があります。

変数名では大文字と小文字が区別されます。たとえば、変数R1 と変数r1は異なる変数として解釈されます。変数名ではアンダースコア文字(_)を使用できます。

宣言内の値は、変数や式ではなく、定数でなければなりません。つまり、「LOCAL INT L2:= L3;」という宣言は許可されません。宣言内で変数を初期化する値は、ポリシーのセレクタセクションおよびプロバイダセクションで変更されることがあります。


セレクタセクション

ポリシーのセレクタセクションは、キーワードSELECTORで始まり、キーワードENDで終ります。セレクタセクションが評価されて、どのロード済みポリシーを使用するかが決定されます。

どのポリシーのウエイトが最大かを判断するために、現在ロード済みのすべてのポリシーのセレクタセクションが実行されます。評価後、セレクタセクションから0〜100の間のウエイトが返されます。0は、このポリシーを使用しないことを意味します。1〜99は、さらに大きい値が他のポリシーから返されない限り、このポリシーを使用することを意味します。100は、このポリシーを使用することを意味します。

セレクタセクションの結果は、RETURN宣言で返されます。RETURN宣言がない場合、0のデフォルト値が返されます。セレクタセクションの例を次に示します。

SELECTOR
RETURN 49;
END

複数のポリシーのセレクタセクションが評価されると、複数のポリシーから同じ値が返されることがあります。この場合、どのポリシーが選択されるかは不定です。他の条件がすべて同じである場合、サーバポリシーがWANポリシーに優先します。

宣言を記述する方法の詳細については、「ポリシーセクションで使用される構文」を参照してください。「プロバイダセクション」も参照してください。


プロバイダセクション

プロバイダセクションは、キーワードPROVIDERで始まり、キーワードENDで終ります。プロバイダセクションの主要部は宣言リストで構成されます。

この宣言リストの結果は、SENDまたはDONT_SENDに対するポリシーの提案を表す値になります。

プロバイダセクションの結果は、RETURN宣言で返されます。RETURN宣言がない場合、SENDのデフォルト値が返されます。

プロバイダセクションの例を次に示します。

PROVIDER
RETURN SEND;
END

宣言を記述する方法の詳細については、「ポリシーセクションで使用される構文」を参照してください。


ポリシーセクションで使用される構文

WANポリシーのセレクタセクションおよびプロバイダセクションでは(宣言セクションを除く)、次のステートメントと構文を使用できます。ポリシーの宣言セクションを記述する方法の詳細については、「宣言セクション」を参照してください。


コメント

コメントを記述するには、行の初めに/*を入力し、終わりに*/を入力します。具体的には、次のように入力します。

/* This is a comment. */

//を使用して、ステートメントと同じ行に続けてコメントを記述することもできます。たとえば、次のように入力します。

IF L2 > L3 THEN //This is a comment.


IF-THENステートメント

IF-THENステートメントを使用して、宣言ブロックを条件付きで実行します。

例:

IF Boolean_expression THEN declarations
END

IF Boolean_expression THEN declarations
ELSE declarations
END

IF Boolean_expression THEN declarations
ELSIF Boolean_expression THEN declarations
END


IF Boolean_Expression THEN

これはIF-THENステートメントの最初の句です。ブール式が評価され、結果としてTRUEまたはFALSEが返されます。TRUEの場合は、直後の宣言が実行されます。FALSEの場合は、対応する後置のELSE、ELSIF、またはEND宣言にジャンプします。


ELSE

対応する前置のIF-THENおよびELSIFステートメントの結果がFALSEである場合、ELSEで始まる宣言が実行されます。例を次に示します。

IF Boolean_expression THEN statements
ELSIF Boolean_expression THEN statements
ELSIF Boolean_expression THEN statements
ELSE statements
END


ELSIF Boolean_Expression THEN

前置のIF-THEN宣言からFALSEが返された場合、ブール式が評価されます。ELSIF宣言が評価され、結果としてTRUEまたはFALSEが返されます。TRUEの場合は、直後の宣言が実行されます。FALSEの場合は、対応する後置のELSE、ELSIF、またはEND宣言にジャンプします。例を次に示します。

IF Boolean_expression THEN statements
ELSIF Boolean_expression THEN statements
ELSIF Boolean_expression THEN statements
END


END

END宣言によってIF-THEN構文が終了します。


RETURN

RETURNコマンドによって、セレクタセクションおよびプロバイダセクションの結果が返されます。


セレクタ

セレクタセクションでは、ポリシーのウエイトとして使用される整数がRETURN宣言によって返されます。RETURNは0〜100の間のポリシーウエイトを返します。0は、このポリシーを使用しないことを意味します。1〜99は、さらに大きい値が他のポリシーから返されない限り、このポリシーを使用することを意味します。100は、このポリシーを使用することを意味します。セレクタセクションではRETURN宣言がない場合、0のデフォルト値が返されます。

宣言を終了するにはセミコロンが必要です。例を次に示します。

RETURN 49;
RETURN L2;
RETURN 39+7;


プロバイダ

プロバイダセクションでは、RETURN宣言によってSENDまたはDONT_SENDが返されます。RETURN宣言がない場合、SENDのデフォルト値が返されます。

宣言を終了するにはセミコロンが必要です。例を次に示します。

RETURN SEND; 
RETURN DONT_SEND;
RETURN L1;


割り当て

割り当て宣言では、:=文字を使用してシンボルの値が変更されます。定義済み変数またはシステム変数を最初に指定し、:=に続いて値、変数、または演算式を指定します。割り当ての宣言はセミコロンで終了する必要があります。例を次に示します。

variable.field:=expressionvariable:=expression;

t1とt2はタイプTIME、i1とi2はタイプINTEGER、b1とb2はタイプBOOLEANの有効な割り当てです。

t1 := t2;
b1 := t1 < t2;
i1 := t1.mday - 15;
b2 := t2.year < 2000

無効な割り当ての例を示します。

b1 := 10 < i2 < 12;

(10 < i2)はブール式です。BOOLEANをINTEGERと比較することはできません。

代わりに、b1 := (10 < i2) AND (i2 < 12);を使用します。また、次のような例も無効です。

  b2 := i1;

b2はBOOLEANで、i1はINTEGERです。BOOLEANをINTEGERと比較することはできません。

代わりに、b2 := i1 > 0;を使用します。

厳密なタイプのチェックが行われます。TIME変数にINTを割り当てることはできません。


算術演算子

割り当て宣言、RETURN宣言、またはIF構文内で、算術演算子を使用できます。有効な演算子は次のとおりです。

算術演算子とともに使用できるのはINT変数タイプだけです。算術式で、TIME、NETADDRESS、およびBOOLEAN変数タイプは使用しないでください。

結果が-2147483648〜+2147483648の範囲外の値になる演算、または0による除算は行わないでください。


関係演算子

IF構文で関係演算子を使用できます。有効な演算子は次のとおりです。

関係演算子は、TIMEおよびINT変数タイプで使用できます。< >および=は、NET ADDRESSおよびBOOLEAN変数タイプでも使用できます。


論理演算子

有効な演算子は次のとおりです。


ビットワイズ演算子

INT変数タイプでビットワイズ演算子を使用して、整数値を返すことができます。有効な演算子は次のとおりです。


複合演算

複合演算を処理するときは、次の優先規則が適用されます。同じ優先順位の演算子には、左から右へ優先順位が付けられます。優先順位は次のとおりです。

優先順位が明確でない場合は、カッコを使用します。たとえば、A、B、およびCが整数または変数の場合、A<B<Cは許可されません。A<Bでは、整数値ではなくブール値が返されるので、整数Cと比較することはできません。しかし、(A<B) AND (B<C)は文法的に正しい式です。


PRINT

PRINT宣言を使用して、サーバのWANトラフィックマネージャ表示画面およびログファイルに、テキストやシンボルの値を送ることができます。

PRINTステートメントには、リテラル文字列、シンボル名やシンボルメンバー、整数値、またはブール値などの引数をコンマで区切って、いくつでも指定できます。

リテラル文字列は複引用符("")で囲んでください。PRINT宣言はセミコロン(;)で終了する必要があります。例を次に示します。

PRINT "INT=",10,"BOOL=",TRUE,"SYM=",R1;

TIMEおよびNETADDRESS変数では、フォーマット化されたPRINT宣言が使用されます。TIMEシンボルは次のように出力されます。

m:d:y h:m

NETADDRESS変数は次のように出力されます。

Type length data

typeはIPまたはIPXのいずれかで、length はバイト数、dataは16進のアドレス文字列です。