バックナンバーはこちら。
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に入ろうかな。
まとめ
まとめだよ。
- 連結リスト復習。
- 送信データを連結リストからリニアバッファに変換するコード作成。
- エラーコードも調べて適切なエラーハンドリング実施。
バックナンバーはこちら。
コメント