D: インタフェース制御
これまで、IPインタフェースのアドレスはvirtio-netドライバの初期化の中にハードコードしていました(4.1で追加した暫定コード)。これを、ユーザ空間からインタフェースの情報を取得したりアドレスを設定できるようにしてください。
目標
- インタフェースの情報(名前・MACアドレス・IPアドレスなど)を一覧表示するコマンドを作る
- ユーザ空間からインタフェースにIPアドレスを設定できるようにする
- 設定したアドレスで実際に通信できることを確認する
- 4.1で追加したvirtio-netドライバ内のアドレスのハードコードを削除する
ヒント
ifconfigコマンドが良い例ですが、必ずしも同じ仕様である必要はありません。
- システムコールの追加: プロトコルスタックの情報はカーネル内にあるため、ユーザ空間から取得・設定するにはシステムコールが必要です。「情報を取得する」ものと「アドレスを設定する」ものの2つを追加するとよいでしょう。
- プロトコルスタックへの機能追加: プロトコルスタックはデバイスの一覧を内部(
net.cのdevicesリスト)で管理していますが、外部から辿る手段がありません。インデックスやデバイス名からデバイスを取得する関数を追加すると、システムコールから情報を取り出せるようになります。アドレスの設定には、既にあるip_iface_alloc()とip_iface_register()が使えます。 - カーネルとユーザ空間で共有する構造体: インタフェース情報を受け渡すための構造体は、
struct stat(kernel/stat.h)のように、カーネルとユーザ空間の両方からインクルードできるヘッダに定義するとよいでしょう。
Important
必要に応じてシステムコールの追加や、プロトコルスタックへの機能追加を行ってください。プロトコルスタック本体(
kernel/net/*.c)にはできるだけ手を入れず、追加する関数は最小限に留めるのが望ましいです。
完成イメージ
$ ifconfig
net0: flags=0x121<UP> mtu 1500
ether 52:54:00:12:34:56
$ ifconfig net0 192.0.2.2 255.255.255.0
$ ifconfig
net0: flags=0x121<UP> mtu 1500
ether 52:54:00:12:34:56
inet 192.0.2.2 netmask 255.255.255.0 broadcast 192.0.2.255