【Ethernet】車載ネットワーク その59【lwIP+npcap⑤】

【Ethernet】車載ネットワーク その59【lwIP+npcap⑤】 車載ネットワーク

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

はじめに

ネットワークシミュレーションに向けてlwIPの送信インターフェース実装の話。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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の送信インターフェースの実装を考えるんだよね?

太郎くん
太郎くん

うん。
まずはここ連結リストを復習しておこう。

送信データの構造変換

フクさん
フクさん

とりあえず、
npcapの送信バッファ自体はグローバル変数で持っても良いんじゃないかな?

太郎くん
太郎くん

そうだね。
メモリ制約がほぼ無いWindows上の環境だし。

フクさん
フクさん

そうすると、
連結リストからリニアなバッファへのコピーが簡単なアプローチになると思う。

太郎くん
太郎くん

うん。
それが一番シンプルそうだよね。
とりあえず、その発想で実装してみた。

BYTE pktbuf[2000];

static err_t lwip_tx_func(struct netif *netif, struct pbuf *p)
{
	BYTE *pbuf;
	int i;
	int cnt = 0;
	err_t err = ERR_OK;

	LWIP_UNUSED_ARG(netif);

	while( p != NULL ) {
		pbuf = (BYTE*)p->payload;
		if( (p->len+cnt) > sizeof(pktbuf) ){
			err = ERR_BUF;
			break;
		}
		for( i =0 ; i < p->len; i++ ){
			pktbuf[cnt++] = pbuf[i];
		}
		p = p->next;
	}
	
	/* ここでnpcapの送信巻子にリニア送信バッファを渡す */
	
	return err;
}
フクさん
フクさん

うん。
連結リスト終端までコピーしてから、送信バッファに渡す方式になってるね。

エラーハンドリング

フクさん
フクさん

あと、
正常の場合はERR_OK
バッファサイズを超える場合はERR_BUFを返すようになってるね?
この戻り値はどこで特定したの?

太郎くん
太郎くん

ここで各エラー番号が定義されているんで、
そこから適切そうなやつを選んだ感じ。

include\lwip\err.h

フクさん
フクさん

なるほど。
定義されているエラーも把握しておくのは重要だね。

太郎くん
太郎くん

lwIPのインターフェースは押さえたから、
次からはnpcapに入ろうかな。

まとめ

太郎くん
太郎くん

まとめだよ。

  • 連結リスト復習。
  • 送信データを連結リストからリニアバッファに変換するコード作成。
    • エラーコードも調べて適切なエラーハンドリング実施。

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

コメント

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