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 $
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>
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 無差別モード
21 .TH PACKET 7 2008-08-08 "Linux" "Linux Programmer's Manual"
23 packet, AF_PACKET \- デバイスレベルのパケットインターフェース
26 .B #include <sys/socket.h>
28 .B #include <netpacket/packet.h>
30 .B #include <net/ethernet.h> /* the L2 protocols */
32 .BI "packet_socket = socket(AF_PACKET, int " socket_type ", int "protocol );
35 packet ソケットは、デバイスドライバ (OSI レイヤ 2) レベルで
36 生のパケット (raw packet) を送受信するために用いられる。
37 packet ソケットを使うと、ユーザー空間で物理層の上に
38 プロトコルモジュールを実装することができる。
47 はリンクレベルヘッダを含む raw パケットを、
49 はリンクレベルヘッダが削除された加工済みパケットを示す。
54 には IEEE 802.3 プロトコル番号を
56 指定できるプロトコルのリストは、インクルードファイル
61 外部から来たパケットのうち指定したプロトコルのものは、
62 カーネルに実装されているプロトコルに渡される前の段階で、
65 packet ソケットをオープンできるのは、
71 パケットでは、パケットをデバイスドライバと受け渡しする際、
73 パケットの受信時には、アドレスの解析だけは行われ、
76 アドレス構造体に渡される。パケットの送信時には、ユーザが指定する
77 バッファに物理層のヘッダが含まれている必要がある。
78 パケットはそのまま修正を受けずに、行き先アドレスから決定される
79 インターフェースのネットワークドライバにキューイングされる。
80 デバイスドライバによっては、他のヘッダを常に追加するものもある。
82 は Linux 2.0 の obosolete な
83 .B AF_INET/SOCK_PACKET
87 はやや高位のレベルで動作する。物理ヘッダは、パケットがユーザーに
90 の packet ソケットを通して送られるパケットは、
92 の行き先アドレスの情報に基づき、適切な物理層のヘッダが付加されてから、
95 デフォルトでは、指定したプロトコル型のパケットはすべて packet
96 ソケットに送られる。特定のインターフェースからのパケットだけを
101 を呼び、 packet ソケットをそのインターフェースに結び付ける (バインドする)。
102 バインドの際には、アドレスフィールドのうち
109 操作は packet ソケットではサポートされていない。
116 に渡されると、 (バッファサイズより大きかったとしても) 常に実際に通信された
119 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]; /* 物理層のアドレス */
136 は標準的なイーサネットプロトコルのタイプで、
139 .I <linux/if_ether.h>
141 これがこのソケットのプロトコルのデフォルトとなる。
144 はそのインターフェースの interface index である
147 0 は (バインドが許可されている) 任意のインターフェースにマッチする。
155 はパケット種別である。指定できる種別は以下のいずれかである:
161 (物理層のマルチキャストアドレスに送るパケット)、
164 無差別モード (promiscuous mode: 後述) のデバイスドライバにより補足されたもの)、
167 packet ソケットにループバックしてきたパケット)。
168 これらの種別が意味を持つのは受信時のみである。
173 は、物理層の (つまり IEEE 802.3 の) アドレスとその長さである。
182 その他のフィールドは 0 にしておくべきである。
193 packet ソケットは、物理層のマルチキャストや
194 無差別モード (promiscuous mode) を設定して使うことができる。
201 .B PACKET_ADD_MEMBERSHIP
203 .B PACKET_DROP_MEMBERSHIP
211 int mr_ifindex; /* インターフェース番号 */
212 unsigned short mr_type; /* 動作 */
213 unsigned short mr_alen; /* アドレスの長さ */
214 unsigned char mr_address[8]; /* 物理層のアドレス */
220 は、ステータスを変更したいインターフェースの
225 は、共有している媒体からの全てのパケットを受信できるようにする
226 (しばしば "無差別モード (promiscuous mode)" と呼ばれる)。
227 .B PACKET_MR_MULTICAST
232 で指定される物理層のマルチキャストブループにバインドする。
233 .B PACKET_MR_ALLMULTI
234 は socket を up にして、そのインターフェースに到達したすべての
235 マルチキャストパケットを受信できるようにする。
244 を用いると、最後に受信したパケットのタイムスタンプを得ることができる。
248 .\" FIXME Document SIOCGSTAMPNS
254 で定義されている標準の ioctl はいずれも
257 packet ソケットは、パケットをデバイスドライバに渡すときに
258 起きたエラーしか処理しない。遅延エラー (pending error)
263 不明なマルチキャストグループアドレスが渡された。
272 パケットがインターフェースの MTU より大きい。
281 デバイス名が不明。あるいはインターフェースアドレスで指定された
288 インターフェースアドレスが渡されなかった。
291 インターフェースアドレスに不正なインターフェースインデックスが含まれている。
294 この操作を行うのに必要な権限をユーザが持っていない。
296 上記以外のエラーが、低レベルのドライバで生成されることがある。
299 は Linux 2.2 の新機能である。これより古いバージョンの Linux では
304 .I <netpacket/packet.h>
305 が存在するのは glibc 2.1 以降である。
306 それ以前のシステムでは以下のようにする必要がある:
310 #include <asm/types.h>
311 #include <linux/if_packet.h>
312 #include <linux/if_ether.h> /* The L2 protocols */
320 を用いることをお薦めする。ただし、この方法では
325 packet ソケットは、IEEE 802.3 フレームの IEEE 802.2 LLC ヘッダの
328 が送信プロトコルに指定されると、カーネルは 802.3 フレームを
329 生成して length フィールドに書き込む。
330 完全に準拠したパケットを得るためにはユーザーが LLC ヘッダを
331 与える必要がある。到着した 802.3 パケットでは、
332 DSAP/SSAP protocol の各フィールドは多重化 (multiplex) されていない。
333 代わりにこれらは LLC ヘッダが前置された
339 にバインドし、自分自身でプロトコルの多重化を行うこと。
340 送信のデフォルトは、プロトコルフィールドを持つ
341 標準の Ethernet DIX encapsulation である。
343 packet ソケットは入出力の firewall chain に影響をうけない。
345 Linux 2.0 では、 packet ソケットを得る方法は
346 .BI "socket(AF_INET, SOCK_PACKET, " protocol )\fR
347 を呼ぶやり方しかなかった。この方法はまだサポートされているが、
348 用いないことを強く推奨する。現在の方法との主な違いは、
351 .I struct sockaddr_pkt
352 を用いる点である。これには物理層からの独立性がない。
356 struct sockaddr_pkt {
357 unsigned short spkt_family;
358 unsigned char spkt_device[14];
359 unsigned short spkt_protocol;
369 で定義されている IEEE 802.3 プロトコルタイプ、
371 はデバイスの名前を NULL 終端された文字列で与えたもの (例: eth0) である。
374 新しくコードを書く時には用いるべきでない。
378 の定義がない。回避策としては、以下のようにするとよい。
383 #define SOL_PACKET 263
388 この問題は新しいバージョンの glibc では修正されている。
389 libc5 のシステムにはこの問題はない。
391 IEEE 802.2/803.3 の LLC の扱い方は、バグと考えても良いだろう。
393 ソケットフィルターについて記載されていない。
397 拡張は非常にまずい対処であり、制御メッセージで置き換えるべきである。
400 経由でパケットについていた宛先アドレスを得る方法がない。
402 .\" この man ページは Matthew Wilcox の助力のもとに Andi Kleen が書いた。
403 .\" Linux 2.2 の AF_PACKET は、
404 .\" Alan Cox たちのコードをもとにして Alexey Kuznetsov が実装した。
408 .BR capabilities (7),
413 標準 IP Ethernet encapsulation に関する情報は RFC\ 894 にある。
415 IEEE 802.3 IP encapsulation に関する情報は RFC\ 1700 にある。
418 .I <linux/if_ether.h>