続・uIPでUDP
前回(http://d.hatena.ne.jp/yasunoxx/20090901/1251800058)
の続き
ここまでのあらすじ:
・オプティマイズ社製品(http://www.itplaza.co.jp/opti/spi_ether/spi_ether.htm)で
ARMとENC28J60で稼働実績がある(と思われる)uIP-0.9を
CQ-STARM基板で動かすべくゴニョゴニョしているぞ
・ある程度ハードルが高いと予想していたので
TCPサポートは諦めてUDPを動かす事を主眼に置く
(UDPがマトモに動けばTCPもなんとかなるだろうという読み)
。。。ここまでハードルが高いとは思ってなかったんだけどね
・uIP-1.0のサンプルコードdhcpc.cを使ってDHCPが動く所までは漕ぎ着けた
だがしかし
ここまでにやったこと:
・enc28j60.cのデバイスに近い部分(read()とかwrite()とか)を
STM32でムリヤリ動くようにした
※各レジスタへのアクセスが正常にできるようになるまでは
誰も助けてはくれない(愚痴
※SPIを全二重で使う時に
少し考えれば解る事に気付くのに時間がかかった
※メモリをケチるとDHCPが動かないという事に気付くまでに
ほんの少し時間がかかった
※DHCPのパケットサイズがどのくらいあるかは
RFCを読めば解る。。。
・DHCP discoverからackまではbroadcastでイイので
グローバル変数でフラグ(broadcastかunicastかを設定する)を用意し
uip_process()内部でunicast前提になっている所を
そのフラグでバイパスする改造を行った
※その結果
DHCPでローカルIPアドレスを設定できるようになった
そして現在ハマっている事:
・UDP unicastをどう動かしたらイイのか解らない
※uip_udp_new()で送信ポートを開き
uip_udp_bind()で受信ポートを開くのは
DHCPで動作を確認できている(しかし前述の問題がある
※何も考えずに動かしたら
DHCP discover送信時のdestination MAC addressが
初期化されていない配列(uip_bufの先頭6バイト)のまま
送出されていた
とりあえずDHCPを動かさないといけないので
uip_init()内部でuip_buf先頭6バイトを0x0FFで埋めるようにした
・でもコレっておかしいんじゃないか?
DHCPのdiscoverからackまではイイとして
renewal(実装されていない)はunicastじゃなければいけない
今思っている事:
・とにかくuip_process()の記述が汚い
→読み切れないからTCPサポートは後回しにした
・ARP受信とIP broadcast受信した時の処理が重い
・uip_arp.cでARPテーブルの更新が出来てないんじゃないのか?
(パケットの送受信はuip_arp.cの中でやっているのは押さえた)
・そもそもUDPでunicastのパケットを単発で出そうという時に
相手先のIPアドレスしか分からないのだから
ARPテーブル自動参照かARP requestによる補完は
必要なんじゃないのか?
(ここまでARP受信はしているけど
ARP requestが出た事は一度も観測できていない
→ARP機能がちゃんと動いているのか?という疑惑)
・そもそもuIPにおいて
UDPでunicastのパケットを送信するには
どうするのが正しいのか?
・uip_bufはUDP層からは不可侵だと思っているので
uip_arp.cかuip_process()内部で決着するしかないだろう
※この部分に対しても誰も助けてくれない(愚痴2
※オープンソースの流儀が分かっていない職場なので
現状のソースは公開できないけど
別のカタチでfeedbackしようと思っている
参考にさせて頂いているページ:
mones2(http://wiki.monaos.org/index.php?mones2)