バックナンバーはこちら。
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。
- 文字列で式を指定し、計測前にバイナリ変換する方式は割と一般的。
- センサ電圧を物理値(圧力とか流量とか)にリアルタイムで変換する場合など。
バックナンバーはこちら。
コメント