lwIP 2.0.2のRAW APIでちょっとはまったので、メモを残しておきます。

DNS

lwipopts.h
#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

ずいぶんはまりました。

lwipopts.h
#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の場合は作る必要があります。ある程度正確な値を返さないとおかしな動きをするかもしれません。

これでIPの三つの神器のDHCP,DNS,SSLがそろったので、なにか作ってみようかと思います。

ネットは広大だわ

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.