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

【Ethernet】車載ネットワーク その62【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:キャプチャ処理
太郎くん
太郎くん

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

フクさん
フクさん

どういう種類があるとかわからない?

リンクタイプの種類

太郎くん
太郎くん

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”が戻り値となる。

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

コメント

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