使えるProxyDHCPサーバーを実装しようじゃないか

誰かが実装したっていいじゃないかと。DHCPサーバーにPXEをやらせるのは、ちょっと違う気がする。万全のDHCP + PXEサーバー(ProxyDHCP + TFTP)が本来じゃぁないか。DHCPサーバーとProxyDHCPサーバーを同じホストで動かそうとするとややこしいけど、同じホストで動かせる=DHCPサーバーが自分の管理下にある ということなので、そういうときはDHCPサーバーの設定を変更してもらえばいい。
DHCPサーバーと分離すれば、PXEサーバーの冗長化は極めて容易。IP割り振らないし、連携も要らない。足すだけ。TFTPサーバーは単純にスケールアウトする。


次期RUNES計画的には、ブートパラメータを中央集権的に管理する機構が必要だけど、そこは分散ファイルシステムで。とりあえず現状はP2P分散ファイルシステムが無いので、NFSとかHTTPとかで。


RFCに従ったサーバープログラムをイチから書くのは苦しい。ここはdhcprelayをベースにしたい。dhcprelayのコードはものすごくキレイで読みやすい。スバラシイ。
DHCP関連の関数群と、DHCP Relay Agent固有の処理が別ファイルに分離してあるので、なおスバラシイ。dhcp.hとdhcp.cを使わせていただく。必然的にGPL


設定ファイルを読む処理を書くのは面倒(&プログラムサイズが増える)なので、全部コマンドライン引数でやる。設定ファイル型にしたいときは、シェルスクリプトで起動スクリプトを書けばいい。


まずgetopt()でコマンドライン引数を解析。

  • 待ち受けるインターフェース(デフォルト無し)
  • 自分のIPアドレス(待ち受けるインターフェースの最初のアドレス)
  • TFTPサーバーのアドレス(デフォルト=自分のIPアドレス
  • ブロードキャストアドレス(デフォルト=255.255.255.0)
  • TFTPサーバー上のブートローダのパス(デフォルト無し)

IPv6に対応する必要がないから楽。シングルスレッドなので楽。ああ楽園。
移植性を考えると、SO_BINDTODEVICEは使うべきではない。どうするか。


DHCPACKで、TFTPサーバーのアドレスをどこのフィールドに入れればいいのか良く分からない。PXE DaemonIntel Boot Agentのやりとりをパケットキャプチャしながら調べるしかないかなー。時間がかかる。明日の講義が全部休講になったりしませんか!



PXEはMTFTPも使えるけど、要らないと思う。むしろユニキャストの方がいい。