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
はデバイスのフラグである。
netdevice(7) を参照。 ifi_index
は他と重ならないインターフェースの
index である (Linux 3.7
以降では、 RTMGRP_LINK
メッセージで 0
以外の値を指定することができ、そのため指定した
ifindex
でリンクを作成できる)。
ifi_change
は将来の利用のために予約されており、常に
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 |
下記参照 |
インターフェースの統計 |
IFLA_STATS の値の型は struct
rtnl_link_stats (Linux 2.4 以前では
struct net_device_stats)
である。
- 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
の新機能である。
このマニュアルは完全ではない。
関連項目¶
cmsg(3),
rtnetlink(3),
ip(7),
netlink(7)
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.65 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。