【Ethernet】車載ネットワーク その30【lwIP⑥】

車載ネットワーク

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

はじめに

lwIPのネットワークインターフェースの追加について。

netif_add関数についての話。
これの引数とそれの位置づけについての話。
下位層の初期化の扱いの話。

などなど。

登場人物

博識フクロウのフクさん

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

ネットワークインターフェースって何個でも追加できるの?

フクさん
フクさん

そうだね。
メモリが許す限りは追加可能なはずだ。

太郎くん
太郎くん

これもAPIとしては一個になるのかな?

フクさん
フクさん

うん。
netif_addって関数。
引数はまぁまぁあるねー。

netif_add関数

フクさん
フクさん

まずAPI仕様としてはこんなん。

struct netif *
netif_add(struct netif *netif,
          const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw,
          void *state, netif_init_fn init, netif_input_fn input)
太郎くん
太郎くん

それぞれの引数の意味は?

フクさん
フクさん

ざっと書くとこんな意味だね。

netif:netif構造体(事前にアロケート済みなもの)
ipaddr:ネットワークインターフェースに割り当てるIPアドレス
netmask:ネットワークインターフェースのネットマスク
gw: デフォルトゲートウェイのIPアドレス
state: 不透明オブジェクト
init:初期化時のコールバック関数
input: 受信時のコールバック関数

netif_add関数の引数詳細

太郎くん
太郎くん

netifの事前にアロケートってのは何?

フクさん
フクさん

mallocでも普通の変数定義のどっちでもいいんだけど、
メモリ領域確保済みのnetif構造体を引数として渡してくれって話だね。
組み込みの場合、mallocは使用できないことが多いから
グローバル変数で定義することが多いかな。

太郎くん
太郎くん

stateってのが「不透明オブジェクト」ってなってるけど、
これは何者?

フクさん
フクさん

voidポインタで、具体的な型が決まってないオブジェクトだね。
ドライバ層の状態を取得できるっぽい。
ドライバ層の内部構造の型はそれぞれ違うんで、
voidポインタこと「不透明オブジェクト」として、
利用側でうまく使ってもらう。
PPPとかブリッジで使用することを想定してるんで今回は使用しない。

って感じかな?

太郎くん
太郎くん

(まぁ今回は使わないっぽいから、「そういうものがある」程度にしとくかー。)

太郎くん
太郎くん

initってコールバック関数は具体的にどんな関数をセットすれば良いのかな?

フクさん
フクさん

こんな関数をセットすることになるね。

static err_t testif_init(struct netif *netif)
{
  netif->name[0] = 't';
  netif->name[1] = 's';
  netif->output = etharp_output;
  netif->linkoutput = lwip_tx_func;
  netif->mtu = 1500;
  netif->hwaddr_len = 6;
  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP;

  netif->hwaddr[0] = 0x00;
  netif->hwaddr[1] = 0x23;
  netif->hwaddr[2] = 0xC1;
  netif->hwaddr[3] = 0xDE;
  netif->hwaddr[4] = 0xD0;
  netif->hwaddr[5] = 0x0D;
  
  return ERR_OK;
}
太郎くん
太郎くん

詳細はわからんが、
データリンク層の初期化に必要なパラメータを設定するイメージかな?

フクさん
フクさん

その通り。
特にMACアドレスの設定とかここでやることになるねー。

太郎くん
太郎くん

inputってコールバック関数は?

フクさん
フクさん

ここにはethernet_input関数をセットすることになるかなー。

太郎くん
太郎くん

あれ?
割込み時の関数をここでセットするんだ?

フクさん
フクさん

まぁ実際はethernet_inputを呼び出す前のフック関数を想定して要るっぽいね。
フック関数で何かしらの処理をして、その中でethernet_inputを呼ぶって感じ。

太郎くん
太郎くん

うーん。
予想以上にカスタマイズ性があって驚いたなー。

フクさん
フクさん

そうだねー。
良く作られてると思うよー。

まとめ

フクさん
フクさん

まとめだよ。

  • lwIPのネットワークインターフェースの追加について説明。
    • netif_add関数を使用する。
      • 引数はIPアドレス、ネットマスク等のIP層の他、データリンク層由来のものもある。
      • データリンク層初期化関数はコールバック関数initに渡す。

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

コメント

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