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_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 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_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   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/ に書かれている。

関連キーワード

unsigned, 経路, struct, アドレス, int, type, rtnetlink, メッセージ, インターフェース, protocol

Linux マニュアル 一覧

[man1] [man2] [man3] [man4] [man5] [man6] [man7] [man8]
[a] [b] [c] [d] [e] [f] [g] [h] [i] [j] [k] [l] [m] [n] [o] [p] [q] [r] [s] [t] [u] [v] [w] [x] [y] [z]

 

Index

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

This document was created by man2html, using the manual pages.
Time: 12:08:34 GMT, June 11, 2022