RTNETLINK

Section: Linux Programmer's Manual (7)
Updated: 1999-04-30
Index JM Home Page roff page
 

名前

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 アドレス・リンクパラメータ・ 近傍設定 (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 である。 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 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_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_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_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_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_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_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_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 ページは不完全である。  

関連項目

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


 

Index

名前
書式
説明
ルーティング属性
メッセージ
バージョン
バグ
関連項目

This document was created by man2html, using the manual pages.
Time: 04:32:00 GMT, November 19, 2007