OSDN Git Service

4825b28c13eecbaf744e86adeddaef0a315a358e
[linuxjm/LDP_man-pages.git] / draft / man7 / netlink.7
1 .\" t
2 .\" Don't change the first line, it tells man that tbl is needed.
3 .\" This man page is Copyright (c) 1998 by Andi Kleen. Subject to the GPL.
4 .\" Based on the original comments from Alexey Kuznetsov
5 .\" Modified 2005-12-27 by Hasso Tepper <hasso@estpak.ee>
6 .\" $Id: netlink.7,v 1.8 2000/06/22 13:23:00 ak Exp $
7 .\"*******************************************************************
8 .\"
9 .\" This file was generated with po4a. Translate the source file.
10 .\"
11 .\"*******************************************************************
12 .TH NETLINK 7 2012\-04\-14 Linux "Linux Programmer's Manual"
13 .SH 名前
14 netlink \- カーネルとユーザー空間の通信 (AF_NETLINK)
15 .SH 書式
16 .nf
17 \fB#include <asm/types.h>\fP
18 \fB#include <sys/socket.h>\fP
19 \fB#include <linux/netlink.h>\fP
20
21 \fBnetlink_socket = socket(AF_NETLINK, \fP\fIsocket_type\fP\fB, \fP\fInetlink_family\fP\fB);\fP
22 .fi
23 .SH 説明
24 netlink はカーネルモジュールとユーザー空間のプロセス間で 情報をやりとりするために用いられる。 netlink は、ユーザープロセスに対しては
25 標準的なソケットベースのインターフェースを、 カーネルモジュールにはカーネルの内部 API を提供する。 カーネル内部のインターフェースについてはこの
26 man ページでは記述しない。 また、netlink キャラクタデバイスを用いた obsolete な netlink
27 インターフェースもあるが、これもこの文書では解説しない。 これは単に過去互換性のために用意されているものにすぎない。
28
29 netlink はデータグラム指向のサービスである。 \fIsocket_type\fP には \fBSOCK_RAW\fP と \fBSOCK_DGRAM\fP
30 の両方とも指定可能である。 しかし netlink プロトコルはデータグラムと raw ソケットの区別をしない。
31
32 \fInetlink_family\fP は、通信するカーネルモジュールや netlink グループの選択に用いる。 現在割り当てられている netlink
33 ファミリーは以下の通り。
34 .TP 
35 \fBNETLINK_ROUTE\fP
36 ルーティングとリンクの更新を受信する。 (IPv4 と IPv6 両方の) ルーティングテーブル・ IP アドレス・リンクパラメータ・近傍設定
37 (neighbor setup)・ キューイングルール (queueing dicipline)・トラフィッククラス・
38 パケットのクラス分類の修正に用いることができるだろう (\fBrtnetlink\fP(7)  を見よ)。
39 .TP 
40 \fBNETLINK_W1\fP
41 単線 (1\-wire) のサブシステムからのメッセージ。
42 .TP 
43 \fBNETLINK_USERSOCK\fP
44 ユーザーモードソケットプロトコルのために予約されている。
45 .TP 
46 \fBNETLINK_FIREWALL\fP
47 IPv4 パケットを netfilter からユーザー空間へ転送する。 \fIip_queue\fP カーネルモジュールで使用される。
48 .TP 
49 \fBNETLINK_INET_DIAG\fP
50 .\" FIXME More details on NETLINK_INET_DIAG needed.
51 INET ソケットをモニタリングする。
52 .TP 
53 \fBNETLINK_NFLOG\fP
54 Netfilter/iptables ULOG.
55 .TP 
56 \fBNETLINK_XFRM\fP
57 .\" FIXME More details on NETLINK_XFRM needed.
58 IPsec.
59 .TP 
60 \fBNETLINK_SELINUX\fP
61 SELinux のイベント通知。
62 .TP 
63 \fBNETLINK_ISCSI\fP
64 .\" FIXME More details on NETLINK_ISCSI needed.
65 Open\-iSCSI.
66 .TP 
67 \fBNETLINK_AUDIT\fP
68 .\" FIXME More details on NETLINK_AUDIT needed.
69 監査 (audit) を行う。
70 .TP 
71 \fBNETLINK_FIB_LOOKUP\fP
72 .\" FIXME More details on NETLINK_FIB_LOOKUP needed.
73 ユーザー空間から FIB ルックアップにアクセスする。
74 .TP 
75 \fBNETLINK_CONNECTOR\fP
76 カーネルコネクタ。 より詳しい情報はカーネルソースの \fIDocumentation/connector/*\fP を参照すること。
77 .TP 
78 \fBNETLINK_NETFILTER\fP
79 .\" FIXME More details on NETLINK_NETFILTER needed.
80 netfilter サブシステム。
81 .TP 
82 \fBNETLINK_IP6_FW\fP
83 IPv6 パケットを netfilter からユーザー空間へ転送する。 \fIip6_queue\fP カーネルモジュールで使用される。
84 .TP 
85 \fBNETLINK_DNRTMSG\fP
86 DECnet ルーティングメッセージ。
87 .TP 
88 \fBNETLINK_KOBJECT_UEVENT\fP
89 .\" FIXME More details on NETLINK_KOBJECT_UEVENT needed.
90 ユーザー空間へのカーネルメッセージ
91 .TP 
92 \fBNETLINK_GENERIC\fP
93 netlink を簡単に使用するための一般的な netlink ファミリー。
94 .PP
95 netlink メッセージはバイトストリームからなり、 一つ以上の \fInlmsghdr\fP ヘッダと、それに対応するペイロード (payload)
96 が含まれる。 バイトストリームには、標準の \fBNLMSG_*\fP マクロによってのみアクセスすべきである。 より詳しい情報は \fBnetlink\fP(3)
97 を見よ。
98
99 マルチパートメッセージ (一つ以上の \fInlmsghdr\fP ヘッダと、それに対応するペイロードが 一つバイトストリームに含まれる) においては、
100 先頭のヘッダ・後続のヘッダには \fBNLM_F_MULTI\fP フラグがセットされる。ただし最後のヘッダだけは例外で、 \fBNLMSG_DONE\fP
101 タイプとなる。
102
103 それぞれの \fBnlmsghdr\fP の後にはペイロードが続く。
104
105 .in +4n
106 .nf
107 struct nlmsghdr {
108     __u32 nlmsg_len;    /* ヘッダを含むメッセージの長さ */
109     __u16 nlmsg_type;   /* メッセージの内容のタイプ */
110     __u16 nlmsg_flags;  /* 追加フラグ */
111     __u32 nlmsg_seq;    /* シーケンス番号 */
112     __u32 nlmsg_pid;    /* 送信プロセスの PID */
113 };
114 .fi
115 .in
116
117 \fInlmsg_type\fP は標準のメッセージタイプのどれか一つである: \fBNLMSG_NOOP\fP メッセージは無視される。
118 \fBNLMSG_ERROR\fP メッセージはエラーを示し、ペイロードには \fInlmsgerr\fP 構造体が入る。 \fBNLMSG_DONE\fP
119 メッセージはマルチパートメッセージの終了を伝える。
120
121 .in +4n
122 .nf
123 struct nlmsgerr {
124     int error;        /* 負または 0 の errno は応答を表す */
125     struct nlmsghdr msg;  /* エラーを起こしたメッセージのヘッダ */
126 };
127 .fi
128 .in
129
130 ある netlink ファミリーで指定できるメッセージタイプは、 通常もっと多い。これらに関しては適切な man ページを見てほしい。 たとえば
131 \fBNETLINK_ROUTE\fP に関しては \fBrtnetlink\fP(7)  に書いてある。
132
133 \fInlmsg_flags\fP の標準フラグビット
134 .br
135 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
136 .TS
137 tab(:);
138 lB l.
139 NLM_F_REQUEST:要求メッセージ全てでセットされなければならない。
140 NLM_F_MULTI:T{
141 このメッセージはマルチパートメッセージの一部である。
142 マルチパートメッセージは \fBNLMSG_DONE\fP で終端する。
143 T}
144 NLM_F_ACK:成功した場合の応答を要求する。
145 NLM_F_ECHO:この要求をエコーする。
146 .TE
147
148 GET 要求における追加フラグビット
149 .br
150 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
151 .TS
152 tab(:);
153 lB l.
154 NLM_F_ROOT:単一のエントリではなくテーブル全体を返す。
155 NLM_F_MATCH:T{
156 メッセージの内容で渡された基準 (criteria) にマッチする全てのエントリを返す。
157 まだ実装されていない。
158 T}
159 .\" FIXME NLM_F_ATOMIC is not used any more?
160 NLM_F_ATOMIC:テーブルのアトミックなスナップショットを返す。
161 NLM_F_DUMP:便利なマクロ。(NLM_F_ROOT|NLM_F_MATCH) と同じ。
162 .TE
163
164 \fBNLM_F_ATOMIC\fP を使う場合は、 \fBCAP_NET_ADMIN\fP 権限を持つか実効ユーザー ID が 0
165 でなければならない点に注意すること。
166
167 NEW 要求における追加フラグビット
168 .br
169 \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
170 .TS
171 tab(:);
172 lB l.
173 NLM_F_REPLACE:現存のオブジェクトを置換する。
174 NLM_F_EXCL:すでにオブジェクトがあったら置換しない。
175 NLM_F_CREATE:まだオブジェクトがなければ作成する。
176 NLM_F_APPEND:オブジェクトリストの最後に追加する。
177 .TE
178
179 \fInlmsg_seq\fP と \fInlmsg_pid\fP はメッセージの追跡に使用される。 \fInlmsg_pid\fP はメッセージの送信元を表す。
180 メッセージが netlink ソケットで送信されている場合、 \fInlmsg_pid\fP とプロセスの PID は 1:1
181 の関係ではない点に注意すること。 より詳しい情報は、 「\fBアドレスのフォーマット\fP」 のセクションを参照すること。
182
183 .\" FIXME Explain more about nlmsg_seq and nlmsg_pid.
184 \fInlmsg_seq\fP と \fInlmsg_pid\fP は netlink のコアには見えない (opaque)。
185
186 netlink は信頼性の高いプロトコルではない。 netlink はメッセージを行き先に届けるために最善を尽くすが、
187 メモリが足りなかったりエラーが起こったりすると メッセージを取りこぼすこともある。 信頼性の高い転送を行いたいときは、
188 送信者は受信者に応答を要求することもできる。 これには \fBNLM_F_ACK\fP フラグをセットする。 応答は \fBNLMSG_ERROR\fP
189 パケットのエラーフィールドを 0 にしたものになる。 アプリケーションは自分自身のメッセージを受けたときには、 応答を生成しなければならない。
190 カーネルは失敗したパケットに対して、 \fBNLMSG_ERROR\fP メッセージを送ろうとする。 ユーザープロセスはこの慣習にも従う必要がある。
191
192 しかし、どのような場合でもカーネルからユーザーへの 信頼性の高い転送は不可能である。 ソケットバッファが満杯の場合、カーネルは netlink
193 メッセージを送信できない。 メッセージは取りこぼされて、カーネルとユーザー空間プロセスは、 カーネルの状態についての同じビューを持つことができなくなる。
194 これが起こったこと (\fBrecvmsg\fP(2)  によって \fBENOBUFS\fP エラーが返される) を検知して再び同期させるのは、
195 アプリケーションの責任である。
196 .SS アドレスのフォーマット
197 \fIsockaddr_nl\fP 構造体はユーザー空間やカーネル空間で netlink クライアントを記述する。 \fIsockaddr_nl\fP
198 はユニキャスト (単一の接続先にだけ送られる) にもできるし、 netlink マルチキャストグループ (\fInl_groups\fP が 0 でない場合)
199 にも送ることができる。
200
201 .in +4n
202 .nf
203 struct sockaddr_nl {
204     sa_family_t     nl_family;  /* AF_NETLINK */
205     unsigned short  nl_pad;     /* 0 である */
206     pid_t           nl_pid;     /* プロセス ID */
207     __u32           nl_groups;  /* マルチキャストグループマスク */
208 };
209 .fi
210 .in
211
212 \fInl_pid\fP は netlink ソケットのユニキャストアドレスである。 行き先がカーネルの場合は、常に 0 である。
213 ユーザー空間プロセスの場合、通常は \fInl_pid\fP は行き先のソケットを所有しているプロセスの PID である。 ただし、 \fInl_pid\fP
214 はプロセスではなく netlink ソケットを同定する。 プロセスが複数の netlink ソケットを所有する場合、 \fInl_pid\fP
215 は最大でも一つのソケットのプロセス ID としか等しくならない。 \fInl_pid\fP を netlink ソケットに割り当てる方法は 2 つある。
216 アプリケーションが \fBbind\fP(2)  を呼ぶ前に \fInl_pid\fP を設定する場合、 \fInl_pid\fP
217 が一意であることを確認するのはアプリケーションの責任となる。 アプリケーションが \fInl_pid\fP を 0
218 に設定した場合、カーネルがこの値を割り当てる。 カーネルはプロセスが最初にオープンした netlink ソケットに対してプロセス ID を割り当て、
219 それ以降にプロセスが作成した全ての netlink ソケットにも一意な \fInl_pid\fP を割り当てる。
220
221 \fInl_groups\fP はビットマスクで、すべてのビットが netlink グループ番号を表す。
222 それぞれの netlink ファミリーは 32 のマルチキャストグループのセットを持つ。
223 それぞれの netlink ファミリーは 32 のマルチキャストグループの セットを持つ。
224 \fBbind\fP(2) がソケットに対して呼ばれると、 \fIsockaddr_nl\fP の \fInl_groups\fP
225 フィールドには listen したいグループのビットマスクがセットされる。
226 デフォルトの値は 0 で、マルチキャストを一切受信しない。
227 \fBsendmsg\fP(2) や \fBconnect\fP(2) によって、あるソケットからメッセージを
228 マルチキャストしたいときは、 \fInl_groups\fP に送信したいグループのビットマスク
229 をセットすればよい。
230 実効ユーザー ID が 0 か、 \fBCAP_NET_ADMIN\fP 権限を持つユーザーのみが netlink
231 マルチキャストグループに 送信したり、これを listen したりすることができる。
232 マルチキャストグループ向けメッセージを受信した場合、これ対する応答は
233 送り主の PID とマルチキャストグループとに送り返すべきである。
234 さらに、Linux のカーネルサブシステムによっては、
235 他のユーザもメッセージの送受信ができる場合がある。
236 Linux 3.0 の時点では、
237 \fBNETLINK_KOBJECT_UEVENT\fP, \fBNETLINK_GENERIC\fP, \fBNETLINK_ROUTE\fP,
238 \fBNETLINK_SELINUX\fP グループでは他のユーザがメッセージを受信することができる。
239 他のユーザがメッセージを送信できるグループは存在しない。
240 .SH バージョン
241 netlink へのソケットインターフェースは Linux 2.2 の新機能である。
242
243 Linux 2.0 は、もっと原始的なデバイスベースの netlink インターフェースを サポートしていた (これも互換性のために今でも使用できる)。
244 古いインターフェースに関してはここでは記述しない。
245
246 NETLINK_SELINUX は Linux 2.6.4 で登場した。
247
248 NETLINK_AUDIT は Linux 2.6.6 で登場した。
249
250 NETLINK_KOBJECT_UEVENT は Linux 2.6.10 で登場した。
251
252 NETLINK_W1, NETLINK_FIB_LOOKUP は Linux 2.6.13 で登場した。
253
254 NETLINK_INET_DIAG, NETLINK_CONNECTOR, NETLINK_NETFILTER は Linux 2.6.14
255 で登場した。
256
257 NETLINK_GENERIC, NETLINK_ISCSI は Linux 2.6.15 で登場した。
258 .SH 注意
259 低レベルのカーネルインターフェースより、 \fIlibnetlink\fP または \fIlibnl\fP を通して netlink
260 を利用するほうが良いことが多い。
261 .SH バグ
262 この man ページは完成していない。
263 .SH 例
264 以下の例では、 \fBRTMGRP_LINK\fP (ネットワークインターフェースの create/delete/up/down イベント) と
265 \fBRTMGRP_IPV4_IFADDR\fP (IPv4 アドレスの add/delete イベント) マルチキャストグループを listen する
266 \fBNETLINK_ROUTE\fP netlink を作成している。
267
268 .in +4n
269 .nf
270 struct sockaddr_nl sa;
271
272 memset(&sa, 0, sizeof(sa));
273 sa.nl_family = AF_NETLINK;
274 sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR;
275
276 fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
277 bind(fd, (struct sockaddr *) &sa, sizeof(sa));
278 .fi
279 .in
280
281 次の例では、netlink メッセージをカーネル (pid 0) に送る方法を示している。 応答を追跡する際の信頼性を高めるために、アプリケーションが
282 メッセージのシーケンス番号を正しく処理しなければならない点に注意すること。
283
284 .in +4n
285 .nf
286 struct nlmsghdr *nh;    /* 送信する nlmsghdr とペイロード */
287 struct sockaddr_nl sa;
288 struct iovec iov = { (void *) nh, nh\->nlmsg_len };
289 struct msghdr msg;
290
291 msg = { (void *)&sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
292 memset(&sa, 0, sizeof(sa));
293 sa.nl_family = AF_NETLINK;
294 nh\->nlmsg_pid = 0;
295 nh\->nlmsg_seq = ++sequence_number;
296 /* NLM_F_ACK を設定することで、カーネルに応答を要求する */
297 nh\->nlmsg_flags |= NLM_F_ACK;
298
299 sendmsg(fd, &msg, 0);
300 .fi
301 .in
302
303 最後は、netlink メッセージの読み込みの例である。
304
305 .in +4n
306 .nf
307 int len;
308 char buf[4096];
309 struct iovec iov = { buf, sizeof(buf) };
310 struct sockaddr_nl sa;
311 struct msghdr msg;
312 struct nlmsghdr *nh;
313
314 msg = { (void *)&sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
315 len = recvmsg(fd, &msg, 0);
316
317 for (nh = (struct nlmsghdr *) buf; NLMSG_OK (nh, len);
318      nh = NLMSG_NEXT (nh, len)) {
319     /* マルチパートメッセージの終わり */
320     if (nh\->nlmsg_type == NLMSG_DONE)
321         return;
322
323     if (nh\->nlmsg_type == NLMSG_ERROR)
324         /* 何らかのエラー処理を行う */
325     ...
326
327     /* ペイロードの解析を続ける */
328     ...
329 }
330 .fi
331 .in
332 .SH 関連項目
333 \fBcmsg\fP(3), \fBnetlink\fP(3), \fBcapabilities\fP(7), \fBrtnetlink\fP(7)
334 .PP
335 libnetlink に関する情報は ftp://ftp.inr.ac.ru/ip\-routing/iproute2*
336
337 libnl に関する情報は http://people.suug.ch/~tgr/libnl/
338
339 RFC 3549 "Linux Netlink as an IP Services Protocol"