Я пытаюсь написать простой анализатор пакетов, который будет работать только с определенными типами трафика c. Я пишу код на C ++ и использую libpcap на коробке Centos 7. Он работает довольно хорошо, но надеялся улучшить производительность, используя опции фильтрации библиотеки pcap, так что для обработки представлены только интересующие меня типы пакетов.
Пример моего кода:
struct bpf_program filter;
if (pcap_compile(pcap, &filter,
"(ip && (tcp || udp)) || (vlan && (ip && (tcp || udp)))",
1 /*OPTIMIZE*/, PCAP_NETMASK_UNKNOWN) == PCAP_ERROR) {
std::cout << "Failed to compile filter: " << pcap_geterr(pcap);
} else {
// Load filter into packet capture device
if (pcap_setfilter(pcap, &filter) == PCAP_ERROR) {
std::cout << "Failed to set filter: " << pcap_geterr(pcap);
}
}
По сути, я хочу, чтобы IP-пакеты содержали TCP или UDP, а также принимали пакеты с тегами VLAN того же типа. Я считаю, что синтаксис фильтра правильный, но теперь нужно поддерживать двойные пакеты VLAN (802.1ad) и не знаю, как мне переписать строку фильтра. У меня нет пакетов с двойным vlan для тестирования, поэтому я не могу просто поэкспериментировать, пока я не получу это правильно. Кто-нибудь есть какие-либо предложения о том, как строка фильтра должна выглядеть для принятия двойных пакетов VLAN (а также один VLAN и без VLAN)?
Я также заметил, что когда я запускаю вживую, функция pcap_compile
не работает с ошибкой no VLAN support for data link type 113
. Странно, когда я помещаю тот же код фильтра в wireshark, он не жалуется. Любая идея, что проблема здесь?
Обновление 1:
Мне удалось найти несколько двойных пакетов VLAN онлайн для тестирования. Используя wireshark, фильтр ieee8021ad работает нормально, но выдает синтаксическую ошибку при использовании в качестве аргумента с pcap_compile