From 2a7d0e1553693e2b2e464e7c4e0fd40acf13f48f Mon Sep 17 00:00:00 2001 From: Akihiro Motoki Date: Mon, 29 Mar 2021 18:35:53 +0900 Subject: [PATCH] LDP: Update draft based on the previous commit (netlink) --- manual/LDP_man-pages/draft/man3/rtnetlink.3 | 2 +- manual/LDP_man-pages/draft/man7/netlink.7 | 428 +++++++++++++++++++++++++++ manual/LDP_man-pages/draft/man7/rtnetlink.7 | 444 ++++++++++++++++++++++++++++ 3 files changed, 873 insertions(+), 1 deletion(-) create mode 100644 manual/LDP_man-pages/draft/man7/netlink.7 create mode 100644 manual/LDP_man-pages/draft/man7/rtnetlink.7 diff --git a/manual/LDP_man-pages/draft/man3/rtnetlink.3 b/manual/LDP_man-pages/draft/man3/rtnetlink.3 index 5fd46661..efcc0917 100644 --- a/manual/LDP_man-pages/draft/man3/rtnetlink.3 +++ b/manual/LDP_man-pages/draft/man3/rtnetlink.3 @@ -70,7 +70,7 @@ NETLINK_ROUTE);\fP これらのマクロは非標準で、Linux での拡張である。 .SH バグ このマニュアルは完全ではない。 -.SH EXAMPLES +.SH 例 .\" FIXME . ? would be better to use libnetlink in the EXAMPLE code here デバイスの MTU をセットする rtnetlink メッセージを生成する .PP diff --git a/manual/LDP_man-pages/draft/man7/netlink.7 b/manual/LDP_man-pages/draft/man7/netlink.7 new file mode 100644 index 00000000..b774db41 --- /dev/null +++ b/manual/LDP_man-pages/draft/man7/netlink.7 @@ -0,0 +1,428 @@ +.\" This man page is Copyright (c) 1998 by Andi Kleen. +.\" +.\" %%%LICENSE_START(GPL_NOVERSION_ONELINE) +.\" Subject to the GPL. +.\" %%%LICENSE_END +.\" +.\" Based on the original comments from Alexey Kuznetsov +.\" Modified 2005-12-27 by Hasso Tepper +.\" $Id: netlink.7,v 1.8 2000/06/22 13:23:00 ak Exp $ +.\"******************************************************************* +.\" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.\" +.\" Japanese Version Copyright (c) 1999 NAKANO Takeo all rights reserved. +.\" Translated 1999-12-06 by NAKANO Takeo +.\" Updated 2001-04-04 by Yuichi SATO , catch up to LDP v1.35 +.\" Updated 2006-06-23 by Yuichi SATO , catch up to LDP v2.29 +.\" +.TH NETLINK 7 2020\-06\-09 Linux "Linux Programmer's Manual" +.SH 名前 +netlink \- カーネルとユーザー空間の通信 (AF_NETLINK) +.SH 書式 +.nf +\fB#include \fP +\fB#include \fP +\fB#include \fP +.PP +\fBnetlink_socket = socket(AF_NETLINK, \fP\fIsocket_type\fP\fB, \fP\fInetlink_family\fP\fB);\fP +.fi +.SH 説明 +netlink はカーネルモジュールとユーザー空間のプロセス間で 情報をやりとりするために用いられる。 netlink は、ユーザープロセスに対しては +標準的なソケットベースのインターフェースを、 カーネルモジュールにはカーネルの内部 API を提供する。 カーネル内部のインターフェースについてはこの +man ページでは記述しない。 また、netlink キャラクターデバイスを用いた obsolete な netlink +インターフェースもあるが、これもこの文書では解説しない。 これは過去互換性のためだけに用意されている。 +.PP +netlink はデータグラム指向のサービスである。 \fIsocket_type\fP には \fBSOCK_RAW\fP と \fBSOCK_DGRAM\fP +の両方とも指定可能である。 しかし netlink プロトコルはデータグラムと raw ソケットの区別をしない。 +.PP +\fInetlink_family\fP は、通信するカーネルモジュールや netlink グループの選択に用いる。 現在割り当てられている netlink +ファミリーは以下の通り。 +.TP +\fBNETLINK_ROUTE\fP +ルーティングとリンクの更新を受信する。 (IPv4 と IPv6 両方の) ルーティングテーブル・ IP アドレス・リンクパラメーター・近傍設定 +(neighbor setup)・ キューイングルール (queueing dicipline)・トラフィッククラス・ +パケットのクラス分類の修正に用いることができるだろう (\fBrtnetlink\fP(7) を見よ)。 +.TP +\fBNETLINK_W1\fP (Linux 2.6.13 から 2.16.17 まで) +単線 (1\-wire) のサブシステムからのメッセージ。 +.TP +\fBNETLINK_USERSOCK\fP +ユーザーモードソケットプロトコルのために予約されている。 +.TP +\fBNETLINK_FIREWALL\fP (Linux 3.4 以前) +.\" removed by commit d16cf20e2f2f13411eece7f7fb72c17d141c4a84 +Transport IPv4 packets from netfilter to user space. Used by \fIip_queue\fP +kernel module. After a long period of being declared obsolete (in favor of +the more advanced \fInfnetlink_queue\fP feature), \fBNETLINK_FIREWALL\fP was +removed in Linux 3.5. +.TP +\fBNETLINK_SOCK_DIAG\fP (Linux 3.3 以降) +.\" commit 7f1fb60c4fc9fb29fbb406ac8c4cfb4e59e168d6 +Query information about sockets of various protocol families from the kernel +(see \fBsock_diag\fP(7)). +.TP +\fBNETLINK_INET_DIAG\fP (Linux 2.6.14 以降) +An obsolete synonym for \fBNETLINK_SOCK_DIAG\fP. +.TP +\fBNETLINK_NFLOG\fP (Linux 3.16 以前) +Netfilter/iptables ULOG. +.TP +\fBNETLINK_XFRM\fP +.\" FIXME More details on NETLINK_XFRM needed. +IPsec. +.TP +\fBNETLINK_SELINUX\fP (Linux 2.6.4 以降) +SELinux のイベント通知。 +.TP +\fBNETLINK_ISCSI\fP (Linux 2.6.15 以降) +.\" FIXME More details on NETLINK_ISCSI needed. +Open\-iSCSI. +.TP +\fBNETLINK_AUDIT\fP (Linux 2.6.6 以降) +.\" FIXME More details on NETLINK_AUDIT needed. +監査 (audit) を行う。 +.TP +\fBNETLINK_FIB_LOOKUP\fP (Linux 2.6.13 以降) +.\" FIXME More details on NETLINK_FIB_LOOKUP needed. +ユーザー空間から FIB ルックアップにアクセスする。 +.TP +\fBNETLINK_CONNECTOR\fP (Linux 2.6.14 以降) +.\" commit baa293e9544bea71361950d071579f0e4d5713ed +カーネルコネクタ。より詳しい情報は Linux カーネルソースの \fIDocumentation/driver\-api/connector.rst\fP +(カーネル 5.2 以前では \fI/Documentation/connector/connector.*\fP) を参照すること。 +.TP +\fBNETLINK_NETFILTER\fP (Linux 2.6.14 以降) +.\" FIXME More details on NETLINK_NETFILTER needed. +netfilter サブシステム。 +.TP +\fBNETLINK_SCSITRANSPORT\fP (Linux 2.6.19 以降) +.\" commit 84314fd4740ad73550c76dee4a9578979d84af48 +.\" FIXME More details on NETLINK_SCSITRANSPORT needed. +SCSI Transports. +.TP +\fBNETLINK_RDMA\fP (Linux 3.0 以降) +.\" commit b2cbae2c248776d81cc265ff7d48405b6a4cc463 +.\" FIXME More details on NETLINK_RDMA needed. +Infiniband RDMA. +.TP +\fBNETLINK_IP6_FW\fP (Linux 3.4 以前) +IPv6 パケットを netfilter からユーザー空間へ転送する。 \fIip6_queue\fP カーネルモジュールで使用される。 +.TP +\fBNETLINK_DNRTMSG\fP +DECnet ルーティングメッセージ。 +.TP +\fBNETLINK_KOBJECT_UEVENT\fP (Linux 2.6.10 以降) +.\" FIXME More details on NETLINK_KOBJECT_UEVENT needed. +ユーザー空間へのカーネルメッセージ +.TP +\fBNETLINK_GENERIC\fP (Linux 2.6.15 以降) +netlink を簡単に使用するための一般的な netlink ファミリー。 +.TP +\fBNETLINK_CRYPTO\fP (Linux 3.2 以降) +.\" commit a38f7907b926e4c6c7d389ad96cc38cec2e5a9e9 +.\" Author: Steffen Klassert +カーネル暗号 API で登録された暗号に関する情報を要求したり、 カーネル暗号 API の設定を行ったりするための netlink インターフェース。 +.PP +netlink メッセージはバイトストリームからなり、 一つ以上の \fInlmsghdr\fP ヘッダーと、それに対応するペイロード (payload) +が含まれる。 バイトストリームには、標準の \fBNLMSG_*\fP マクロによってのみアクセスすべきである。 より詳しい情報は \fBnetlink\fP(3) +を見よ。 +.PP +マルチパートメッセージ (一つ以上の \fInlmsghdr\fP ヘッダーと、それに対応するペイロードが 一つバイトストリームに含まれる) においては、 +先頭のヘッダー・後続のヘッダーには \fBNLM_F_MULTI\fP フラグがセットされる。ただし最後のヘッダーだけは例外で、 \fBNLMSG_DONE\fP +タイプとなる。 +.PP +それぞれの \fBnlmsghdr\fP の後にはペイロードが続く。 +.PP +.in +4n +.EX +struct nlmsghdr { + __u32 nlmsg_len; /* ヘッダーを含むメッセージの長さ */ + __u16 nlmsg_type; /* メッセージの内容のタイプ */ + __u16 nlmsg_flags; /* 追加フラグ */ + __u32 nlmsg_seq; /* シーケンス番号 */ + __u32 nlmsg_pid; /* 送信者のポート ID */ +}; +.EE +.in +.PP +\fInlmsg_type\fP は標準のメッセージタイプのどれか一つである: \fBNLMSG_NOOP\fP メッセージは無視される。 +\fBNLMSG_ERROR\fP メッセージはエラーを示し、ペイロードには \fInlmsgerr\fP 構造体が入る。 \fBNLMSG_DONE\fP +メッセージはマルチパートメッセージの終了を伝える。 +.PP +.in +4n +.EX +struct nlmsgerr { + int error; /* 負または 0 の errno は応答を表す */ + struct nlmsghdr msg; /* エラーを起こしたメッセージのヘッダー */ +}; +.EE +.in +.PP +ある netlink ファミリーで指定できるメッセージタイプは、 通常もっと多い。これらに関しては適切な man ページを見てほしい。 たとえば +\fBNETLINK_ROUTE\fP に関しては \fBrtnetlink\fP(7) に書いてある。 +.TS +tab(:); +l s +lB l. +\fInlmsg_flags\fP の標準フラグビット +_ +NLM_F_REQUEST:要求メッセージ全てでセットされなければならない。 +NLM_F_MULTI:T{ +このメッセージはマルチパートメッセージの一部である。 +マルチパートメッセージは \fBNLMSG_DONE\fP で終端する。 +T} +NLM_F_ACK:成功した場合の応答を要求する。 +NLM_F_ECHO:この要求をエコーする。 +.TE +.\" No right adjustment for text blocks in tables +.TS +tab(:); +l s +lB l. +GET 要求における追加フラグビット +_ +NLM_F_ROOT:単一のエントリーではなくテーブル全体を返す。 +NLM_F_MATCH:T{ +メッセージの内容で渡された基準 (criteria) にマッチする全てのエントリーを返す。 +まだ実装されていない。 +T} +NLM_F_ATOMIC:テーブルのアトミックなスナップショットを返す。 +NLM_F_DUMP:T{ +便利なマクロ。 +.br +(NLM_F_ROOT|NLM_F_MATCH) と等価. +T} +.TE +.\" FIXME NLM_F_ATOMIC is not used anymore? +.PP +\fBNLM_F_ATOMIC\fP を使う場合は、 \fBCAP_NET_ADMIN\fP 権限を持つか実効ユーザー ID が 0 +でなければならない点に注意すること。 +.TS +tab(:); +l s +lB l. +NEW 要求における追加フラグビット +_ +NLM_F_REPLACE:現存のオブジェクトを置換する。 +NLM_F_EXCL:すでにオブジェクトがあったら置換しない。 +NLM_F_CREATE:まだオブジェクトがなければ作成する。 +NLM_F_APPEND:オブジェクトリストの最後に追加する。 +.TE +.PP +\fInlmsg_seq\fP と \fInlmsg_pid\fP はメッセージの追跡に使用される。 \fInlmsg_pid\fP はメッセージの送信元を表す。 +メッセージが netlink ソケットで送信されている場合、 \fInlmsg_pid\fP とプロセスの PID は 1:1 +の関係ではない点に注意すること。 より詳しい情報は、 「\fBアドレスのフォーマット\fP」 のセクションを参照すること。 +.PP +.\" FIXME Explain more about nlmsg_seq and nlmsg_pid. +\fInlmsg_seq\fP と \fInlmsg_pid\fP は netlink のコアには見えない (opaque)。 +.PP +netlink は信頼性の高いプロトコルではない。 netlink はメッセージを行き先に届けるために最善を尽くすが、 +メモリーが足りなかったりエラーが起こったりすると メッセージを取りこぼすこともある。 信頼性の高い転送を行いたいときは、 +送信者は受信者に応答を要求することもできる。 これには \fBNLM_F_ACK\fP フラグをセットする。 応答は \fBNLMSG_ERROR\fP +パケットのエラーフィールドを 0 にしたものになる。 アプリケーションは自分自身のメッセージを受けたときには、 応答を生成しなければならない。 +カーネルは失敗したパケットに対して、 \fBNLMSG_ERROR\fP メッセージを送ろうとする。 ユーザープロセスはこの慣習にも従う必要がある。 +.PP +しかし、どのような場合でもカーネルからユーザーへの 信頼性の高い転送は不可能である。 ソケットバッファーが満杯の場合、カーネルは netlink +メッセージを送信できない。 メッセージは取りこぼされて、カーネルとユーザー空間プロセスは、 カーネルの状態についての同じビューを持つことができなくなる。 +これが起こったこと (\fBrecvmsg\fP(2) によって \fBENOBUFS\fP エラーが返される) を検知して再び同期させるのは、 +アプリケーションの責任である。 +.SS アドレスのフォーマット +\fIsockaddr_nl\fP 構造体はユーザー空間やカーネル空間で netlink クライアントを記述する。 \fIsockaddr_nl\fP +はユニキャスト (単一の接続先にだけ送られる) にもできるし、 netlink マルチキャストグループ (\fInl_groups\fP が 0 でない場合) +にも送ることができる。 +.PP +.in +4n +.EX +struct sockaddr_nl { + sa_family_t nl_family; /* AF_NETLINK */ + unsigned short nl_pad; /* 0 である */ + pid_t nl_pid; /* ポート ID */ + __u32 nl_groups; /* マルチキャストグループマスク */ +}; +.EE +.in +.PP +\fInl_pid\fP は netlink ソケットのユニキャストアドレスである。 行き先がカーネルの場合は、常に 0 である。 +ユーザー空間プロセスの場合、通常は \fInl_pid\fP は行き先のソケットを所有しているプロセスの PID である。 ただし、 \fInl_pid\fP +はプロセスではなく netlink ソケットを同定する。 プロセスが複数の netlink ソケットを所有する場合、 \fInl_pid\fP +は最大でも一つのソケットのプロセス ID としか等しくならない。 \fInl_pid\fP を netlink ソケットに割り当てる方法は 2 つある。 +アプリケーションが \fBbind\fP(2) を呼ぶ前に \fInl_pid\fP を設定する場合、 \fInl_pid\fP +が一意であることを確認するのはアプリケーションの責任となる。 アプリケーションが \fInl_pid\fP を 0 +に設定した場合、カーネルがこの値を割り当てる。 カーネルはプロセスが最初にオープンした netlink ソケットに対してプロセス ID を割り当て、 +それ以降にプロセスが作成した全ての netlink ソケットにも一意な \fInl_pid\fP を割り当てる。 +.PP +.\" commit d629b836d151d43332492651dd841d32e57ebe3b +\fInl_groups\fP はビットマスクで、すべてのビットが netlink グループ番号を表す。 +それぞれの netlink ファミリーは 32 のマルチキャストグループのセットを持つ。 +それぞれの netlink ファミリーは 32 のマルチキャストグループの セットを持つ。 +\fBbind\fP(2) がソケットに対して呼ばれると、 \fIsockaddr_nl\fP の \fInl_groups\fP +フィールドには listen したいグループのビットマスクがセットされる。 +デフォルトの値は 0 で、マルチキャストを一切受信しない。 +\fBsendmsg\fP(2) や \fBconnect\fP(2) によって、あるソケットからメッセージを +マルチキャストしたいときは、 \fInl_groups\fP に送信したいグループのビットマスク +をセットすればよい。 +netlink マルチキャストグループに送信したり、これを listen したりできるのは、 +実効ユーザー ID が 0 のプロセスか、 \fBCAP_NET_ADMIN\fP 権限を持つプロセスのみである。 +Linux 2.6.13 以降では、メッセージを複数のグループへのブロードキャストすることはできない。 +マルチキャストグループ向けメッセージを受信した場合、これ対する応答は +送り主の PID とマルチキャストグループとに送り返すべきである。 +さらに、Linux のカーネルサブシステムによっては、 +他のユーザーもメッセージの送受信ができる場合がある。 +Linux 3.0 の時点では、 +\fBNETLINK_KOBJECT_UEVENT\fP, \fBNETLINK_GENERIC\fP, \fBNETLINK_ROUTE\fP, +\fBNETLINK_SELINUX\fP グループでは他のユーザーがメッセージを受信することができる。 +他のユーザーがメッセージを送信できるグループは存在しない。 +.PP +.SS ソケットオプション +To set or get a netlink socket option, call \fBgetsockopt\fP(2) to read or +\fBsetsockopt\fP(2) to write the option with the option level argument set to +\fBSOL_NETLINK\fP. Unless otherwise noted, \fIoptval\fP is a pointer to an +\fIint\fP. +.TP +\fBNETLINK_PKTINFO\fP (Linux 2.6.14 以降) +.\" commit 9a4595bc7e67962f13232ee55a64e063062c3a99 +.\" Author: Patrick McHardy +Enable \fBnl_pktinfo\fP control messages for received packets to get the +extended destination group number. +.TP +\fBNETLINK_ADD_MEMBERSHIP\fP,\ \fBNETLINK_DROP_MEMBERSHIP\fP (Linux 2.6.14 以降) +.\" commit 9a4595bc7e67962f13232ee55a64e063062c3a99 +.\" Author: Patrick McHardy +Join/leave a group specified by \fIoptval\fP. +.TP +\fBNETLINK_LIST_MEMBERSHIPS\fP (Linux 4.2 以降) +.\" commit b42be38b2778eda2237fc759e55e3b698b05b315 +.\" Author: David Herrmann +Retrieve all groups a socket is a member of. \fIoptval\fP is a pointer to +\fB__u32\fP and \fIoptlen\fP is the size of the array. The array is filled with +the full membership set of the socket, and the required array size is +returned in \fIoptlen\fP. +.TP +\fBNETLINK_BROADCAST_ERROR\fP (Linux 2.6.30 以降) +.\" commit be0c22a46cfb79ab2342bb28fde99afa94ef868e +.\" Author: Pablo Neira Ayuso +When not set, \fBnetlink_broadcast()\fP only reports \fBESRCH\fP errors and +silently ignore \fBENOBUFS\fP errors. +.TP +\fBNETLINK_NO_ENOBUFS\fP (Linux 2.6.30 以降) +.\" commit 38938bfe3489394e2eed5e40c9bb8f66a2ce1405 +.\" Author: Pablo Neira Ayuso +This flag can be used by unicast and broadcast listeners to avoid receiving +\fBENOBUFS\fP errors. +.TP +\fBNETLINK_LISTEN_ALL_NSID\fP (Linux 4.2 以降) +.\" commit 59324cf35aba5336b611074028777838a963d03b +.\" Author: Nicolas Dichtel +When set, this socket will receive netlink notifications from all network +namespaces that have an \fInsid\fP assigned into the network namespace where +the socket has been opened. The \fInsid\fP is sent to user space via an +ancillary data. +.TP +\fBNETLINK_CAP_ACK\fP (Linux 4.2 以降) +.\" commit 0a6a3a23ea6efde079a5b77688541a98bf202721 +.\" Author: Christophe Ricard +The kernel may fail to allocate the necessary room for the acknowledgment +message back to user space. This option trims off the payload of the +original netlink message. The netlink message header is still included, so +the user can guess from the sequence number which message triggered the +acknowledgment. +.SH バージョン +netlink へのソケットインターフェースは Linux 2.2 で初めて登場した。 +.PP +Linux 2.0 は、もっと原始的なデバイスベースの netlink インターフェースを サポートしていた (これも互換性のために今でも使用できる)。 +古いインターフェースに関してはここでは記述しない。 +.SH 注意 +低レベルのカーネルインターフェースより、 \fIlibnetlink\fP または \fIlibnl\fP を通して netlink +を利用するほうが良いことが多い。 +.SH バグ +この man ページは完成していない。 +.SH 例 +以下の例では、 \fBRTMGRP_LINK\fP (ネットワークインターフェースの create/delete/up/down イベント) と +\fBRTMGRP_IPV4_IFADDR\fP (IPv4 アドレスの add/delete イベント) マルチキャストグループを listen する +\fBNETLINK_ROUTE\fP netlink を作成している。 +.PP +.in +4n +.EX +struct sockaddr_nl sa; + +memset(&sa, 0, sizeof(sa)); +sa.nl_family = AF_NETLINK; +sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR; + +fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); +bind(fd, (struct sockaddr *) &sa, sizeof(sa)); +.EE +.in +.PP +次の例では、netlink メッセージをカーネル (pid 0) に送る方法を示している。 応答を追跡する際の信頼性を高めるために、アプリケーションが +メッセージのシーケンス番号を正しく処理しなければならない点に注意すること。 +.PP +.in +4n +.EX +struct nlmsghdr *nh; /* 送信する nlmsghdr とペイロード */ +struct sockaddr_nl sa; +struct iovec iov = { nh, nh\->nlmsg_len }; +struct msghdr msg; + +msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 }; +memset(&sa, 0, sizeof(sa)); +sa.nl_family = AF_NETLINK; +nh\->nlmsg_pid = 0; +nh\->nlmsg_seq = ++sequence_number; +/* NLM_F_ACK を設定することで、カーネルに応答を要求する */ +nh\->nlmsg_flags |= NLM_F_ACK; + +sendmsg(fd, &msg, 0); +.EE +.in +.PP +最後は、netlink メッセージの読み込みの例である。 +.PP +.in +4n +.EX +int len; +/* 8192 to avoid message truncation on platforms with + page size > 4096 */ +struct nlmsghdr buf[8192/sizeof(struct nlmsghdr)]; +struct iovec iov = { buf, sizeof(buf) }; +struct sockaddr_nl sa; +struct msghdr msg; +struct nlmsghdr *nh; + +msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 }; +len = recvmsg(fd, &msg, 0); + +for (nh = (struct nlmsghdr *) buf; NLMSG_OK (nh, len); + nh = NLMSG_NEXT (nh, len)) { + /* マルチパートメッセージの終わり */ + if (nh\->nlmsg_type == NLMSG_DONE) + return; + + if (nh\->nlmsg_type == NLMSG_ERROR) + /* 何らかのエラー処理を行う */ + ... + + /* ペイロードの解析を続ける */ + ... +} +.EE +.in +.SH 関連項目 +\fBcmsg\fP(3), \fBnetlink\fP(3), \fBcapabilities\fP(7), \fBrtnetlink\fP(7), +\fBsock_diag\fP(7) +.PP +.UR ftp://ftp.inr.ac.ru\:/ip\-routing\:/iproute2* +libnetlink に関する情報 +.UE +.PP +.UR http://www.infradead.org\:/\(titgr\:/libnl/ +libnl に関する情報 +.UE +.PP +RFC 3549 "Linux Netlink as an IP Services Protocol" +.SH この文書について +この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は +\%https://www.kernel.org/doc/man\-pages/ に書かれている。 diff --git a/manual/LDP_man-pages/draft/man7/rtnetlink.7 b/manual/LDP_man-pages/draft/man7/rtnetlink.7 new file mode 100644 index 00000000..8b55d573 --- /dev/null +++ b/manual/LDP_man-pages/draft/man7/rtnetlink.7 @@ -0,0 +1,444 @@ +.\" This man page is Copyright (C) 1999 Andi Kleen . +.\" +.\" %%%LICENSE_START(VERBATIM_ONE_PARA) +.\" Permission is granted to distribute possibly modified copies +.\" of this page provided the header is included verbatim, +.\" and in case of nontrivial modification author and date +.\" of the modification is added to the header. +.\" %%%LICENSE_END +.\" +.\" Based on the original comments from Alexey Kuznetsov, written with +.\" help from Matthew Wilcox. +.\" $Id: rtnetlink.7,v 1.8 2000/01/22 01:55:04 freitag Exp $ +.\" +.\"******************************************************************* +.\" +.\" This file was generated with po4a. Translate the source file. +.\" +.\"******************************************************************* +.\" +.\" Japanese Version Copyright (c) 1999 NAKANO Takeo all rights reserved. +.\" Translated Mon 6 Dec 1999 by NAKANO Takeo +.\" Updated 2013-05-01, Akihiro MOTOKI +.\" Updated 2013-05-04, Akihiro MOTOKI +.\" +.TH RTNETLINK 7 2020\-06\-09 Linux "Linux Programmer's Manual" +.SH 名前 +rtnetlink \- Linux IPv4 ルーティングソケット +.SH 書式 +\fB#include \fP +.br +\fB#include \fP +.br +\fB#include \fP +.br +\fB#include \fP +.PP +\fBrtnetlink_socket = socket(AF_NETLINK, int \fP\fIsocket_type\fP\fB, +NETLINK_ROUTE);\fP +.SH 説明 +.\" FIXME . ? all these macros could be moved to rtnetlink(3) +\fBrtnetlink\fP はカーネルのルーティングテーブルを読んだり変更したり するためのものである。これはカーネルが内部のサブシステムと +通信するためにも用いられているが、それはここでは記述しない。 この man ページではユーザー空間のプログラムとの通信に関してのみ述べる。 +ネットワーク経路・IP アドレス・リンクパラメーター・ 近傍設定 (neighbor setup)・キューイングルール (queueing +dicipline)・ トラフィッククラス・パケットのクラス分類などが、すべて \fBNETLINK_ROUTE\fP ソケットを通して制御できる。 +\fBrtnetlink\fP は netlink メッセージをベースにしている。詳細は \fBnetlink\fP(7) を見ること。 +.SS ルーティング属性 +rtnetlink メッセージには、初期ヘッダーの後に付加的な属性を 持つものがある。 +.PP +.in +4n +.EX +struct rtattr { + unsigned short rta_len; /* Length of option */ + unsigned short rta_type; /* Type of option */ + /* Data follows */ +}; +.EE +.in +.PP +これらの属性の操作は、 RTA_* マクロか libnetlink のみを使って行うべきである。 \fBrtnetlink\fP(3) を見よ。 +.SS メッセージ +rtnetlink は (標準的な netlink メッセージに加えて) 以下のメッセージタイプから構成される。 +.TP +\fBRTM_NEWLINK\fP, \fBRTM_DELLINK\fP, \fBRTM_GETLINK\fP +指定したネットワークインターフェースの情報を、生成・削除・取得する。 これらのメッセージは \fIifinfomsg\fP 構造体と、それに続いていくつかの +\fIrtattr\fP 構造体を伴う。 +.IP +.EX +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 */ +}; +.EE +.IP +.\" FIXME Document ifinfomsg.ifi_type +\fIifi_flags\fP はデバイスのフラグである。 \fBnetdevice\fP(7) を参照。 \fIifi_index\fP +は他と重ならないインターフェースの index である (Linux 3.7 以降では、 \fBRTMGRP_LINK\fP メッセージで 0 +以外の値を指定することができ、そのため指定した \fIifindex\fP でリンクを作成できる)。 \fIifi_change\fP +は将来の利用のために予約されており、常に 0xFFFFFFFF にセットすべきである。 +.TS +tab(:); +c s s +lb l l. +ルーティング属性 +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:T{ +下記参照 +T}:インターフェースの統計 +.TE +.IP +\fBIFLA_STATS\fP の値の型は \fIstruct rtnl_link_stats\fP (Linux 2.4 以前では \fIstruct +net_device_stats\fP) である。 +.TP +\fBRTM_NEWADDR\fP, \fBRTM_DELADDR\fP, \fBRTM_GETADDR\fP +インターフェースの IP アドレスの情報を追加・削除・取得する。 Linux 2.2 では、一つのインターフェースに複数の IP アドレスを +保持させることができ、これは 2.0 の別名デバイスの概念を置き換える。 Linux 2.2 では、これらのメッセージは IPv4 と IPv6 +の両方のアドレスをサポートしている。 これらは \fIifaddrmsg\fP 構造体を伴う。そのあとに \fIrtattr\fP +ルーティング属性が続くこともある。 +.IP +.EX +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 */ +}; +.EE +.IP +\fIifa_family\fP はアドレスファミリーのタイプである (現在は \fBAF_INET\fP または \fBAF_INET6\fP)。 +\fIifa_prefixlen\fP はアドレスのアドレスマスクの長さである (IPv4 のように、 そのファミリーで定義されている場合)。 +\fIifa_scope\fP はアドレスのスコープである。 \fIifa_index\fP はアドレスが関連づけられているインターフェースの index である。 +\fIifa_flags\fP はフラグワードで、 二つめのアドレス (古い別名インターフェース) の場合は \fBIFA_F_SECONDARY\fP +に、永続的なアドレスの場合は \fBIFA_F_PERMANENT\fP に適用される。ユーザーによってセットされるフラグと、 undocumented +なフラグがある。 +.TS +tab(:); +c s s +lb 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:アドレス情報 +.TE +.\" FIXME Document struct ifa_cacheinfo +.TP +\fBRTM_NEWROUTE\fP, \fBRTM_DELROUTE\fP, \fBRTM_GETROUTE\fP +ネットワーク経路の情報を生成・削除・取得する。 これらのメッセージは \fIrtmsg\fP 構造体を伴う。そのあとにいくつかの \fIrtattr\fP +構造体を続けることもできる。 \fBRTM_GETROUTE\fP で \fIrtm_dst_len\fP と \fIrtm_src_len\fP に 0 +をセットすると、 指定されたルーティングテーブルの全てのエントリーを所得する。 \fIrtm_table\fP と \fIrtm_protocol\fP +以外の他のフィールドに 0 を入れると、ワイルドカードを意味する。 +.IP +.EX +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; +}; +.EE +.TS +tab(:); +lb 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} +.TE +.TS +tab(:); +lb l. +rtm_protocol:経路の情報源 +_ +RTPROT_UNSPEC:不明 +RTPROT_REDIRECT:T{ +ICMP リダイレクトによる (現在は用いられない) +T} +RTPROT_KERNEL:カーネルによる +RTPROT_BOOT:ブート時 +RTPROT_STATIC:管理者による +.TE +.sp 1 +\fBRTPROT_STATIC\fP よりも大きな値はカーネルによって解釈されない。これは 単なるユーザーへの情報である。これらは経路情報の情報源を +タグ付けしたり、複数のルーティングデーモンからの情報を 区別するために用いることができる。 既に割り当てられているルーティングデーモンの識別子については +\fI\fP を見よ。 +.IP +\fIrtm_scope\fP は行き先への距離である。 +.TS +tab(:); +lb l. +RT_SCOPE_UNIVERSE:グローバルな経路 +RT_SCOPE_SITE:T{ +ローカルな自律システムにおける内部経路 +T} +RT_SCOPE_LINK:このリンク上の経路 +RT_SCOPE_HOST:ローカルホスト上の経路 +RT_SCOPE_NOWHERE:行き先が存在しない +.TE +.sp 1 +ユーザーは \fBRT_SCOPE_UNIVERSE\fP と \fBRT_SCOPE_SITE\fP の間の値を用いることができる。 +.IP +\fIrtm_flags\fP は以下の意味を持つ: +.TS +tab(:); +lb l. +RTM_F_NOTIFY:T{ +経路が変更されると、 rtnetlink を通してユーザーに通知が行く。 +T} +RTM_F_CLONED:経路は他の経路によって複製された。 +RTM_F_EQUALIZE:マルチパスイコライザ (まだ実装されていない) +.TE +.sp 1 +\fIrtm_table\fP ではルーティングテーブルを指定する。 +.TS +tab(:); +lb l. +RT_TABLE_UNSPEC:指定されていないルーティングテーブル +RT_TABLE_DEFAULT:デフォルトのテーブル +RT_TABLE_MAIN:メインのテーブル +RT_TABLE_LOCAL:ローカルテーブル +.TE +.sp 1 +.\" Keep table on same page +ユーザーは \fBRT_TABLE_UNSPEC\fP と \fBRT_TABLE_DEFAULT\fP. の間の任意の値を用いることができる。 +.bp +1 +.TS +tab(:); +c s s +lb2 l2 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:protocol address:Preferred source address +RTA_METRICS:int:経路のメトリック +RTA_MULTIPATH::T{ +Multipath nexthop data +br +(see below). +T} +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:T{ +Routing table ID; if set, +.br +rtm_table is ignored +T} +RTA_MARK:int: +RTA_MFC_STATS:struct rta_mfc_stats:(linux/rtnetlink.h 参照) +RTA_VIA:struct rtvia:T{ +Gateway in different AF +(see below) +T} +RTA_NEWDST:protocol address:T{ +パケットの経路の行き先アドレスを変更する +T} +RTA_PREF:char:T{ +RFC4191 IPv6 router +preference (see below) +T} +RTA_ENCAP_TYPE:short:T{ +Encapsulation type for +.br +lwtunnels (下記参照) +T} +RTA_ENCAP::Defined by RTA_ENCAP_TYPE +RTA_EXPIRES:int:T{ +Expire time for IPv6 +routes (in seconds) +T} +.TE +.IP +\fBRTA_MULTIPATH\fP contains several packed instances of \fIstruct rtnexthop\fP +together with nested RTAs (\fBRTA_GATEWAY\fP): +.IP +.in +4n +.EX +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 */ +} +.EE +.in +.IP +There exist a bunch of \fBRTNH_*\fP macros similar to \fBRTA_*\fP and \fBNLHDR_*\fP +macros useful to handle these structures. +.IP +.in +4n +.EX +struct rtvia { + unsigned short rtvia_family; + unsigned char rtvia_addr[0]; +}; +.EE +.in +.IP +\fIrtvia_addr\fP is the address, \fIrtvia_family\fP is its family type. +.IP +\fBRTA_PREF\fP may contain values \fBICMPV6_ROUTER_PREF_LOW\fP, +\fBICMPV6_ROUTER_PREF_MEDIUM\fP, and \fBICMPV6_ROUTER_PREF_HIGH\fP defined incw +\fI\fP. +.IP +\fBRTA_ENCAP_TYPE\fP may contain values \fBLWTUNNEL_ENCAP_MPLS\fP, +\fBLWTUNNEL_ENCAP_IP\fP, \fBLWTUNNEL_ENCAP_ILA\fP, or \fBLWTUNNEL_ENCAP_IP6\fP +defined in \fI\fP. +.IP +\fB(これらの値を埋めること!)\fP +.TP +\fBRTM_NEWNEIGH\fP, \fBRTM_DELNEIGH\fP, \fBRTM_GETNEIGH\fP +近傍テーブル (neighbor table) のエントリー (例えば ARP エントリー) の情報を追加・削除・取得する。 このメッセージは +\fIndmsg\fP 構造体を伴う。 +.IP +.EX +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; +}; +.EE +.IP +\fIndm_state\fP は以下の状態のビットマスクである: +.TS +tab(:); +lb l. +NUD_INCOMPLETE:現在レゾルブ中のキャッシュエントリー +NUD_REACHABLE:動作確認済みのキャッシュエントリー +NUD_STALE:期限切れのキャッシュエントリー +NUD_DELAY:タイマー待ちのキャッシュエントリー +NUD_PROBE:再確認中のキャッシュエントリー +NUD_FAILED:不正なキャッシュエントリー +NUD_NOARP:行き先キャッシュのないデバイス +NUD_PERMANENT:静的なエントリー +.TE +.sp 1 +有効な \fIndm_flags\fP は以下の通り: +.TS +tab(:); +lb l. +NTF_PROXY:プロクシ arp エントリー +NTF_ROUTER:IPv6 ルータ +.TE +.sp 1 +.\" FIXME . +.\" document the members of the struct better +\fIrtattr\fP 構造体は、 \fIrta_type\fP フィールドに応じてそれぞれ以下の意味を持つ: +.TS +tab(:); +lb l. +NDA_UNSPEC:未知のタイプ +NDA_DST:近傍キャッシュネットワーク層の行き先アドレス +NDA_LLADDR:近傍キャッシュリンク層のアドレス +NDA_CACHEINFO:キャッシュの統計 +.TE +.sp 1 +\fIrta_type\fP フィールドが \fBNDA_CACHEINFO\fP の場合には、 \fIstruct nda_cacheinfo\fP ヘッダーが続く。 +.TP +\fBRTM_NEWRULE\fP, \fBRTM_DELRULE\fP, \fBRTM_GETRULE\fP +ルーティングルールを追加・削除・取得する。 \fIstruct rtmsg\fP を伴う。 +.TP +\fBRTM_NEWQDISC\fP, \fBRTM_DELQDISC\fP, \fBRTM_GETQDISC\fP +キューイングルールを追加・削除・取得する。 このメッセージは \fIstruct tcmsg\fP を伴い、またそのあとに属性がいくつか続くこともある。 +.IP +.EX +struct tcmsg { + unsigned char tcm_family; + int tcm_ifindex; /* interface index */ + __u32 tcm_handle; /* Qdisc handle */ + __u32 tcm_parent; /* Parent qdisc */ + __u32 tcm_info; +}; +.EE +.TS +tab(:); +c s s +lb2 l2 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:レート制限 +.TE +.sp 1 +さらに、 qdisc モジュール特有の様々な属性を指定できる。 詳細な情報は適切なインクルードファイルを見よ。 +.TP +\fBRTM_NEWTCLASS\fP, \fBRTM_DELTCLASS\fP, \fBRTM_GETTCLASS\fP +トラフィッククラスを追加・削除・取得する。 これらのメッセージは、上述の \fIstruct tcmsg\fP を伴う。 +.TP +\fBRTM_NEWTFILTER\fP, \fBRTM_DELTFILTER\fP, \fBRTM_GETTFILTER\fP +トラフィックフィルターの情報を追加・削除・取得する。 これらのメッセージは、上述の \fIstruct tcmsg\fP を伴う。 +.SH バージョン +\fBrtnetlink\fP は Linux 2.2 の新機能である。 +.SH バグ +このマニュアルは完全ではない。 +.SH 関連項目 +\fBcmsg\fP(3), \fBrtnetlink\fP(3), \fBip\fP(7), \fBnetlink\fP(7) +.SH この文書について +この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は +\%https://www.kernel.org/doc/man\-pages/ に書かれている。 -- 2.11.0