【Ethernet】車載ネットワーク その37【lwIP⑬】

車載ネットワーク

バックナンバーはこちら。
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という連結リストのバッファにパケットをコピーする必要がある。

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

コメント

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