INET6_RTH_SPACE(3) | FreeBSD Library Functions Manual | INET6_RTH_SPACE(3) |
名称
inet6_rth_space, inet6_rth_init, inet6_rth_add, inet6_rth_reverse, inet6_rth_segments, inet6_rth_getaddr — IPv6 ルーティング (経路制御) ヘッダオプション操作書式
#include < netinet/in.h> socklen_t
inet6_rth_space( int, int);
void *
inet6_rth_init( void *, socklen_t, int, int);
int
inet6_rth_add( void *, const struct in6_addr *);
int
inet6_rth_reverse( const void *, void *);
int
inet6_rth_segments( const void *);
struct in6_addr *
inet6_rth_getaddr( const void *, int);
解説
IPv6 アドバンスト API、RFC 3542、は IPv6 ルーティング (経路制御) ヘッダを構築して調査するためにアプリケーションを呼び出す関数を定義しています。ルーティングヘッダは、IPv6 ネットワークで指定経路制御を実行するために使用されます。 RFC は、アドレスを記述するために単語“セグメント”を使用します、また、ここで使用される用語です。すべての関数は < netinet/in.h> ヘッダファイルで定義されます。このマニュアルページに記述された関数は、すべて < netinet/ip6.h> で定義されるルーティングヘッダ構造を操作しますが、この API の外側で使用され変更する必要はないはずです。ルートヘッダ構造の大きさと形は、変化するかもしれないので、 API を使用することは、より移植性があり、長い期間使用できる、解決法です。API の関数は、2 つのグループに分けられます、ルーティングヘッダを構築するものと、受信されたルーティングヘッダを解析するものです。構築関数のあとに続いて解析関数を説明します。
inet6_rth_space
inet6_rth_space() 関数は type 引数で指定され、 segments 引数で指定されたアドレスの数を含む、タイプのルーティングヘッダを保持するために必要なバイト数を返します。タイプが IPV6_RTHDR_TYPE_0 であるとき、セグメントの数は、0 から 127 でなければなりません。タイプ IPV6_RTHDR_TYPE_2 のルーティングヘッダは、1 つのセグメントだけを含み、モバイル IPv6 で使用されるだけです。この関数からの返り値は、ルーティングヘッダを格納するために必要なバイト数です。値 0 が返されたなら、ルートヘッダタイプが認識されないか、または別のエラーが発生しました。inet6_rth_init
inet6_rth_init() 関数は、 bp によって指された前もって割り付けられたバッファを初期化します。 bp_len 引数は、バッファが十分大きいことを確かめるために使用されます。呼び出し側は、bp によって指されたバッファを割り付けなければなりません。前のセクションで説明された inet6_rth_space() を呼び出すことによって、必要なバッファサイズは、決定されるべきです。inet6_rth_init() 関数は、成功すれば bp へのポインタを返し、エラーがあるとき、 NULL を返します。
inet6_rth_add
inet6_rth_add() 関数は addr によって指された IPv6 アドレスを構築されているルーティングヘッダの終りに追加します。追加が成功すれば関数は、0 を返し、そうでなければ-1 を返します。
inet6_rth_reverse
inet6_rth_reverse() 関数は、引数 in によって指されたルーティングヘッダを取り、 out によって指された引数に新しいルーティングヘッダを書き込みます。ルーティングヘッダは、そのまま、そのルートの逆に沿ってデータグラムを送信します。両方の引数は、反転が適当な位置に起こることに意味がある同じバッファを指すことができます。関数の返り値は、成功すれば 0 で、エラーがあれば-1 です。
関数の次の組は、アプリケーションが解析したいルーティングヘッダを操作します。普通の場合では、そのようなルーティングヘッダは、ネットワークから受信されますが、また、これらの関数は、アプリケーション自体が作成したルーティングヘッダで使用することができます。
inet6_rth_segments
inet6_rth_segments() 関数は bp によって指されたルーティングヘッダに含まれるセグメントの数を返します。返り値は、ルーティングヘッダに含まれたセグメントの数であるか、またはエラーが起こるなら-1 です。ルーティングヘッダが 0 個のセグメントを含むかもしれないので、 0 が返されることは、エラーではありません。inet6_rth_getaddr
inet6_rth_getaddr() 関数は、ルーティングヘッダからただ一つのアドレスを検索するために使用されます。 index は、アプリケーションがアドレスを検索したいルーティングヘッダの位置です。 index パラメータは、0 からルーティングヘッダに存在するセグメントの数より小さい値でなければなりません。最後のセクションに記述された inet6_rth_segments() 関数は、ルーティングヘッダのセグメントの総数を決定するために使用されるべきです。 inet6_rth_getaddr() 関数は、成功すれば IPv6 アドレスへのポインタを返すか、エラーが発生したとき、 NULL を返します。使用例
RFC 3542 は、セクション 21、付録 B で大規模な例を与えています。また、KAME は、キットの advapitest (訳注、意味不明) なディレクトリの例を提供します。
診断
inet6_rth_space() と inet6_rth_getaddr() 関数は、エラーのときに 0 を返します。inet6_rthdr_init() 関数は、エラーのときに NULL を返します。 inet6_rth_add() と inet6_rth_reverse() 関数は、成功すれば 0 を返し、エラーのときに-1 を返します。
関連項目
W. Stevens, M. Thomas, E. Nordmark, and T. Jinmei, Advanced Sockets API for IPv6, RFC 3542, May 2003. S. Deering and R. Hinden, Internet Protocol, Version 6 (IPv6) Specification, RFC2460, December 1998.歴史
この実装は、KAME アドバンストネットワーキングキットではじめて登場しました。December 24, 2004 | FreeBSD |