OSDN Git Service

54c517845b92ed5921e55f36d9921b32926a248c
[linuxjm/LDP_man-pages.git] / release / man7 / packet.7
1 .\" This man page is Copyright (C) 1999 Andi Kleen <ak@muc.de>.
2 .\"
3 .\" %%%LICENSE_START(VERBATIM_ONE_PARA)
4 .\" Permission is granted to distribute possibly modified copies
5 .\" of this page provided the header is included verbatim,
6 .\" and in case of nontrivial modification author and date
7 .\" of the modification is added to the header.
8 .\" %%%LICENSE_END
9 .\"
10 .\" $Id: packet.7,v 1.13 2000/08/14 08:03:45 ak Exp $
11 .\"
12 .\"*******************************************************************
13 .\"
14 .\" This file was generated with po4a. Translate the source file.
15 .\"
16 .\"*******************************************************************
17 .\"
18 .\" Japanese Version Copyright (c) 1999 NAKANO Takeo all rights reserved.
19 .\" Translated 1999-12-06, NAKANO Takeo <nakano@apm.seikei.ac.jp>
20 .\" Updated 2001-02-13, Kentaro Shirakata <argrath@ub32.org>
21 .\" Updated 2005-02-21, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
22 .\"
23 .TH PACKET 7 2012\-05\-10 Linux "Linux Programmer's Manual"
24 .SH 名前
25 packet \- デバイスレベルのパケットインターフェース
26 .SH 書式
27 .nf
28 \fB#include <sys/socket.h>\fP
29 .br
30 \fB#include <netpacket/packet.h>\fP
31 .br
32 \fB#include <net/ethernet.h> /* the L2 protocols */\fP
33 .sp
34 \fBpacket_socket = socket(AF_PACKET, int \fP\fIsocket_type\fP\fB, int \fP\fIprotocol\fP\fB);\fP
35 .fi
36 .SH 説明
37 packet ソケットは、デバイスドライバ (OSI レイヤ 2) レベルで 生のパケット (raw packet) を送受信するために用いられる。
38 packet ソケットを使うと、ユーザー空間で物理層の上に プロトコルモジュールを実装することができる。
39
40 \fIsocket_type\fP には \fBSOCK_RAW\fP と \fBSOCK_DGRAM\fP のいずれかを指定する。 \fBSOCK_RAW\fP
41 はリンクレベルヘッダを含む raw パケットを、 \fBSOCK_DGRAM\fP はリンクレベルヘッダが削除された加工済みパケットを示す。
42 リンクレベルヘッダ情報は \fIsockaddr_ll\fP で共通のフォーマットで入手できる。 \fIprotocol\fP には IEEE 802.3
43 プロトコル番号を ネットワークバイトオーダーで指定する。 指定できるプロトコルのリストは、インクルードファイル
44 \fI<linux/if_ether.h>\fP を参照。プロトコルを \fBhtons(ETH_P_ALL)\fP
45 にすると、全てのプロトコルが受信される。 外部から来たパケットのうち指定したプロトコルのものは、
46 カーネルに実装されているプロトコルに渡される前の段階で、 packet ソケットに渡される。
47
48 packet ソケットをオープンできるのは、 実効ユーザーID が 0 のプロセスか、 \fBCAP_NET_RAW\fP
49 ケーパビリティを持つプロセスだけである。
50
51 \fBSOCK_RAW\fP パケットでは、パケットをデバイスドライバと受け渡しする際、 パケットデータに変更が行われることはない。
52 パケットの受信時には、アドレスの解析だけは行われ、 標準的な \fIsockaddr_ll\fP
53 アドレス構造体に渡される。パケットの送信時には、ユーザが指定する バッファに物理層のヘッダが含まれている必要がある。
54 パケットはそのまま修正を受けずに、行き先アドレスから決定される インターフェースのネットワークドライバにキューイングされる。
55 デバイスドライバによっては、他のヘッダを常に追加するものもある。 \fBSOCK_RAW\fP は Linux 2.0 の obosolete な
56 \fBAF_INET/SOCK_PACKET\fP と似ているが、互換性があるわけではない。
57
58 \fBSOCK_DGRAM\fP はやや高位のレベルで動作する。物理ヘッダは、パケットがユーザーに 渡される前に削除される。 \fBSOCK_DGRAM\fP の
59 packet ソケットを通して送られるパケットは、 \fIsockaddr_ll\fP の行き先アドレスの情報に基づき、適切な物理層のヘッダが付加されてから、
60 キューに送られる。
61
62 デフォルトでは、指定したプロトコル型のパケットはすべて packet ソケットに送られる。特定のインターフェースからのパケットだけを
63 取得したい場合には、 \fIstruct sockaddr_ll\fP にアドレスを指定して \fBbind\fP(2)  を呼び、 packet
64 ソケットをそのインターフェースに結び付ける (バインドする)。 バインドの際には、アドレスフィールドのうち \fIsll_protocol\fP と
65 \fIsll_ifindex\fP だけが用いられる。
66
67 \fBconnect\fP(2)  操作は packet ソケットではサポートされていない。
68
69 \fBMSG_TRUNC\fP フラグが \fBrecvmsg\fP(2), \fBrecv\fP(2), \fBrecvfrom\fP(2)  に渡されると、
70 (バッファサイズより大きかったとしても) 常に実際に通信された パケットの長さが返される。
71 .SS アドレスのタイプ
72 sockaddr_ll はデバイスに依存しない物理層のアドレスである。
73
74 .in +4n
75 .nf
76 struct sockaddr_ll {
77     unsigned short sll_family;   /* 常に AF_PACKET */
78     unsigned short sll_protocol; /* 物理層のプロトコル */
79     int            sll_ifindex;  /* インターフェース番号 */
80     unsigned short sll_hatype;   /* ARP ハードウェア種別 */
81     unsigned char  sll_pkttype;  /* パケット種別 */
82     unsigned char  sll_halen;    /* アドレスの長さ */
83     unsigned char  sll_addr[8];  /* 物理層のアドレス */
84 };
85 .fi
86 .in
87
88 \fIsll_protocol\fP は標準的なイーサネットプロトコルのタイプで、 ネットワーク
89 バイトオーダーで記述する。 インクルードファイル
90 \fI<linux/if_ether.h>\fP で定義されている。 これがこのソケットのプロト
91 コルのデフォルトとなる。 \fIsll_ifindex\fP はそのインターフェースの interface
92 index である (\fBnetdevice\fP(7) を参照)。 0 は (バインドが許可されている) 任
93 意のインターフェースにマッチする。 \fIsll_hatype\fP は、インクルードファイル
94 \fI<linux/if_arp.h>\fP で定義されている ARP 種別である。
95 \fIsll_pkttype\fP はパケット種別である。指定できる種別は以下のいずれかである:
96 \fBPACKET_HOST\fP (ローカルホスト向けのパケット)、 \fBPACKET_BORADCAST\fP (物理層
97 のブロードキャストパケット)、 \fBPACKET_MULTICAST\fP (物理層のマルチキャストア
98 ドレスに送るパケット)、 \fBPACKET_OTHERHOST\fP (他のホストに向けられたパケット
99 のうち、 無差別モード (promiscuous mode: 後述) のデバイスドライバにより補足
100 されたもの)、 \fBPACKET_OUTGOING\fP (ローカルホストから発信され、 packet ソケッ
101 トにループバックしてきたパケット)。 これらの種別が意味を持つのは受信時のみ
102 である。 \fIsll_addr\fP と \fIsll_halen\fP は、物理層の (つまり IEEE 802.3 の)
103 アドレスとその長さである。 厳密な解釈はデバイスに依存する。
104
105 パケットを送る場合は、 \fIsll_family\fP, \fIsll_addr\fP, \fIsll_halen\fP, \fIsll_ifindex\fP
106 を指定すれば十分である。 その他のフィールドは 0 にしておくべきである。 \fIsll_hatype\fP と \fIsll_pkttype\fP
107 には受信したパケットの情報が設定される。 バインドの際には、 \fIsll_protocol\fP と \fIsll_ifindex\fP だけが使用される。
108 .SS ソケットオプション
109 packet ソケットは、物理層のマルチキャストや 無差別モード (promiscuous mode) を設定して使うことができる。 これには
110 \fBSOL_PACKET\fP と以下のオプションのいずれかを指定して \fBsetsockopt\fP(2)  を呼べばよい。 バインドを追加する場合は
111 \fBPACKET_ADD_MEMBERSHIP\fP であり、取り去る場合は \fBPACKET_DROP_MEMBERSHIP\fP である。これらはいずれも
112 \fBpacket_mreq\fP 構造体を引き数に取る。
113
114 .in +4n
115 .nf
116 struct packet_mreq {
117     int            mr_ifindex;    /* インターフェース番号 */
118     unsigned short mr_type;       /* 動作 */
119     unsigned short mr_alen;       /* アドレスの長さ */
120     unsigned char  mr_address[8]; /* 物理層のアドレス */
121 };
122 .fi
123 .in
124
125 \fImr_ifindex\fP は、ステータスを変更したいインターフェースの インターフェース番号である。 \fImr_type\fP
126 パラメータは実行する動作を指定する: \fBPACKET_MR_PROMISC\fP は、共有している媒体からの全てのパケットを受信できるようにする
127 (しばしば "無差別モード (promiscuous mode)" と呼ばれる)。 \fBPACKET_MR_MULTICAST\fP は、そのソケットを、
128 \fImr_address\fP と \fImr_alen\fP で指定される物理層のマルチキャストブループにバインドする。
129 \fBPACKET_MR_ALLMULTI\fP は socket を up にして、そのインターフェースに到達したすべての
130 マルチキャストパケットを受信できるようにする。
131
132 昔からある ioctl だけでなく、 \fBSIOCSIFFLAGS\fP, \fBSIOCADDMULTI\fP, \fBSIOCDELMULTI\fP
133 を同じ目的に用いることができる。
134 .SS ioctl
135 .\" FIXME Document SIOCGSTAMPNS
136 \fBSIOCGSTAMP\fP を用いると、最後に受信したパケットのタイムスタンプを得ることができる。 引き数は \fIstruct timeval\fP
137 である。
138
139 さらに、 \fBnetdevice\fP(7)  および \fBsocket\fP(7)  で定義されている標準の ioctl はいずれも packet
140 ソケットに指定可能である。
141 .SS エラー処理
142 packet ソケットは、パケットをデバイスドライバに渡すときに 起きたエラーしか処理しない。遅延エラー (pending error)
143 に関する概念は持っていない。
144 .SH エラー
145 .TP 
146 \fBEADDRNOTAVAIL\fP
147 不明なマルチキャストグループアドレスが渡された。
148 .TP 
149 \fBEFAULT\fP
150 ユーザが渡したメモリアドレスが不正。
151 .TP 
152 \fBEINVAL\fP
153 引き数が不正。
154 .TP 
155 \fBEMSGSIZE\fP
156 パケットがインターフェースの MTU より大きい。
157 .TP 
158 \fBENETDOWN\fP
159 インターフェースが up でない。
160 .TP 
161 \fBENOBUFS\fP
162 パケットに割り当てるメモリが足りない。
163 .TP 
164 \fBENODEV\fP
165 デバイス名が不明。あるいはインターフェースアドレスで指定された インターフェースインデックスが不明。
166 .TP 
167 \fBENOENT\fP
168 パケットを一つも受信していない。
169 .TP 
170 \fBENOTCONN\fP
171 インターフェースアドレスが渡されなかった。
172 .TP 
173 \fBENXIO\fP
174 インターフェースアドレスに不正なインターフェースインデックスが含まれている。
175 .TP 
176 \fBEPERM\fP
177 この操作を行うのに必要な権限をユーザが持っていない。
178
179 上記以外のエラーが、低レベルのドライバで生成されることがある。
180 .SH バージョン
181 \fBAF_PACKET\fP は Linux 2.2 の新機能である。これより古いバージョンの Linux では \fBSOCK_PACKET\fP
182 のみをサポートしていた。
183 .PP
184 インクルードファイル \fI<netpacket/packet.h>\fP が存在するのは glibc 2.1 以降である。
185 それ以前のシステムでは以下のようにする必要がある:
186 .sp
187 .in +4n
188 .nf
189 #include <asm/types.h>
190 #include <linux/if_packet.h>
191 #include <linux/if_ether.h>  /* The L2 protocols */
192 .fi
193 .in
194 .SH 注意
195 移植性の必要なプログラムでは、 \fBpcap\fP(3)  経由で \fBAF_PACKET\fP を用いることをお薦めする。ただし、この方法では
196 \fBAF_PACKET\fP の機能すべてを利用することはできない。
197
198 \fBSOCK_DGRAM\fP packet ソケットは、IEEE 802.3 フレームの IEEE 802.2 LLC ヘッダの
199 生成や解析を行おうとしない。 \fBETH_P_802_3\fP が送信プロトコルに指定されると、カーネルは 802.3 フレームを 生成して length
200 フィールドに書き込む。 完全に準拠したパケットを得るためにはユーザーが LLC ヘッダを 与える必要がある。到着した 802.3 パケットでは、
201 DSAP/SSAP protocol の各フィールドは多重化 (multiplex) されていない。 代わりにこれらは LLC ヘッダが前置された
202 \fBETH_P_802_2\fP プロトコルとして与えられる。したがって、 \fBETH_P_802_3\fP にバインドすることはできない。かわりに
203 \fBETH_P_802_2\fP にバインドし、自分自身でプロトコルの多重化を行うこと。 送信のデフォルトは、プロトコルフィールドを持つ 標準の
204 Ethernet DIX encapsulation である。
205
206 packet ソケットは入出力の firewall chain に影響をうけない。
207 .SS 移植性
208 Linux 2.0 では、 packet ソケットを得る方法は \fBsocket(AF_INET, SOCK_PACKET,
209 \fP\fIprotocol\fP\fB)\fP を呼ぶやり方しかなかった。この方法はまだサポートされているが、 用いないことを強く推奨する。現在の方法との主な違いは、
210 \fBSOCK_PACKET\fP ではインターフェースの指定に古い \fIstruct sockaddr_pkt\fP
211 を用いる点である。これには物理層からの独立性がない。
212
213 .in +4n
214 .nf
215 struct sockaddr_pkt {
216     unsigned short spkt_family;
217     unsigned char  spkt_device[14];
218     unsigned short spkt_protocol;
219 };
220 .fi
221 .in
222
223 \fIspkt_family\fP はデバイスのタイプ、 \fIspkt_protocol\fP は \fI<sys/if_ether.h>\fP
224 で定義されている IEEE 802.3 プロトコルタイプ、 \fIspkt_device\fP はデバイスの名前を NULL 終端された文字列で与えたもの
225 (例: eth0) である。
226
227 この構造体は obsolete であり、 新しくコードを書く時には用いるべきでない。
228 .SH バグ
229 glibc 2.1 には \fBSOL_PACKET\fP の定義がない。回避策としては、以下のようにするとよい。
230 .in +4n
231 .nf
232
233 #ifndef SOL_PACKET
234 #define SOL_PACKET 263
235 #endif
236
237 .fi
238 .in
239 この問題は新しいバージョンの glibc では修正されている。 libc5 のシステムにはこの問題はない。
240
241 IEEE 802.2/803.3 の LLC の扱い方は、バグと考えても良いだろう。
242
243 ソケットフィルターについて記載されていない。
244
245 .\" .SH CREDITS
246 .\" This man page was written by Andi Kleen with help from Matthew Wilcox.
247 .\" AF_PACKET in Linux 2.2 was implemented
248 .\" by Alexey Kuznetsov, based on code by Alan Cox and others.
249 \fBMSG_TRUNC\fP \fBrecvmsg\fP(2)  拡張は非常にまずい対処であり、制御メッセージで置き換えるべきである。 今のところ
250 \fBSOCK_DGRAM\fP 経由でパケットについていた宛先アドレスを得る方法がない。
251 .SH 関連項目
252 \fBsocket\fP(2), \fBpcap\fP(3), \fBcapabilities\fP(7), \fBip\fP(7), \fBraw\fP(7),
253 \fBsocket\fP(7)
254
255 標準 IP Ethernet encapsulation に関しては RFC\ 894 を、 IEEE 802.3 IP encapsulation
256 に関しては RFC\ 1700 を参照。
257
258 物理層のプロトコルに関する記述は \fI<linux/if_ether.h>\fP インクルードファイルにある。
259 .SH この文書について
260 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.53 の一部
261 である。プロジェクトの説明とバグ報告に関する情報は
262 http://www.kernel.org/doc/man\-pages/ に書かれている。