名前
rtnetlink, NETLINK_ROUTE - Linux IPv4 ルーティングソケット
書式
#include <asm/types.h> #include <linux/netlink.h> #include <linux/rtnetlink.h> #include <sys/socket.h>
rtnetlink_socket = socket(PF_NETLINK, int socket_type, NETLINK_ROUTE);
説明
rtnetlink はカーネルのルーティングテーブルを読んだり変更したり するためのものである。これはカーネルが内部のサブシステムと 通信するためにも用いられているが、それはここでは記述しない。 この man ページではユーザー空間のプログラムとの通信に関してのみ述べる。 ネットワーク経路・IP アドレス・リンクパラメータ・ 近傍設定 (neighbour 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 である。 ifi_change は将来の利用のために予約されており、常に 0xFFFFFFFF にセットすべきである。
IFLA_STATS の値の型は struct net_device_stats である。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
インターフェースの IP アドレスの情報を追加・削除・取得する。
Linux 2.2 では、一つのインターフェースに複数の IP アドレスを
保持させることができ、これは 2.0 の別名デバイスの概念を置き換える。
Linux 2.2 では、これらのメッセージは
IPv4 と IPv6 の両方のアドレスをサポートしている。
これらは
ifaddrmsg 構造体を伴う。そのあとに
rtaddr ルーティング属性が続くこともある。
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 なフラグがある。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 source */
unsigned char rtm_src_len; /* Length of destination */
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;
};
RTPROT_STATIC よりも大きな値はカーネルによって解釈されない。これは 単なるユーザーへの情報である。これらは経路情報の情報源を タグ付けしたり、複数のルーティングデーモンからの情報を 区別するために用いることができる。 既に割り当てられているルーティングデーモンの識別子については <linux/rtnetlink.h> を見よ。 rtm_scope は行き先への距離である。
ユーザーは RT_SCOPE_UNIVERSE と RT_SCOPE_SITE の間の値を用いることができる。 rtm_flags は以下の意味を持つ:
rtm_table ではルーティングテーブルを指定する。
ユーザーは RT_TABLE_UNSPEC と RT_TABLE_DEFAULT. の間の任意の値を用いることができる。
(これらの値を埋めること!) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
近傍テーブル (neighbour 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 は以下の状態のビットマスクである:
有効な ndm_flags は以下の通り:
(構造体メンバの記述をもうちょっと改良すること) rtaddr 構造体は、 rta_type フィールドに応じてそれぞれ以下の意味を持つ:
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; };
さらに、 qdisc モジュール特有の様々な属性を指定できる。 詳細な情報は適切なインクルードファイルを見よ。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
トラフィッククラスを追加・削除・取得する。 これらのメッセージは、上述の struct tcmsg を伴う。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
トラフィックフィルターの情報を追加・削除・取得する。 これらのメッセージは、上述の struct tcmsg を伴う。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
バージョン
rtnetlink は Linux 2.2 の新機能である。
バグ
この man ページは不完全である。