【Ethernet】車載ネットワーク その36【lwIP⑫】

車載ネットワーク

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

はじめに

lwIPのUDP受信について。

登場人物

博識フクロウのフクさん

イラスト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のUDP受信

フクさん
フクさん

今回はUDP受信について。

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

これは受信関数呼ぶ終わりな予感!

フクさん
フクさん

ざんねーん。
そうは問屋が卸さない!

太郎くん
太郎くん

(ずいぶん古い言い回しを・・・。)

太郎くん
太郎くん

なんか他にやり方があるの?

フクさん
フクさん

受信処理。
そして、組み込み。
といったら?

太郎くん
太郎くん

んー?
受信割込みからの~?

太郎くん
太郎くん

あ!
受信コールバックか?!

フクさん
フクさん

正解!

太郎くん
太郎くん

おー。これは以外と面倒というかなんというか・・・。

フクさん
フクさん

まぁコールバック関数をセットして、
コールバック関数が呼ばれた際に受信データを受け取るって流れなんで、
それほど複雑な話でもないけどねー。
ちなみに受信コールバックを設定するAPIはudp_recv関数になる。

udp_recv関数説明

フクさん
フクさん

まず引数を説明

pcb:UDP SocketのPCB
recv:受信用コールバック関数
recv_arg:コールバック時に一緒に渡すパラメータ

フクさん
フクさん

コールバック関数の方は以下になる。

typedef void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p,
    const ip_addr_t *addr, u16_t port);
太郎くん
太郎くん

コールバック関数の引数は?

フクさん
フクさん

こんなん。

arg:udp_recvで渡したrecv_arg
pcb:UDP SocketのPCB
p:受信したパケットのバッファ
addr:受信したパケットの送信元IPアドレス
port:受信したパケットの送信元ポート番号

太郎くん
太郎くん

おー。
これだけ情報あれば、いろいろ出来そう!

フクさん
フクさん

そうね。
送信元の情報も取得できるんで、
そのまま送信元にレスポンスするとかに使える。

太郎くん
太郎くん

今回の場合は、
ここにIPフラグメントで分断されたデータが
結合されて渡される感じか。

フクさん
フクさん

そうだね。

太郎くん
太郎くん

うん。イメージは湧いたから大丈夫そうだ。

まとめ

フクさん
フクさん

まとめだよ。

  • lwIPのUDP受信の説明。
    • 受信用APIは存在せず、受信コールバック設定用APIが存在する。
    • 受信コールバックでデータを取得可能。
      • 送信元IPアドレス、ポート番号もコールバック時に取得できる。

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

コメント

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