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

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

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

はじめに

npcapのパケットフィルタ有効化APIについて

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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

npcapのパケットフィルタ有効化API

太郎くん
太郎くん

今回はnpcapのパケットフィルタ有効化APIについて。

  • pcap_datalink:デバイスのリンクタイプ取得
  • pcap_compile:フィルタ文字列をコンパイルしてbpf_program構造体を取得
  • pcap_setfilter:bpf_program構造体を元にパケットフィルタ有効化 ← これ
  • pcap_loop:キャプチャ処理
フクさん
フクさん

これは、前回のpcap_compileで取得したbpf_program構造体をそのまま渡す感じかな?

太郎くん
太郎くん

うん。
そうだね。
フィルタ文字列のままだとフィルタ効率が悪いから、
pcap_compileでバイナリ的な構造であるbpf_program構造体に変換
そのbpf_program構造体をpcap_setfilterに渡せば、
指定したフィルタを実施してくれるって感じ。

pcap_setfilter API仕様

太郎くん
太郎くん

API仕様としてはこれ。

int	pcap_setfilter(pcap_t *p, struct bpf_program *fp);
太郎くん
太郎くん

引数はこれ。

p:pcapディスクリプタ
fp:pcap_compileで得られたbpf_program構造体

pcap_setfilter 使用方法例

フクさん
フクさん

使用方法としてはどうなる?

太郎くん
太郎くん

pcap_compileとセットで使うことになるね。
こんな感じになるはずだよ。

	//compile the filter
	if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 )
	{
		fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
		/* Free the device list */
		pcap_freealldevs(alldevs);
		return -1;
	}
	
	//set the filter
	if (pcap_setfilter(adhandle, &fcode)<0)
	{
		fprintf(stderr,"\nError setting the filter.\n");
		/* Free the device list */
		pcap_freealldevs(alldevs);
		return -1;
	}
フクさん
フクさん

fcodeがbpf_program構造体で、
packet_filterがフィルタ文字列だね。

余談

太郎くん
太郎くん

というわけで、今回はあっさり終了。

フクさん
フクさん

まぁここに関してはpcap_compile側に仕様の難しさが寄ってたからねー。

太郎くん
太郎くん

でも、
文字列でフィルタ設定というユーザフレンドリさと、
その文字列をコンパイルして処理効率化
2つを実現してるってすごいね。

フクさん
フクさん

まぁ割とある実装かな?

太郎くん
太郎くん

そうなの?

フクさん
フクさん

フィルタ以外にも計測データのリアルタイム演算なんかも同じようなアプローチをとることがあるね。

太郎くん
太郎くん

例えば?

フクさん
フクさん

例えば、
圧力センサ値を電圧で取得したとして、
欲しい情報は電圧ではなく圧力
電圧から圧力に変換するには、とある変換式を通す必要がある。
しかし、その変換式は一意なものではないので、ユーザに記載してもらう必要がある。
ユーザ記載は文字列
しかし、文字列のままだとリアルタイム演算時に負荷となる。
よって、事前にバイナリ化して高速に演算できるようにしておく。
とか。

太郎くん
太郎くん

ほー。
今回の話に似てるねー。
割と良くある話なんだねー。

フクさん
フクさん

こういうのを覚えておくと、
速度性能向上を設計に組み込めるんで、割と便利だね。

まとめ

フクさん
フクさん

まとめだよ。

  • npcapのパケットフィルタ有効化APIについて説明。
  • pcap_compileとpcap_setfilterはセットで使うAPI。
  • 文字列で式を指定し、計測前にバイナリ変換する方式は割と一般的。
    • センサ電圧を物理値(圧力とか流量とか)にリアルタイムで変換する場合など。

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

コメント

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