Cisco CNS Network Registrar Release 6.2 ユーザ ガイド
式の使用方法
式の使用方法
発行日;2012/02/01 | ドキュメントご利用ガイド | ダウンロード ; この章pdf , ドキュメント全体pdf (PDF - 5MB) | フィードバック

目次

式の使用方法

式の使用方法

式の入力

式の作成

式のシンタックス

式のデータタイプ

式におけるリテラル

式が返すタイプ分けされた値

式が失敗する可能性

式の関数

データタイプの変換

CLI における式

式の例

制限例 1:DOCSIS ケーブル モデム

制限例 2:拡張 DOCSIS ケーブル モデム

制限例 3:非同期転送モードによる DSL

式のデバッグ

式の使用方法

Network Registrar ではクライアントクラスの拡張サポートを提供します。要求の内容に基づいて、要求をクライアントクラスに配置できます。この場合、クライアントをクライアント データベースに登録する必要はありません。また、加入者のアクティブ リース数に基づいて要求をクライアントクラスに配置でき、さまざまな加入者に提供されたサービス レベルで制限を実行できます。これは、式を使用して特別な DHCP オプション処理を行うことで可能になります。

DHCP relay-agent-info オプションの値に基づいて加入者アドレスに制限を設定できます(RFC 3046 で規定されているオプション 82)。これらの値で機密性の高いアドレスを明かす必要はありません。着信 DHCPDISCOVER 要求パケットをオプション 82 サブオプション( remote-id または circuit-id )あるいはその他の DHCP オプションに対して評価する式を作成すれば、ある個体を加入者に関連付ける値を作成できます。式は、パケット内で評価される対象によってさまざまな値を返す一連の if 文です。これは、実際には加入者が所属するクライアントクラスを算出し、アドレス割り当てをそのクライアントクラスのスコープに制限します。


) 式は、DHCP 拡張とは異なります。一般的に、クライアント ID の作成またはクライアントのルックアップに使用します。拡張機能(「拡張ポイントの使用」を参照)は、要求または応答パケットの変更に使用します。ここで説明する式は、正規表現とも異なります。


式の使用方法

式による処理は、次の箇所で使用されます。

クライアントクラスの算出: client-class-lookup-id 。この式では着信パケットの内容に基づいてクライアントクラスを判別します。

クライアント エントリ データベースでルックアップするキーの作成: client-lookup-id 。これは式の評価で得たキーを使用してクライアント エントリ データベースにアクセスします。

同じ加入者のクライアント制限に使用する ID の作成: limitation-id 。これは、他のクライアントがこの加入者に関連付けられていないかどうかの確認に使用する ID です。

このような処理の結果は、次のようになります。

1. DHCP サーバは、 client-class-lookup-id 式に基づいてクライアントクラスを取得しようとします。クライアントクラスを算出できない場合、サーバは通常の MAC アドレス方式を使用してクライアントを参照します。

2. クライアントクラスを算出できる場合、サーバは client-lookup-id を返す client-lookup-id 式を評価してクライアント エントリ ルックアップの実行が必要かどうかを判別します。このような ID がある場合、サーバは ID を使用してクライアント ルックアップを実行します。ID がない場合、算出されたクライアントクラス値を使用してアドレスを割り当てます。

3. サーバが client-lookup-id を使用してクライアント エントリを検索する場合、クライアントのデータを使用します。クライアント エントリが見つからない場合、算出されたクライアントクラス データまたはデフォルトのクライアントクラス データを使用します。

ポリシー レベルで同一の limitation-id 値を持つネットワークまたは LAN セグメントのクライアントに対して、割り当てられたアドレスに上限を設定します。ポリシーの limitation-count アトリビュートを使用して、この上限を正の整数として設定します。

次は、加入者に対して IP アドレスを制限するために設定する値です。

ポリシーの場合、 limitation-count アトリビュートに正の整数を設定します。

クライアントクラスの場合、 limitation-id および client-lookup-id アトリビュートに式を設定し、 over-limit-client-class-name アトリビュートにクライアントクラスを設定します。

クライアントの場合、 over-limit-client-class-name アトリビュートにクライアントクラスを設定します。

使用する式については、「式の作成」の項で説明します。

式の入力

単純式はアトリビュート定義に入れることができ、もっと複雑な式は式ファイルに入れてアトリビュート定義でこのファイルを参照できます。どちらの方法でも、使用可能な最大文字数は 16 K です。CLI で単純式を入力する場合、その式は次の規則を守る必要があります。

式は 1 コマンド ラインに制限する必要がある。

式全体を二重引用符( " " )で囲む必要がある。

埋め込み二重引用符はバックスラッシュ( \ )でエスケープする必要がある。

client-class-lookup-id を設定する単純式の例です。

"\"limit\""
 

次は、クライアントクラスの limitation-id を設定するやや広範な例です。

"(request option 82 \"circuit-id\")"
 

1 行に制限できないさらに複雑な式や、分かりやくするために形式設定する複雑な式は、ファイルに入力し、先頭にアットマーク( @ )が付くアトリビュート定義で参照する必要があります。

@cclookup.txt
 

