【Ethernet】車載ネットワーク その29【lwIP⑤】

車載ネットワーク

バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-network-backnumber/

はじめに

lwIPの初期化について。

登場人物

博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

lwIPの初期化

フクさん
フクさん

じゃー今回からlwIPの利用方法についての説明にはいるよー。

太郎くん
太郎くん

おー。

フクさん
フクさん

まず最初にやることは、
lwIPの初期化。

  • lwIP自身の初期化 ← これ
  • ネットワークインターフェースの追加
  • マルチキャストグループの参加
  • ネットワークインターフェースの初期化
  • リンクアップ
  • UDP Socket生成
  • IPアドレス、ポートへのBind
  • UDP受信待ち
  • EthnertFrameの疑似受信
太郎くん
太郎くん

とりあえず初期化関数呼べばOK的な感じだとありがたい。

フクさん
フクさん

まぁlwip_initって関数呼ぶだけだねー。

太郎くん
太郎くん

まじか!!

太郎くん
太郎くん

引数もないの?

フクさん
フクさん

引数も無い。

太郎くん
太郎くん

じゃ、この話はこれまでってことで。

フクさん
フクさん

そういうわけにも行かないんだよねぇ。

太郎くん
太郎くん

(相変わらず回りくどいな・・・。)

lwIPの初期化の具体的な内容

フクさん
フクさん

とりあえず、lwip_init関数の中身を見てみよう。

/**
 * @ingroup lwip_nosys
 * Initialize all modules.
 * Use this in NO_SYS mode. Use tcpip_init() otherwise.
 */
void
lwip_init(void)
{
#ifndef LWIP_SKIP_CONST_CHECK
  int a = 0;
  LWIP_UNUSED_ARG(a);
  LWIP_ASSERT("LWIP_CONST_CAST not implemented correctly. Check your lwIP port.", LWIP_CONST_CAST(void *, &a) == &a);
#endif
#ifndef LWIP_SKIP_PACKING_CHECK
  LWIP_ASSERT("Struct packing not implemented correctly. Check your lwIP port.", sizeof(struct packed_struct_test) == PACKED_STRUCT_TEST_EXPECTED_SIZE);
#endif

  /* Modules initialization */
  stats_init();
#if !NO_SYS
  sys_init();
#endif /* !NO_SYS */
  mem_init();
  memp_init();
  pbuf_init();
  netif_init();
#if LWIP_IPV4
  ip_init();
#if LWIP_ARP
  etharp_init();
#endif /* LWIP_ARP */
#endif /* LWIP_IPV4 */
#if LWIP_RAW
  raw_init();
#endif /* LWIP_RAW */
#if LWIP_UDP
  udp_init();
#endif /* LWIP_UDP */
#if LWIP_TCP
  tcp_init();
#endif /* LWIP_TCP */
#if LWIP_IGMP
  igmp_init();
#endif /* LWIP_IGMP */
#if LWIP_DNS
  dns_init();
#endif /* LWIP_DNS */
#if PPP_SUPPORT
  ppp_init();
#endif

#if LWIP_TIMERS
  sys_timeouts_init();
#endif /* LWIP_TIMERS */
}
太郎くん
太郎くん

ん?
なんかいろいろ#if~#endifが多いね?

フクさん
フクさん

そうそう。
そこがlwip_initのポイントになる。

太郎くん
太郎くん

これって、どっかでdefine定義されてるところがあるってことだよね?

フクさん
フクさん

うん。
これらは以下で定義されている。
include/lwip/opt.h

太郎くん
太郎くん

ということは、
そこの定義によって、lwip_initの初期化の内容が変わるってことだね?

フクさん
フクさん

うん。
今回はデフォルトのままだけど、
組み込み用途だと、可能な限りROM/RAM使用量を減らしたいって動機があるんで、
define定義を弄って、不要なものは無効にする。
って運用を想定してるっぽい。

太郎くん
太郎くん

なるほどー。
たしかに、DNSとかPPPとか不要だったら無効にした方がよさそうだねー。

まとめ

フクさん
フクさん

まとめだよ。

  • lwIPの初期化関数はlwip_init。
  • lwip_initの内部は#if~#endifで必要最低限の初期化が可能。
    • include/lwip/opt.hで使用する機能の有効/無効の切り替えができる。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました