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

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

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

はじめに

ネットワークシミュレーションに向けてnpcap初期化処理の話。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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初期化コードの元ネタ

太郎くん
太郎くん

npcapの初期化コードは以前動作させたpktdump_exをベースにしようかな。

フクさん
フクさん

そうだね。
動作実績のあるコードを使用した方がいいだろう。

太郎くん
太郎くん

確か、ここでやったやつだね。

npcap初期化コードに必要なAPI

太郎くん
太郎くん

抜き出すにしても全部である必要はないから・・・。

太郎くん
太郎くん

pcap_findalldevs

pcap_open_live
を起点に抜き出せばいいかな。

フクさん
フクさん

そうだね。
そのあとの、
pcap_next_ex
はパケット受信になるから初期化処理では不要だろう。

npcap初期化コード

太郎くん
太郎くん

で、実際の初期化コードはこんな感じで良いと思う。

int pcap_init()
{

#ifdef _WIN32
	/* Load Npcap and its functions. */
	if (!LoadNpcapDlls())
	{
		fprintf(stderr, "Couldn't load Npcap\n");
		exit(1);
	}
#endif

	/* Retrieve the device list */
	if(pcap_findalldevs(&alldevs, errbuf) == -1)
	{
		fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
		exit(1);
	}
	
	/* Print the list */
	for(d=alldevs; d; d=d->next)
	{
		printf("%d. %s", ++i, d->name);
		if (d->description)
			printf(" (%s)\n", d->description);
		else
			printf(" (No description available)\n");
	}

	if(i==0)
	{
		printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
		return -1;
	}
	
	printf("Enter the interface number (1-%d):",i);
	scanf("%d", &inum);
	
	/* Check if the user specified a valid adapter */
	if(inum < 1 || inum > i)
	{
		printf("\nAdapter number out of range.\n");
		
		/* Free the device list */
		pcap_freealldevs(alldevs);
		return -1;
	}

	/* Jump to the selected adapter */
	for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
	
	/* Open the adapter */
	if ((pcap_fp = adhandle= pcap_open_live(d->name,	// name of the device
							 65536,			// portion of the packet to capture. 
											// 65536 grants that the whole packet will be captured on all the MACs.
							 1,				// promiscuous mode (nonzero means promiscuous)
							 100,			// read timeout
							 errbuf			// error buffer
							 )) == NULL)
	{
		fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n");
		/* Free the device list */
		pcap_freealldevs(alldevs);
		return -1;
	}
}

npcap初期化コード説明

太郎くん
太郎くん

まぁ特に説明はいらないかな。

フクさん
フクさん

そうだね。
使用しているAPIも以前説明したものだし。

太郎くん
太郎くん

ここで説明してたね。

pcap_findalldevs

pcap_open_live

太郎くん
太郎くん

次はnpcapの受信部分のコードを実装しないとねー。

まとめ

太郎くん
太郎くん

まとめだよ。

  • npcap初期化コードに必要なAPI説明。
    • pcap_findalldevs。
    • pcap_open_live。
    • ※ 両方とも以前説明済み。
  • npcap初期化コードを作成。
    • サンプルコードのpcap_next_exをベースに抜き出してきた。

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

コメント

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