livaの雑記帳

僕の💩自作OS💩が研究室のネットワークを破壊するわけがない

出オチです。ごめんなさい。

 

背景

最近研究室で僕が自分で作ってるOSを起動すると、ラボのネットワークが不安定になるんですよね。YouTubeが見れなくて辛い。

 

一年くらい前に僕が研究室のネットワーク構築をした時は、僕のOSをインターネッツに繋いだ所で何とも無かったのですが、最近どうやら何かよろしくない事が起きているっぽいのです。

 

起きてるっぽい、とか書いてますが、心当たりは大いにありまして、ラボネットワークがDHCPで構成されているにも関わらず、僕のOSは自分で勝手に割り当てたIPを使うんです。IP勝手に使ってARPパケット流しまくるの、とてもタノシイ!

 

昔の研究室は人もマシンも少なかったので適当なIPを勝手に使っても誰にも怒られなかったのですが、やはり昨今の弊研究室でも大量にIPアドレスが払い出される状況が発生しておりまして、以前の牧歌的な時代が懐かしく思い出されます。

 

さて、こういう状況で一番妥当そうな選択肢はルータに自作OSで使うIPを登録してしまう事だとは思うのですが、ただでさえ自作OSなんて価値があるかどうか分からないのに自分のIPすらマトモに管理できないのは流石に💩すぎるであろう、と。

もう少し真面目な理由を書くなら、2つのマシンで同時に自分のOSを立ち上げたくなる事もあるかもしれないですしね。

 

というわけで自分のOSにDHCPを実装してみる事にしました。

本音を書けば、クリスマスも近いし、なんかゆるふわリア充な事がしたかった、ってだけです。

 

ところで、この記事を読んでいる人であればOSを書いた事がある人が大半なのではないかと思いますが、皆さんの書かれたOSはEthernetに繋ぐ時にIP割り当てどうしてますか?アンケートとか取れないかな。

 

DHCPについて

DHCPは簡単なので説明する程でも無いとは思いますが、一応参考になりそうなリンクを貼っておきます。

 

とりあえずふいんきを掴みたければ

http://www.picfun.com/lan09a.html

 

ぶっちゃけ、Wikipedia読むのが一番手っ取り早いです。

Dynamic Host Configuration Protocol - Wikipedia

 

あとはここら辺とか

DHCP, Dynamic Host Configuration Protocol

DHCP: Message format

 

ちゃんと仕様を知りたければRFCを読めばOK

http://www.networksorcery.com/enp/rfc/rfc2131.txt

http://www.networksorcery.com/enp/rfc/rfc2132.txt

 

最低限の実装で良いなら、たった4つのパケットのやり取りで終わるので、とても簡単です。既にUDPが実装されていれば、ちょっとUDPパケットの中身をごにょるだけで良いというのもグッド👍

 

個人的に微妙だと思うのは、幾らBOOTPとの互換とはいえ、実質的な本体はDHCP optionsであるという事。「options」っていうくらいだから空っぽでいいじゃろ、とか最初思ったんだけど、流石にそこまで甘くは無かったですね。

 

あと、Wikipediaの例ではDHCP OFFERのServer IP Addressの項目にDHCPサーバのIPが入ってる感じになっていたので、最初はこれを使う感じで実装したんですが、実際に試したら、ゼロ埋めされていました。うんうん、DHCP optionsの54番が本体なんだね、分かったよ。

 

動かしてみた

実験環境:

NICIntel X540(ixgbe)

DHCPサーバ(兼ルータ):BUFFALO BHR-4GRV2

OS:ぼくがつくってるなにか

 

f:id:liva_h:20171214071129j:plain

 

一番下のメッセージで、192.168.12.54が降ってきたとありますね。やったぜ。

 

感想的な何か

今回、3,4時間くらいで実装できたので、気分転換としてやるには割と良いかな、と思いました。優秀な人ならもっと早く実装できそう。

 

ただし、RFCを読む元気が無かったので、殆どwikipediaとか個人サイトとかを見ながら何となく動かした結果、凄くゆるいパケットを吐いてくれます。クリスマス特有のウェイ↑感があって、とても良いですね。

 

とりあえず動けばいいやって感じでやったので、リース切れたらどうすんのとか、いろいろ悩ましい事はあるわけですが、まあいいんじゃないですかね。YouTubeは見れるようになったし。

 

あ、実装はここに転がってます。

Raph_Kernel/udp.h at develop · PFLab-OS/Raph_Kernel · GitHub

Raph_Kernel/udp.cc at develop · PFLab-OS/Raph_Kernel · GitHub

 

最後に

この記事は自作OS Adevent Calender 2017の12日目です。遅れてしまい、申し訳ございません。間に合わなかったのは、DHCPの実装の前にやっていた、カーネル内非同期タスクの再設計&実装が思った以上に時間が掛かってしまいまして。。。

バグの無いプログラムを書ける強い人になりたいですね。最近おうちで寝てない気がする。