face: put the pcap handle in non-blocking mode
This prevents NFD from getting stuck in pcap_next_ex()
when the network interface goes down
Change-Id: I5760fcc7c950b46aecb7619bd889508ee24133aa
diff --git a/daemon/face/ethernet-transport.cpp b/daemon/face/ethernet-transport.cpp
index c122a80..a1c23f2 100644
--- a/daemon/face/ethernet-transport.cpp
+++ b/daemon/face/ethernet-transport.cpp
@@ -167,7 +167,7 @@
auto [pkt, readErr] = m_pcap.readNextPacket();
if (pkt.empty()) {
- NFD_LOG_FACE_WARN("Read error: " << readErr);
+ NFD_LOG_FACE_DEBUG("Read error: " << readErr);
}
else {
auto [eh, frameErr] = ethernet::checkFrameHeader(pkt, m_srcAddress,
diff --git a/daemon/face/pcap-helper.cpp b/daemon/face/pcap-helper.cpp
index 637faaf..230e5af 100644
--- a/daemon/face/pcap-helper.cpp
+++ b/daemon/face/pcap-helper.cpp
@@ -69,6 +69,10 @@
NDN_THROW(Error("pcap_activate: " + std::string(pcap_statustostr(ret))));
});
+ char errbuf[PCAP_ERRBUF_SIZE] = {};
+ if (pcap_setnonblock(m_pcap, 1, errbuf) < 0)
+ NDN_THROW(Error("pcap_setnonblock: " + std::string(errbuf)));
+
if (pcap_set_datalink(m_pcap, dlt) < 0)
NDN_THROW(Error("pcap_set_datalink: " + getLastError()));
@@ -136,7 +140,7 @@
if (ret < 0)
return {span<uint8_t>{}, getLastError()};
else if (ret == 0)
- return {span<uint8_t>{}, "timed out"};
+ return {span<uint8_t>{}, "Nothing to read"};
else
return {{packet, header->caplen}, ""};
}