EN JA
INET6_OPT_INIT(3)
INET6_OPT_INIT(3) FreeBSD Library Functions Manual INET6_OPT_INIT(3)

名称

inet6_opt_init, inet6_opt_append, inet6_opt_finish, inet6_opt_set_val, inet6_opt_next, inet6_opt_find, inet6_opt_get_valIPv6 中継点ごとと宛先 (終点) オプション操作

書式

#include < netinet/in.h>

int
inet6_opt_init( void *extbuf, socklen_t extlen);

int
inet6_opt_append( void *extbuf, socklen_t extlen, int offset, u_int8_t type, socklen_t len, u_int8_t align, void **databufp);

int
inet6_opt_finish( void *extbuf, socklen_t extlen, int offset);

int
inet6_opt_set_val( void *databuf, int offset, void *val, socklen_t vallen);

int
inet6_opt_next( void *extbuf, socklen_t extlen, int offset, u_int8_t *typep, socklen_t *lenp, void **databufp);

int
inet6_opt_find( void *extbuf, socklen_t extlen, int offset, u_int8_t type, socklen_t *lenp, void **databufp);

int
inet6_opt_get_val( void *databuf, int offset, void *val, socklen_t vallen);

解説

中継点ごとと宛先 (終点) オプションを構築して、解析することは複雑です。高度なソケット API は、アプリケーションが中継点ごとと宛先 (終点) オプションを作成して、操作するのを助けるために 1 組の関数を定義しています。このマニュアルページは IETF 草稿 RFC3542 で指定された関数について説明しています。これらの関数は RFC2460 の Appendix B で指定された書式化規則を使用します、すなわち、最も大きなフィールドがオプションの最後に置かれるということです。これらの関数のための関数プロトタイプは < netinet/in.h> ヘッダファイルにすべて含まれています。

inet6_opt_init

inet6_opt_init() 関数はオプションなしで 1 つの空の拡張ヘッダに必要であるバイト数を返します。また、 extbuf 引数がメモリの有効なセクションを指すなら、 inet6_opt_init() 関数は拡張ヘッダの長さのフィールドを初期化します。 extbuf 引数で渡された拡張バッファを初期化することを試みるとき、 extlen は 8 の正の倍数でなければならないか、あるいは関数は失敗して、-1 を呼び出し側に返します。

inet6_opt_append

inet6_opt_append() 関数は 2 つの異なったジョブを実行できます。有効な extbuf 引数が供給されるとき、 databufp で新たに作成されたオプションへのポインタと同様に拡張バッファへのポインタを追加して、更新された合計の長さを返します。 extbuf の値が NULL であるなら、 inet6_opt_append() 関数は、オプションが実際に追加されたなら、合計の長さがどうなったか報告するだけです。 lenalign 引数はオプションを追加するとき使用しなければならないオプションの長さと要求されたデータ整列の長さを指定します。 offset 引数は inet6_opt_init() 関数か、または前の inet6_opt_append() の呼び出しによってに返された長さであるべきです。

type 引数は 8 ビットのオプションタイプです。

inet6_opt_append() が呼び出された後に、アプリケーションは直接 databufp によって指されたバッファを使用するか、またはオプションに含まれるデータを指定するために inet6_opt_set_val() を使用することができます。

01 のオプションタイプは Pad1PadN オプションのために予約されています。 2 から 255 の他のすべての値がアプリケーションで使用されるかもしれません。

オプションデータの長さは、8 ビット値で含まれているので、0 から 255 までどんな値も含むことができます。

align パラメータは、1、2、4 または 8 の値を持たなければならなくて、 len の値を超えることができません。整列値は整列でなく、それぞれ 16 ビット、32 ビット、および 64 ビットの整列を表します。

inet6_opt_finish

