OSDN Git Service

Update drafts for LDP 3.67
[linuxjm/LDP_man-pages.git] / draft / 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 2014\-04\-28 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> /* L2 プロトコル */\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 \fIsockaddr_ll\fP はデバイスに依存しない物理層のアドレスである。
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 パケットソケットのオプションは、レベル \fBSOL_PACKET\fP を指定して \fBsetsockopt\fP(2) を呼び出すことで設定できる。
110 .TP 
111 \fBPACKET_ADD_MEMBERSHIP\fP
112 .PD 0
113 .TP 
114 \fBPACKET_DROP_MEMBERSHIP\fP
115 .PD
116 packet ソケットは、物理層のマルチキャストや 無差別モード (promiscuous mode) を設定して使うことができる。
117 \fBPACKET_ADD_MEMBERSHIP\fP はバインドを追加し、 \fBPACKET_DROP_MEMBERSHIP\fP
118 はバインドを削除する。これらはいずれも \fIpacket_mreq\fP 構造体を引き数に取る。
119
120 .in +4n
121 .nf
122 struct packet_mreq {
123     int            mr_ifindex;    /* インターフェース番号 */
124     unsigned short mr_type;       /* 動作 */
125     unsigned short mr_alen;       /* アドレスの長さ */
126     unsigned char  mr_address[8]; /* 物理層のアドレス */
127 };
128 .fi
129 .in
130
131 \fImr_ifindex\fP は、ステータスを変更したいインターフェースの インターフェース番号である。 \fImr_type\fP
132 パラメータは実行する動作を指定する: \fBPACKET_MR_PROMISC\fP は、共有している媒体からの全てのパケットを受信できるようにする
133 (しばしば "無差別モード (promiscuous mode)" と呼ばれる)。 \fBPACKET_MR_MULTICAST\fP は、そのソケットを、
134 \fImr_address\fP と \fImr_alen\fP で指定される物理層のマルチキャストブループにバインドする。
135 \fBPACKET_MR_ALLMULTI\fP は socket を up にして、そのインターフェースに到達したすべての
136 マルチキャストパケットを受信できるようにする。
137
138 昔からある ioctl だけでなく、 \fBSIOCSIFFLAGS\fP, \fBSIOCADDMULTI\fP, \fBSIOCDELMULTI\fP
139 を同じ目的に用いることができる。
140 .TP 
141 \fBPACKET_AUXDATA\fP (Linux 2.6.21 以降)
142 .\" commit 8dc4194474159660d7f37c495e3fc3f10d0db8cc
143 ブール値のオプションを有効すると、 パケットソケットは、パケットと一緒にメタデータ構造体を \fBrecvmsg\fP(2) コントロールフィールドで渡す。
144 この構造体は \fBcmsg\fP(3) を使って読むことができる。 定義は以下の通りである。
145
146 .in +4n
147 .nf
148 struct tpacket_auxdata {
149     __u32 tp_status;
150     __u32 tp_len;      /* パケット長 */
151     __u32 tp_snaplen;  /* キャプチャした長さ */
152     __u16 tp_mac;
153     __u16 tp_net;
154     __u16 tp_vlan_tci;
155     __u16 tp_padding;
156 };
157 .fi
158 .in
159 .TP 
160 \fBPACKET_FANOUT\fP (Linux 3.1 以降)
161 .\" commit dc99f600698dcac69b8f56dda9a8a00d645c5ffc
162 スレッドにまたがって処理をスケールさせるため、 パケットソケットはファンアウトグループを構成することができる。 このモードでは、
163 マッチしたそれぞれのパケットはグループ内のいずれか一つのソケットにだけキューイングされる。 ソケットをファンアウトグループに参加させるには、 レベル
164 \fBSOL_PACKET\fP でオプション \fBPACKET_FANOUT\fP を指定して \fBsetsockopt\fP(2) を呼び出す。
165 ネットワーク名前空間毎に最大 65536 個の独立したグループを持つことができる。 整数のオプション値の先頭 16 ビットに ID
166 をエンコードすることで、 ソケットはグループを選択する。 あるグループへの最初のパケットソケットの参加があった時点で、
167 グループは暗黙のうちに作成される。 既存のグループへの参加が成功するためには、 それ以降にそのグループに参加しようとするパケットソケットは、
168 プロトコロ、 デバイス設定、ファンアウトモード、フラグが同じである必要がある (下記参照)。 パケットソケットがファンアウトグループから抜けるのは、
169 そのソケットをクローズした場合だけである。 ファンアウトグループは最後のソケットがクローズした場合に削除される。
170
171 .\" commit 2d36097d26b5991d71a2cf4a20c1a158f0f1bfcd
172 ファンアウトでは、 複数のソケットにトラフィックを分散させるアルゴリズムを複数サポートしている。 デフォルトのモードである
173 \fBPACKET_FANOUT_HASH\fP では、同じフローのパケットは同じソケットに送信され、 フロー単位の順序が維持される。
174 パケットごとに、パケットフローのハッシュの、そのグループのソケット数に対する剰余が計算され、ソケットが選択される。
175 なお、フローハッシュはネットワーク層のアドレスとトランスポート層のポートフィールドに対するハッシュである (トランスポート層ポートは存在する場合のみ)。
176 負荷分散モード \fBPACKET_FANOUT_LB\fP はラウンドロビンアルゴリズムが採用されている。 \fBPACKET_FANOUT_CPU\fP では、
177 パケットが到着した CPU に基づいてソケットを選択する。 \fBPACKET_FANOUT_ROLLOVER\fP
178 はすべてのデータを一つのソケットで処理し、 そのソケットで処理待ち (backlog) が発生した場合に次のソケットに移る。
179 \fBPACKET_FANOUT_RND\fP では擬似乱数発生器を使ってソケットが選択される。 \fBPACKET_FANOUT_QM\fP (Linux
180 3.14 以降で利用可能) では受信 skb に記録された queue_mapping を使ってソケットが選択される。
181
182 ファンアウトモードでは追加のオプションがある。 IP フラグメンテーションが起こると、
183 同じフローのパケットのフローハッシュが異なるハッシュを持つことになる。 フラグ \fBPACKET_FANOUT_FLAG_DEFRAG\fP
184 をセットすると、 パケットはファンアウトを行う前にフラグメント再構築が行われるようになり、 フラグメントがあった場合でも順序が維持される。
185 ファンアウトモードとオプションは、 整数のオプション値の下位 16 ビットで指定される。 フラグ
186 \fBPACKET_FANOUT_FLAG_ROLLOVER\fP を指定すると、 バックアップ戦略としてロールオーバー方式が有効になる。
187 元のファンアウトアルゴリズムが backlog ソケットを選択していれば、 パケットは次の利用可能なソケットにロールオーバーされる。
188 .TP 
189 \fBPACKET_LOSS\fP (\fBPACKET_TX_RING\fP で使用)
190 When a malformed packet is encountered on a transmit ring, the default is to
191 reset its \fItp_status\fP to \fBTP_STATUS_WRONG_FORMAT\fP and abort the
192 transmission immediately.  The malformed packet blocks itself and
193 subsequently enqueued packets from being sent.  The format error must be
194 fixed, the associated \fItp_status\fP reset to \fBTP_STATUS_SEND_REQUEST\fP, and
195 the transmission process restarted via \fBsend\fP(2).  However, if
196 \fBPACKET_LOSS\fP is set, any malformed packet will be skipped, its
197 \fItp_status\fP reset to \fBTP_STATUS_AVAILABLE\fP, and the transmission process
198 continued.
199 .TP 
200 \fBPACKET_RESERVE\fP (\fBPACKET_RX_RING\fP で使用)
201 デフォルトでは、パケット受信リングはメタデータ構造体とアライメント用のパディングの直後にパケットを書き込む。
202 この整数オプションを設定すると、パケットの前に追加で領域が予約される。
203 .TP 
204 \fBPACKET_RX_RING\fP
205 非同期でのパケット受信用のメモリマップされたリングバッファを作成する。 パケットソケットはアプリケーションのアドレス空間に連続する領域を確保し、
206 そこにパケットスロットの配列を構成し、 (最大 \fItp_snaplen\fP 個の) パケットを順にスロットにコピーする。 各パケットの前には
207 \fItpacket_auxdata\fP に似たメタデータ構造体が置かれる。
208 プロトコルフィールドには、データの、メタデータヘッダーの先頭からのオフセットが入る。 \fItp_net\fP にはネットワーク層へのオフセットが格納される。
209 パケットソケットが \fBSOCK_DGRAM\fP 型の場合、 \fItp_mac\fP も同じである。 \fBSOCK_RAW\fP 型の場合、 \fItp_net\fP
210 にはリンク層のフレームへのオフセットが入る。 パケットソケットとアプリケーションは \fItp_status\fP フィールドを通してリングの先頭
211 (head) と末尾 (tail) の情報を受け渡す。 パケットソケットは \fItp_status\fP が \fBTP_STATUS_KERNEL\fP
212 のすべてのスロットを所有しており、 スロットにデータが入ると、
213 パケットソケットはそのスロットのステータスをアプリケーションに所有権を渡す状態に変更する。 通常の動作では、 新しい \fItp_status\fP
214 で少なくとも \fBTP_STATUS_USER\fP ビットがセットされていれば、 受信されたパケットが格納されたことを示している。
215 アプリケーションがパケットの処理を終えると、アプリケーションはそのスロットの \fBtp_status\fP を \fBTP_STATUS_KERNEL\fP
216 に設定し、そのスロットの所有権をソケットに返す。 パケットソケットは、複数バージョンのパケットリングを実装している。 実装の詳細は Linux
217 カーネルソースツリーの \fIDocumentation/networking/packet_mmap.txt\fP で説明されている。
218 .TP 
219 \fBPACKET_STATISTICS\fP
220 パケットソケットの統計情報を次の構造体形式で取得する。
221
222 .in +4n
223 .nf
224 struct tpacket_stats {
225     unsigned int tp_packets;  /* 総パケット数 */
226     unsigned int tp_drops;    /* ドロップパケット数 */
227 };
228 .fi
229 .in
230
231 統計情報を取得すると、内部カウンターはリセットされる。 \fBTPACKET_V3\fP のリングを使う場合には、統計情報構造体は違うものになる。
232 .TP 
233 \fBPACKET_TIMESTAMP\fP (\fBPACKET_RX_RING\fP で使用; Linux 2.6.36 以降)
234 .\" commit 614f60fa9d73a9e8fdff3df83381907fea7c5649
235 パケット受信リングでは常にタイムスタンプがメタデータヘッダーに格納される。
236 デフォルトでは、タイムスタンプはパケットがリングにコピーされた時点で生成されるソフトウェアによるタイムスタンプである。
237 この整数オプションによりタイムスタンプの種類を選択できる。 デフォルト以外では、 Linux カーネルソースツリーの
238 \fIDocumentation/networking/timestamping.txt\fP に説明がある 2
239 種類のハードウェアフォーマットがサポートされている。
240 .TP 
241 \fBPACKET_TX_RING\fP (Linux 2.6.31 以降)
242 .\" commit 69e3c75f4d541a6eb151b3ef91f34033cb3ad6e1
243 パケット送信用のメモリマップされたリングバッファを作成する。 このオプションは \fBPACKET_RX_RING\fP と同様で、同じ引き数を取る。
244 アプリケーションは \fItp_status\fP が \fBTP_STATUS_AVAILABLE\fP のスロットにパケットを書き込み、
245 \fItp_status\fP を \fBTP_STATUS_SEND_REQUEST\fP に変更することでそのパケットの送信を予約する。
246 パケットの送信準備ができたら、アプリケーションは続けて \fBsend\fP(2) 系のシステムコールを呼び出す。 システムコールの引き数 \fIbuf\fP と
247 \fIlen\fP は無視される。 \fBsendto\fP(2) や \fBsendmsg\fP(2) を使ってアドレスが渡された場合、
248 ソケットのデフォルト値ではなくそのアドレスが使用される。 送信に成功すると、ソケットはそのスロットの \fItp_status\fP を
249 \fBTP_STATUS_AVAILABLE\fP に戻す。 エラーの場合、 \fBPACKET_LOSS\fP がセットされていなければ、
250 直ちに送信を中断しエラーを上げる。
251 .TP 
252 \fBPACKET_VERSION\fP (\fBPACKET_RX_RING\fP で使用; Linux 2.6.27 以降)
253 .\" commit bbd6ef87c544d88c30e4b762b1b61ef267a7d279
254 デフォルトでは、 \fBPACKET_RX_RING\fP は \fBTPACKET_V1\fP
255 のパケット受信リングを作成する。別のバージョンのリングを作成するには、そのリングを作成する前に希望するバージョンが使われるようにこの整数オプションを設定すること。
256 .TP 
257 \fBPACKET_QDISC_BYPASS\fP (Linux 3.14 以降)
258 .\" commit d346a3fae3ff1d99f5d0c819bf86edf9094a26a1
259 デフォルトでは、パケットはカーネルの qdisc (トラフィック制御) レイヤー経由で渡される。 これは大半のユースケースに合っている。
260 ネットワークに対して可能な限りパケットを送信する (例えば pkggen と同様の方法で負荷対象のデバイスを試験する)
261 のにパケットソケットを使うトラフィック生成アプライアンスでは、この整数オプションを 1 に設定することで qdisc レイヤーを飛ばすことができる。
262 qdisc レイヤーでのパケットバッファが行われなくなるという副作用がある。 これにより、
263 ネットワークデバイスの送信キューの使用量が高い場合にパケット廃棄が起きやすくなる。
264 .SS ioctl
265 .\" FIXME Document SIOCGSTAMPNS
266 \fBSIOCGSTAMP\fP を用いると、最後に受信したパケットのタイムスタンプを得ることができる。 引き数は \fIstruct timeval\fP
267 型の変数である。
268
269 さらに、 \fBnetdevice\fP(7)  および \fBsocket\fP(7)  で定義されている標準の ioctl はいずれも packet
270 ソケットに指定可能である。
271 .SS エラー処理
272 packet ソケットは、パケットをデバイスドライバに渡すときに 起きたエラーしか処理しない。遅延エラー (pending error)
273 に関する概念は持っていない。
274 .SH エラー
275 .TP 
276 \fBEADDRNOTAVAIL\fP
277 不明なマルチキャストグループアドレスが渡された。
278 .TP 
279 \fBEFAULT\fP
280 ユーザが渡したメモリアドレスが不正。
281 .TP 
282 \fBEINVAL\fP
283 引き数が不正。
284 .TP 
285 \fBEMSGSIZE\fP
286 パケットがインターフェースの MTU より大きい。
287 .TP 
288 \fBENETDOWN\fP
289 インターフェースが up でない。
290 .TP 
291 \fBENOBUFS\fP
292 パケットに割り当てるメモリが足りない。
293 .TP 
294 \fBENODEV\fP
295 デバイス名が不明。あるいはインターフェースアドレスで指定された インターフェースインデックスが不明。
296 .TP 
297 \fBENOENT\fP
298 パケットを一つも受信していない。
299 .TP 
300 \fBENOTCONN\fP
301 インターフェースアドレスが渡されなかった。
302 .TP 
303 \fBENXIO\fP
304 インターフェースアドレスに不正なインターフェースインデックスが含まれている。
305 .TP 
306 \fBEPERM\fP
307 この操作を行うのに必要な権限をユーザが持っていない。
308
309 上記以外のエラーが、低レベルのドライバで生成されることがある。
310 .SH バージョン
311 \fBAF_PACKET\fP は Linux 2.2 の新機能である。これより古いバージョンの Linux では \fBSOCK_PACKET\fP
312 のみをサポートしていた。
313 .PP
314 インクルードファイル \fI<netpacket/packet.h>\fP が存在するのは glibc 2.1 以降である。
315 それ以前のシステムでは以下のようにする必要がある:
316 .sp
317 .in +4n
318 .nf
319 #include <asm/types.h>
320 #include <linux/if_packet.h>
321 #include <linux/if_ether.h>  /* The L2 protocols */
322 .fi
323 .in
324 .SH 注意
325 移植性の必要なプログラムでは、 \fBpcap\fP(3)  経由で \fBAF_PACKET\fP を用いることをお薦めする。ただし、この方法では
326 \fBAF_PACKET\fP の機能すべてを利用することはできない。
327
328 \fBSOCK_DGRAM\fP packet ソケットは、IEEE 802.3 フレームの IEEE 802.2 LLC ヘッダの
329 生成や解析を行おうとしない。 \fBETH_P_802_3\fP が送信プロトコルに指定されると、カーネルは 802.3 フレームを 生成して length
330 フィールドに書き込む。 完全に準拠したパケットを得るためにはユーザーが LLC ヘッダを 与える必要がある。到着した 802.3 パケットでは、
331 DSAP/SSAP protocol の各フィールドは多重化 (multiplex) されていない。 代わりにこれらは LLC ヘッダが前置された
332 \fBETH_P_802_2\fP プロトコルとして与えられる。したがって、 \fBETH_P_802_3\fP にバインドすることはできない。かわりに
333 \fBETH_P_802_2\fP にバインドし、自分自身でプロトコルの多重化を行うこと。 送信のデフォルトは、プロトコルフィールドを持つ 標準の
334 Ethernet DIX encapsulation である。
335
336 packet ソケットは入出力の firewall chain に影響をうけない。
337 .SS 移植性
338 Linux 2.0 では、 packet ソケットを得る方法は \fBsocket(AF_INET, SOCK_PACKET,
339 \fP\fIprotocol\fP\fB)\fP を呼ぶやり方しかなかった。この方法はまだサポートされているが、 用いないことを強く推奨する。現在の方法との主な違いは、
340 \fBSOCK_PACKET\fP ではインターフェースの指定に古い \fIstruct sockaddr_pkt\fP
341 を用いる点である。これには物理層からの独立性がない。
342
343 .in +4n
344 .nf
345 struct sockaddr_pkt {
346     unsigned short spkt_family;
347     unsigned char  spkt_device[14];
348     unsigned short spkt_protocol;
349 };
350 .fi
351 .in
352
353 \fIspkt_family\fP はデバイスのタイプ、 \fIspkt_protocol\fP は \fI<sys/if_ether.h>\fP
354 で定義されている IEEE 802.3 プロトコルタイプ、 \fIspkt_device\fP はデバイスの名前をヌル終端された文字列で与えたもの (例:
355 eth0) である。
356
357 この構造体は obsolete であり、 新しくコードを書く時には用いるべきでない。
358 .SH バグ
359 glibc 2.1 には \fBSOL_PACKET\fP の定義がない。回避策としては、以下のようにするとよい。
360 .in +4n
361 .nf
362
363 #ifndef SOL_PACKET
364 #define SOL_PACKET 263
365 #endif
366
367 .fi
368 .in
369 この問題は新しいバージョンの glibc では修正されている。 libc5 のシステムにはこの問題はない。
370
371 IEEE 802.2/803.3 の LLC の扱い方は、バグと考えても良いだろう。
372
373 ソケットフィルターについて記載されていない。
374
375 .\" .SH CREDITS
376 .\" This man page was written by Andi Kleen with help from Matthew Wilcox.
377 .\" AF_PACKET in Linux 2.2 was implemented
378 .\" by Alexey Kuznetsov, based on code by Alan Cox and others.
379 \fBMSG_TRUNC\fP \fBrecvmsg\fP(2)  拡張は非常にまずい対処であり、制御メッセージで置き換えるべきである。 今のところ
380 \fBSOCK_DGRAM\fP 経由でパケットについていた宛先アドレスを得る方法がない。
381 .SH 関連項目
382 \fBsocket\fP(2), \fBpcap\fP(3), \fBcapabilities\fP(7), \fBip\fP(7), \fBraw\fP(7),
383 \fBsocket\fP(7)
384
385 標準 IP Ethernet encapsulation に関しては RFC\ 894 を、 IEEE 802.3 IP encapsulation
386 に関しては RFC\ 1700 を参照。
387
388 物理層のプロトコルに関する記述は \fI<linux/if_ether.h>\fP インクルードファイルにある。
389
390 The Linux kernel source tree.  \fI/Documentation/networking/filter.txt\fP
391 describes how to apply Berkeley Packet Filters to packet sockets.
392 \fI/tools/testing/selftests/net/psock_tpacket.c\fP contains example source code
393 for all available versions of \fBPACKET_RX_RING\fP and \fBPACKET_TX_RING\fP.
394 .SH この文書について
395 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.67 の一部
396 である。プロジェクトの説明とバグ報告に関する情報は
397 http://www.kernel.org/doc/man\-pages/ に書かれている。