OSDN Git Service

Update releases for LDP 3.68
[linuxjm/LDP_man-pages.git] / release / man7 / packet.7
index 54c5178..8e3e29a 100644 (file)
@@ -20,7 +20,7 @@
 .\" Updated 2001-02-13, Kentaro Shirakata <argrath@ub32.org>
 .\" Updated 2005-02-21, Akihiro MOTOKI <amotoki@dd.iij4u.or.jp>
 .\"
-.TH PACKET 7 2012\-05\-10 Linux "Linux Programmer's Manual"
+.TH PACKET 7 2014\-04\-28 Linux "Linux Programmer's Manual"
 .SH 名前
 packet \- デバイスレベルのパケットインターフェース
 .SH 書式
@@ -29,7 +29,7 @@ packet \- デバイスレベルのパケットインターフェース
 .br
 \fB#include <netpacket/packet.h>\fP
 .br
-\fB#include <net/ethernet.h> /* the L2 protocols */\fP
+\fB#include <net/ethernet.h> /* L2 プロトコル */\fP
 .sp
 \fBpacket_socket = socket(AF_PACKET, int \fP\fIsocket_type\fP\fB, int \fP\fIprotocol\fP\fB);\fP
 .fi
@@ -69,7 +69,7 @@ packet ソケットを通して送られるパケットは、 \fIsockaddr_ll\fP
 \fBMSG_TRUNC\fP フラグが \fBrecvmsg\fP(2), \fBrecv\fP(2), \fBrecvfrom\fP(2)  に渡されると、
 (バッファサイズより大きかったとしても) 常に実際に通信された パケットの長さが返される。
 .SS アドレスのタイプ
-sockaddr_ll はデバイスに依存しない物理層のアドレスである。
+\fIsockaddr_ll\fP はデバイスに依存しない物理層のアドレスである。
 
 .in +4n
 .nf
