バックナンバーはこちら。
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:キャプチャ処理

まずはリンクタイプってのが何者かってところかなー?

どういう種類があるとかわからない?
リンクタイプの種類

Include\pcap\bpf.h
で、以下の種類が定義されてるみたい。
#define DLT_NULL 0 /* BSD loopback encapsulation */
#define DLT_EN10MB 1 /* Ethernet (10Mb) */
#define DLT_EN3MB 2 /* Experimental Ethernet (3Mb) */
#define DLT_AX25 3 /* Amateur Radio AX.25 */
#define DLT_PRONET 4 /* Proteon ProNET Token Ring */
#define DLT_CHAOS 5 /* Chaos */
#define DLT_IEEE802 6 /* 802.5 Token Ring */
#define DLT_ARCNET 7 /* ARCNET, with BSD-style header */
#define DLT_SLIP 8 /* Serial Line IP */
#define DLT_PPP 9 /* Point-to-point Protocol */
#define DLT_FDDI 10 /* FDDI */

となると、今回としてはEthernetだけで良いはずだから、
DLT_EN10MBが取得できれば良いってことだな。

そうだね。
サンプルプログラムのudpdumpもDLT_EN10MB以外が返ってきたら
エラーって扱いにしてるね。
というわけで、そのまま利用。
pcap_datalink API仕様

API仕様も調べておいた。
関数型はこれ
int pcap_datalink(pcap_t *);

おそろしくシンプルだね。

pcap_open_liveで取得したディスクリプタを渡せば、
リンクタイプが即取得できる。
って感じ。

ちなみにpcap_open_liveの話はここでやったよ。
pcap_datalink 呼び出し例

シンプルなAPIだから悩むことはないけど、
こんな使い方になるね。
if(pcap_datalink(adhandle) != DLT_EN10MB)
{
fprintf(stderr,"\nThis program works only on Ethernet networks.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
return -1;
}

エラー時はデバイスを解放するんだね。

まぁ期待したリンクタイプじゃないから、
プログラムとしては終了するしかないかなー。

私もそれで良いと思うよ。
まとめ

まとめだよ。
- pcap_datalinkはリンクタイプ取得API。
- リンクタイプはbpf.hで定義されている。
- 引数はpcap_open_liveで取得したディスクリプタを渡すのみ。
- Ethernetの場合は”DLT_EN10MB”が戻り値となる。
バックナンバーはこちら。
コメント