inet6_opt_finish() 関数は、IPv6 拡張ヘッダ仕様の定めるところにより拡張ヘッダを 8 バイトの倍数にするのに必要な最終的な詰め物について計算して、拡張ヘッダの更新された合計の長さを返します。 offset 引数は inet6_opt_init() か inet6_opt_append() によって返された長さであるべきです。また、 extbufNULL でないときに、関数は適切な長さの Pad1 か PadN オプションを挿入することによって適切な詰め物のバイトを設定します。

拡張ヘッダが適切な詰め物を含むことができないくらい小さいなら、-1 のエラーが呼び出し側に返されます。

inet6_opt_set_val

inet6_opt_set_val() 関数は様々なサイズのデータ項目をオプションのデータ部分に挿入します。 databuf 引数は inet6_opt_append() 呼び出しによって返されたメモリへのポインタです、そして、 offset 引数はオプションがデータバッファのどこに置かれるべきであるかを指定します。 val 引数は拡張ヘッダに挿入されるデータを含むメモリの領域を指します、そして、 vallen 引数はどのくらい多くのデータをコピーするかを示します。

呼び出し側は、各フィールドが RFC2460 の Appendix B で説明されるように自然な境界で整列されることを保証するべきです。

関数は offset + vallen として計算され、複数のフィールドでオプションを構成するとき使用される次のフィールドのためのオフセットを返します。

inet6_opt_next

inet6_opt_next() 関数は受信された拡張ヘッダを解析します。 extbufextlen 引数は解析される拡張ヘッダの位置と長さを指定します。 offset 引数は、最初のオプションのためなら 0、または inet6_opt_next() か inet6_opt_find() への前の呼び出しによって返された長さの値のいずれかであるべきです。返された値は拡張バッファをスキャンし続けてどこを置くかを指定します。オプションは、それぞれ 8 ビットのオプションタイプ、8 ビットのオプションの長さおよびオプションデータを指す、引数 typep, lenpdatabufp に返されます。この関数は PAD1 または PADN オプションのいずれも返しません。エラーが発生するか、またはそれ以上のオプションがないとき、返り値は-1 です。

inet6_opt_find

inet6_opt_find() 関数は type 引数を通して渡される特定のオプションタイプで拡張バッファを捜します。オプションが見つけられるなら、 lenpdatabufp 引数はそれぞれオプションの長さとデータを指すために更新されます。 extbufextlen 引数は、有効な拡張バッファを指して、その長さを与えなければなりません。 offset 引数は拡張ヘッダでどこの位置から探すかに使用することができます。

inet6_opt_get_val

inet6_opt_get_val() 関数はオプションのデータ部分で様々なサイズのデータ項目を抽出します。 databufinet6_opt_next() か inet6_opt_find() 関数によって返されたポインタです。 val 引数はデータが抽出されるところに指します。 offset 引数はオプションのデータ部分で、値が抽出されるべきである場所を指定します。オプションデータの最初のバイトは 0 のオフセットで指定されます。

各フィールドは RFC2460 の Appendix B で説明されるように自然な境界で整列されると期待されます。

関数は、複数のフィールドでオプションの内容を抽出するとき使用される offset + vallen を計算することによって、次のフィールドのためのオフセットを返します。頑強な受信側は、この関数を呼び出す前に、整列されているか検証しなければなりません。

戻り値

すべての関数はエラーの場合に-1 を返します。

使用例

RFC3542 ではセクション 23 で総合的な例を与えます。

また、KAME はキットの advapitest ディレクトリで例を提供しています。

関連項目

W. Stevens, M. Thomas, E. Nordmark, and T. Jinmei, Advanced Sockets API for IPv6, RFC3542, October 2002. S. Deering and R. Hinden, Internet Protocol, Version 6 (IPv6) Specification, RFC2460, December 1998.

規格

関数は、“Advanced Sockets API for IPv6” (RFC3542) で文書化されています。

歴史

実装は、KAME アドバンストネットワーキングキットではじめて登場しました。
December 23, 2004 FreeBSD