EN JA
TAP(4)
TAP(4) FreeBSD Kernel Interfaces Manual TAP(4)

名称

tapイーサネットトンネルソフトウェアネットワークインタフェース

書式

device tap

解説

tap インタフェースは、 pty(4) のネットワークインタフェース類事物のように大まかに記述することができるソフトウェアループバックメカニズムです。すなわち、 tap は、 pty ドライバが端末にすることをネットワークインタフェースに行ないます。

pty ドライバに似た、 tap ドライバは次の 2 つのインタフェースを提供します: ( tap の場合でイーサネットネットワークインタフェースまたは pty のための端末) をシミュレートしている普通の機能に似たインタフェース、とキャラクタスペシャルデバイス“制御”インタフェースです。

ネットワークインタフェースは、オープンされた各制御デバイスあたり 1 つの、“ tap0”, “ tap1”などと名前が付けられます。これらのネットワークインタフェースは、 if_tap.ko モジュールがアンロードされるか、または "ifconfig destroy" (下記参照) で削除されるまで、存続します。

tap デバイスは、インタフェースクローニングを使用して作成されます。これは、“ifconfig tap N create”コマンドを使用して行われます。これは、 tap デバイスを作成するのに好ましい方法です。同じメソッドによってインタフェースを取り除くことができます。これのためには、“ifconfig tap N destroy”コマンドを使用します。

sysctl(8) 変数 net.link.tap.devfs_cloning が 0 でないなら、 tap インタフェースは、特別の制御デバイス /dev/tap でオープンすることができます。このデバイスがオープンされるとき、 tap は、最も未使用の tap デバイス (どれかを決定するために devname(3) を使用) のためにハンドルを返します。

古い devfs クローニングの機能性を無効にすると、 VMware と ssh(1) のような、 tap を使用する既存のアプリケーションはブレーク (break) するかもしれません。したがって、追って通知があるまで有効にされることをデフォルトとします。

制御デバイス (一度オープンに成功すれば) は、 if_tap.ko がアンロードされるか、またはインタフェースが破壊されるまで、持続します。

各インタフェースは、通常のイーサネットネットワークインタフェース ioctl(2) をサポートし、したがって他のイーサネットインタフェースのように ifconfig(8) で使用することができます。システムが、ネットワークインタフェースでイーサネットフレームを送信するのを選択するとき、フレームは制御デバイス (そこで“入力”として現れます) から読み込むことができます。イーサネットフレームを制御デバイスに書き込むと、まるで (実在しない) ハードウェアがちょうどそれを受信されかのように、ネットワークインタフェースで入力フレームが生成されます。

イーサネットトンネルデバイス、通常 /dev/tapN は、 sysctl(8) 変数 net.link.tap.user_open が非 0 でないなら (0 であるなら)、排他的にオープンされて (それが既にオープンされているなら、それをオープンすることはできません) スーパユーザに制限されます。 sysctl(8) 変数 net.link.tap.up_on_open が 0 でないなら、トンネルデバイスは、制御デバイスがオープンされるとき、“up”とマークされます。インタフェースが“レディ” (準備ができていない) でないと、 read() 呼び出しはエラー ( EHOSTDOWN) を返します。インタフェースがいったんレディ (準備ができるよう) になると、それが利用可能であるなら、 read() は、イーサネットフレームを返します。そうでなければ、非ブロッキング入出力が有効になったどうかによって、ブロックするか EWOULDBLOCK が返されるかのいずれかです。フレームが read() に渡されたバッファの中で許されるより長いなら、余分なデータは黙って落とされます。

write(2) 呼び出しは疑似インタフェースで“受信”されるイーサネットフレームを渡します。各 write() 呼び出しはちょうど 1 つのパケットを供給します。フレームの長さは、 write() のために提供されたデータの量から取られます。書き込みはブロックされません。フレームが一時的な理由 (例えば、利用可能なバッファ空間がない) で受け取られなかったなら、黙ってそれは落とされます。理由が一時的でない (例えば、パケットが大きすぎる) なら、エラーが返されます。 < net/if_tap.h> で定義された、次の ioctl(2) 呼び出しがサポートされます:

TAPSIFINFO
ネットワークインタフェース情報 (回線スピード、MTU とタイプ) を設定します。引数は、 struct tapinfo へのポインタであるべきです。
TAPGIFINFO
ネットワークインタフェース情報 (回線スピード、MTU とタイプ) を検索します。引数は、 struct tapinfo へのポインタであるべきです。
TAPSDEBUG
引数は、 int へのポインタであるべきです。これはその値に内部のデバッグ変数を設定します。どちらかといえば、この変数の制御はここでは文書化されません。ソースコードを参照してください。
TAPGDEBUG
引数は、 int へのポインタであるべきです。これは内部のデバッグ変数の値をそれに格納します。
TAPGIFNAME
ネットワークインタフェース名を検索します。引数は、 struct ifreq へのポインタであるべきです。インタフェース名は、 ifr_name フィールドに返されます。
FIONBIO
引数の int の値が 0 か 0 でないかに従って、読み込みの非ブロッキング入出力を無効か有効に切り替えます。 (書き込みは常に非ブロッキングです。)
FIOASYNC
引数の int の値が 0 か 0 でないかに従って、 (すなわち、データが読み込み利用可能であるときに SIGIO を生成する) 読み込みのための非同期入出力を無効か有効に切り替えます。
FIONREAD
任意のフレームが読み込み用のキューに入れられるなら、最初のフレームのサイズを引数 int に格納します。さもなければ、0 を格納します。
TIOCSPGRP
非同期入出力が有効にされるとき、 SIGIO シグナルを受け取るプロセスグループを引数 int 値に設定します。
TIOCGPGRP
SIGIO シグナルのためのプロセスグループ値を引数 int 値に取り出します。
SIOCGIFADDR
“リモート”側の Media Access Control ( MAC) アドレスを検索して取り出します。このコマンドは VMware ポートによって使用され、制御デバイス (通常 /dev/vmnet N/dev/tap N) に関連している記述子で実行されると予想されます。引数として渡される バッファ は、 MAC アドレスを保存するために十分な空間があると期待されます。オープン時には、“ローカル”と“リモート”の MAC アドレスがともに同じであるので、“ローカル” MAC アドレスを検索して取り出すためにこのコマンドを使用することができます。
SIOCSIFADDR
“リモート”側の Media Access Control ( MAC) アドレスを設定します。このコマンドは VMware ポートによって使用され、制御デバイス (通常 /dev/vmnet N) に関連している記述子で実行されると予想されます。

制御デバイスは読み込みのための select(2) もサポートします。書き込みは常に非ブロッキングなので、いつも成功して、書き込みのための選択 (select) は無意味です。

データデバイスが最後にクローズした時、デフォルトで、インタフェースはデバイスが VMnet デバイスでなければ (あたかも“ifconfig tap N down”のように) 停止されます。キューに入っているすべてのフレームは捨てられます。データデバイスがオープンされていない時にインタフェースが動作しているなら、出力フレームはそれらを蓄積させないで常に捨てられます。

tap デバイスはまた古い VMnet デバイスドライバを置き換える VMware ポートと共に使用することができます。ドライバは、 tapvmnet デバイスの間で選択するマイナ番号を使用します。 VMnet のマイナ番号は、 0x800000 + N で始まります。ここで N は、 VMnet のユニット番号です。この場合、制御デバイスは、 /dev/vmnetN であると期待され、ネットワークインタフェースは、 vmnetN になります。さらに、 VMnet デバイスは制御デバイスがクローズされたとき、 ifconfig(8) 自身で停止しません。その他は同じです。

上記に加えて、 ioctl(2) 呼び出しは、VMware ポートのための 1 つの追加があります。

VMIO_SIOCSIFFLAGS
VMware の SIOCSIFFLAGS

関連項目

inet(4), intro(4)
January 26, 2012 FreeBSD