ファイル内の式のシンタックスには、単純式の追加要件(文字のスペーシングとエスケープに関して)はありません。また、コメント行も入れることができます。これは、先頭にシャープ記号(#)、ダブルスラッシュ(//)、またはセミコロン(;)が付き、行の最後で終わります。たとえば、次の cclookup.txt ファイルです。

// Expression to calculate client-class based on remote-id
(try (if (equal (request option "relay-agent-info" "remote-id") (request chaddr))
"cm-client-class"
"cpe-client-class")
"<none>")
 

式の作成

DHCP の式を使用すると、着信 DHCP パケット内のデータに基づいて検索、処理、および決定することができます。式を使用して着信パケットのクライアントクラスを決定でき、オプション 82 制限サポート用の等価キーを作成できます。式では、パケットおよび個々のオプションから情報を取得する手段、パケット内の情報に基づいて決定できるさまざまな条件機能、およびクライアントクラス名またはキーを作成できるデータ合成機能を提供します。

「標準的な制限事例」の例を記述した場合に、式ファイルに含まれる式を次に示します。

// This begins the try function
(try
(or (if (equal (request option "relay-agent-info" "remote-id") (request chaddr))
"cm-client-class")
(if (equal (substring (option "dhcp-class-identifier") 0 6) "docsis")
"docsis-cm-client-class")
(if (equal (request option "user-class") "alternative-class")
"alternative-cm-client-class")
)
<none>
)
// This ends the try function
 

これは、 or 関数を使用して、3 つの if 関数を評価します。もっと単純な形式で、クライアントクラスを算出し、この式を cclookup.txt ファイルに入れることができます。

// Expression to calculate client-class based on remote-id
(try (if (equal (request option "relay-agent-info" "remote-id") (request chaddr))
"cm-client-class"
"cpe-client-class")
"<none>")
 

このファイルを参照して、サーバのクライアントクラス検索 ID を設定する式を使用します。

nrcmd> dhcp set client-class-lookup-id=@cclookup.txt
 

remote-id サブオプションをオプション 82 から取得しようとすることで制限キーを生成できます。生成できない場合は、標準の MAC blob キーを使用します。ファイルに式を入れて、制限 ID を cclimit.txt ファイルに設定します。

// Expression to use remote-id or standard MAC
(try (request option "relay-agent-info" "remote-id") 00:d0:ba:d3:bd:3b)
 
nrcmd> client-class name limitation-id=@cclimit.txt
 

式のシンタックス

式は、関数とリテラルだけで構成されます。シンタックスは Lisp に似ています。数多くの同じ規則に従っており、可能な場合は Lisp 関数名を使用しています。基本シンタックスは次のとおりです。

(function argument-0 ... argument-n)
 

さらに便利な例を次に示します。

(try (if (equal (request option "relay-agent-info" "remote-id") (request chaddr))
"cm-client-class"
"cpe-client-class")
"<none>")
 

この例では、 relay-agent-info オプション(オプション 82)の remote-id サブオプションをパケット内の MAC アドレスと比較して、両者が同じである場合は「cm-client-class」を返し、異なる場合は「cpe-client-class」を返します(式でデータを評価できない場合、 try 関数は「<none>」値を返します。「式が失敗する可能性」を参照)。この目的は、デバイスがケーブル モデムかどうかを判別することです(おそらく、 remote-id は MAC アドレスと同等です)。ケーブル モデムの場合は、顧客宅内機器や PC とは別のクライアントクラスに置きます。関数とリテラルの両方が式であることに注意してください。前の例では 1 つの関数を式として示しています。リテラルについては、「式におけるリテラル」を参照してください。

式のデータタイプ

式でサポートするデータタイプは次のとおりです。

blob:カウントされる一連のバイト。サポートされる最小の長さは 1 K バイトです。

文字列:カウントされる一連の Network Virtual Terminal(NVT; ネットワーク仮想端末)ASCII 文字。ゼロ バイトで終了しません。サポートされる最小の長さは 1 K バイトです。

符号付き整数:32 ビット符号付き整数。

符号なし整数:32 ビット符号なし整数。

IP アドレス データタイプがないことに注意してください。1 つの IP アドレスは、4 バイトの blob です。数値はすべて、ネットワーク バイト順です。「データタイプの変換」を参照してください。

式におけるリテラル

次のさまざまなリテラルが式機能に含まれています。

符号付き整数:32 ビットに収まる必要のある通常の数字。

符号なし整数:32 ビットに収まる必要のある通常の符号なし数字。

Blob:コロンで区切られた 16 進バイト。たとえば、01:02:03:04:05:06 はバイト 1 ~ 6 がある 6 バイトの blob です。これは、17 バイトの文字列である "01:02:03:04:05:06" とは区別されます。文字列は、blob のテキスト表示であることによってその blob に関連付けられます。たとえば、式 (to-blob "01:02:03") は blob 01:02:03 を返します。1 バイトの blob のリテラル表現は作成できません。たとえば 01 は整数になります。1 を含む 1 バイトの blob を取得するには、式 (substring (to-blob 1) 3 1) を使用します。3 は、4 バイトの整数(00:00:00:01)の第 4 バイトを抽出するためのオフセットを示し、1 は抽出するバイト数で、結果は「01」になります。

文字列:二重引用符で囲まれた文字。たとえば、"example.com" は "01:02:03:04:05:06." のように文字列です。文字列リテラル内に引用符を入れるには、たとえば次のように、バックスラッシュ(\)でエスケープします。

"this has one \"quote"
 

整数リテラル(符号付きおよび符号なし)は base10 にあるものと想定されています。リテラルは、0 で始まる場合は 8 進数と見なされ、0x で始まる場合は 16 進数と見なされます。リテラルの例を次に示します。

「hello world」は文字列リテラルです(完全に有効な式です)。

1 は符号なし整数リテラルです(これも完全に有効な式です)。4 バイトが含まれ、最初の 3 バイトはゼロで、最後のバイトは最下位ビットに 1 を含んでいます。

01:02:03 は blob リテラルで、3 つのバイト 01、02、および 03 を含んでいます。

-10 は符号付き整数リテラルで、10 進数 -10 の 2 の補数表記を持つ 4 バイトを含んでいます。

式が返すタイプ分けされた値

式の目的は、ほぼ例外なく値を返すことにあります。クライアントクラスを判別するために設定される式は、DHCP サーバ プロパティ client-class-lookup-id に設定されます。この式が評価される場合、DHCP サーバは、クライアントクラスの名前を含む文字列、または文字列 <none> が返されることを予想しています。

すべての関数は値を返します。値のデータタイプは、引数のデータタイプによって異なる場合があります。式の中には、特定のデータタイプの引数しか受け入れないものがあります。次に例を示します。

(+ argument0 argument1)
 

特定の引数に特定のデータタイプが必要な関数は、ほとんどの場合、適切なデータタイプになる引数に変換しようとします。たとえば、 (+ "1" 2) は、文字列リテラル "1" を数値 1 に正常に変換するので、3 を返します。しかし、 (+ "one" 2) は、"one" を数値に正常に変換できないので、エラーを返します。一般に、式の評価者はデータタイプの変換を決定する際にできる限り正しい処理を試みます。

式が失敗する可能性

式を構成する関数のうち、任意のデータタイプまたは値で正しく機能する関数もあれば、機能しない関数も多数あります。前述の + 関数は文字列リテラル「one」を有効数字に変換しなかったため、その関数の評価は失敗しました。関数が評価に失敗すると、その呼び出し関数も失敗するというように、式全体が失敗するまで続きます。式の評価が失敗すると、関係する式によって異なる結果になります。パケットがドロップされる場合もあれば、警告メッセージが生成されるだけの場合もあります。

(try expression failure-expression ) 関数を使用して、評価が失敗する事態を回避できます。 try 関数は式を評価し、評価が成功すれば、関数の値は expression の値になります。評価が失敗した場合(理由を問わず)、関数の値は failure-expression の値になります。 try 関数自体が失敗する唯一の状況は、 failure-expression 評価が失敗する場合です。そのため、 failure-expression として定義する式には注意する必要があります。文字列リテラルは確実な方法です。 client-class-lookup-id の評価を try 関数で保護することは得策です。前述の例でこの方法を示します。

(try (if (equal (request option "relay-agent-info" "remote-id") (request chaddr))
"cm-client-class"
"cpe-client-class")
"<none>")
 

この場合、 if 関数が失敗すると、 client-class-lookup-id 式の値は <none> になります。当然ながら、その代わりにクライアントクラス名になる可能性もあります。

式の関数

表24-1 に式の関数を示します。式はカッコで囲む必要があります。

 

表24-1 式の関数

関数
説明

(and arg1 ... argn )

(and "hello" "world") returns "world"

(and (request option 82 1) (request option 82 2)) returns option-82 sub-option 2 if both option-82 sub-option 1 and sub-option 2 are present in the request

and 関数は、 argn のデータタイプである値またはヌルを返します。引数は左から右の順に評価されます(引数はあるデータタイプに評価できます)。ヌルに評価された引数があれば、引数の評価を停止してヌルを返します。それ以外の場合は、最後の引数 argn の値を返します。

(as-blob expr )

(as-blob "hello world") returns the blob 68:65:6c:6c:6f:20:77:6f:72:6c:64

as-blob 関数は、 expr を blob のように扱います。 expr が文字列に評価されると、文字列を構成するバイトは返される blob のバイトになります。 expr が blob に評価されると、その blob がそのまま返されます。 expr がいずれかの種類の整数に評価されると、整数のバイトを含む 4 バイトの blob が返されます(表24-2を参照)。

(as-sint expr )

(as-sint ff:ff:ff:ff) returns -1

(as-sint 2147483648) returns an error

as-sint 関数は、 expr を符号付き整数のように扱います。 expr が 4 バイト以下の文字列または blob に評価されると、関数はそのバイトで構成される符号付き整数を返します(4 バイトより長い場合はエラーを返します)。 expr が符号付き整数に評価されると、そのままの値を返します。符号なし整数の場合は、同じビット値の符号付き整数を返します(表24-2を参照)。

(as-string expr )

(as-string 97) returns "a"

(as-string 68:65:6c:6c:6f:20:77:6f:72:6c:64) returns "hello world"

(as-string 0) returns an error.

as-string 関数は、 expr を文字列のように扱います。 expr が文字列に評価されると、その文字列が返されます。 expr が blob に評価されると、blob 内のバイトで構成される文字列を返します。ただし、印刷不可能な ASCII 値の場合はエラーを返します。 expr が整数に評価されると、値は 1 文字の ASCII 値と見なされ、その 1 文字で構成される文字列を返します。ただし、値が印刷不可能な場合はエラーを返します(表24-2を参照)。

(as-uint expr )

(as-uint -2147483648) returns the unsigned integer 2147483648

(as-uint -1) returns the unsigned integer 4294967295

(as-uint ff:ff:ff:ff) returns the unsigned integer 4294967295

as-uint 関数は、 expr を整数のように扱います。 expr が 4 バイト以下の文字列または blob に評価されると、そのバイトで構成される符号なし整数を返します。4 バイトより長い場合は、エラーを返します。結果が符号なし整数の場合は、引数をそのまま返します。符号付き整数の場合は、同じビット値を持つ符号なし整数を返します(表24-2を参照)。

(ash expr shift )

(ash 00:01:00 1) returns the blob 00:02:00

(ash 00:01:00 -1) returns the blob 00:00:80

(ash 1) returns the unsigned integer 2

ash 関数は、 shift の量でシフトされたビットを持つ整数または blob を返します。 expr は整数、blob、または文字列に評価できます。 expr が文字列に評価されると、この関数は符号付き整数への変換を試みます。失敗した場合は、blob への変換を試みます。両方の変換に失敗した場合は、エラーを返します。 shift は、符号付き整数に変換可能な対象に評価される必要があります。 shift が正の場合は左へのシフトとなり、負の場合は右へのシフトとなります。 expr が符号付き整数となった場合、右シフトは符号拡張付きです。 expr が符号なし整数または blob となった場合、右シフトは最上位ビットでゼロ ビットをシフトします。

(bit-and arg1 arg2 )
(bit-or
arg1 arg2 )
(bit-xor
arg1 arg2 )
(bit-eqv
arg1 arg2 )
(bit-andc1
arg1 arg2 )
(bit-andc2
arg1 arg2 )
(bit-orc1
arg1 arg2 )
(bit-orc2
arg1 arg2 )

(bit-and 00:20 00:ff) returns 00:20

(bit-or 00:20 00:ff) returns 00:ff

(bit-xor 00:20 00:ff) returns 00:df

(bit-andc1 00:20 00:ff) returns 00:df

これらの bit 関数は、2 つの引数によるビット関連のブール演算結果を返します。両方の引数がどちらかの種類の整数になった場合、結果のデータタイプは符号付き整数になります。引数が整数にならなかった場合、結果は blob になります。 arg1 および arg2 引数は 2 つの整数、同じ長さの 2 つの blob、または 1 つの整数と長さ 4 の 1 つの blob として評価される必要があります。引数のいずれかが文字列として評価される場合、関数はその文字列を符号付き整数に変換を試みて、失敗すると blob に変換します。この変換後、結果は前に述べた基準に一致する必要があります。これらの条件が満たされない場合は、エラーを返します。

c1 および c2 を使用した演算は、演算の前に 1 番目と 2 番目のそれぞれの引数の補数がとられることを示しています。

(bit-not expr )

(bit-not ff:ff) returns 00:00

(bit-not 1) returns 4294967295

(bit-not "hello world") returns an error

bit-not 関数は、 expr のビット単位の補数である値を返します。結果が文字列となった場合、結果のデータタイプは expr の評価結果、および後続の変換結果と同じになります。式は、いずれかのタイプの整数、または blob に評価される必要があります。文字列に評価されると、関数は符号付き整数への変換を試みます。失敗した場合は blob への変換を試み、これが失敗すると、エラーを返します。

(byte arg1 )

(byte 150) returns 0x96

(byte 0x96) returns 0x96

byte 関数を使用すると、1 バイトの blob を簡単に作成できます。この関数は、データ タイプに応じて次の blob を返します。

sint、uint:整数型の下位バイトを返します。

blob:blob 内の最後のバイトを返します。

string:文字列内の最後のバイトを返します。

(comment comment expr1 ... exprn )

(comment "this is a comment that won’t get lost" (request option 82 1))

この関数は comment 引数を無視しますが、残りの引数を評価して exprn の値を返します。この関数を使用して、コメント文字列を式に挿入します。

(concat arg1 ... argn )

(concat "hello " "world") returns "hello world"

(concat -1 "world") returns an error

(concat -1 00:01:02) returns the blob ff:ff:ff:ff:00:01:02

この関数は引数の値を 1 つの文字列または blob に連結します。ヌルの引数は無視されます。最初のヌルでない引数は、文字列または blob に評価される必要があります。文字列に評価されると、関数はこの引数を blob に変換します。このヌルではない最初の引数のデータタイプ(変換後)が、結果のデータタイプを決定します。関数は後に続くすべての引数を結果のデータタイプに変換し、この変換が失敗した場合はエラーを返します。

(dotimes ( var count-expr [ result-expr ] ) exp1 ... expn )

(let (x y) (setq x 01:02:03) (dotimes (i (length x)) (setq y (concat (substring x i 1) y)))) returns null, but after the dotimes y is the reverse of x

(dotimes (i 10) (setq i 1)) loops forever!

dotimes 関数は、最初はゼロに設定されている 1 つのローカル整数型変数 var のある環境を作成し、 exp1 expn までを評価します。その後、 var を 1 ずつインクリメントし、 count-expr 未満の場合は再度 exp1 expn を評価します。 var count-expr 以上になると、関数は result-expr を評価して dotimes 全体の結果として返します。 result-expr がない場合、関数はヌルを返します。

var はローカル変数を英字名で定義する必要があります。 count-expr は整数に評価されるか、または整数に変換できる必要があります。 exp1 expn は、任意のデータタイプに評価できる式です。 result-expr はオプションで、指定された場合は任意のデータタイプに評価できます。関数が count-expr を評価すると、 var はバインドされず、 count-expr には表示できません。代わりに、 var result-expr を評価するためにバインドされ、 count-expr の値を持ちます。 result-expr を省略すると、関数はヌルを返します。


exp1expnvar 値を変更するときは注意してください。簡単に無限ループを作成できるためです(例を参照)。


 

(environmentdictionary { get | put val | delete } attr )

nrcmd> dhcp set initial-environment-dictionary=first=one,second=2

(environmentdictionary get "first") returns "one"

(environmentdictionary get "second") returns "2" (note string 2)

(environmentdictionary put "two" "second") returns "second"

(environmentdictionary delete "first") returns null

environmentdictionary 関数は、DHCP 拡張環境ディクショナリ アトリビュート値を取得、セット、または削除します。 val はアトリビュートの値で、 attr はアトリビュートの名前です。両方とも、その初期のデータタイプに関係なく、文字列に変換されます。初期の環境ディクショナリは変更できませんが、シャドウにできます(初期ディクショナリ内に存在するものを再定義できますが、それを削除しても元の初期値はそのまま残ります)。 get キーワードは、「取得」の場合、オプションではありません。

(equal expr1 expr2 expr3 )
(equali
expr1 expr2 expr3 )

(equal (request option "dhcp-class-identifier") "docsis") returns the string ”docsis” if the value of the option dhcp-class-identifier is a string identical to "docsis"

(equali "abc" "ABC") returns "ABC"

(equal "abc" "def") returns null

(equal "ab" (as-string 61:62)) "this is true") returns "this is true"

