Use base class link state in case of Win intf stats

After this change adapter_ and linkStateOid_ members are no longer
required in case of Windows Interface stats, so don't initialize them.

Also remove all references to them in ifstats mode - the change in
has/setExclusiveControl also fixes the non-working bindconfig - the
problem was the portname being derived in those functions was not
correct causing bindconfig to fail - bindconfig itself probably never
had a problem.
This commit is contained in:
Srivats P 2023-09-28 15:49:32 +05:30
parent e5375247a9
commit f27003b8f5
3 changed files with 21 additions and 12 deletions

View File

@ -109,7 +109,8 @@ void PcapPort::updateNotes()
{ {
QString notes; QString notes;
if ((!monitorRx_->isPromiscuous()) || (!monitorTx_->isPromiscuous())) if ((monitorRx_ && monitorTx_)
&& (!monitorRx_->isPromiscuous() || !monitorTx_->isPromiscuous()))
notes.append("<li>Non Promiscuous Mode</li>"); notes.append("<li>Non Promiscuous Mode</li>");
if (!monitorRx_->isDirectional() && !hasExclusiveControl()) if (!monitorRx_->isDirectional() && !hasExclusiveControl())

View File

@ -76,13 +76,15 @@ WinPcapPort::WinPcapPort(int id, const char *device, const char *description)
data_.set_description(description); data_.set_description(description);
// XXX: luid_ is already populated by populateInterfaceInfo() call above // XXX: luid_ is already populated by populateInterfaceInfo() call above
adapter_ = PacketOpenAdapter((CHAR*)device); if (internalPortStats_) {
if (!adapter_) adapter_ = PacketOpenAdapter((CHAR*)device);
qFatal("Unable to open adapter %s", device); if (!adapter_)
linkStateOid_ = (PPACKET_OID_DATA) malloc(sizeof(PACKET_OID_DATA) + qFatal("Unable to open adapter %s", device);
sizeof(NDIS_LINK_STATE)); linkStateOid_ = (PPACKET_OID_DATA) malloc(sizeof(PACKET_OID_DATA) +
if (!linkStateOid_) sizeof(NDIS_LINK_STATE));
qFatal("failed to alloc oidData"); if (!linkStateOid_)
qFatal("failed to alloc oidData");
}
data_.set_is_exclusive_control(hasExclusiveControl()); data_.set_is_exclusive_control(hasExclusiveControl());
minPacketSetSize_ = 256; minPacketSetSize_ = 256;
@ -125,6 +127,12 @@ void WinPcapPort::init()
OstProto::LinkState WinPcapPort::linkState() OstProto::LinkState WinPcapPort::linkState()
{ {
if (!internalPortStats_)
return AbstractPort::linkState();
assert(adapter_);
assert(linkStateOid_);
memset(linkStateOid_, 0, sizeof(PACKET_OID_DATA) + sizeof(NDIS_LINK_STATE)); memset(linkStateOid_, 0, sizeof(PACKET_OID_DATA) + sizeof(NDIS_LINK_STATE));
linkStateOid_->Oid = OID_GEN_LINK_STATE; linkStateOid_->Oid = OID_GEN_LINK_STATE;
@ -162,7 +170,7 @@ OstProto::LinkState WinPcapPort::linkState()
bool WinPcapPort::hasExclusiveControl() bool WinPcapPort::hasExclusiveControl()
{ {
QString portName(adapter_->Name + strlen("\\Device\\NPF_")); QString portName(name() + strlen("\\Device\\NPF_"));
QString bindConfigFilePath(QCoreApplication::applicationDirPath() QString bindConfigFilePath(QCoreApplication::applicationDirPath()
+ "/bindconfig.exe"); + "/bindconfig.exe");
int exitCode; int exitCode;
@ -185,7 +193,7 @@ bool WinPcapPort::hasExclusiveControl()
bool WinPcapPort::setExclusiveControl(bool exclusive) bool WinPcapPort::setExclusiveControl(bool exclusive)
{ {
QString portName(adapter_->Name + strlen("\\Device\\NPF_")); QString portName(name() + strlen("\\Device\\NPF_"));
QString bindConfigFilePath(QCoreApplication::applicationDirPath() QString bindConfigFilePath(QCoreApplication::applicationDirPath()
+ "/bindconfig.exe"); + "/bindconfig.exe");
QString status; QString status;

View File

@ -88,9 +88,9 @@ private:
bool setPromisc(); bool setPromisc();
bool clearPromisc(); bool clearPromisc();
LPADAPTER adapter_; LPADAPTER adapter_{nullptr};
NET_LUID luid_; NET_LUID luid_;
PPACKET_OID_DATA linkStateOid_ ; PPACKET_OID_DATA linkStateOid_{nullptr};
static PIP_ADAPTER_ADDRESSES adapterList_; static PIP_ADAPTER_ADDRESSES adapterList_;
}; };