バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-network-backnumber/
はじめに
lwIPのEthnertFrameの疑似受信について。
登場人物
博識フクロウのフクさん
イラスト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のEthnertFrameの疑似受信
今回はEthnertFrameの疑似受信について。
- lwIP自身の初期化
- ネットワークインターフェースの追加
- マルチキャストグループの参加
- ネットワークインターフェースの初期化
- リンクアップ
- UDP Socket生成
- IPアドレス、ポートへのBind
- UDP受信待ち
- EthnertFrameの疑似受信 ← これ
今回こそシンプルなんじゃん?
ethernet_inputって関数にバッファ渡すだけでしょ。
そのバッファにルールがあるんだよねぇ。
意外とメンドーな気配!!
ethernet_input関数の型
ethernet_inputは、netif_add関数に渡した受信時のコールバック関数として登録しているわけなんだけど、
そもそもこの関数が期待する引数がどうなっているか。
ってのを見るといろいろわかるかも。
じゃー、その引数の解説をよろしく。
まずは関数の型はこれ。
typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp);
そして引数の説明がこれ。
p:pbufにコピーされた受信パケット
inp:パケットを受信したネットワークインターフェース
ethernet_input関数の詳細
inpのネットワークインターフェースはいつものnetif構造体で、
「pbufにコピーされたパケット」????
どういうこと?
メモリが潤沢なら、1500byte級のバッファを用意するのも問題ないだろうけど、
組み込み系の場合は?
あ、不可能ってことはないけど、ちょっと危険な匂いがする!!
というわけで、連結リストを使用して、
複数の小分けになったバッファを概念上の1個のバッファとして管理する。
それがpbuf。
該当ロジックは以下で定義されてる。
core/pbuf.c
連結リストとは?
その連結リストってのはいまいちわからないんだけど・・・。
恒例のWikipedia。
連結リスト(れんけつリスト、英語: Linked list)は、最も基本的なデータ構造の1つであり、他のデータ構造の実装に使われる。リンクリスト、リンクトリストとも表記される。一連のノードが、任意のデータフィールド群を持ち、1つか2つの参照(リンク)により次(および前)のノードを指している。連結リストの主な利点は、リスト上のノードを様々な順番で検索可能な点である。連結リストは自己参照型のデータ型であり、同じデータ型の別のノードへのリンク(またはポインタ)を含んでいる。連結リストは場所が分かっていれば、ノードの挿入や削除を定数時間で行うことができる(場所を探すのにかかる時間はリスト上の順番の条件などにも依存するし、後述する片方向リストなのか双方向リストなのかにも依存する)。連結リストにはいくつかの種類があり、片方向リスト、双方向リスト、線形リスト、循環リストなどがある。
Wikipediaより
んーーー??
だめだー!
さっぱりわからん!
まぁC言語の場合は自己参照構造体を駆使して実現されるんだけど。
lwIPの場合は、512byteのブロックを数珠つなぎにして、512byte以上の疑似配列を実現している。
・・・。
絵で描くとこんなんだ。
おー?
なるほど!
こういう構造で可変長を実現してるのか!!
そして、ethernet_inputに渡すバッファはこの構造である必要がある。
確かにこれはシンプルとは言い難い。
でも、仕掛けが分かればそれほど怖くはないかな。
というわけで、
一通り必要な機能は説明したんで、
次回は実際にコーディング!
おー!
まとめ
まとめだよ。
- lwIPのEthnertFrameの疑似受信について説明。
- ethernet_input関数を呼び出すだけだが引数が曲者。
- pbufという連結リストのバッファにパケットをコピーする必要がある。
- ethernet_input関数を呼び出すだけだが引数が曲者。
バックナンバーはこちら。
コメント