RTNETLINK(7)

名前
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.53 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。