tapとsocket

なんとかtapを使えるようになりました。
わりと簡単にできたなと喜んでいたのですが、しばらく使ってみて、socketと一緒に使うことができないことが判明。ぬぁぜだぁーーーっと叫んでいたのですが、それもほどなく判明。メモリーのバグも見つけて直せたからいいか、という感じです。少し遊んでおります。
デバッグで、Etherealまで入れることになってしまったのですが、これって、プログラムで開いたソケットを監視することってできないんですね。なんか知らないだけかもしれないですけど。
しばらくしたら公開することにしようかな。

tapの調査

0.7.2では、
qemu_add_read_packetで、
qemu_add_fd_read_handlerが呼ばれる。
ne2000_can_receiveとne2000_receiveを登録するのに使われている。
0.8.0では、
qemu_set_fd_handler(s->fd, tap_send, NULL, s)
で、IOハンドラを登録。データが来たときに反応する。
qemu_new_vlan_clientでne2000_receiveを登録。ne2000_can_receiveは登録されなくなっている。
これで、1つのclientから出たデータを他のclientに分配するときの関数を登録している。
0.7.2では、
n = tap_win32_readで、データがあれば、
first_io_handler->fd_read
これは、ne2000_receiveが呼ばれる。
その後、
tap_win32_free_bufferしている。
などなど、やっております。

VLANのパッチとバイナリ

VLANのパッチとバイナリを作りました。
次のようにするとゲストOS同士で通信ができます。ゲストOSを2つ用意し、2つのコマンドプロンプトから起動します。
Prompt1> qemu.exe -L ./ -hda redhat1.img -net nic -net socket,listen=localhost:1234
Prompt2> qemu.exe -L ./ -hda redhat2.img -net nic,macaddr=52:54:00:12:34:57 -net socket,connect=localhost:1234
OSが立ち上がったら、IPアドレスを設定します。
Redhat1> ifconfig eth0 10.0.2.16
Redhat2> ifconfig eth0 10.0.2.17
もう少し詳しい使い方は、作成中です。
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060102-vlan-2.patch
http://www.h6.dion.ne.jp/~kazuw/qemu-win/qemu-20060102-vlan.zip

Mersenne Twister

メルセンヌ・ツイスタ
擬似乱数生成アルゴリズムだって。線形合同法よりも良質な乱数を生成する。
乱数生成といってもいろいろあるのね。
ちなみに、tongue twisterというと早口言葉のこと。tongue(タン)は、舌のことです。牛肉のタンと一緒だったりする。
牛肉のハツは、hearts(ハーツ)からきているそうですね。なんか話が違っているような…。

OOB

OOB - Out of band
帯域外データ
telnetプロトコルでCtrl-Cのような割り込みで使っている。
send/recvにMSG_OOBを渡すことで送受信できる。
setsockoptにSO_OOBINLINEを設定することで、OOBデータを得ることもできる。<---設定しなければ、送ることができないの?不明。設定したときとしないときで、selectが反応するかどうかを調べればいいのだろうけど。 とりあえず使っていないからいいか。telnetも使えるようだし。

VLANのsocketオプション

とりあえず、VLANのsocketオプションを動かすことに成功。まだ、人様にお見せできる状態じゃないですけど。ゲスト同士で、sshでアクセスできるみたいです。
ただ、わからないことがいくつかあって、どうしたもんかなと考え中。selectのexceptional file descriptorをセットするところがあって、Out of Bandデータを扱うそうなんですけど、OOBってなに?な状態ですので、調べないといかんのかなあ。
ファイルディスクリプタのセットはどう扱えばいいのか、とか。メモリーを確保しているけど、freeしていないのはどうして、だとか。
selectじゃなくて、eventを使ったほうがいいのかな。とも思うけど、実際に作ってみないとなんとも言えないし。BSDソケットと互換にしておいたほうがいいかなとも思ったり。
わからないところはそのままにしておくのかな。

仮想化やクラウドについて