kazmax - Linux で自宅サーバー

rtnetlink - 約束事その他の説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. ルーティング属性
  5. メッセージ
  6. バージョン
  7. バグ
  8. 関連項目

名前

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 にセットすべきである。
.TS tab(:); c l l l. ルーティング属性 rta_type:値の型:説明 _ IFLA_UNSPEC:-:指定されていない。 IFLA_ADDRESS:hardware address:T{ インターフェース L2 アドレス T} IFLA_BROADCAST:hardware address:T{ L2 ブロードキャストアドレス T} IFLA_IFNAME:asciiz string:デバイス名 IFLA_MTU:unsigned int:デバイスの MTU IFLA_LINK:int:リンクタイプ IFLA_QDISC:asciiz string:キューイングのルール IFLA_STATS:T{ struct net_device_stats T}:インターフェースの統計
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 なフラグがある。
.TS tab(:); c l l l. 属性 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; };

.TS tab(:); l l l l. rtm_type:経路のタイプ _ RTN_UNSPEC:未知の経路 RTN_UNICAST:ゲートウェイまたはダイレクトな経路 RTN_LOCAL:ローカルインターフェースの経路 RTN_BROADCAST:T{ ローカルなブロードキャスト経路 (ブロードキャストとして送信される) T} RTN_ANYCAST:T{ ローカルなブロードキャスト経路 (ユニキャストとして送信される) T} RTN_MULTICAST:マルチキャスト経路 RTN_BLACKHOLE:パケットを捨てる経路 RTN_UNREACHABLE:到達できない行き先 RTN_PROHIBIT:パケットを拒否する経路 RTN_THROW:経路探索を別のテーブルで継続 RTN_NAT:ネットワークアドレスの変換ルール RTN_XRESOLVE:T{ 外部レゾルバを参照 (実装されていない) T}
.TS tab(:); l l. rtm_protocol:経路の情報源 _ RTPROT_UNSPEC:不明 RTPROT_REDIRECT:T{ ICMP リダイレクトによる (現在は用いられない) T} RTPROT_KERNEL:カーネルによる RTPROT_BOOT:ブート時 RTPROT_STATIC:管理者による
RTPROT_STATIC よりも大きな値はカーネルによって解釈されない。これは 単なるユーザーへの情報である。これらは経路情報の情報源を タグ付けしたり、複数のルーティングデーモンからの情報を 区別するために用いることができる。 既に割り当てられているルーティングデーモンの識別子については <linux/rtnetlink.h> を見よ。
rtm_scope は行き先への距離である。
.TS tab(:); l l. RT_SCOPE_UNIVERSE:グローバルな経路 RT_SCOPE_SITE:T{ ローカルな自律システムにおける内部経路 T} RT_SCOPE_LINK:このリンク上の経路 RT_SCOPE_HOST:ローカルホスト上の経路 RT_SCOPE_NOWHERE:行き先が存在しない
ユーザーは RT_SCOPE_UNIVERSERT_SCOPE_SITE の間の値を用いることができる。
rtm_flags は以下の意味を持つ:
.TS tab(:); l l. RTM_F_NOTIFY:T{ 経路が変更されると、 rtnetlink を通してユーザーに通知が行く。 T} RTM_F_CLONED:経路は他の経路によって複製された。 RTM_F_EQUALIZE:マルチキャストイクォライザー (実装されていない)
rtm_table ではルーティングテーブルを指定する。
.TS tab(:); l l. RT_TABLE_UNSPEC:指定されていないルーティングテーブル RT_TABLE_DEFAULT:デフォルトのテーブル RT_TABLE_MAIN:メインのテーブル RT_TABLE_LOCAL:ローカルテーブル
ユーザーは RT_TABLE_UNSPECRT_TABLE_DEFAULT .の間の任意の値を用いることができる。
.TS tab(:); c l l l. 属性 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
近傍テーブル (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 は以下の状態のビットマスクである:
.TS tab(:); l l. NUD_INCOMPLETE:現在レゾルブ中のキャッシュエントリ NUD_REACHABLE:動作確認済みのキャッシュエントリ NUD_STALE:期限切れのキャッシュエントリ NUD_DELAY:タイマ待ちのキャッシュエントリ NUD_PROBE:再確認中のキャッシュエントリ NUD_FAILED:不正なキャッシュエントリ NUD_NOARP:行き先キャッシュのないデバイス NUD_PERMANENT:静的なエントリ
有効な ndm_flags は以下の通り:
.TS tab(:); l l. NTF_PROXY:プロクシ arp エントリ NTF_ROUTER:IPv6 ルータ
(構造体メンバの記述をもうちょっと改良すること)
rtaddr 構造体は、 rta_type フィールドに応じてそれぞれ以下の意味を持つ:
.TS tab(:); l l. 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;
};

.TS tab(:); c l l l. 属性 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 ページは不備かつ不完全である。

関連項目