EN JA
RTALLOC(9)
RTALLOC(9) FreeBSD Kernel Developer's Manual RTALLOC(9)

名称

rtalloc1_fib, rtalloc_ign_fib, rtalloc_fibカーネルの経路表で経路を検索する

書式

#include < sys/types.h>
#include < sys/socket.h>
#include < net/route.h>

struct rtentry *
rtalloc1_fib( struct sockaddr *dst, int report, u_long flags, u_int fibnum);

void
rtalloc_fib( struct route *ro, u_int fibnum);

void
rtalloc_ign_fib( struct route *ro, u_long flags, u_int fibnum);

RTFREE_LOCKED( struct rt_entry *rt);

RTFREE( struct rt_entry *rt);

RT_LOCK( struct rt_entry *rt);

RT_UNLOCK( struct rt_entry *rt);

RT_ADDREF( struct rt_entry *rt);

RT_REMREF( struct rt_entry *rt);

RO_RTFREE( struct route *ro);

void
rtfree( struct rt_entry *rt);

struct rtentry *
rtalloc1( struct sockaddr *dst, int report, u_long flags);

void
rtalloc( struct route *ro);

void
rtalloc_ign( struct route *ro, u_long flags);


options RADIX_MPATH

解説

カーネルは、ネットワークのサブシステムのための経路を管理するために基数ツリー構造を使用します。 options RADIX_MPATH でコンパイルされるなら、カーネルは、いくつかの独立した転送情報データベース (FIB) を維持します。 rtalloc() ファミリルーチンは、特別の終了ノードアドレスに対応する経路を、これらの構造に問い合わせるために、そして特定のプロトコル特有でインタフェースに特有の動作を起こすために、プロトコルによって使用されます。

rtalloc1_fib() 関数は、 rtalloc() の最も一般的な形式で、他の形式のすべては、それへの呼び出しとして実装されます。それは、 dst 引数として直接 struct sockaddr * を取ります。 2 番目の引数 report は、検索が失敗するとき経路制御のソケットを通知するかどうかを制御します。 3 番目の引数 flags は、次の値の組み合わせです:

  • RTF_RNH_LOCKED 基数ツリーロックが既に保持されていることを示します

最後の引数 fibnum は、検索が実行されるべきである転送情報データベース (FIB) の数を指定します。成功の場合に、 rtalloc1_fib() 関数は、追加の参照があるロックされた struct rtentry へのポインタを返します。

rtalloc_fib() は、最も単純な変異型です。その主な引数は、次のように定義される struct route へのポインタである ro です:

struct route { 
 struct rtentry *ro_rt; 
 struct llentry *ro_lle; 
 struct sockaddr ro_dst; 
};

したがって、この関数は、デフォルトの struct sockaddr より小さいアドレスファミリのためだけに使用することができます。初めて rtalloc_fib() を呼び出す前に、呼び出し側は、構造体の未使用のビットが 0 に設定されていることを保証するべきです。 2 番目の引数 fibnum は、FIB 番号です。 rtalloc_fib() の成功の場合に、 ro_rt は、有効でアンロックされた rtentry(9) (それには、取り付けられた追加の参照があり、それを解放するのは、呼び出し側の責任です) を指します。その後の呼び出しで、 rtalloc_fib() は、 ro->ro_rt が NULL でなく、 RTF_UP フラグが、rtentry の rt_flags フィールドに設定されているなら、検索を行なわずに返ります。

rtalloc_ign_fib() 関数は、 rtalloc_fib(), と同じですが、 rtalloc1_fib() と同じ、追加の flags 引数があります。

RTFREE_LOCKED() マクロは、例えば、 rtalloc1_fib() によって以前に割り付けられた、1 つの私たちの参照があるロックされた経路制御エントリを unref するか、たぶん解放するために使用されます。

RTFREE() マクロは、例えば、 rtalloc_fib() または rtalloc_ign_fib() によって以前に割り付けられた、1 つの私たちの参照があるアンロックされた経路制御エントリを unref するか、たぶん解放するために使用されます。

RTFREE_LOCKED() と RTFREE() マクロの両方は、経路表のエントリの参照カウントを減少し、参照カウントが 0 に達しているなら、実際の解放を始めます。

RT_LOCK() マクロは、経路表のエントリをロックするために使用されます。

RT_UNLOCK() マクロは、経路表のエントリをアンロックするために使用されます。

RT_ADDREF() マクロは、以前にロックされた経路表の参照カウントを増分します。それは、 rtentry(9) の参照が経路表の外側に格納されるときはいつでも使用されるべきです。

RT_REMREF() マクロは、以前にロックされた経路表のエントリの参照カウントを減少します。使用法は、 RT_ADDREF() と反対です。

RO_RTFREE() マクロは、struct route によって参照される経路のエントリを解放するために使用されます。ある特定の状況で、後者は、rtentry で参照を保持せず、 RO_RTFREE() は、そのような経路を正確に扱います。

rtfree() 関数は、経路表のエントリの実際の解放を行います、そして、経路表の検索をまさに実行する、プログラムによって直接呼び出されるべきではありません。

古いインタフェース

複数の経路表を導入する以前の関数は、 u_int fibnum 引数を要求しませんでした。古い rtalloc1(), rtalloc() と rtalloc_ign() 関数は、互換性のために保持され、デフォルトの転送表を意味する、 0 に等しい fibnum 引数を付ける新しいインタフェースを呼び出すことと同等です。

戻り値

rtalloc1_fib() 関数は、成功するなら、ロックされた経路表へのポインタを返し、そうでなければ、NULL ポインタを返します。 rtalloc_fib() と rtalloc_ign_fib() は、値を返しませんが、それらは、成功するなら、アンロックされた経路表のエントリへのポインタを、そうでなければ、NULL ポインタを、 *ro 引数の *ro_rt メンバに書き込みます。成功の場合に、すべての関数は、呼び出し側の責任で解放する、経路表のエントリの参照を置きます。経路の不足は、ほとんどの場合 errno(2)EHOSTUNREACH に変換するべきです。

関連項目

route(4), rtentry(9)

歴史

内部は、大きく異なりますが、 rtalloc 機能は、 4.2BSD ではじめて登場しました。 rtalloc_ign() 関数と rtalloc1() の flags 引数は、 FreeBSD 2.0 ではじめて登場しました。経路表のロックは、 FreeBSD 5.2 で導入されました。複数の経路表は、 FreeBSD 8.0 で導入されました。

作者

このマニュアルページのオリジナル版は、 Garrett Wollman よって書かれました。それは、 Gleb Smirnoff によって大幅に更新されました。
July 4, 2012 FreeBSD