日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.3-RELEASE-K, 13.0-RELEASE-K から 13.2-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
ROUTE(4) FreeBSD カーネルインタフェースマニュアル ROUTE(4) 名称 route -- カーネルパケット転送データベース 書式 #include <sys/types.h> #include <sys/time.h> #include <sys/socket.h> #include <net/if.h> #include <net/route.h> int socket(PF_ROUTE, SOCK_RAW, int family); 解説 FreeBSD は、いくつかのパケット経路制御機能を提供しています。カーネルは、 パケットを送信するとき、適切なネットワークインタフェースを選択するために に使用される、経路制御 (routing) 情報データベースを保守します。 ユーザプロセス (またはことによると複数の協同プロセス) は、特別な種類のソ ケット上にメッセージを送信することによって、このデータベースを保守しま す。これは、初期のリリースで使用される固定サイズの ioctl(2) に取って代わ ります。経路制御テーブルの変更は、スーパユーザによってのみ実行されます。 オペレーティングシステムは、リダイレクトの受信か、または要求に対して適切 な経路 (route) を見つけることに失敗するような、外部のイベントに応答する経 路制御メッセージを自然に発行します。メッセージタイプは、下記により詳しく 記述されています。 経路制御データベースエントリは、次の 2 つの特色の形で提供されます: 特定の ホストのために、または、 (ビットマスクとマスクされた値によって指定される ような) 一般的なサブネットワークですべてのホストのためです。ワイルドカー ドかデフォルト経路の効果は、すべて 0 のマスクを使用することによって達成さ れ、それらは、階層的な経路になります。 システムがブートされ、アドレスがネットワークインタフェースに割り当てられ るとき、各プロトコルファミリは、トラフィックの準備ができているとき、イン タフェースごとに経路制御テーブルエントリをインストールします。通常、プロ トコルは、宛先ホストまたはネットワークに ``直接'' 接続するような各インタ フェースを通して経路を指定します。経路が直接であるなら、プロトコルファミ リの転送レイヤは、通常、パケットで指定される同じホストに送信されるパケッ トを要求します。そうでなければ、インタフェースは、経路制御エントリにリス トされたゲートウェイへのパケットを処置するように要求されます (すなわち、 パケットは、転送されます)。 パケットを経路制御するとき、カーネルは、宛先に一致する最も明確な経路を見 つけようと試みます。(一致する 2 つの異なったマスクとマスクされた値 (value-under-the-mask) のペアがあるなら、より特殊なものは、より多くのビッ トがあるものです。ホストへの経路は、宛先中のビットがあるものと同数のマス クが供給されると見なされます)。エントリが見つけられないなら、宛先は、到達 不能であると宣言され、以下に記述される経路制御の制御ソケットでいくらかの listener (接続を受け付けるプログラム) があるなら、経路制御ミス (rout ing-miss) メッセージが生成されます。 ワイルドカードの経路制御エントリは、0 の宛先アドレス値とすべて 0 のマスク で指定されます。ワイルドカードの経路は、システムが宛先に一致する他の経路 を見つけるのに失敗するとき、使用されます。ワイルドカードの経路と経路制御 リダイレクトの組み合わせは、経路制御トラフィックのための安価な仕組みを提 供することができます。 上記の概要で示されるソケットコールを使用することによって経路制御の制御 メッセージを渡すためにチャネルをオープンします。 family パラメータは、すべてのアドレスファミリのための経路制御の情報を提供 する AF_UNSPEC であるかもしれません、または、どのアドレスファミリが要求さ れているかを指定することによって特定のアドレスファミリに制限することがで きます。システムごとにオープンされた 2 つ以上の経路制御ソケットを指定でき ます。 メッセージは、ヘッダに続く sockaddrs の小さな数 (現在、特に ISO の場合に 可変長) によって形成され、位置によって解釈され、そして sockaddr の新しい length (長さ) エントリによって区切られます。4 つのアドレスがあるメッセー ジの例は、ISO リダイレクトになるかもしれません: 宛先、ネットマスク、ゲー トウェイ、とリダイレクトの作者。どのアドレスが存在しているかの解釈は、 ヘッダ内のビットマスクで与えられ、シーケンスは、ベクタ内の最下位ビットか ら最上位ビットです。 カーネルに送られたあらゆるメッセージは、返され、コピーが、すべての関係が あるリスナに送られます。カーネルは、送信側のためのプロセス ID を提供し、 送信側は、未解決のメッセージを区別するために追加のシーケンスフィールドを 使用します。しかしながら、メッセージの応答は、カーネルバッファが使い果た されるとき、失われるかもしれません。 カーネルは、特定のメッセージを拒否し、rtm_errno フィールドに記入すること によってこれを示します。経路制御コードは、存在するエントリを複製するよう に要求されるなら EEXIST を返し、実在しないエントリを削除するように要求さ れるなら ESRCH を返し、新しい経路をインストールするために利用可能なリソー スが不足しているなら、ENOBUFS を返します。現在の実装で、すべての経路制御 プロセスは、ローカルに実行し、rtm_errno のための値は、たとえ経路制御の応 答メッセージが失われても、通常の errno メカニズムを通して利用可能です。 プロセスは、SOL_SOCKET レベルで SO_USELOOPBACK オプションがオフにされるこ とを示す setsockopt(2) 呼び出しを発行することによって、それ自体のメッセー ジへの応答を読み込むコストを避けます。プロセスは、さらなる入力のために shutdown(2) システムコールを行なうことによって、経路制御ソケットからのす べてのメッセージを無視します。 経路が削除されるとき、それが使用中であるなら、経路制御エントリは、ダウン (停止中) とマークされ、経路制御テーブルから削除されますが、それに関連して いるリソースは、すべての参照が解除されるまで再利用されません。ユーザプロ セスは、RTM_GET メッセージを使用することによってか、または sysctl(3) を呼 び出すことによって、特定の宛先への経路制御エントリに関する情報を取得する ことができます。 メッセージは、次のものを含んでいます: #define RTM_ADD 0x1 /* 経路を追加 */ #define RTM_DELETE 0x2 /* 経路を削除 */ #define RTM_CHANGE 0x3 /* メトリック, フラグまたはゲートウェイを変更 */ #define RTM_GET 0x4 /* 情報を報告 */ #define RTM_LOSING 0x5 /* カーネル容疑分割 */ #define RTM_REDIRECT 0x6 /* 異なった経路を使用するように伝える */ #define RTM_MISS 0x7 /* このアドレスで失敗した検索 */ #define RTM_LOCK 0x8 /* 指定されたメトリックを修正 */ #define RTM_RESOLVE 0xb /* 宛先を LL アドレスに解決要求 - 未使用 */ #define RTM_NEWADDR 0xc /* iface に追加されるアドレス */ #define RTM_DELADDR 0xd /* iface から削除されるアドレス */ #define RTM_IFINFO 0xe /* iface を up/down するその他 */ #define RTM_NEWMADDR 0xf /* if に追加される mcast グループ メンバシップ */ #define RTM_DELMADDR 0x10 /* 削除される mcast グループメンバシップ */ #define RTM_IFANNOUNCE 0x11 /* iface 到着/出発 */ #define RTM_IEEE80211 0x12 /* IEEE80211 無線イベント */ メッセージヘッダは、次の 1 つで構成されています: struct rt_msghdr { u_short rtm_msglen; /* 理解されないメッセージをスキップする */ u_char rtm_version; /* 将来のバイナリ互換性 */ u_char rtm_type; /* メッセージタイプ */ u_short rtm_index; /* 関連する ifp のインデックス */ int rtm_flags; /* フラグ, incl. kern & message, 例えば DONE */ int rtm_addrs; /* メッセージ中のビットマスク識別 sockaddrs */ pid_t rtm_pid; /* 送信者識別 */ int rtm_seq; /* 動作を識別する送信者に対して */ int rtm_errno; /* 何故失敗したか */ int rtm_fmask; /* RTM_CHANGE メッセージで使用される ビットマスク */ u_long rtm_inits; /* どのメトリックを初期化しているか */ struct rt_metrics rtm_rmx; /* メトリック自体 */ }; struct if_msghdr { u_short ifm_msglen; /* 理解されないメッセージをスキップする */ u_char ifm_version; /* 将来のバイナリ互換性 */ u_char ifm_type; /* メッセージタイプ */ int ifm_addrs; /* rtm_addrs に似たもの */ int ifm_flags; /* if_flags の値 */ u_short ifm_index; /* 関連する ifp のインデックス */ struct if_data ifm_data; /* if に関する統計と他のデータ */ }; struct ifa_msghdr { u_short ifam_msglen; /* 理解されないメッセージをスキップする */ u_char ifam_version; /* 将来のバイナリ互換性 */ u_char ifam_type; /* メッセージタイプ */ int ifam_addrs; /* rtm_addrs に似たもの */ int ifam_flags; /* ifa_flags の値 */ u_short ifam_index; /* 関連する ifp のインデックス */ int ifam_metric; /* ifa_metric の値 */ }; struct ifma_msghdr { u_short ifmam_msglen; /* 理解されないメッセージをスキップする */ u_char ifmam_version; /* 将来のバイナリ互換性 */ u_char ifmam_type; /* メッセージタイプ */ int ifmam_addrs; /* rtm_addrs に似たもの */ int ifmam_flags; /* ifa_flags の値 */ u_short ifmam_index; /* 関連する ifp のインデックス */ }; struct if_announcemsghdr { u_short ifan_msglen; /* 理解されないメッセージをスキップする */ u_char ifan_version; /* 将来のバイナリ互換性 */ u_char ifan_type; /* メッセージタイプ */ u_short ifan_index; /* 関連する ifp のインデックス */ char ifan_name[IFNAMSIZ]; /* 名前があるなら, 例えば "en0" */ u_short ifan_what; /* どんなアナウンスのタイプ */ }; RTM_IFINFO メッセージは、if_msghdr ヘッダを使用し、RTM_NEWADDR と RTM_DELADDR メッセージは、ifa_msghdr ヘッダを使用し、RTM_NEWMADDR と RTM_DELMADDR メッセージは、ifma_msghdr ヘッダを使用し、RTM_IFANNOUNCE メッセージは、if_announcemsghdr ヘッダを使用し、そして、他のすべてのメッ セージは、rt_msghdr ヘッダを使用します。 ``struct rt_metrics'' とフラグビットは、rtentry(9) で定義されています。 rmx_locks と rtm_inits のメトリック値のための指定子は、次の通りです: #define RTV_MTU 0x1 /* _mtu を初期化またはロック */ #define RTV_HOPCOUNT 0x2 /* _hopcount を初期化またはロック */ #define RTV_EXPIRE 0x4 /* _expire を初期化またはロック */ #define RTV_RPIPE 0x8 /* _recvpipe を初期化またはロック */ #define RTV_SPIPE 0x10 /* _sendpipe を初期化またはロック */ #define RTV_SSTHRESH 0x20 /* _ssthresh を初期化またはロック */ #define RTV_RTT 0x40 /* _rtt を初期化またはロック */ #define RTV_RTTVAR 0x80 /* _rttvar を初期化またはロック */ #define RTV_WEIGHT 0x100 /* _weight を初期化またはロック */ メッセージに提示されるアドレスの指定子は、次の通りです: #define RTA_DST 0x1 /* 宛先 sockaddr 提示 */ #define RTA_GATEWAY 0x2 /* ゲートウェイ sockaddr 提示 */ #define RTA_NETMASK 0x4 /* ネットマスク sockaddr 提示 */ #define RTA_GENMASK 0x8 /* クローニングマスク sockaddr 提示 - 未使用*/ #define RTA_IFP 0x10 /* インタフェース名 sockaddr 提示 */ #define RTA_IFA 0x20 /* インタフェースアドレス sockaddr 提示 */ #define RTA_AUTHOR 0x40 /* リダイレクトの作者のための sockaddr */ #define RTA_BRD 0x80 /* NEWADDR のための, ブロードキャストまたは p-p 宛先アドレス */ 関連項目 sysctl(3), route(8), rtentry(9) rtm_flags フィールドのための定数は、route(8) ユーティリティのためのマニュ アルページに文書化されています。 歴史 PF_ROUTE プロトコルファミリは、4.3BSD-Reno ではじめて登場しました。 FreeBSD 12.2 November 4, 2004 FreeBSD 12.2