RTNETLINK(7) | Linux Programmer's Manual | RTNETLINK(7) |
名前¶
rtnetlink - Linux IPv4 ルーティングソケット
書式¶
#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <sys/socket.h>
rtnetlink_socket = socket(AF_NETLINK, int socket_type, NETLINK_ROUTE);
説明¶
rtnetlink はカーネルのルーティングテーブルを読んだり変更したり するためのものである。これはカーネルが内部のサブシステムと 通信するためにも用いられているが、それはここでは記述しない。 この man ページではユーザー空間のプログラムとの通信に関してのみ述べる。 ネットワーク経路・IP アドレス・リンクパラメータ・ 近傍設定 (neighbor setup)・キューイングルール (queueing dicipline)・ トラフィッククラス・パケットのクラス分類などが、すべて NETLINK_ROUTE ソケットを通して制御できる。 rtnetlink は netlink メッセージをベースにしている。詳細は netlink(7) を見ること。
ルーティング属性¶
rtnetlink メッセージには、初期ヘッダの後に付加的な属性を 持つものがある。
struct rtattr {
unsigned short rta_len; /* Length of option */
unsigned short rta_type; /* Type of option */
/* Data follows */ };
これらの属性の操作は、 RTA_* マクロか libnetlink のみを使って行うべきである。 rtnetlink(3) を見よ。
メッセージ¶
rtnetlink は (標準的な netlink メッセージに加えて) 以下のメッセージタイプから構成される。
- RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK
- 指定したネットワークインターフェースの情報を、生成・削除・取得する。
これらのメッセージは
ifinfomsg
構造体と、それに続いていくつかの
rtattr 構造体を伴う。
struct ifinfomsg {
unsigned char ifi_family; /* AF_UNSPEC */
unsigned short ifi_type; /* Device type */
int ifi_index; /* Interface index */
unsigned int ifi_flags; /* Device flags */
unsigned int ifi_change; /* change mask */ };ifi_flags contains the device flags, see netdevice(7); ifi_index is the unique interface index (since Linux 3.7, it is possible to feed a nonzero value with the RTM_NEWLINK message, thus creating a link with the given ifindex); ifi_change is reserved for future use and should be always set to 0xFFFFFFFF.
ルーティング属性 rta_type 値の型 説明 IFLA_UNSPEC - 指定されていない。 IFLA_ADDRESS hardware address インターフェース L2 アドレス IFLA_BROADCAST hardware address L2 ブロードキャストアドレス IFLA_IFNAME asciiz string デバイス名 IFLA_MTU unsigned int デバイスの MTU IFLA_LINK int リンクタイプ IFLA_QDISC asciiz string キューイングのルール IFLA_STATS 下記参照 インターフェースの統計 The value type for IFLA_STATS is struct rtnl_link_stats (struct net_device_stats in Linux 2.4 and earlier).
- RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR
- インターフェースの
IP
アドレスの情報を追加・削除・取得する。
Linux 2.2
では、一つのインターフェースに複数の
IP アドレスを
保持させることができ、これは
2.0
の別名デバイスの概念を置き換える。
Linux 2.2
では、これらのメッセージは
IPv4 と IPv6
の両方のアドレスをサポートしている。
これらは ifaddrmsg
構造体を伴う。そのあとに
rtattr
ルーティング属性が続くこともある。
struct ifaddrmsg {
unsigned char ifa_family; /* Address type */
unsigned char ifa_prefixlen; /* Prefixlength of address */
unsigned char ifa_flags; /* Address flags */
unsigned char ifa_scope; /* Address scope */
int ifa_index; /* Interface index */ };ifa_family はアドレスファミリーのタイプである (現在は AF_INET または AF_INET6)。 ifa_prefixlen はアドレスのアドレスマスクの長さである (IPv4 のように、 そのファミリーで定義されている場合)。 ifa_scope はアドレスのスコープである。 ifa_index はアドレスが関連づけられているインターフェースの index である。 ifa_flags はフラグワードで、 二つめのアドレス (古い別名インターフェース) の場合は IFA_F_SECONDARY に、永続的なアドレスの場合は IFA_F_PERMANENT に適用される。ユーザーによってセットされるフラグと、 undocumented なフラグがある。
属性 rta_type 値の型 説明 IFA_UNSPEC - 指定されていない IFA_ADDRESS raw protocol address インターフェースアドレス IFA_LOCAL raw protocol address ローカルアドレス IFA_LABEL asciiz string インターフェースの名前 IFA_BROADCAST raw protocol address ブロードキャストアドレス IFA_ANYCAST raw protocol address anycast アドレス IFA_CACHEINFO struct ifa_cacheinfo アドレス情報 - RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE
- ネットワーク経路の情報を生成・削除・取得する。
これらのメッセージは
rtmsg
構造体を伴う。そのあとにいくつかの
rtattr
構造体を続けることもできる。
RTM_GETROUTE で rtm_dst_len と
rtm_src_len に 0
をセットすると、
指定されたルーティングテーブルの全てのエントリを所得する。
rtm_table と rtm_protocol
以外の他のフィールドに
0
を入れると、ワイルドカードを意味する。
struct rtmsg {
unsigned char rtm_family; /* Address family of route */
unsigned char rtm_dst_len; /* Length of destination */
unsigned char rtm_src_len; /* Length of source */
unsigned char rtm_tos; /* TOS filter */
unsigned char rtm_table; /* Routing table ID */
unsigned char rtm_protocol; /* Routing protocol; see below */
unsigned char rtm_scope; /* See below */
unsigned char rtm_type; /* See below */
unsigned int rtm_flags; };rtm_type 経路のタイプ RTN_UNSPEC 未知の経路 RTN_UNICAST ゲートウェイまたはダイレクトな経路 RTN_LOCAL ローカルインターフェースの経路 RTN_BROADCAST ローカルなブロードキャスト経路 (ブロードキャストとして送信される) RTN_ANYCAST ローカルなブロードキャスト経路 (ユニキャストとして送信される) RTN_MULTICAST マルチキャスト経路 RTN_BLACKHOLE パケットを捨てる経路 RTN_UNREACHABLE 到達できない行き先 RTN_PROHIBIT パケットを拒否する経路 RTN_THROW 経路探索を別のテーブルで継続 RTN_NAT ネットワークアドレスの変換ルール RTN_XRESOLVE 外部レゾルバを参照 (実装されていない) rtm_protocol 経路の情報源 RTPROT_UNSPEC 不明 RTPROT_REDIRECT ICMP リダイレクトによる (現在は用いられない) RTPROT_KERNEL カーネルによる RTPROT_BOOT ブート時 RTPROT_STATIC 管理者による RTPROT_STATIC よりも大きな値はカーネルによって解釈されない。これは 単なるユーザーへの情報である。これらは経路情報の情報源を タグ付けしたり、複数のルーティングデーモンからの情報を 区別するために用いることができる。 既に割り当てられているルーティングデーモンの識別子については <linux/rtnetlink.h> を見よ。
rtm_scope は行き先への距離である。
RT_SCOPE_UNIVERSE グローバルな経路 RT_SCOPE_SITE ローカルな自律システムにおける内部経路 RT_SCOPE_LINK このリンク上の経路 RT_SCOPE_HOST ローカルホスト上の経路 RT_SCOPE_NOWHERE 行き先が存在しない ユーザーは RT_SCOPE_UNIVERSE と RT_SCOPE_SITE の間の値を用いることができる。
rtm_flags は以下の意味を持つ:
RTM_F_NOTIFY 経路が変更されると、 rtnetlink を通してユーザーに通知が行く。 RTM_F_CLONED 経路は他の経路によって複製された。 RTM_F_EQUALIZE マルチパスイコライザ (まだ実装されていない) rtm_table ではルーティングテーブルを指定する。
RT_TABLE_UNSPEC 指定されていないルーティングテーブル RT_TABLE_DEFAULT デフォルトのテーブル RT_TABLE_MAIN メインのテーブル RT_TABLE_LOCAL ローカルテーブル ユーザーは RT_TABLE_UNSPEC と RT_TABLE_DEFAULT. の間の任意の値を用いることができる。
属性 rta_type 値の型 説明 RTA_UNSPEC - 無視される RTA_DST protocol address 経路の行き先アドレス RTA_SRC protocol address 経路の発信元アドレス RTA_IIF int 入力インターフェースの index RTA_OIF int 出力インターフェースの index RTA_GATEWAY protocol address 経路のゲートウェイ RTA_PRIORITY int 経路の優先度 RTA_PREFSRC RTA_METRICS int 経路のメトリック RTA_MULTIPATH RTA_PROTOINFO RTA_FLOW RTA_CACHEINFO (これらの値を埋めること!)
- RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH
- 近傍テーブル (neighbor table)
のエントリ (例えば ARP
エントリ)
の情報を追加・削除・取得する。
このメッセージは
ndmsg 構造体を伴う。
struct ndmsg {
unsigned char ndm_family;
int ndm_ifindex; /* Interface index */
__u16 ndm_state; /* State */
__u8 ndm_flags; /* Flags */
__u8 ndm_type; }; struct nda_cacheinfo {
__u32 ndm_confirmed;
__u32 ndm_used;
__u32 ndm_updated;
__u32 ndm_refcnt; };ndm_state は以下の状態のビットマスクである:
NUD_INCOMPLETE 現在レゾルブ中のキャッシュエントリ NUD_REACHABLE 動作確認済みのキャッシュエントリ NUD_STALE 期限切れのキャッシュエントリ NUD_DELAY タイマ待ちのキャッシュエントリ NUD_PROBE 再確認中のキャッシュエントリ NUD_FAILED 不正なキャッシュエントリ NUD_NOARP 行き先キャッシュのないデバイス NUD_PERMANENT 静的なエントリ 有効な ndm_flags は以下の通り:
NTF_PROXY プロクシ arp エントリ NTF_ROUTER IPv6 ルータ rtattr 構造体は、 rta_type フィールドに応じてそれぞれ以下の意味を持つ:
NDA_UNSPEC 未知のタイプ NDA_DST 近傍キャッシュネットワーク層の行き先アドレス NDA_LLADDR 近傍キャッシュリンク層のアドレス NDA_CACHEINFO キャッシュの統計 rta_type フィールドが NDA_CACHEINFO の場合には、 struct nda_cacheinfo ヘッダが続く。
- RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE
- ルーティングルールを追加・削除・取得する。 struct rtmsg を伴う。
- RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC
- キューイングルールを追加・削除・取得する。
このメッセージは struct
tcmsg
を伴い、またそのあとに属性がいくつか続くこともある。
struct tcmsg {
unsigned char tcm_family;
int tcm_ifindex; /* interface index */
__u32 tcm_handle; /* Qdisc handle */
__u32 tcm_parent; /* Parent qdisc */
__u32 tcm_info; };属性 rta_type 値の型 説明 TCA_UNSPEC - 指定されていない TCA_KIND asciiz string キューイングルールの名前 TCA_OPTIONS byte sequence Qdisc 特有のオプションが続く TCA_STATS struct tc_stats Qdisc の統計 TCA_XSTATS qdisc specific モジュール特有の統計 TCA_RATE struct tc_estimator レート制限 さらに、 qdisc モジュール特有の様々な属性を指定できる。 詳細な情報は適切なインクルードファイルを見よ。
- RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS
- トラフィッククラスを追加・削除・取得する。 これらのメッセージは、上述の struct tcmsg を伴う。
- RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER
- トラフィックフィルターの情報を追加・削除・取得する。 これらのメッセージは、上述の struct tcmsg を伴う。
バージョン¶
rtnetlink は Linux 2.2 の新機能である。
バグ¶
このマニュアルは完全ではない。
関連項目¶
この文書について¶
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2013-03-05 | Linux |