@@ -106,10 +106,16 @@ index である (\fBnetdevice\fP(7) を参照)。 0 は (バインドが許可
 を指定すれば十分である。 その他のフィールドは 0 にしておくべきである。 \fIsll_hatype\fP と \fIsll_pkttype\fP
 には受信したパケットの情報が設定される。 バインドの際には、 \fIsll_protocol\fP と \fIsll_ifindex\fP だけが使用される。
 .SS ソケットオプション
-packet ソケットは、物理層のマルチキャストや 無差別モード (promiscuous mode) を設定して使うことができる。 これには
-\fBSOL_PACKET\fP と以下のオプションのいずれかを指定して \fBsetsockopt\fP(2)  を呼べばよい。 バインドを追加する場合は
-\fBPACKET_ADD_MEMBERSHIP\fP であり、取り去る場合は \fBPACKET_DROP_MEMBERSHIP\fP である。これらはいずれも
-\fBpacket_mreq\fP 構造体を引き数に取る。
+パケットソケットのオプションは、レベル \fBSOL_PACKET\fP を指定して \fBsetsockopt\fP(2) を呼び出すことで設定できる。
+.TP 
+\fBPACKET_ADD_MEMBERSHIP\fP
+.PD 0
+.TP 
+\fBPACKET_DROP_MEMBERSHIP\fP
+.PD
+packet ソケットは、物理層のマルチキャストや 無差別モード (promiscuous mode) を設定して使うことができる。
+\fBPACKET_ADD_MEMBERSHIP\fP はバインドを追加し、 \fBPACKET_DROP_MEMBERSHIP\fP
+はバインドを削除する。これらはいずれも \fIpacket_mreq\fP 構造体を引き数に取る。
 
 .in +4n
 .nf
@@ -131,10 +137,134 @@ struct packet_mreq {
 
 昔からある ioctl だけでなく、 \fBSIOCSIFFLAGS\fP, \fBSIOCADDMULTI\fP, \fBSIOCDELMULTI\fP
 を同じ目的に用いることができる。
+.TP 
+\fBPACKET_AUXDATA\fP (Linux 2.6.21 以降)
+.\" commit 8dc4194474159660d7f37c495e3fc3f10d0db8cc
+ブール値のオプションを有効すると、 パケットソケットは、パケットと一緒にメタデータ構造体を \fBrecvmsg\fP(2) コントロールフィールドで渡す。
+この構造体は \fBcmsg\fP(3) を使って読むことができる。 定義は以下の通りである。
+
+.in +4n
+.nf
+struct tpacket_auxdata {
+    __u32 tp_status;
+    __u32 tp_len;      /* パケット長 */
+    __u32 tp_snaplen;  /* キャプチャした長さ */
+    __u16 tp_mac;
+    __u16 tp_net;
+    __u16 tp_vlan_tci;
+    __u16 tp_padding;
+};
+.fi
+.in
+.TP 
+\fBPACKET_FANOUT\fP (Linux 3.1 以降)
+.\" commit dc99f600698dcac69b8f56dda9a8a00d645c5ffc
+スレッドにまたがって処理をスケールさせるため、 パケットソケットはファンアウトグループを構成することができる。 このモードでは、
+マッチしたそれぞれのパケットはグループ内のいずれか一つのソケットにだけキューイングされる。 ソケットをファンアウトグループに参加させるには、 レベル
+\fBSOL_PACKET\fP でオプション \fBPACKET_FANOUT\fP を指定して \fBsetsockopt\fP(2) を呼び出す。
+ネットワーク名前空間毎に最大 65536 個の独立したグループを持つことができる。 整数のオプション値の先頭 16 ビットに ID
+をエンコードすることで、 ソケットはグループを選択する。 あるグループへの最初のパケットソケットの参加があった時点で、
+グループは暗黙のうちに作成される。 既存のグループへの参加が成功するためには、 それ以降にそのグループに参加しようとするパケットソケットは、
+プロトコロ、 デバイス設定、ファンアウトモード、フラグが同じである必要がある (下記参照)。 パケットソケットがファンアウトグループから抜けるのは、
+そのソケットをクローズした場合だけである。 ファンアウトグループは最後のソケットがクローズした場合に削除される。
+
+.\" commit 2d36097d26b5991d71a2cf4a20c1a158f0f1bfcd
+ファンアウトでは、 複数のソケットにトラフィックを分散させるアルゴリズムを複数サポートしている。 デフォルトのモードである
+\fBPACKET_FANOUT_HASH\fP では、同じフローのパケットは同じソケットに送信され、 フロー単位の順序が維持される。
+パケットごとに、パケットフローのハッシュの、そのグループのソケット数に対する剰余が計算され、ソケットが選択される。
+なお、フローハッシュはネットワーク層のアドレスとトランスポート層のポートフィールドに対するハッシュである (トランスポート層ポートは存在する場合のみ)。
+負荷分散モード \fBPACKET_FANOUT_LB\fP はラウンドロビンアルゴリズムが採用されている。 \fBPACKET_FANOUT_CPU\fP では、
+パケットが到着した CPU に基づいてソケットを選択する。 \fBPACKET_FANOUT_ROLLOVER\fP
+はすべてのデータを一つのソケットで処理し、 そのソケットで処理待ち (backlog) が発生した場合に次のソケットに移る。
+\fBPACKET_FANOUT_RND\fP では擬似乱数発生器を使ってソケットが選択される。 \fBPACKET_FANOUT_QM\fP (Linux
+3.14 以降で利用可能) では受信 skb に記録された queue_mapping を使ってソケットが選択される。
+
+ファンアウトモードでは追加のオプションがある。 IP フラグメンテーションが起こると、
+同じフローのパケットのフローハッシュが異なるハッシュを持つことになる。 フラグ \fBPACKET_FANOUT_FLAG_DEFRAG\fP
+をセットすると、 パケットはファンアウトを行う前にフラグメント再構築が行われるようになり、 フラグメントがあった場合でも順序が維持される。
+ファンアウトモードとオプションは、 整数のオプション値の下位 16 ビットで指定される。 フラグ
+\fBPACKET_FANOUT_FLAG_ROLLOVER\fP を指定すると、 バックアップ戦略としてロールオーバー方式が有効になる。
+元のファンアウトアルゴリズムが backlog ソケットを選択していれば、 パケットは次の利用可能なソケットにロールオーバーされる。
+.TP 
+\fBPACKET_LOSS\fP (\fBPACKET_TX_RING\fP で使用)
+When a malformed packet is encountered on a transmit ring, the default is to
+reset its \fItp_status\fP to \fBTP_STATUS_WRONG_FORMAT\fP and abort the
+transmission immediately.  The malformed packet blocks itself and
+subsequently enqueued packets from being sent.  The format error must be
+fixed, the associated \fItp_status\fP reset to \fBTP_STATUS_SEND_REQUEST\fP, and
+the transmission process restarted via \fBsend\fP(2).  However, if
+\fBPACKET_LOSS\fP is set, any malformed packet will be skipped, its
+\fItp_status\fP reset to \fBTP_STATUS_AVAILABLE\fP, and the transmission process
+continued.
+.TP 
+\fBPACKET_RESERVE\fP (\fBPACKET_RX_RING\fP で使用)
+デフォルトでは、パケット受信リングはメタデータ構造体とアライメント用のパディングの直後にパケットを書き込む。
+この整数オプションを設定すると、パケットの前に追加で領域が予約される。
+.TP 
+\fBPACKET_RX_RING\fP
+非同期でのパケット受信用のメモリマップされたリングバッファを作成する。 パケットソケットはアプリケーションのアドレス空間に連続する領域を確保し、
+そこにパケットスロットの配列を構成し、 (最大 \fItp_snaplen\fP 個の) パケットを順にスロットにコピーする。 各パケットの前には
+\fItpacket_auxdata\fP に似たメタデータ構造体が置かれる。
+プロトコルフィールドには、データの、メタデータヘッダーの先頭からのオフセットが入る。 \fItp_net\fP にはネットワーク層へのオフセットが格納される。
+パケットソケットが \fBSOCK_DGRAM\fP 型の場合、 \fItp_mac\fP も同じである。 \fBSOCK_RAW\fP 型の場合、 \fItp_net\fP
+にはリンク層のフレームへのオフセットが入る。 パケットソケットとアプリケーションは \fItp_status\fP フィールドを通してリングの先頭
+(head) と末尾 (tail) の情報を受け渡す。 パケットソケットは \fItp_status\fP が \fBTP_STATUS_KERNEL\fP
+のすべてのスロットを所有しており、 スロットにデータが入ると、
+パケットソケットはそのスロットのステータスをアプリケーションに所有権を渡す状態に変更する。 通常の動作では、 新しい \fItp_status\fP
+で少なくとも \fBTP_STATUS_USER\fP ビットがセットされていれば、 受信されたパケットが格納されたことを示している。
+アプリケーションがパケットの処理を終えると、アプリケーションはそのスロットの \fBtp_status\fP を \fBTP_STATUS_KERNEL\fP
+に設定し、そのスロットの所有権をソケットに返す。 パケットソケットは、複数バージョンのパケットリングを実装している。 実装の詳細は Linux
+カーネルソースツリーの \fIDocumentation/networking/packet_mmap.txt\fP で説明されている。
+.TP 
+\fBPACKET_STATISTICS\fP
+パケットソケットの統計情報を次の構造体形式で取得する。
+
+.in +4n
+.nf
+struct tpacket_stats {
+    unsigned int tp_packets;  /* 総パケット数 */
+    unsigned int tp_drops;    /* ドロップパケット数 */
+};
+.fi
+.in
+
+統計情報を取得すると、内部カウンターはリセットされる。 \fBTPACKET_V3\fP のリングを使う場合には、統計情報構造体は違うものになる。
+.TP 
+\fBPACKET_TIMESTAMP\fP (\fBPACKET_RX_RING\fP で使用; Linux 2.6.36 以降)
+.\" commit 614f60fa9d73a9e8fdff3df83381907fea7c5649
+パケット受信リングでは常にタイムスタンプがメタデータヘッダーに格納される。
+デフォルトでは、タイムスタンプはパケットがリングにコピーされた時点で生成されるソフトウェアによるタイムスタンプである。
+この整数オプションによりタイムスタンプの種類を選択できる。 デフォルト以外では、 Linux カーネルソースツリーの
+\fIDocumentation/networking/timestamping.txt\fP に説明がある 2
+種類のハードウェアフォーマットがサポートされている。
+.TP 
+\fBPACKET_TX_RING\fP (Linux 2.6.31 以降)
+.\" commit 69e3c75f4d541a6eb151b3ef91f34033cb3ad6e1
+パケット送信用のメモリマップされたリングバッファを作成する。 このオプションは \fBPACKET_RX_RING\fP と同様で、同じ引き数を取る。
+アプリケーションは \fItp_status\fP が \fBTP_STATUS_AVAILABLE\fP のスロットにパケットを書き込み、
+\fItp_status\fP を \fBTP_STATUS_SEND_REQUEST\fP に変更することでそのパケットの送信を予約する。
+パケットの送信準備ができたら、アプリケーションは続けて \fBsend\fP(2) 系のシステムコールを呼び出す。 システムコールの引き数 \fIbuf\fP と
+\fIlen\fP は無視される。 \fBsendto\fP(2) や \fBsendmsg\fP(2) を使ってアドレスが渡された場合、
+ソケットのデフォルト値ではなくそのアドレスが使用される。 送信に成功すると、ソケットはそのスロットの \fItp_status\fP を
+\fBTP_STATUS_AVAILABLE\fP に戻す。 エラーの場合、 \fBPACKET_LOSS\fP がセットされていなければ、
+直ちに送信を中断しエラーを上げる。
+.TP 
+\fBPACKET_VERSION\fP (\fBPACKET_RX_RING\fP で使用; Linux 2.6.27 以降)
+.\" commit bbd6ef87c544d88c30e4b762b1b61ef267a7d279
+デフォルトでは、 \fBPACKET_RX_RING\fP は \fBTPACKET_V1\fP
+のパケット受信リングを作成する。別のバージョンのリングを作成するには、そのリングを作成する前に希望するバージョンが使われるようにこの整数オプションを設定すること。
+.TP 
+\fBPACKET_QDISC_BYPASS\fP (Linux 3.14 以降)
+.\" commit d346a3fae3ff1d99f5d0c819bf86edf9094a26a1
+デフォルトでは、パケットはカーネルの qdisc (トラフィック制御) レイヤー経由で渡される。 これは大半のユースケースに合っている。
+ネットワークに対して可能な限りパケットを送信する (例えば pkggen と同様の方法で負荷対象のデバイスを試験する)
+のにパケットソケットを使うトラフィック生成アプライアンスでは、この整数オプションを 1 に設定することで qdisc レイヤーを飛ばすことができる。
+qdisc レイヤーでのパケットバッファが行われなくなるという副作用がある。 これにより、
+ネットワークデバイスの送信キューの使用量が高い場合にパケット廃棄が起きやすくなる。
 .SS ioctl
 .\" FIXME Document SIOCGSTAMPNS
 \fBSIOCGSTAMP\fP を用いると、最後に受信したパケットのタイムスタンプを得ることができる。 引き数は \fIstruct timeval\fP
-である。
+型の変数である。
 
 さらに、 \fBnetdevice\fP(7)  および \fBsocket\fP(7)  で定義されている標準の ioctl はいずれも packet
 ソケットに指定可能である。
@@ -221,8 +351,8 @@ struct sockaddr_pkt {
 .in
 
 \fIspkt_family\fP はデバイスのタイプ、 \fIspkt_protocol\fP は \fI<sys/if_ether.h>\fP
-で定義されている IEEE 802.3 プロトコルタイプ、 \fIspkt_device\fP はデバイスの名前を NULL 終端された文字列で与えたもの
-(例: eth0) である。
+で定義されている IEEE 802.3 プロトコルタイプ、 \fIspkt_device\fP はデバイスの名前をヌル終端された文字列で与えたもの (例:
+eth0) である。
 
 この構造体は obsolete であり、 新しくコードを書く時には用いるべきでない。
 .SH バグ
@@ -256,7 +386,12 @@ IEEE 802.2/803.3 の LLC の扱い方は、バグと考えても良いだろう
 に関しては RFC\ 1700 を参照。
 
 物理層のプロトコルに関する記述は \fI<linux/if_ether.h>\fP インクルードファイルにある。
+
+The Linux kernel source tree.  \fI/Documentation/networking/filter.txt\fP
+describes how to apply Berkeley Packet Filters to packet sockets.
+\fI/tools/testing/selftests/net/psock_tpacket.c\fP contains example source code
+for all available versions of \fBPACKET_RX_RING\fP and \fBPACKET_TX_RING\fP.
 .SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.53 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.68 の一部
 である。プロジェクトの説明とバグ報告に関する情報は
 http://www.kernel.org/doc/man\-pages/ に書かれている。