У меня проблема, когда pcap_datalink()
всегда возвращается 1
. Насколько я понимаю, это LINKTYPE_ETHERNET
. Но устройство, которое я использую, - это беспроводная карта, а в моем случае - en0
.Почему pcap_datalink() всегда возвращает 1 (Ethernet), даже на беспроводном устройстве?
Это останавливает меня от установки карты в режим монитора и прекращения работы моих фильтров WLAN. Я попытался запустить это как на OSX, так и на Linux с теми же результатами. Я также выполняю роль root.
Вот часть моего кода, вызывающего проблему. В качестве примера предположим, что для dev
установлено значение en0
(беспроводное устройство на Mac).
#include <stdio.h>
#include <pcap.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
pcap_t *pcap_h;
char *dev, errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program fp;
struct pcap_pkthdr header;
const u_char *packet;
if(argc < 2)
{
printf("Usage: %s device\n", argv[0]);
exit(EXIT_FAILURE);
}
dev = argv[1];
if((pcap_h = pcap_create(dev, errbuf)) == NULL)
{
printf("pcap_create() failed: %s\n", errbuf);
exit(EXIT_FAILURE);
}
if(pcap_can_set_rfmon(pcap_h) == 0)
{
printf("Monitor mode can not be set.\n");
}
if(pcap_set_rfmon(pcap_h, 1) != 0)
{
printf("Failed to set monitor mode.\n");
exit(EXIT_FAILURE);
}
if(pcap_activate(pcap_h) != 0)
{
printf("pcap_activate() failed\n");
exit(EXIT_FAILURE);
}
/*
* Compile a filter to sniff 802.11 probe requests
* Filter: type mgt subtype probe-req
*/
if(pcap_compile(pcap_h, &fp, "type mgt subtype probe-req", 0, PCAP_NETMASK_UNKNOWN) == -1)
{
printf("pcap_compile() failed: %s\n", pcap_geterr(pcap_h));
exit(EXIT_FAILURE);
}
/*
* Set the compiled filter
*/
if(pcap_setfilter(pcap_h, &fp) == -1)
{
printf("pcap_setfilter() failed: %s\n", pcap_geterr(pcap_h));
exit(EXIT_FAILURE);
}
pcap_freecode(&fp);
packet = pcap_next(pcap_h, &header);
printf("Header: %d\n", header.len);
pcap_close(pcap_h);
return 0;
}
Любая идея почему pcap_datalink()
всегда возвращается 1
?
Редактировать
Обновленный код, и добавил pcap_set_rfmon()
перед вызовом pcap_activate()
. Я получаю сообщение об ошибке:
pcap_compile() failed: 802.11 link-layer types supported only on 802.11
Какую ошибку вы получаете и где? –
Я не получаю сообщение об ошибке, любые ошибки, которые я получаю, такие как режим монитора и фильтры, связаны с тем, что у моего беспроводного устройства есть слой связи Ethernet (который является заголовком этого вопроса) ... где не поддерживается режим мониторинга , –
'en0' должно быть именем интерфейса Ethernet, а не беспроводным интерфейсом. В этом случае, если вы запросите PCAP для его типа ссылки, то 'LINKTYPE_ETHERNET' (== 1) является совершенно разумным результатом. В наши дни почти каждая машина имеет интерфейс Ethernet, включая те, которые также имеют беспроводные интерфейсы. Вы уверены, что ищете интерфейс, на который собираетесь смотреть? –