From e5d2ccaa0fb58f98f9dea84b0db6983aae1a7e27 Mon Sep 17 00:00:00 2001 From: "Srivats P." Date: Thu, 20 Oct 2011 07:13:33 +0530 Subject: [PATCH] Fixed windows problem where tx packets are looped back as rx packets also. Also fixed an issue with transmit at slow rate (< 0.5pps) Fixes issue 46 --- server/abstractport.h | 2 +- server/pcapport.cpp | 25 +++++++++++++++++++++++-- server/pcapport.h | 6 +++--- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/server/abstractport.h b/server/abstractport.h index 7feba7d..f531e26 100644 --- a/server/abstractport.h +++ b/server/abstractport.h @@ -76,7 +76,7 @@ public: virtual bool appendToPacketList(long sec, long nsec, const uchar *packet, int length) = 0; virtual void setPacketListLoopMode(bool loop, - long secDelay, long nsecDelay) = 0; + quint64 secDelay, quint64 nsecDelay) = 0; void updatePacketList(); virtual void startTransmit() = 0; diff --git a/server/pcapport.cpp b/server/pcapport.cpp index d959f72..465b44c 100644 --- a/server/pcapport.cpp +++ b/server/pcapport.cpp @@ -160,23 +160,44 @@ PcapPort::PortMonitor::PortMonitor(const char *device, Direction direction, { int ret; char errbuf[PCAP_ERRBUF_SIZE] = ""; + bool noLocalCapture; direction_ = direction; isDirectional_ = true; isPromisc_ = true; + noLocalCapture = true; stats_ = stats; + _retry: +#ifdef Q_OS_WIN32 + int flags = 0; + + if (isPromisc_) + flags |= PCAP_OPENFLAG_PROMISCUOUS; + if (noLocalCapture) + flags |= PCAP_OPENFLAG_NOCAPTURE_LOCAL; + + handle_ = pcap_open(device, 64 /* FIXME */, flags, + 1000 /* ms */, NULL, errbuf); +#else handle_ = pcap_open_live(device, 64 /* FIXME */, int(isPromisc_), - 1000 /* ms */, errbuf); + 1000 /* ms */, errbuf); +#endif if (handle_ == NULL) { if (isPromisc_ && QString(errbuf).contains("promiscuous")) { - qDebug("%s:can't set promiscuous mode, trying non-promisc", device); + qDebug("Can't set promiscuous mode, trying non-promisc %s", device); isPromisc_ = false; goto _retry; } + else if (noLocalCapture && QString(errbuf).contains("loopback")) + { + qDebug("Can't set no local capture mode %s", device); + noLocalCapture = false; + goto _retry; + } else goto _open_error; } diff --git a/server/pcapport.h b/server/pcapport.h index ee2e7f2..814528d 100644 --- a/server/pcapport.h +++ b/server/pcapport.h @@ -51,7 +51,7 @@ public: int length) { return transmitter_->appendToPacketList(sec, nsec, packet, length); } - virtual void setPacketListLoopMode(bool loop, long secDelay, long nsecDelay) + virtual void setPacketListLoopMode(bool loop, quint64 secDelay, quint64 nsecDelay) { transmitter_->setPacketListLoopMode(loop, secDelay, nsecDelay); } @@ -105,7 +105,7 @@ protected: long repeatDelaySec, long repeatDelayNsec); bool appendToPacketList(long sec, long usec, const uchar *packet, int length); - void setPacketListLoopMode(bool loop, long secDelay, long nsecDelay) { + void setPacketListLoopMode(bool loop, quint64 secDelay, quint64 nsecDelay) { returnToQIdx_ = loop ? 0 : -1; loopDelay_ = secDelay*long(1e6) + nsecDelay/1000; } @@ -174,7 +174,7 @@ protected: quint64 packetCount_; int returnToQIdx_; - long loopDelay_; + quint64 loopDelay_; bool usingInternalStats_; AbstractPort::PortStats *stats_;