(equal "ab" 61:62 "this is not true") returns null

(equal 01:02:03 01:02:03) returns 01:02:03

(equal (as-blob "ab") 61:62) returns null

(equal 1 (to-blob 1)) returns null

(equal (null) (request option 20)) returns "*T*" if there is no option 20 in the packet

equal 関数は、 expr1 および expr2 の評価結果が等しいかどうかを評価します。等しい場合、次を返します。

1. 指定された場合、 expr3 の値、または

2. expr2 がヌルでない場合は expr2 の値(およびデータタイプ。文字列変換後)、または

3. 文字列「*T*」(ヌルを返すと、比較に失敗したことを誤って示すので)。

expr1 および expr2 が等しくない場合、関数はヌルを返します。

2 つの引数は任意のデータタイプにできます。異なる場合、比較する前に、関数で文字列(失敗することはない)に変換されます。どの文字列変換も (to-string ... ) に相当する関数を使用して実行してください。したがって、blob 61:62 と文字列「ab」は等しくありません。また、1 バイトの blob 01 はリテラルの整数 1 と等しくないことにも注意してください。両方とも文字列に変換されますが、文字列「01」は文字列「1」と等しくありません。

equali 関数は、比較の対象が文字列の場合に(文字列引数が使用されたため、あるいは引数が文字列に変換されたため)、大文字と小文字を区別しない比較が使用される点を除いて、 equal と同一です。

