RTNETLINK

Section: Linux Programmer's Manual (7)
Updated: 2020-06-09
Index JM Home Page
 

名前

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 */
    unsigned 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;
                                   see RTA_TABLE below */
    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   protocol address   Preferred source address
RTA_METRICS   int   経路のメトリック
RTA_MULTIPATH      Multipath nexthop data br (see below).
RTA_PROTOINFO      No longer used
RTA_FLOW   int   Route realm
RTA_CACHEINFO   struct rta_cacheinfo   (linux/rtnetlink.h 参照)
RTA_SESSION      No longer used
RTA_MP_ALGO      No longer used
RTA_TABLE   int   Routing table ID; if set,
rtm_table is ignored
RTA_MARK   int  
RTA_MFC_STATS   struct rta_mfc_stats   (linux/rtnetlink.h 参照)
RTA_VIA   struct rtvia   Gateway in different AF (see below)
RTA_NEWDST   protocol address   パケットの経路の行き先アドレスを変更する
RTA_PREF   char   RFC4191 IPv6 router preference (see below)
RTA_ENCAP_TYPE   short   Encapsulation type for
lwtunnels (下記参照)
RTA_ENCAP      Defined by RTA_ENCAP_TYPE
RTA_EXPIRES   int   Expire time for IPv6 routes (in seconds)
RTA_MULTIPATH contains several packed instances of struct rtnexthop together with nested RTAs (RTA_GATEWAY):
struct rtnexthop {
    unsigned short rtnh_len;     /* Length of struct + length
                                    of RTAs */
    unsigned char  rtnh_flags;   /* Flags (see
                                    linux/rtnetlink.h) */
    unsigned char  rtnh_hops;    /* Nexthop priority */
    int            rtnh_ifindex; /* Interface index for this
                                    nexthop */ }
There exist a bunch of RTNH_* macros similar to RTA_* and NLHDR_* macros useful to handle these structures.
struct rtvia {
    unsigned short rtvia_family;
    unsigned char  rtvia_addr[0]; };
rtvia_addr is the address, rtvia_family is its family type.
RTA_PREF may contain values ICMPV6_ROUTER_PREF_LOW, ICMPV6_ROUTER_PREF_MEDIUM, and ICMPV6_ROUTER_PREF_HIGH defined incw <linux/icmpv6.h>.
RTA_ENCAP_TYPE may contain values LWTUNNEL_ENCAP_MPLS, LWTUNNEL_ENCAP_IP, LWTUNNEL_ENCAP_ILA, or LWTUNNEL_ENCAP_IP6 defined in <linux/lwtunnel.h>.
(これらの値を埋めること!)
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 プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。

関連キーワード

経路   アドレス   type   struct   address   インターフェース   index   protocol   flags   エントリー   ルーティング   メッセージ   family   キャッシュ   rtnetlink   テーブル   属性   構造体   ローカル   table   below   行き先   short   タイプ   デバイス

Linux マニュアル 一覧

関連するコマンド・関数

route.8   rtnetlink.3   ifuser.8   freeaddrinfo.3   gai_strerror.3   getaddrinfo.3
 

Index

名前
書式
説明
ルーティング属性
メッセージ
バージョン
バグ
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 04:38:52 GMT, October 11, 2026