[ TOP | Recently ]

2010-03-15 MTU size detection


昔treeさんが、jumbo frameなethernet intefaceのMTUを拡張arpパケットを使って知らせるということを考えているということを言っていた。
これをヒントにして、arp packetにpaddingを付けてarp queryを送り、返事が来たらそのsize分のMTUを相手が受信することができる、という実装を思いついた。
例えば9000byteのarp queryを送って返事が来たら、相手のMTUは9000、返事が来なかったらそれ以下、ということになる。
このサイズをbinary searchで調べていけば正確なMTU sizeがわかるという具合。

というわけで実装してみた。

…ら、bpfが2048byte(MCLBYTES)サイズ以上の送信に対応していなかった。

一応そこさえクリアすればどんなMTU sizeでも動くはずなので、まぁbpf直せばいいよね、と思ってる頃にasiabsdconがあったので、 TheoとClaudioにarp paddingなmtu size detectionについて話してみた。

「Hi! アンタラjumbo frame使う時同一セグメントのMTUサイズの検出どうしてる? 俺arp packetで検出する仕組み実装したんだけど、イカスだろ?」
「俺たちはアイディアだけで実装はしてないけど、icmp echoでそれをやるつもりだ。icmp echoをblockしてる場合どうするかって?
HAHAHA!そんなホストはこの世には存在しない問題にならないYO それよりオマエの実装だと L2 が arp 返す場合はどうするんだ?」

と言われた。ガーン

icmp echo云々は、いわゆるOpenBSD的な「糞実装は無視」といういつものアレだろうけども、 proxy arpされた時にちゃんとした対向のMTU sizeが検出できないというのは確かに失念していた。ダメじゃんarp
icmp echoがblockされていてもMTU1500と見なせばいいだけのことなので、確かにicmp echoを使った方が良さそうだ。

というわけで最初のpadding arp packet案は破棄してicmp echo版に作りなおすことにする。
せっかく見つけたbpfのバグを修正する意味が無くなるなぁ。


EOF