(error)

error 関数は、 error 関数評価の前に try 関数がない限り、式評価全体が失敗となる「no recovery」エラーを返します。

(if cond [ then else ] )

(if (equali (substring (request option "dhcp-class-identifier") 0 6) "docsis") (request option 82 1)) returns sub-option 1 of option 82 if the first six characters of the dhcp-class-identifier are "docsis" in any case; otherwise returns null

if 関数は、 if-then-else センスで条件式 cond を評価します。 cond がヌル以外の値に評価されると、 then 引数の評価結果を返し、そうでない場合は else 引数の評価結果を返します。 then else は、両方ともオプションの引数です。 then 引数と else 引数を省略すると、関数は cond 引数の評価結果を返します。 else 引数を省略して cond がヌルに評価されると、関数はヌルを返します。3 つの引数のデータタイプに制限はありません。

(ip-string blob )

(ip-string 01:02:03:04) returns "1.2.3.4"

(ip-string -1) returns "255.255.255.255"

(ip-string (as-blob "hello world") returns "104.101.108.108"

ip-string 関数は、4 バイトの IP アドレス blob の文字列表現を “a.b.c.d ” の形式で返します。1 つの引数 blob は、blob に評価されるか blob に変換できる必要があります。blob が 4 バイトを超える場合、関数は最初の 4 バイトだけを使用して IP アドレス文字列を作成します。blob のバイト数が少ない場合、関数は IP アドレス文字列の作成時に一番右のバイトをゼロと見なします。

(ip6-string blob )

(ip-string (as-blob "hello world") returns "6865:6c6c:6f20:776f:726c:6400::"

ip6-string 関数は、16 バイトの IPv6 アドレス blob の文字列表現を、 “a : b : c : d : e : f : g : h ” の形式で返します。1 つの引数 blob は、blob に評価されるか 1 に変換できる必要があります。blob が 16 バイトを超える場合、関数は最初の 16 バイトだけを使用して IPv6 アドレス文字列を作成します。blob のバイト数が少ない場合、関数は IPv6 文字列の作成時に一番右のバイトをゼロと見なします。

(is-string expr )

(is-string 01:02:03:04) returns null

(is-string "hello world") returns "hello world"

(is-string 68:65:6c:6c:6f:20:77:6f:72:6c:64) returns the blob

is-string 関数は、 expr の評価結果が文字列の場合、または文字列として使用できる場合に expr の値を返し、それ以外の場合はヌルを返します。つまり、 as-string がエラーを返さない場合、 is-string expr の値を返します。

(length expr )

(length 1) returns 4

(length 01:02:03) returns 3

(length "hello world") returns 11

length 関数は、値が expr 値のバイト長さである整数を返します。引数 expr は、任意のデータタイプに評価できます。整数は常に 4 バイトの長さです。文字列の長さには、文字列を終了できるゼロ バイトは含まれせん。

(let ( var1 ... varn ) expr1 ... expn )

(let (x) (setq x (substring (request option "dhcp-class-identifier") 0 6)) (if (equali x "docsis") "client-class-1") (if (equali x "something else") "client-class-2"))

let 関数は、ヌル値に初期化されているローカル変数 var1 varn を持つ環境を作成します( setq 関数を使用すれば、変数に他の値を指定できます)。ローカル変数がヌルに初期化されると、関数は式 expr1 exprn を順番に評価します。次に、最後の式 exprn の値を返します。この関数の利点は、値の計算に一度使用してその値をローカル変数に割り当て、値を再計算しないでもう一度他の式で使用できる点です。変数は大文字と小文字を区別します。

(log severity expr )

log 関数は、 expr を文字列に変換した結果を記録します。 severity expr は文字列にする必要があり、文字列に評価されない場合は文字列に変換されます。 severity はヌルにもでき、文字列の場合は次のいずれかの値を持つ必要があります。

"debug"
"activity"(severity がヌルの場合のデフォルト)
"info"
"warning"
"error"


) ロギングはサーバのリソースを大量に消費するため、式に入れる log 関数の評価数を制限します。「error」の severity が記録された場合でも、log 関数はエラーを返しません。この場合、ログ メッセージにエラー表示を付けるだけです。関数による評価の一部としてエラーを返すには、error 関数を参照してください。


 

(mask-blob mask-size length )

(mask-blob 1 4) yields 80:00:00:00

(mask-blob 4 2) yields f0:00

(mask-blob 31 4) yields ff:ff:ff:fe

mask-blob 関数は、blob の高位ビットで始まる長さのマスク mask-size を含む、長さが length である blob を返します。 mask-size は、整数に評価される式か、または整数に変換できる必要があります。また、 length mask-size よりも小さくできませんが、ゼロまたは正にしなければならない点を除いて、規定の限度はありません。 mask-size がゼロ未満の場合、blob の右端から計算されたマスク長さを示します。

(mask-int mask-size )

(mask-int 1) yields 0x80000000

(mask-int 4) yields 0xf0000000

(mask-int 31) yields 0xfffffffe

(mask-int -1) yields 0x00000001

mask-int 関数は、整数の高位ビットで始まる、長さ mask-size ビットの整数マスクを返します。 mask-size は、整数に評価される式か、または整数に変換できる必要があります。32 を超える任意の数字は無意味で、超えた場合は 32 を使用したとして処理されます。 mask-size がゼロ未満の場合、整数の右端から計算されたマスク長さを示します。

(not expr )

(not "hello world") return null

not 関数は、文字列、blob、または整数の式がヌルの場合にヌルではないと評価し、ヌルではない場合にはヌルと評価します。 expr 値がヌルの場合で、返される値がヌルではない場合、2 つを呼び出しても同じ値であることが保証されません。

(null [ expr1 ... exprn ] )

null 関数はヌルを返し、どの引数も評価しません。

(or arg1 ... argn )
(pick-first-value arg1 ... argn )

(or (request option 82 1) (request option 82 2) 01:02:03:04) returns the value of sub-option 1 in option 82, and if that does not exist, returns the value of sub-option 2, and if that does not exist, returns 01:02:03:04

or 関数または pick-first-value 関数は、引数を順番に評価します。 arg の評価でヌルではない値が返されると、この関数はそのヌルではない最初の引数の値を返します。それ以外の場合は、最後の引数 argn の値を返します。データタイプが同じである必要はありません。

(progn arg ... argn )

(progn (log (null) "I was here") (request option 82 1))

progn 関数は引数を順番に評価して、最後の引数 argn の値を返します。

(request [ get | get-blob ] [ relay [ n ]] option opt [{ instance n } | { enterprise-id n } | { vendor string }]
[[ subopt | { option opt }] [{ instance n } | { enterprise-id n } | { vendor string }[[ sub-subopt | { option opt }] [{ instance n } | { enterprise-id n } | { vendor string }][ instance-count | { index n } | count ])

(request option 82) returns the relay-agent-info option as a blob

(request option 82 1) returns just the circuit-id (1) suboption

(request option 82 "circuit-id") is the equivalent

(request option "domain-name-servers") returns the first IP address from the domain-name-servers option

(request option 6 index 0) is the equivalent

(request option 6 count) returns the number of IP addresses

(request get-blob option "dhcp-class-identifier") returns the value as a blob, not a string

(request option "IA-NA" instance 2 option "IAADDR" instance 3) returns the third instance of the IA-NA option, and the fourth instance of the IAADDR option encapsulated in the IA-NA option

(request get-blob option "vendor-opts" enterprise-id 1234) returns a blob of the option data for enterprise-id 1234

(request option "vendor-opts" enterprise-id 1234 3) returns suboption 3 from the requested vendor option data

request option 関数は、パケットからのオプション値を返します。キーワードは次のとおりです。

get :オプション。省略した場合は指定したものと見なされます。

get-blob :データを blob として返し、オプション バイトへの直接アクセスを提供します。

relay :IPv6 パケットにのみ適用され、それ以外の場合はエラーを返します。クライアント オプションではなく、リレー オプションを要求します。 n は、クライアントに n 番目に近いリレー エージェントを示し、省略した場合は、0(クライアントに最も近いリレー エージェント)と見なされます。

option :オプションは opt 引数を使用して指定します。この引数は整数または文字列へ評価される必要があります。どちらにも評価されない場合、関数はこの引数を変換しないでエラーを返します。 opt 指定子の有効な文字列値は、拡張子に使用する値と同じです。

instance :先行するオプションまたはサブオプションの( n +1)番目のインスタンスを選択します。インスタンスは 0 から始まります。

enterprise-id :オプションまたはサブオプションのあとで、しかも DHCPv4 および DHCPv6 の場合に、そのオプションのデータ全体でなく、パケット内の指定された enterprise-id のあとにあるデータ バイトのみを返します。

vendor :オプションまたはサブオプションのあとで、そのオプション内のデータのデコードにベンダーのカスタム オプション定義を使用するよう要求します。DHCPv6 オプションには適用されません。指定されたベンダー文字列の定義が存在しない場合、エラーは発行されず、そのオプションの標準定義が使用される(それもない場合は blob と見なされる)ことに注意してください。

instance-count :先行するオプションまたはサブオプションのインスタンスの数を返し、通常、すべてのインスタンスをループするために使用されます。

index :複数の値を含んでいるオプションの中から( n +1)番目の値を選択します。たとえば、 index 0 は最初の値を返し、 index 1 は 2 番目の値を返します。

count :先行するオプション内の関連するデータ項目の数を返し、通常は index キーワードと一緒に、オプションまたはサブオプションのすべてのデータ値をループするために使用されます。

subopt (サブオプション)指定子に定義される、文字列値だけを持つサブオプション名は、relay-agent-info オプション(82)用です。次の名前があります。

1:"circuit-id"
2:"remote-id"
4:"device-class"
5:"subnet-selection"
6:"subscriber-id"
7:"radius-attributes"(サブサブオプションとして指定できる次のカプセル化されたアトリビュートを含みます。1:"radius-user"、6:"radius-class"、88:"radius-framed-pool-name"、
26:"radius-vendor-specific"、27:"radius-session-timeout"、100:“radius-framed-ipv6-pool”)
8:"authentication"
9:"v-i-vendor-class"
150:"cisco-subnet-selection"
151:"cisco-vpn-id"
152:"cisco-server-id-override"
181:"vpn-id"
182:"server-id-override"

request option 関数は、要求されたオプションによって異なるデータタイプの値を返します。表のデータタイプが request 関数の返すデータタイプとどのように対応するかを次に示します。

blob -> blob
IP アドレス -> 4 バイトの blob
文字列 -> 文字列
8 ビットの符号なし整数 -> uint
16 ビットの符号なし整数 -> uint
32 ビットの符号なし整数 -> uint
整数 -> sint
バイト値ブール -> true ならば sint=1、false ならばヌル

(request [ get | get-blob ] [ relay [ number ]] packetfield )

(request get ciaddr) returns the ciaddr if it exists, otherwise returns null

(request ciaddr) is the same as (request get ciaddr)

(request giaddr)

packetfield の有効値:

op (blob 1)

htype (blob 1)

hlen (blob 1)

hops (blob 1)

xid (uint)

secs (uint)

flags (uint)

ciaddr (blob 4)

yiaddr (blob 4)

siaddr (blob 4)

giaddr (blob 4)

chaddr (blob hlen

sname (文字列)

file (文字列)

DHCPv6 packetfield の有効値:

msg-type (uint)

msg-type-name
(文字列)

xid (uint)

relay-count (uint)

hop-count (uint)

link-address (blob 16)

peer-address (blob 16)

request packetfield 関数は、要求パケットの名前付きフィールド値を返します。DHCP 要求パケットには、オプション エリアのオプションと同様に名前付きフィールドが含まれています。この形式の request 関数を使用して、要求パケットから特定の名前付きフィールドを取得します。 relay キーワードについては、より一般的な request 関数の項に説明があります。

RFC 2131 で定義された packetfield 値のリストは左側にあります。要求される可能性のある packetfield 値の中には、未加工の DHCP パケットでこのとおりに表示されないものもあります。これらはパケットに表示されるデータを取得して一般的な方法で結合します。こうした説明で想定しているパケットの内容は次のとおりです。

hlen = 1
htype = 6
chaddr = 01:02:03:04:05:06

macaddress-string (文字列): hlen , htype , chaddr 形式で MAC アドレスを返します(たとえば “1,6,01:02:03:04:05:06” など)。

macaddress-blob (blob): hlen : htype : chaddr 形式で MAC アドレスを返します(たとえば 01:06:01:02:03:04:05:06 など)。

macaddress-clientid (blob):Microsoft htype : chaddr client-id 形式で MAC アドレスから作成された client-id を返します(たとえば 01:01:02:03:04:05:06 など)。

DHCPv6 の msg-type パケット フィールドは、現在のリレーまたはクライアント メッセージ タイプを記述し、次の値を持ちます。

1=SOLICIT、2=ADVERTISE、3=REQUEST、4=CONFIRM、5=RENEW、6=REBIND、8=RELEASE、9=-DECLINE、11=INFORMATION-REQUEST、12=RELAY-FORWARD

msg-type-name パケット フィールドは、メッセージ タイプ名の文字列を返します。その文字列値は、たとえば SOLICIT のように常に大文字になります。

xid は 24 ビットのクライアント トランザクション ID で、 relay-count は要求内のリレー メッセージの数です。

DHCPv4 パケットから DHCPv6 パケット フィールドが要求された場合は、エラーが返されます。その逆も同じです。

(request dump)

request dump 関数は、式の評価後に現在の要求パケットをログ ファイルにダンプします。すべての式評価で dump キーワードをサポートしているわけではありません。ただし、サポートされていない場合は無視されます。

(search arg1 arg2 fromend )

(search "test" "this is a test") returns 9

(search "test" "this test test test" "true") returns 15

search 関数は、 arg2 の中で arg1 に正確に一致するサブシーケンスを検索します。見つかった場合は、そのサブシーケンスが始まる arg2 内の要素のインデックスを返します( fromend 引数を使用した場合を除く)。見つからなければヌルを返します。 arg1 がヌルの場合は 0 を返し、 arg2 がヌルの場合はヌルを返します。この関数は、両方の引数に対して暗黙の as-blob 変換を行います。したがって、この関数は文字列および blob の実際のバイト シーケンスを比較し、sint および uint は比較できるよう 4 バイトの blob になります。

ヌルでない fromend 引数は、最も右側にある一致するサブシーケンスの、最も左側の要素のインデックスを返します。

(setq var expr )

see the let function for examples

setq 関数は、 var expr の値に設定します。この関数の前に let 関数を指定する必要があります。

(starts-with expr prefix-expr )

(starts-with "abcdefghijklmnop" "abc") returns "abcdefghijklmnop"

(starts-with "abcdefgji" "bcd") returns null

(starts-with 01:02:03:04:05:06 01:02:03) returns 01:02:03:04:05:06

(starts-with "abcd" (as-string 61:62)) returns "abcd"

(starts-with "abcd" 61:62) returns null

(starts-with "abcd" (to-string 61:62)) returns null

starts-with 関数は、 prefix-expr 値が expr の最初と一致する場合に expr の値を返し、一致しない場合はヌルを返します。 prefix-expr expr より長い場合は、ヌルを返します。この関数は、 prefix-expr expr と同じデータタイプ(文字列または blob)に変換できない場合、または expr が整数に評価される場合に、エラーを返します(表24-2を参照)。

(substring expr offset len )

(substring "abcdefg" 0 6) returns bcdefg

(substring 01:02:03:04:05:06 3 2) returns 04:05

substring 関数は、 offset で始まる式 expr len バイトを返します。 expr には、文字列または blob を指定でき、整数の場合は blob に変換されます。結果は文字列か blob、またはヌルに評価された引数があればヌルとなります。 offset が長さ len より大きい場合、結果はヌルになります。 offset len を加えた値が expr の終わりより先のデータになると、関数は expr 内の残りのデータを返します。 offset がゼロ未満の場合、offset はデータの終わりからとなります(最後の文字は index -1 です。-0=0 となるためで、これは最初の文字を参照します)。これがデータの始まりより先のデータを参照する場合、offset はゼロであると見なされます。

(to-blob expr )

(to-blob 1) returns 00:00:00:01

(to-blob "01:02") returns 01:02

(to-blob 02:03) returns 02:03

(to-blob "this is not in blob format") return an error

to-blob 関数は、式を blob に変換します。 expr は、文字列に評価される場合、「 nn : nn : nn 」形式である必要があります。この関数は、文字列を blob へ変換した結果の blob を返します。関数が文字列を blob に変換できない場合は、エラーを返します。 expr が blob に評価されると、その blob を返します。 expr が整数に評価されると、その整数バイトを表す 4 バイトの blob をネットワークの順番に返します(表24-2を参照)。

(to-lower expr )

 

to-lower 関数は、文字列を取得し、小文字でその文字列を生成します。 client-lookup-id アトリビュートを使用して、MCD ローカル ストアでクライアント エントリを検索するクライアント指定子を算出している場合(LDAP とは対照的に)、取得する文字列は小文字である必要があります。この関数を使用すると、簡単に client-lookup-id の結果を小文字の文字列にすることができます。 client-lookup-id を使用して LDAP にアクセスする場合は、この関数を使用しなくてもかまいません。

(to-sint expr )

(to-sint "1") returns 1

(to-sint -1) returns -1

(to-sint 00:02) returns 2

(to-sint "00:02") returns an error

(to-sint "4294967295") returns an error

to-sint 関数は、式を符号付き整数に変換します。 expr が文字列に評価される場合、符号付き整数に変換できる形式である必要があり、その形式でない場合はエラーを返します。 expr が 1 ~ 4 バイトの blob に評価されると、符号付き整数としてその値を返します。 expr が 4 バイトより大きい blob に評価されると、エラーを返します。 expr が符号なし整数に評価されると、符号なし整数の値が最大の正の符号付き整数より大きくない場合は、同じ値の符号付き整数を返します。大きい場合は、エラーを返します。 expr が符号付き整数に評価されると、その値を返します(表24-2を参照)。

(to-uint expr )

(to-uint "1") returns 1

(to-uint 00:02) returns 2

(to-uint "4294967295") returns 4294967295

(to-uint "00:02") returns an error

(to-uint -1) returns an error

to-uint 関数は、式を符号なし整数に変換します。 expr が文字列に評価される場合、符号なし整数に変換できる形式である必要があり、その形式でない場合はエラーを返します。 expr が 1 ~ 4 バイトの blob に評価されると、符号なし整数としてその値を返します。 expr が 4 バイトより大きい blob に評価されると、エラーを返します。 expr が符号付き整数に評価されると、符号付き整数の値がゼロ未満でなければ、同じ値の符号なし整数を返します。ゼロ未満の場合はエラーを返します。 expr が符号なし整数に評価されると、その値を返します(表24-2を参照)。

(to-string expr )

(to-string "hello world") returns “hello world”

(to-string -1) returns “-1”

(to-string 02:04:06) returns “02:04:06”

to-string 関数は、式を文字列に変換します。 expr が文字列に評価されるとその値を返し、blob または整数に評価されるとその印刷可能表現を返します。 expr 自体がエラーを出さずに評価されると、この関数がエラーを返すことはありません。どの値にも印刷可能表現があるからです(表24-2を参照)。

(try expr failure-expr )

(try (try ( expr ) ( complex-failure-expr )) " string-constant " ensures that the outer try never returns an error (because evaluating " string-constant " cannot fail).

(try (error) 01:02:03) always returns 01:02:03

(try 1 01:02:03) always returns 1

(try (request option 82) "failure") never returns "failure" because (request option 82) turns null if there is no option-82 in the packet and does not return an error

(try (request option "junk") "failure") returns "failure" because "junk" is not a valid option-name.

try 関数は、 expr を評価し、評価中に発生したエラーがなかった場合、その評価結果を返します。 expr の評価中にエラーが発生した場合は、次のようになります。

failure-expr が指定されていて、この関数がエラーを出さずに評価した場合は、 try 関数の結果としてその評価結果を返します。

failure-expr が指定されていて、 failure-expr の評価中にエラーが発生した場合は、エラーを返します。

failure-expr が指定されていない場合、 try 関数はヌルを返します。

(+ arg1 ... argn )
(- arg1 ... argn )
( * arg1 ... argn )
(/ arg1 ... argn )

(+ 1 2 3 4) returns 10

(- 10 5 2) returns 3

(* 3 4 5) returns 60

(/ 20 2 5) returns 2

(/ 20 0) returns an error

これらの関数は、符号付き整数または符号付き整数への変換が可能な式で算術演算を実行します。符号付き整数(ヌル以外)に変換できない引数があれば、エラーを返します。ヌルに評価された引数は無視されます(ただし、- および / の最初の引数はヌルに評価されないようにしてください)。これらの関数は必ず符号付き整数を返します(オーバーフローとアンダーフローは、現在のところ考慮されていません)。

+ は引数を合計します。引数がない場合、結果は 0 です。

- は 1 つの引数の値を否定します。または、引数が複数ある場合は、1 番目の引数から残りの引数の値を続けて減算します。たとえば、 (- 3 4 5) は -6 になります。

* は引数値の積を取得します。引数がない場合、結果は 1 です。

/ は、1 番目の引数を他のすべての引数で除算します。たとえば、 (/ 100 4 5) は 5 になります。1 番目以外のいずれかの引数が 0 の場合は、エラーが返ります。

データタイプの変換

関数が特定データタイプの引数を必要とする場合、値をそのデータタイプに変換しようとします。これは失敗することもあり、多くの場合はその関数全体が失敗します。データタイプの変換は、 to-string 関数、 to-blob 関数、 to-sint 関数、および to-uint 関数によっても実行されます。関数が特定データタイプの引数を必要とする場合は、必ずこうした外部的に使用可能な関数の内部版を呼び出します。

また、 as-string as-blob as-sint 、および as-uint という変換関数もあり、その場合、何らかのチェックは行われますが、値のデータは単に求めるデータタイプに改称されます。両方の関数セットの変換マトリクスを 表24-2 に示します。

 

表24-2 データタイプ変換関数

引数タイプ:
関数:
文字列
Blob
符号付き整数
符号なし整数

to-string

失敗なし。

失敗なし。

失敗なし。

as-string

印刷可能な文字であれば、文字列バイトに変更されます。

4 バイトの blob に変換してから、blob として処理します(いくつかの特殊な整数を除いて失敗します)。

4 バイトの blob に変換してから、blob として処理します(いくつかの特殊な整数を除いて失敗します)。

to-blob

「01:02:03」の形式であることが必要です。

失敗なし。4 バイトの整数から 4 バイトの blob を生成します。

失敗なし。4 バイトの整数から 4 バイトの blob を生成します。

as-blob

失敗なし。ASCII 文字を blob バイトに変更します。

失敗なし。
4 バイトの整数から 4 バイトの blob を生成します。

失敗なし。
4 バイトの整数から 4 バイトの blob を生成します。

to-sint

n または - n の形式であることが必要です。

1、2、3、または 4 バイトの blob のみ。

あまり大きくなく符号付き整数に収まる場合だけ変換します。

as-sint

通常は非実用的。1、2、3、または 4 バイトの文字列を blob に変換し、符号付き整数にパックします。

通常は非実用的。1、2、3、または 4 バイトの blob だけを変換します。

失敗なし。符号付き整数に変換し、より大きな符号なし長精度整数が正の符号付き整数に収まった場合には負となります。

to-uint

n の形式であることが必要です。

1、2、3、または 4 バイトの blob のみ。

負ではない場合のみ。

as-uint

通常は非実用的。1、2、3、または 4 バイトの文字列を blob に変換した後、符号付き整数に変換します。

通常は非実用的。1、2、3、または 4 バイトの blob だけを変換します。

失敗なし。符号なし整数に変換し、負の符号付き整数は符号なし長精度整数になります。

CLI における式

CLI アトリビュート設定で式を組み込む場合は、テキスト ファイルに式を入れる必要があります。このファイルのデフォルト パスは、現在作業中のディレクトリです。式は引用符で囲まないでください。先頭に # // 、または ; を付けてコメント行を追加できます。次の例を参考にしてください。

// Expression to set client-class based on remote-id
(if (equal (request option "relay-agent-info" "remote-id") (request chaddr))
"no-limit" "limit")
 

コマンドの処理時にファイルが読み取られます。このファイルを組み込むコマンドの例を次に示します。

nrcmd> dhcp set client-class-lookup-id=@expressionfile1.txt

式の例

これらの例では、オプション 82 処理を最大限サポートします。この例では、制限するクライアント、制限しないクライアント、および設定限度を超えるクライアントを設定し、over-limit クライアントクラスに割り当てる必要があります。3 つのクライアントクラスごとに、次の別個のスコープおよびスコープ選択タグがあります。

クライアントクラス:limit、no-limit、および over-limit。

スコープ:サブネットから名前が付けられた 10.0.1.0(プライマリ)、10.0.2.0 および 10.0.3.0(セカンダリ)。

スコープ選択タグ:limit-tag、no-limit-tag、および over-limit-tag。スコープは、スコープが表すアドレス プールから名前が付けられています。選択タグは、limit-tag を取得する 10.0.1.0、no-limit-tag を取得する 10.0.2.0、および over-limit-tag を取得する 10.0.3.0 を持つスコープに割り振られます。

制限例 1:DOCSIS ケーブル モデム

このテストでは、デバイスが DOCSIS ケーブル モデムかどうかの判定、および各ケーブル モデムの先にある顧客デバイス数の制限を行います。limit クライアントクラスの制限 ID はケーブル モデムの MAC アドレスで、これは relay-agent-info オプションの remote-id サブオプションに含まれています。

サーバの client-class-lookup-id アトリビュートに対する式は、次のとおりです。

// Expression to set client-class to no-limit or limit based on remote-id
(if (equal (request option "relay-agent-info" "remote-id")
(request chaddr))
"no-limit"
"limit")
 

この式では、 relay-agent-info オプションの remote-id サブオプション(2)の内容がパケットの chaddr と同じ場合は、クライアントクラスが no-limit になり、異なる場合は limit になるということを示しています。

limit クライアントクラスの limitation-id 式は、次のとおりです。

(request option "relay-agent-info" "remote-id")
 

次の手順では、この式を使用してください。


ステップ 1 スコープ選択タグを定義します(Network Registrar 6.0 または 6.1 の場合、この定義は不要です)。

ステップ 2 クライアントクラスを定義します。

ステップ 3 スコープ、その範囲、およびタグを定義し、プライマリかセカンダリかを定義します。各スコープのホスト範囲に注意します。すべてのスコープで同じホスト番号を持つ場合より、この範囲を読み違える可能性は低くなっています。

ステップ 4 制限カウントを定義します。これは default ポリシーに入れることができます。要求で制限 ID が示されていない場合、カウントは確認されません。

ステップ 5 式ファイル cclookup1.txt に式を追加します。

// Expression to set limitation count based on remote-id
(if (equal (request option "relay-agent-info" "remote-id")
(request chaddr)) "no-limit" "limit")
 

ステップ 6 サーバ レベルで client-class lookup-id アトリビュートを設定する際に、式ファイルを参照します。

ステップ 7 クライアントの制限 ID 用に、別の式を cclimit1.txt ファイルに追加します。

// Expression to set limitation ID based on remote-id
(request option "relay-agent-info" "remote-id")
 

ステップ 8 クライアントクラスの limitation-id アトリビュートを設定する際に、この式ファイルを参照します。

ステップ 9 サーバをリロードします。


 

以前は未使用だった設定に対してこの手順を実行した場合、一般的な remote-id オプション 82 のサブオプション値を持つ最初の 2 つの DHCP クライアントは limit クライアントクラスに配置されます。同じ値を持つ 3 番目のクライアントは、 over-limit クライアントクラスに配置されます。クライアントクラスには制限 ID が設定されていないため、加入者が no-limit クライアントクラスの中に持つことができるデバイスの数に制限はありません。 remote-id サブオプションの値と等しい MAC アドレスを持つデバイスは、制限のために無視され、制限 ID が設定されていない no-limit クライアントクラスに入れられます。

制限例 2:拡張 DOCSIS ケーブル モデム

これは、「制限例 1:DOCSIS ケーブル モデム」で説明した例を拡張した例です。後の例ですべてのケーブル モデムは、モデムより先のクライアント デバイスを 2 つだけ許可されました。これは、 default ポリシーで制限カウントが 2 として定義されたためです。この例では、 limit-tag スコープ選択タグを使用するスコープから、さまざまな数のデバイスに IP アドレスを付与できるように、特定のケーブル モデムを設定します。

この場合、アドレスを 3 つ以上持つケーブル モデムをクライアントクラス データベースで明示的に設定する必要があります。それには、クライアントクラス処理をサーバ全体でイネーブルにする必要があり、それによって Network Registrar または LDAP データベースでケーブル モデムのクライアント エントリを検索できるようになります。ケーブル モデムでデバイス数を 2 に制限しているのではなく、ケーブル モデムに設定されたポリシーの制限カウントを使用していることがわかります。

この例では、5 つのデバイスを許可する 1 つの追加ポリシー five だけが必要です。


ステップ 1 サーバ全体でクライアントクラス処理をイネーブルにします。

ステップ 2 制限カウントをデバイス 5 つに設定した five ポリシーを作成します。

ステップ 3 前の例と同じように、式を使用して制限 ID を limit クライアントクラスに設定します。制限 ID を cclimit2.txt ファイルに入れ、検索 ID を cclookup2.txt ファイルに入れます。

cclimit2.txt file:
// Expression to set limitation ID
(request option "relay-agent-info" "remote-id")
 
cclookup2.txt file:
// Expression to set client-class lookup ID
(concat "1,6," (to-string (request option "relay-agent-info" "remote-id")))
 

ステップ 4 該当するアトリビュートの設定時に、これらのファイルを参照します。

ステップ 5 いくつかのケーブル モデム クライアントを定義し、 five ポリシーを適用します。

ステップ 6 サーバをリロードします。


 

制限例 3:非同期転送モードによる DSL

この例では、式を使用して、Asynchronous Transfer Mode(ATM:非同期転送モード)Routed Bridge Encapsulation(RBE)を使用するサービス プロバイダーへの、加入者の Digital Subscriber Line(DSL:デジタル加入者線)アクセスを設定する方法について示します。サービス プロバイダーは、DSL 加入者の設定に ATM RBE をますます使用するようになっています。RBE 機能に対する DHCP オプション 82 のサポート(Cisco IOS Release 12.2(2)T から)によって、こうしたサービス プロバイダーは DHCP を使用して IP アドレスを割り当て、オプション 82 を使用してセキュリティおよび IP アドレス割り当てポリシーを実装できます。

この例で DSL 加入者は、シスコ 7401ASR ルータ上で個々の ATM サブインターフェイスとして識別されます。各カスタマーはルータ内に各自のサブインターフェイスを持ち、各サブインターフェイスは各自の Virtual Channel Identifier(VCI:仮想チャネル識別子)と Virtual Path Identifier(VPI:仮想パス識別子)を持ち、これによって ATM スイッチを通過しながら ATM セルの次の宛先を識別します。7401ASR ルータは、シスコ 7206 ゲートウェイ ルータまでルーティングします。


ステップ 1 IOS を使用して DHCP サーバおよびルータのインターフェイスを設定します。これは、標準的な IOS コンフィギュレーションです。

Router#ip dhcp-server 170.16.1.2
Router#interface Loopback0
Loopback0(config)#ip address 11.1.1.129 255.255.255.192
Loopback0(config)#exit
Router#interface ATM4/0
ATM4/0(config)#no ip address
ATM4/0(config)#exit
Router#interface ATM4/0.1 point-to-point
ATM4/0.1(config)#ip unnumbered Loopback0
ATM4/0.1(config)#ip helper-address 170.16.1.2
ATM4/0.1(config)#atm route-bridged ip
ATM4/0.1(config)#pvc 88/800
ATM4/0.1(config)#encapsulation aal5snap
ATM4/0.1(config)#exit
Router#interface Ethernet5/1
Ethernet5/1(config)#ip address 170.16.1.1 255.255.0.0
Ethernet5/1(config)#exit
Router#router eigrp 100
eigrp(config)#network 11.0.0.0
eigrp(config)#network 170.16.0.0
eigrp(config)#exit

ステップ 2 IOS で、Cisco IOS DHCP サーバに対して転送された BOOTREQUEST メッセージに、DHCP オプション 82 データをシステムが挿入できるようにします。

Router#ip dhcp relay information option
 

ステップ 3 IOS で、オプション 82 remote-id サブオプション(2)を使用して DHCP サーバに送信された DHCP リレー エージェントでループバック インターフェイスの IP アドレスを指定します。

Router#rbe nasip Loopback0
 

ステップ 4 Network Registrar で、サーバ全体にクライアントクラス処理をイネーブルにします。

ステップ 5 制限カウントをデバイス 1 つに設定した one ポリシーを作成します。

ステップ 6 正しいクライアントクラスにパケットを入れます。すべてのパケットは limit クライアントクラスにある必要があります。 limit 値だけを含むルックアップ ファイルを作成し、クライアントクラスの検索 ID を設定します。cclookup3.txt ファイル内は次のとおりです。

// Sets client-class to limit
"limit"
 

ステップ 7 式を使用して、制限されたパケットが正しい制限 ID を持つようにします。式をファイルに入れ、そのファイルを参照して制限 ID を設定します。 substring 関数はオプション 82、サブオプション 2( remote-id )データ フィールドのバイト 10 ~ 12 を抽出して、VPI/VCI を取得します。cclimit3.txt ファイル内は次のとおりです。

// Sets limitation ID
(substring (request option 82 2) 9 3)
 

ステップ 8 サーバをリロードします。


 

式のデバッグ

式に問題がある場合、サーバ始動時に DHCP ログ ファイルを調べます。式は関数のネストが明確になるように出力され、意図したことを確認するのに役立ちます。 equal 関数および引数のデータタイプ変換には、特に注意してください。引数のデータタイプが異なる場合は、 to-string 関数に似たコードを使用して引数が文字列に変換されます。

DHCP サーバの expression-trace-level アトリビュートを使用して、式にさまざまなデバッグ レベルを設定できます。実行されたすべての式は、アトリビュートによって設定された程度でトレースされます。最高位のトレース レベルは 10 です。レベルを少なくとも 2 に設定すると、機能していない式があればレベル 10 で再試行されます。

expression-trace-level のトレース レベル(数値を使用)

0 :トレースなし

1 :失敗( (try ... で保護されたものを含む)

2 :失敗の合計再試行数(再試行の場合は、トレース レベル = 6)

3 :関数の呼び出しと戻り

4 :評価された関数引数

5 :関数引数の出力

6 :データタイプ変換(すべて)

expression-configuration-trace-level のトレース レベル(数値を使用)

0 :追加トレースなし

1 :追加トレースなし

2 :失敗の再試行(デフォルト)

3 :関数定義

4 :関数引数

5 :変数ルックアップとリテラル詳細

6 :すべて

設定に問題のあった式をトレースするために、1 ~ 10 のどのレベルにも設定できる
expression-configuration-trace-level
というアトリビュートもあります。このレベルを少なくとも 2 に設定すると、設定されなかった式はレベルを 6 に設定して再試行されます。番号付けのギャップは、将来のレベルの追加に対応するためです。