PCAP: Switch to pcap_dispatch()

pull/32/head
Kyle Schwarz 2020-10-23 13:43:19 -04:00 committed by Paul Hollinsky
parent 7c1d44bc4f
commit 33a84bf8ce
1 changed files with 16 additions and 22 deletions

View File

@ -215,7 +215,7 @@ bool PCAP::open() {
return false; return false;
} }
pcap_setnonblock(interface.fp, 1, errbuf); pcap_setnonblock(interface.fp, 0, errbuf);
// Create threads // Create threads
readThread = std::thread(&PCAP::readTask, this); readThread = std::thread(&PCAP::readTask, this);
@ -233,6 +233,7 @@ bool PCAP::close() {
return false; return false;
closing = true; // Signal the threads that we are closing closing = true; // Signal the threads that we are closing
pcap_breakloop(interface.fp);
readThread.join(); readThread.join();
writeThread.join(); writeThread.join();
closing = false; closing = false;
@ -249,32 +250,25 @@ bool PCAP::close() {
} }
void PCAP::readTask() { void PCAP::readTask() {
struct pcap_pkthdr* header;
const uint8_t* data;
EventManager::GetInstance().downgradeErrorsOnCurrentThread(); EventManager::GetInstance().downgradeErrorsOnCurrentThread();
while(!closing) { while (!closing) {
auto readBytes = pcap_next_ex(interface.fp, &header, &data); pcap_dispatch(interface.fp, -1, [](uint8_t* obj, const struct pcap_pkthdr* header, const uint8_t* data) {
if(readBytes < 0) { PCAP* driver = (PCAP*)obj;
report(APIEvent::Type::FailedToRead, APIEvent::Severity::Error); EthernetPacket packet(data, header->caplen);
break;
}
if(readBytes == 0)
continue; // Keep waiting for that packet
EthernetPacket packet(data, header->caplen); if(packet.etherType != 0xCAB2)
return; // Not a packet to host
if(packet.etherType != 0xCAB2) if(memcmp(packet.destMAC, driver->interface.macAddress, sizeof(packet.destMAC)) != 0 &&
continue; // Not a packet to host memcmp(packet.destMAC, BROADCAST_MAC, sizeof(packet.destMAC)) != 0 &&
memcmp(packet.destMAC, ICS_UNSET_MAC, sizeof(packet.destMAC)) != 0)
return; // Packet is not addressed to us or broadcast
if(memcmp(packet.destMAC, interface.macAddress, sizeof(packet.destMAC)) != 0 && if(memcmp(packet.srcMAC, driver->deviceMAC, sizeof(driver->deviceMAC)) != 0)
memcmp(packet.destMAC, BROADCAST_MAC, sizeof(packet.destMAC)) != 0 && return; // Not a packet from the device we're concerned with
memcmp(packet.destMAC, ICS_UNSET_MAC, sizeof(packet.destMAC)) != 0)
continue; // Packet is not addressed to us or broadcast
if(memcmp(packet.srcMAC, deviceMAC, sizeof(deviceMAC)) != 0) driver->readQueue.enqueue_bulk(packet.payload.data(), packet.payload.size());
continue; // Not a packet from the device we're concerned with }, (uint8_t*)this);
readQueue.enqueue_bulk(packet.payload.data(), packet.payload.size());
} }
} }