es オペレーティングシステムの TCP/IP スタック ライブラリ(libesnet.a)はqemu上で実行中のesオペレーティングシステム上でも、 ツールビルドを行った Linux (Fedora Core) 上でもどちらからでも実行してテストすることができます。TCP/IPスタックの開発にあたっては現状マルチスレッドに対応したデバッガが使えるツールビルドを使用したほうが効率よく開発を進められるためです。
qemu では実際にネットワークにアクセスするために TUN/TAP デバイスを使用しています。ここでは、TAPを使って実際に LAN にアクセスできるように Fedora Core 6 を設定する手順について説明します。
注意: es-0.0.4 (es-0.0.4.tar.gz)以前のバージョンはネットワークに対応していません。
注意: 2007-10-31以降のソースコードではツールビルドではEthernetデバイスのエミュレーションにTUN/TAPのかわりにパケットインターフェイス(PF_PACKET)を使用するように変更しています。(参考: posix_ethernet.cpp)
注意: 以下はFC6で動作を確認した手順です。FC6以外のバージョンでは操作手順が異なる場合があるかもしれません。
es カーネル(libeskernel.a)の Ethernet ドライバは IStream, IEthernet という2つのインターフェースを 提供することで、TCP/IPプロトコルスタックからLANにアクセスすることを可能にします。
下図は es オペレーティングシステム上でTCP/IPスタックを実行する場合のレイヤー構造を表しています。
|
下図は Fedora Core 用のツールビルドからTCP/IPスタックを実行する場合のレイヤー構造を表しています。
|
どちらの場合でも TCP/IP スタックからは Ethernet デバイスは、es の名前空間 device/ethernet にバインドされたオブジェクトとしてまったく同じように利用することができます。es オペレーティングシステム上で動作している場合にはカーネルが NE2000 ネットワークカードを操作することによって qemu を介してネットワークにアクセスします。Fedora Core 用のツールビルド上で動作している場合にはカーネルが Linux の TAP デバイスを操作してネットワークにアクセスします。
このように TAP デバイスから LAN にアクセスできるようにするためには、TAP インターフェイス(tap0)と Ethernet アダプタのネットワーク インターフェース(eth1)をブリッジインターフェイス(br0)を介してブリッジ接続されるように Linux を設定しておく必要があります。
ここでは、Linux の PC に 2 枚のネットワークインターフェイスカードを挿入して、eth0 は通常のネットワークアクセス用途(Linux からのウェブ、メール、アップデート等)に、eth1 は es オペレーティングシステムの実験用に使用するものとして説明しています。eth1 には Linux から IP アドレスを割り当てないようにようにしてください。また FC6 ではデフォルトで IPv6 が有効になっている場合が多いかと思いますが、こちらも eth1 から Linux がパケットを送信することを避けるため無効にしてしてください。またプロトコルスタックの開発中には eth1 は eth0 とは独立した LAN に接続して、通常のネットワークオペレーションに支障をきたさないようにしておくべきでしょう。
TAP を使うためには、TUN/TAP を利用できるように Linux カーネルが構築されている必要がありますが、FC6 ではあらかじめそのように構築されているはずです。念のため、デバイス /dev/net/tun があることを確認してください。もし /dev/net/tun がなかった場合には次のコマンドを入力してノードを作成してください。
|
続いてブリッジを準備します。下記のコマンドのように、ブリッジインターフェース(br0)を作ってeth1に接続します。 もし brctl コマンドが見つからない場合には $ yum install bridge
を実行してみてください。
|
このままでは Linux をリブートするたびにブリッジの設定は消えてしまいますので、必要に応じて設定してください。
TAP インターフェース(tap0)は、QEMU および Fedora Core 用の es カーネルの実行中に作成され、終了時には削除されてしまいます。そのため、tap0 を br0 にブリッジ接続するために tap0 が作成されたときにユーザーの指定したスクリプトが (/etc/qemu-ifup) 呼び出されるようになっています。
/etc/qemu-ifup の記述例を以下に示します。
|
このスクリプトは、(引数$1として渡される) tap0 をブリッジインターフェース (br0) に接続します。上記のスクリプトではブリッジ接続が安定するまで16秒待つようにしてあります。
注意: 私たちの環境では、tap0 が起動してから約15秒間の間、 「受信はできるが送信はできない」という状態になりました。 回避策としてこのウェイトを入れています。
以上で Linux の設定は完了です。なお、上記のスクリプトやコマンドの実行に当たってはルート権限が必要なことにも注意してください。
QEMU から TAP ネットワーク インターフェイスを使う際には、通常のオプションに加えて以下のオプションを指定します。
|
テストスイートの qemu 起動スクリプトを使用している場合には環境変数 QFLAGS に上記のオプションを設定しておけば、qemu 実行時に追加のコマンドライン引数として渡されます。
|
現在のところFedora Core のツールビルドではスクリプト名はlibeskernel.aのソースコードposix_init.cpp中に直接埋め込んでいます。上記の記述どおりに設定された場合には特に起動オプション等はなしに TAP を利用できます。
TCP/IP スタックのテストプログラムconfig.cppを実行してみてください。実際にTAP経由でネットワークに接続するときはルート権限が必要なことに注意してください。
|
このテストプログラムは Ethernet インターフェイスに IPv4 アドレス 192.168.2.40 を割り当てようとします。実際に割り当てができたら、外部のノードに ping を送信します。うまく行けば、Wireshark などを使って次のようなパケットが LAN 上に流れることを確認できるはずです。
|
config.cpp プログラムは、まず Ethernet インターフェイスを IInternetConfig インターフェイスの addInterface メソッドを使って TCP/IP プロトコルから利用できるように登録を行っています。
|
続いて Ethernet インターフェイスにホストアドレス(192.168.2.40)を IInternetConfig インターフェイスの addAddress メソッドを使って割り当てています。その後、8秒間待っていますが、これは ARP でアドレスの衝突がないかどうか確認するのを待つためのものです。
|
es ではインターネットアドレスを表現するために IInternetAddress
インターフェイスを用いています。新しい IInternetAddress
オブジェクトを取得するときは IResolver インターフェイスの getHostByAddress
メソッドを使用します。
さらにデフォルト ゲートウェイ(192.168.2.1)を IInternetConfig インターフェイスの addRouter メソッドを使って割り当てています。
|
つづいて、ループバックアドレスに対して ping (ICMP Echo リクエスト) を送信しています。getHostByAddress
メソッドの最後の引数 1 は、ループバックインターフェイスの既定のスコープIDです。
|
さらに続けて、ループバックインターフェイスを使って UDP パケットの送受信を行っています。esでは、自ホストにアサインされているアドレスに対して socket メソッドを呼び出すと、自ホストにバインドされた新しいソケットを得ることができます。
|
また LAN の外側のホストに対して ping を投げることもできます。手順はループバックに対して行ったのと同様です。
|
Copyright © 2006, 2007
Nintendo Co,. Ltd.
Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appears in all copies and that both that copyright notice and this permission notice appear in supporting documentation. Nintendo makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.