lwIP 2.0.2のRAW APIでちょっとはまったので、メモを残しておきます。
DNS
#define LWIP_DNS 1
dns_setserver(0, &dnsserver);
dns_gethostbyname("www.yahoo.co.jp", &dnsres, dns_found, NULL);
コールバック関数(dns_found)が用意されていますが、dns_gethostbyname()はブロックなので、アドレスがdnsresに入って返ってきます。確認してみたらこの関数もノンブロックでdnsresは空のようです。やはりコールバック関数で処理を確認する必要があるようです。tcp_connectはconnectとerrのコールバックが別ですが、dnsはアドレスが拾えても拾えなくても同じコールバックが呼ばれ、アドレスがあるかないかで判断できるようです。
DHCP
ずいぶんはまりました。
#define LWIP_DHCP 1
dhcp_start(&netif);
while(netif.ip_addr.addr == 0)
sys_check_timeouts();
dhcp_startはノンプロックの関数なので、返ってきた時点ではIPアドレスは設定されていません。dhcpの処理はDHCPDISCOVER->DHCPOFFER->DHCPREQUEST->DHCPACKで成立するのですがACKを受けた時点では、IPアドレスは設定されていなくて、sys_check_timeoutsから起動される処理で設定されます。このためIPアドレスがセットされたかを確認してループを終了するようにしてみました。
sys_check_timeouts()でDHCPの更新処理もするようなので、更新処理が必要な場合には定期的に呼ぶ必要があるようです。
sys_check_timeouts()ではsys_new()関数を呼んでいてEmbedの場合は作る必要があります。ある程度正確な値を返さないとおかしな動きをするかもしれません。
tcp_poll
このコールバックはtcpのtime out処理などをするためにあるようです。ローカルの接続ではあまりtime outする事はないですが、Internetへの接続では時間がかかる場合があるので十分な時間を設定した方が良いようです。あまり短く設定してtime outが頻発するとlwipが不安定になるような気がします。
これでIPの三つの神器のDHCP,DNS,SSLがそろったので、なにか作ってみようかと思います。
ネットは広大だわ