名前


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 にセットすべきである。
ルーティング属性
rta_type値の型説明
IFLA_UNSPEC-指定されていない。
IFLA_ADDRESShardware addressインターフェース L2 アドレス
IFLA_BROADCASThardware addressL2 ブロードキャストアドレス
IFLA_IFNAMEasciiz stringデバイス名
IFLA_MTUunsigned intデバイスの MTU
IFLA_LINKintリンクタイプ
IFLA_QDISCasciiz stringキューイングのルール
IFLA_STATS下記参照 インターフェースの統計

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 なフラグがある。

属性
rta_type値の型説明
IFA_UNSPEC-指定されていない
IFA_ADDRESSraw protocol addressインターフェースアドレス
IFA_LOCALraw protocol addressローカルアドレス
IFA_LABELasciiz stringインターフェースの名前
IFA_BROADCASTraw protocol addressブロードキャストアドレス
IFA_ANYCASTraw protocol addressanycast アドレス
IFA_CACHEINFOstruct ifa_cacheinfoアドレス情報

RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE
 ネットワーク経路の情報を生成・削除・取得する。 これらのメッセージは rtmsg 構造体を伴う。そのあとにいくつかの rtattr 構造体を続けることもできる。 RTM_GETROUTErtm_dst_lenrtm_src_len に 0 をセットすると、 指定されたルーティングテーブルの全てのエントリを所得する。 rtm_tablertm_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; };

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_REDIRECTICMP リダイレクトによる (現在は用いられない)
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_UNIVERSERT_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_UNSPECRT_TABLE_DEFAULT. の間の任意の値を用いることができる。

属性
rta_type値の型説明
RTA_UNSPEC-無視される
RTA_DSTprotocol address経路の行き先アドレス
RTA_SRCprotocol address経路の発信元アドレス
RTA_IIFint入力インターフェースの index
RTA_OIFint出力インターフェースの index
RTA_GATEWAYprotocol address経路のゲートウェイ
RTA_PRIORITYint経路の優先度
RTA_PREFSRC  
RTA_METRICSint経路のメトリック
RTA_MULTIPATH  
RTA_PROTOINFO  
RTA_FLOW  
RTA_CACHEINFO  

(これらの値を埋めること!)

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 は以下の状態のビットマスクである:

NUD_INCOMPLETE現在レゾルブ中のキャッシュエントリ
NUD_REACHABLE動作確認済みのキャッシュエントリ
NUD_STALE期限切れのキャッシュエントリ
NUD_DELAYタイマ待ちのキャッシュエントリ
NUD_PROBE再確認中のキャッシュエントリ
NUD_FAILED不正なキャッシュエントリ
NUD_NOARP行き先キャッシュのないデバイス
NUD_PERMANENT静的なエントリ

有効な ndm_flags は以下の通り:

NTF_PROXYプロクシ arp エントリ
NTF_ROUTERIPv6 ルータ

(構造体メンバの記述をもうちょっと改良すること)

rtaddr 構造体は、 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_KINDasciiz stringキューイングルールの名前
TCA_OPTIONSbyte sequenceQdisc 特有のオプションが続く
TCA_STATSstruct tc_statsQdisc の統計
TCA_XSTATSqdisc specificモジュール特有の統計
TCA_RATEstruct tc_estimatorレート制限

さらに、 qdisc モジュール特有の様々な属性を指定できる。 詳細な情報は適切なインクルードファイルを見よ。

RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS
 トラフィッククラスを追加・削除・取得する。 これらのメッセージは、上述の struct tcmsg を伴う。
RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER
 トラフィックフィルターの情報を追加・削除・取得する。 これらのメッセージは、上述の struct tcmsg を伴う。

バージョン


rtnetlink は Linux 2.2 の新機能である。

バグ


この man ページは不完全である。

関連項目


cmsg(3), rtnetlink(3), ip(7), netlink(7)

openSUSE Logo

コンテンツ