OSDN Git Service

(split) Convert release and draft pages to UTF-8.
[linuxjm/LDP_man-pages.git] / release / man7 / packet.7
1 .\" This man page is Copyright (C) 1999 Andi Kleen <ak@muc.de>.
2 .\" Permission is granted to distribute possibly modified copies
3 .\" of this page provided the header is included verbatim,
4 .\" and in case of nontrivial modification author and date
5 .\" of the modification is added to the header.
6 .\" $Id: packet.7,v 1.12 2001/06/19 07:07:38 argrath Exp $
7 .\"
8 .\" Japanese Version Copyright (c) 1999 NAKANO Takeo all rights reserved.
9 .\" Translated 1999-12-06, NAKANO Takeo <nakano@apm.seikei.ac.jp>
10 .\" Updated 2001-02-13, Kentaro Shirakata <argrath@ub32.org>
11 .\" Updated 2005-02-21, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
12 .\"
13 .\"WORD         physical layer          物理層
14 .\"WORD         link level header(s)    リンクレベルヘッダ
15 .\"WORD         phyxical header(s)      物理ヘッダ
16 .\"WORD         effective user id       実効ユーザー ID
17 .\"WORD         capability              ケーパビリティ
18 .\"WORD         pending error           遅延エラー
19 .\"WORD         promiscuous mode        無差別モード
20 .\"
21 .TH PACKET  7 2008-08-08 "Linux" "Linux Programmer's Manual"
22 .SH 名前
23 packet, AF_PACKET \- デバイスレベルのパケットインターフェース
24 .SH 書式
25 .nf
26 .B #include <sys/socket.h>
27 .br
28 .B #include <netpacket/packet.h>
29 .br
30 .B #include <net/ethernet.h>     /* the L2 protocols */
31 .sp
32 .BI "packet_socket = socket(AF_PACKET, int " socket_type ", int "protocol );
33 .fi
34 .SH 説明
35 packet ソケットは、デバイスドライバ (OSI レイヤ 2) レベルで
36 生のパケット (raw packet) を送受信するために用いられる。
37 packet ソケットを使うと、ユーザー空間で物理層の上に
38 プロトコルモジュールを実装することができる。
39
40 .I socket_type
41 には
42 .B SOCK_RAW
43
44 .B SOCK_DGRAM
45 のいずれかを指定する。
46 .B SOCK_RAW
47 はリンクレベルヘッダを含む raw パケットを、
48 .B SOCK_DGRAM
49 はリンクレベルヘッダが削除された加工済みパケットを示す。
50 リンクレベルヘッダ情報は
51 .I sockaddr_ll
52 で共通のフォーマットで入手できる。
53 .I protocol
54 には IEEE 802.3 プロトコル番号を
55 ネットワークバイトオーダーで指定する。
56 指定できるプロトコルのリストは、インクルードファイル
57 .I <linux/if_ether.h>
58 を参照。プロトコルを
59 .B htons(ETH_P_ALL)
60 にすると、全てのプロトコルが受信される。
61 外部から来たパケットのうち指定したプロトコルのものは、
62 カーネルに実装されているプロトコルに渡される前の段階で、
63 packet ソケットに渡される。
64
65 packet ソケットをオープンできるのは、
66 実効ユーザーID が 0 のプロセスか、
67 .B CAP_NET_RAW
68 ケーパビリティを持つプロセスだけである。
69
70 .B SOCK_RAW
71 パケットでは、パケットをデバイスドライバと受け渡しする際、
72 パケットデータに変更が行われることはない。
73 パケットの受信時には、アドレスの解析だけは行われ、
74 標準的な
75 .I sockaddr_ll
76 アドレス構造体に渡される。パケットの送信時には、ユーザが指定する
77 バッファに物理層のヘッダが含まれている必要がある。
78 パケットはそのまま修正を受けずに、行き先アドレスから決定される
79 インターフェースのネットワークドライバにキューイングされる。
80 デバイスドライバによっては、他のヘッダを常に追加するものもある。
81 .B SOCK_RAW
82 は Linux 2.0 の obosolete な
83 .B AF_INET/SOCK_PACKET
84 と似ているが、互換性があるわけではない。
85
86 .B SOCK_DGRAM
87 はやや高位のレベルで動作する。物理ヘッダは、パケットがユーザーに
88 渡される前に削除される。
89 .B SOCK_DGRAM
90 の packet ソケットを通して送られるパケットは、
91 .I sockaddr_ll
92 の行き先アドレスの情報に基づき、適切な物理層のヘッダが付加されてから、
93 キューに送られる。
94
95 デフォルトでは、指定したプロトコル型のパケットはすべて packet
96 ソケットに送られる。特定のインターフェースからのパケットだけを
97 取得したい場合には、
98 .I struct sockaddr_ll
99 にアドレスを指定して
100 .BR bind (2)
101 を呼び、 packet ソケットをそのインターフェースに結び付ける (バインドする)。
102 バインドの際には、アドレスフィールドのうち
103 .I sll_protocol
104
105 .I sll_ifindex
106 だけが用いられる。
107
108 .BR connect (2)
109 操作は packet ソケットではサポートされていない。
110
111 .B MSG_TRUNC
112 フラグが
113 .BR recvmsg (2),
114 .BR recv (2),
115 .BR recvfrom (2)
116 に渡されると、 (バッファサイズより大きかったとしても) 常に実際に通信された
117 パケットの長さが返される。
118 .SS アドレスのタイプ
119 sockaddr_ll はデバイスに依存しない物理層のアドレスである。
120
121 .in +4n
122 .nf
123 struct sockaddr_ll {
124     unsigned short sll_family;   /* 常に AF_PACKET */
125     unsigned short sll_protocol; /* 物理層のプロトコル */
126     int            sll_ifindex;  /* インターフェース番号 */
127     unsigned short sll_hatype;   /* ヘッダ種別 */
128     unsigned char  sll_pkttype;  /* パケット種別 */
129     unsigned char  sll_halen;    /* アドレスの長さ */
130     unsigned char  sll_addr[8];  /* 物理層のアドレス */
131 };
132 .fi
133 .in
134
135 .I sll_protocol
136 は標準的なイーサネットプロトコルのタイプで、
137 ネットワークバイトオーダーで記述する。
138 インクルードファイル
139 .I <linux/if_ether.h>
140 で定義されている。
141 これがこのソケットのプロトコルのデフォルトとなる。
142
143 .I sll_ifindex
144 はそのインターフェースの interface index である
145 .RB ( netdevice (7)
146 を参照)。
147 0 は (バインドが許可されている)  任意のインターフェースにマッチする。
148
149 .I sll_hatype
150 は、インクルードファイル
151 .I <linux/if_arp.h>
152 で定義されている ARP 種別である。
153
154 .I sll_pkttype
155 はパケット種別である。指定できる種別は以下のいずれかである:
156 .B PACKET_HOST
157 (ローカルホスト向けのパケット)、
158 .B PACKET_BORADCAST
159 (物理層のブロードキャストパケット)、
160 .B PACKET_MULTICAST
161 (物理層のマルチキャストアドレスに送るパケット)、
162 .B PACKET_OTHERHOST
163 (他のホストに向けられたパケットのうち、
164 無差別モード (promiscuous mode: 後述) のデバイスドライバにより補足されたもの)、
165 .B PACKET_OUTGOING
166 (ローカルホストから発信され、
167 packet ソケットにループバックしてきたパケット)。
168 これらの種別が意味を持つのは受信時のみである。
169
170 .I sll_addr
171
172 .I sll_halen
173 は、物理層の (つまり IEEE 802.3 の) アドレスとその長さである。
174 厳密な解釈はデバイスに依存する。
175
176 パケットを送る場合は、
177 .IR sll_family ,
178 .IR sll_addr ,
179 .IR sll_halen ,
180 .I sll_ifindex
181 を指定すれば十分である。
182 その他のフィールドは 0 にしておくべきである。
183 .I sll_hatype
184
185 .I sll_pkttype
186 には受信したパケットの情報が設定される。
187 バインドの際には、
188 .I sll_protocol
189
190 .I sll_ifindex
191 だけが使用される。
192 .SS ソケットオプション
193 packet ソケットは、物理層のマルチキャストや
194 無差別モード (promiscuous mode) を設定して使うことができる。
195 これには
196 .B SOL_PACKET
197 と以下のオプションのいずれかを指定して
198 .BR setsockopt (2)
199 を呼べばよい。
200 バインドを追加する場合は
201 .B PACKET_ADD_MEMBERSHIP
202 であり、取り去る場合は
203 .B PACKET_DROP_MEMBERSHIP
204 である。これらはいずれも
205 .B packet_mreq
206 構造体を引き数に取る。
207
208 .in +4n
209 .nf
210 struct packet_mreq {
211     int            mr_ifindex;    /* インターフェース番号 */
212     unsigned short mr_type;       /* 動作 */
213     unsigned short mr_alen;       /* アドレスの長さ */
214     unsigned char  mr_address[8]; /* 物理層のアドレス */
215 };
216 .fi
217 .in
218
219 .I mr_ifindex
220 は、ステータスを変更したいインターフェースの
221 インターフェース番号である。
222 .I mr_type
223 パラメータは実行する動作を指定する:
224 .B PACKET_MR_PROMISC
225 は、共有している媒体からの全てのパケットを受信できるようにする
226 (しばしば "無差別モード (promiscuous mode)" と呼ばれる)。
227 .B PACKET_MR_MULTICAST
228 は、そのソケットを、
229 .I mr_address
230
231 .I mr_alen
232 で指定される物理層のマルチキャストブループにバインドする。
233 .B PACKET_MR_ALLMULTI
234 は socket を up にして、そのインターフェースに到達したすべての
235 マルチキャストパケットを受信できるようにする。
236
237 昔からある ioctl だけでなく、
238 .BR SIOCSIFFLAGS ,
239 .BR SIOCADDMULTI ,
240 .B SIOCDELMULTI
241 を同じ目的に用いることができる。
242 .SS ioctl
243 .B SIOCGSTAMP
244 を用いると、最後に受信したパケットのタイムスタンプを得ることができる。
245 引き数は
246 .I struct timeval
247 である。
248 .\" FIXME Document SIOCGSTAMPNS
249
250 さらに、
251 .BR netdevice (7)
252 および
253 .BR socket (7)
254 で定義されている標準の ioctl はいずれも
255 packet ソケットに指定可能である。
256 .SS エラー処理
257 packet ソケットは、パケットをデバイスドライバに渡すときに
258 起きたエラーしか処理しない。遅延エラー (pending error)
259 に関する概念は持っていない。
260 .SH エラー
261 .TP
262 .B EADDRNOTAVAIL
263 不明なマルチキャストグループアドレスが渡された。
264 .TP
265 .B EFAULT
266 ユーザが渡したメモリアドレスが不正。
267 .TP
268 .B EINVAL
269 引き数が不正。
270 .TP
271 .B EMSGSIZE
272 パケットがインターフェースの MTU より大きい。
273 .TP
274 .B ENETDOWN
275 インターフェースが up でない。
276 .TP
277 .B ENOBUFS
278 パケットに割り当てるメモリが足りない。
279 .TP
280 .B ENODEV
281 デバイス名が不明。あるいはインターフェースアドレスで指定された
282 インターフェースインデックスが不明。
283 .TP
284 .B ENOENT
285 パケットを一つも受信していない。
286 .TP
287 .B ENOTCONN
288 インターフェースアドレスが渡されなかった。
289 .TP
290 .B ENXIO
291 インターフェースアドレスに不正なインターフェースインデックスが含まれている。
292 .TP
293 .B EPERM
294 この操作を行うのに必要な権限をユーザが持っていない。
295
296 上記以外のエラーが、低レベルのドライバで生成されることがある。
297 .SH バージョン
298 .B AF_PACKET
299 は Linux 2.2 の新機能である。これより古いバージョンの Linux では
300 .B SOCK_PACKET
301 のみをサポートしていた。
302 .PP
303 インクルードファイル
304 .I <netpacket/packet.h>
305 が存在するのは glibc 2.1 以降である。
306 それ以前のシステムでは以下のようにする必要がある:
307 .sp
308 .in +4n
309 .nf
310 #include <asm/types.h>
311 #include <linux/if_packet.h>
312 #include <linux/if_ether.h>  /* The L2 protocols */
313 .fi
314 .in
315 .SH 注意
316 移植性の必要なプログラムでは、
317 .BR pcap (3)
318 経由で
319 .B AF_PACKET
320 を用いることをお薦めする。ただし、この方法では
321 .B AF_PACKET
322 の機能すべてを利用することはできない。
323
324 .B SOCK_DGRAM
325 packet ソケットは、IEEE 802.3 フレームの IEEE 802.2 LLC ヘッダの
326 生成や解析を行おうとしない。
327 .B ETH_P_802_3
328 が送信プロトコルに指定されると、カーネルは 802.3 フレームを
329 生成して length フィールドに書き込む。
330 完全に準拠したパケットを得るためにはユーザーが LLC ヘッダを
331 与える必要がある。到着した 802.3 パケットでは、
332 DSAP/SSAP protocol の各フィールドは多重化 (multiplex) されていない。
333 代わりにこれらは LLC ヘッダが前置された
334 .B ETH_P_802_2
335 プロトコルとして与えられる。したがって、
336 .B ETH_P_802_3
337 にバインドすることはできない。かわりに
338 .B ETH_P_802_2
339 にバインドし、自分自身でプロトコルの多重化を行うこと。
340 送信のデフォルトは、プロトコルフィールドを持つ
341 標準の Ethernet DIX encapsulation である。
342
343 packet ソケットは入出力の firewall chain に影響をうけない。
344 .SS 移植性
345 Linux 2.0 では、 packet ソケットを得る方法は
346 .BI "socket(AF_INET, SOCK_PACKET, " protocol )\fR
347 を呼ぶやり方しかなかった。この方法はまだサポートされているが、
348 用いないことを強く推奨する。現在の方法との主な違いは、
349 .B SOCK_PACKET
350 ではインターフェースの指定に古い
351 .I struct sockaddr_pkt
352 を用いる点である。これには物理層からの独立性がない。
353
354 .in +4n
355 .nf
356 struct sockaddr_pkt {
357     unsigned short spkt_family;
358     unsigned char  spkt_device[14];
359     unsigned short spkt_protocol;
360 };
361 .fi
362 .in
363
364 .I spkt_family
365 はデバイスのタイプ、
366 .I spkt_protocol
367
368 .I <sys/if_ether.h>
369 で定義されている IEEE 802.3 プロトコルタイプ、
370 .I spkt_device
371 はデバイスの名前を NULL 終端された文字列で与えたもの (例: eth0) である。
372
373 この構造体は obsolete であり、
374 新しくコードを書く時には用いるべきでない。
375 .SH バグ
376 glibc 2.1 には
377 .B SOL_PACKET
378 の定義がない。回避策としては、以下のようにするとよい。
379 .in +4n
380 .nf
381
382 #ifndef SOL_PACKET
383 #define SOL_PACKET 263
384 #endif
385
386 .fi
387 .in
388 この問題は新しいバージョンの glibc では修正されている。
389 libc5 のシステムにはこの問題はない。
390
391 IEEE 802.2/803.3 の LLC の扱い方は、バグと考えても良いだろう。
392
393 ソケットフィルターについて記載されていない。
394
395 .B MSG_TRUNC
396 .BR recvmsg (2)
397 拡張は非常にまずい対処であり、制御メッセージで置き換えるべきである。
398 今のところ
399 .B SOCK_DGRAM
400 経由でパケットについていた宛先アドレスを得る方法がない。
401 .\" .SH 著者
402 .\" この man ページは Matthew Wilcox の助力のもとに Andi Kleen が書いた。
403 .\" Linux 2.2 の AF_PACKET は、
404 .\" Alan Cox たちのコードをもとにして Alexey Kuznetsov が実装した。
405 .SH 関連項目
406 .BR socket (2),
407 .BR pcap (3),
408 .BR capabilities (7),
409 .BR ip (7),
410 .BR raw (7),
411 .BR socket (7)
412
413 標準 IP Ethernet encapsulation に関する情報は RFC\ 894 にある。
414
415 IEEE 802.3 IP encapsulation に関する情報は RFC\ 1700 にある。
416
417 物理層のプロトコルに関する記述は
418 .I <linux/if_ether.h>
419 インクルードファイルにある。