【Ethernet】車載ネットワーク その49【npcap④】

【Ethernet】車載ネットワーク その49【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

ネットワークデバイスのリストの構築のAPI

フクさん
フクさん

じゃーまずはネットワークデバイスのリストの構築について。

  • pcap_findalldevs:ネットワークデバイスのリストの構築。 ← これ
  • pcap_open_live:ネットワーク上のパケットを見るためにパケットキャプチャハンドルを取得。
  • pcap_next_ex:次のパケットを読み込んで、成功/失敗の指示を返す。
太郎くん
太郎くん

これは説明通りな気はしているけど、
リストの構築
ってのが曲者感があるなー。

フクさん
フクさん

そーだねー。
そこが今回の説明の支配的になるところかなー。

pcap_findalldevs API仕様

フクさん
フクさん

まずAPIは以下。

int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
フクさん
フクさん

戻り値、引数の仕様は以下

戻り値:成功すれば、0が返る。エラーが発生した場合は、-1が返り、errbufにその理由が格納。
alldevsp:監視可能なディバイスのリストの最初の要素へのポインタ。
errbuf:エラーが発生したときにその理由が入る文字配列。

pcap_if_tとは

太郎くん
太郎くん

うーん、pcap_if_tという型が何ものかってところだねー。

フクさん
フクさん

構造体としてはpcap.hで以下の定義になってる。

struct pcap_if {
	struct pcap_if *next;
	char *name;		/* name to hand to "pcap_open_live()" */
	char *description;	/* textual description of interface, or NULL */
	struct pcap_addr *addresses;
	bpf_u_int32 flags;	/* PCAP_IF_ interface flags */
};
太郎くん
太郎くん

struct pcap_ifの中にまたstruct pcap_ifへのポインタがあるね。

フクさん
フクさん

うん。
自己参照構造体って呼ばれる実装方式だね。

太郎くん
太郎くん

もしかして、これって連結リストってやるじゃない?

フクさん
フクさん

おー!
よく気が付いたね。

太郎くん
太郎くん

たしかlwIPの時に出てきたヤツだ。
ここでやったね。

pcap_if_tの使い方

フクさん
フクさん

とりあえず連結リストだとわかったところで、
実際のアクセスの仕方はこうなる。

if(pcap_findalldevs(&alldevs, errbuf) == -1)
{
	fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);
	exit(1);
}

/* Print the list */
for(d=alldevs; d; d=d->next)
{
	printf("%d. %s\n    ", ++i, d->name);

	if (d->description)
		printf(" (%s)\n", d->description);
	else
		printf(" (No description available)\n");
}
太郎くん
太郎くん

おー。
for文で回せるんだ。

フクさん
フクさん

そうそう。
これが連結リストの応用性の高さだね。
dというローカル変数に先頭ポインタを渡して、
d->nextが次の要素への参照。
リスト終端がNULLなんで、
NULLに到達すると同時にfor文を抜ける感じ。

太郎くん
太郎くん

うん。
連結リストであることと、
実際の参照の仕方はわかったと思う。

まとめ

フクさん
フクさん

まとめだよ。

  • npcapのネットワークデバイスのリストの構築のAPIの説明。
  • pcap_findalldevsを使用する。
  • リストは連結リストでfor文で回して走査できる。

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

コメント

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