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 .\" $Id: netlink.7,v 1.8 2000/06/22 13:23:00 ak Exp $
7 .\" Japanese Version Copyright (c) 1999 NAKANO Takeo all rights reserved.
8 .\" Translated 1999-12-06 by NAKANO Takeo <nakano@apm.seikei.ac.jp>
9 .\" Updated 2001-04-04 by Yuichi SATO <ysato@h4.dion.ne.jp>, catch up to LDP v1.35
10 .\" Updated 2006-06-23 by Yuichi SATO <ysato444@yahoo.co.jp>, catch up to LDP v2.29
15 .TH NETLINK 7 2008-11-11 "Linux" "Linux Programmer's Manual"
17 netlink \- カーネルとユーザー空間の通信 (AF_NETLINK)
20 .B #include <asm/types.h>
21 .B #include <sys/socket.h>
22 .B #include <linux/netlink.h>
24 .BI "netlink_socket = socket(AF_NETLINK, " socket_type ", " netlink_family );
27 netlink はカーネルモジュールとユーザー空間のプロセス間で
29 netlink は、ユーザープロセスに対しては
30 標準的なソケットベースのインターフェースを、
31 カーネルモジュールにはカーネルの内部 API を提供する。
32 カーネル内部のインターフェースについてはこの man ページでは記述しない。
33 また、netlink キャラクタデバイスを用いた
34 obsolete な netlink インターフェースもあるが、これもこの文書では解説しない。
35 これは単に過去互換性のために用意されているものにすぎない。
37 netlink はデータグラム指向のサービスである。
44 しかし netlink プロトコルはデータグラムと raw ソケットの区別をしない。
47 は、通信するカーネルモジュールや netlink グループの選択に用いる。
48 現在割り当てられている netlink ファミリーは以下の通り。
52 (IPv4 と IPv6 両方の) ルーティングテーブル・
53 IP アドレス・リンクパラメータ・近傍設定 (neighbor setup)・
54 キューイングルール (queueing dicipline)・トラフィッククラス・
55 パケットのクラス分類の修正に用いることができるだろう
60 単線 (1-wire) のサブシステムからのメッセージ。
63 ユーザーモードソケットプロトコルのために予約されている。
66 IPv4 パケットを netfilter からユーザー空間へ転送する。
71 .\" FIXME More details on NETLINK_INET_DIAG needed.
75 Netfilter/iptables ULOG.
78 .\" FIXME More details on NETLINK_XFRM needed.
85 .\" FIXME More details on NETLINK_ISCSI needed.
89 .\" FIXME More details on NETLINK_AUDIT needed.
93 .\" FIXME More details on NETLINK_FIB_LOOKUP needed.
94 ユーザー空間から FIB ルックアップにアクセスする。
99 .I Documentation/connector/*
103 .\" FIXME More details on NETLINK_NETFILTER needed.
107 IPv6 パケットを netfilter からユーザー空間へ転送する。
114 .B NETLINK_KOBJECT_UEVENT
115 .\" FIXME More details on NETLINK_KOBJECT_UEVENT needed.
119 netlink を簡単に使用するための一般的な netlink ファミリー。
121 netlink メッセージはバイトストリームからなり、
124 ヘッダと、それに対応するペイロード (payload) が含まれる。
135 一つバイトストリームに含まれる) においては、
138 フラグがセットされる。ただし最後のヘッダだけは例外で、
149 __u32 nlmsg_len; /* ヘッダを含むメッセージの長さ */
150 __u16 nlmsg_type; /* メッセージの内容のタイプ */
151 __u16 nlmsg_flags; /* 追加フラグ */
152 __u32 nlmsg_seq; /* シーケンス番号 */
153 __u32 nlmsg_pid; /* 送信プロセスの PID */
159 は標準のメッセージタイプのどれか一つである:
167 メッセージはマルチパートメッセージの終了を伝える。
172 int error; /* 負または 0 の errno は応答を表す */
173 struct nlmsghdr msg; /* エラーを起こしたメッセージのヘッダ */
178 ある netlink ファミリーで指定できるメッセージタイプは、
179 通常もっと多い。これらに関しては適切な man ページを見てほしい。
189 ---------------------------------
193 NLM_F_REQUEST:要求メッセージ全てでセットされなければならない。
195 このメッセージはマルチパートメッセージの一部である。
200 NLM_F_ACK:成功した場合の応答を要求する。
201 NLM_F_ECHO:この要求をエコーする。
206 -------------------------------------
210 .\" FIXME NLM_F_ATOMIC is not used any more?
211 NLM_F_ROOT:単一のエントリではなくテーブル全体を返す。
213 メッセージの内容で渡された基準 (criteria) にマッチする
217 NLM_F_ATOMIC:テーブルのアトミックなスナップショットを返す。
218 NLM_F_DUMP:便利なマクロ。(NLM_F_ROOT|NLM_F_MATCH) と同じ。
224 権限を持つか実効ユーザー ID が 0 でなければならない点に注意すること。
228 -------------------------------------
232 NLM_F_REPLACE:現存のオブジェクトを置換する。
233 NLM_F_EXCL:すでにオブジェクトがあったら置換しない。
234 NLM_F_CREATE:まだオブジェクトがなければ作成する。
235 NLM_F_APPEND:オブジェクトリストの最後に追加する。
244 メッセージが netlink ソケットで送信されている場合、
246 とプロセスの PID は 1:1 の関係ではない点に注意すること。
254 は netlink のコアには見えない (opaque)。
256 netlink は信頼性の高いプロトコルではない。
257 netlink はメッセージを行き先に届けるために最善を尽くすが、
258 メモリが足りなかったりエラーが起こったりすると
261 送信者は受信者に応答を要求することもできる。
267 パケットのエラーフィールドを 0 にしたものになる。
268 アプリケーションは自分自身のメッセージを受けたときには、
273 ユーザープロセスはこの慣習にも従う必要がある。
275 しかし、どのような場合でもカーネルからユーザーへの
277 ソケットバッファが満杯の場合、カーネルは netlink メッセージを送信できない。
278 メッセージは取りこぼされて、カーネルとユーザー空間プロセスは、
279 カーネルの状態についての同じビューを持つことができなくなる。
284 エラーが返される) を検知して再び同期させるのは、
288 構造体はユーザー空間やカーネル空間で netlink クライアントを記述する。
290 はユニキャスト (単一の接続先にだけ送られる) にもできるし、
293 が 0 でない場合) にも送ることができる。
298 sa_family_t nl_family; /* AF_NETLINK */
299 unsigned short nl_pad; /* 0 である */
300 pid_t nl_pid; /* プロセス ID */
301 __u32 nl_groups; /* マルチキャストグループマスク */
307 は netlink ソケットのユニキャストアドレスである。
308 行き先がカーネルの場合は、常に 0 である。
311 は行き先のソケットを所有しているプロセスの PID である。
314 はプロセスではなく netlink ソケットを同定する。
315 プロセスが複数の netlink ソケットを所有する場合、
317 は最大でも一つのソケットのプロセス ID としか等しくならない。
319 を netlink ソケットに割り当てる方法は 2 つある。
326 が一意であることを確認するのはアプリケーションの責任となる。
329 を 0 に設定した場合、カーネルがこの値を割り当てる。
331 netlink ソケットに対してプロセス ID を割り当て、
332 それ以降にプロセスが作成した全ての netlink ソケットにも一意な
337 はビットマスクで、すべてのビットが netlink グループ番号を表す。
338 それぞれの netlink ファミリーは 32 のマルチキャストグループのセットを持つ。
339 それぞれの netlink ファミリーは 32 のマルチキャストグループの
346 フィールドには listen したいグループのビットマスクがセットされる。
347 デフォルトの値は 0 で、マルチキャストを一切受信しない。
351 によって、あるソケットからメッセージをマルチキャストしたいときは、
353 に送信したいグループのビットマスクをセットすればよい。
356 権限を持つユーザーのみが netlink マルチキャストグループに
357 送信したり、これを listen したりすることができる。
358 マルチキャストグループ向けメッセージを受信した場合、これ対する応答は
359 送り主の PID とマルチキャストグループとに送り返すべきである。
361 netlink へのソケットインターフェースは Linux 2.2 の新機能である。
363 Linux 2.0 は、もっと原始的なデバイスベースの netlink インターフェースを
364 サポートしていた (これも互換性のために今でも使用できる)。
365 古いインターフェースに関してはここでは記述しない。
367 NETLINK_SELINUX は Linux 2.6.4 で登場した。
369 NETLINK_AUDIT は Linux 2.6.6 で登場した。
371 NETLINK_KOBJECT_UEVENT は Linux 2.6.10 で登場した。
373 NETLINK_W1, NETLINK_FIB_LOOKUP は Linux 2.6.13 で登場した。
375 NETLINK_INET_DIAG, NETLINK_CONNECTOR, NETLINK_NETFILTER は
378 NETLINK_GENERIC, NETLINK_ISCSI は Linux 2.6.15 で登場した。
384 を通して netlink を利用するほうが良いことが多い。
390 (ネットワークインターフェースの create/delete/up/down イベント) と
391 .B RTMGRP_IPV4_IFADDR
392 (IPv4 アドレスの add/delete イベント) マルチキャストグループを listen する
398 struct sockaddr_nl sa;
400 memset(&sa, 0, sizeof(sa));
401 sa.nl_family = AF_NETLINK;
402 sa.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR;
404 fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
405 bind(fd, (struct sockaddr *) &sa, sizeof(sa));
409 次の例では、netlink メッセージをカーネル (pid 0) に送る方法を示している。
410 応答を追跡する際の信頼性を高めるために、アプリケーションが
411 メッセージのシーケンス番号を正しく処理しなければならない点に注意すること。
415 struct nlmsghdr *nh; /* 送信する nlmsghdr とペイロード */
416 struct sockaddr_nl sa;
417 struct iovec iov = { (void *) nh, nh\->nlmsg_len };
420 msg = { (void *)&sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
421 memset(&sa, 0, sizeof(sa));
422 sa.nl_family = AF_NETLINK;
424 nh\->nlmsg_seq = ++sequence_number;
425 /* NLM_F_ACK を設定することで、カーネルに応答を要求する */
426 nh\->nlmsg_flags |= NLM_F_ACK;
428 sendmsg(fd, &msg, 0);
432 最後は、netlink メッセージの読み込みの例である。
438 struct iovec iov = { buf, sizeof(buf) };
439 struct sockaddr_nl sa;
443 msg = { (void *)&sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
444 len = recvmsg(fd, &msg, 0);
446 for (nh = (struct nlmsghdr *) buf; NLMSG_OK (nh, len);
447 nh = NLMSG_NEXT (nh, len)) {
448 /* マルチパートメッセージの終わり */
449 if (nh\->nlmsg_type == NLMSG_DONE)
452 if (nh\->nlmsg_type == NLMSG_ERROR)
464 .BR capabilities (7),
468 ftp://ftp.inr.ac.ru/ip-routing/iproute2*
471 http://people.suug.ch/~tgr/libnl/
473 RFC 3549 "Linux Netlink as an IP Services Protocol"