バックナンバーはこちら。
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に渡す。
- netif_add関数を使用する。
バックナンバーはこちら。
コメント