mirror of
https://github.com/ZeroTier/ZeroTierOne
synced 2025-08-22 22:33:58 -07:00
Fixed bug with aqm queues, check nullref queueAtFrontOfList before use, delete NSM connection before return
This commit is contained in:
parent
a59f82093a
commit
eea440cb0c
4 changed files with 55 additions and 48 deletions
|
@ -626,11 +626,11 @@ void Switch::aqm_enqueue(void *tPtr, const SharedPtr<Network> &network, Packet &
|
|||
if (nqcb->oldQueues[i]->id == qosBucket) {
|
||||
selectedQueue = nqcb->oldQueues[i];
|
||||
}
|
||||
} if (i < nqcb->newQueues.size()) { // search new queues (this would imply not often-used queues)
|
||||
} else if (i < nqcb->newQueues.size()) { // search new queues (this would imply not often-used queues)
|
||||
if (nqcb->newQueues[i]->id == qosBucket) {
|
||||
selectedQueue = nqcb->newQueues[i];
|
||||
}
|
||||
} if (i < nqcb->inactiveQueues.size()) { // search inactive queues
|
||||
} else if (i < nqcb->inactiveQueues.size()) { // search inactive queues
|
||||
if (nqcb->inactiveQueues[i]->id == qosBucket) {
|
||||
selectedQueue = nqcb->inactiveQueues[i];
|
||||
// move queue to end of NEW queue list
|
||||
|
@ -663,12 +663,12 @@ void Switch::aqm_enqueue(void *tPtr, const SharedPtr<Network> &network, Packet &
|
|||
maxQueueLength = nqcb->oldQueues[i]->byteLength;
|
||||
selectedQueueToDropFrom = nqcb->oldQueues[i];
|
||||
}
|
||||
} if (i < nqcb->newQueues.size()) {
|
||||
} else if (i < nqcb->newQueues.size()) {
|
||||
if (nqcb->newQueues[i]->byteLength > maxQueueLength) {
|
||||
maxQueueLength = nqcb->newQueues[i]->byteLength;
|
||||
selectedQueueToDropFrom = nqcb->newQueues[i];
|
||||
}
|
||||
} if (i < nqcb->inactiveQueues.size()) {
|
||||
} else if (i < nqcb->inactiveQueues.size()) {
|
||||
if (nqcb->inactiveQueues[i]->byteLength > maxQueueLength) {
|
||||
maxQueueLength = nqcb->inactiveQueues[i]->byteLength;
|
||||
selectedQueueToDropFrom = nqcb->inactiveQueues[i];
|
||||
|
@ -770,13 +770,15 @@ void Switch::aqm_dequeue(void *tPtr)
|
|||
bool examiningNewQueues = true;
|
||||
while (currQueues->size()) {
|
||||
ManagedQueue *queueAtFrontOfList = currQueues->front();
|
||||
if (queueAtFrontOfList) {
|
||||
if (queueAtFrontOfList->byteCredit < 0) {
|
||||
queueAtFrontOfList->byteCredit += ZT_AQM_QUANTUM;
|
||||
// Move to list of OLD queues
|
||||
// DEBUG_INFO("moving q=%p from NEW to OLD list", queueAtFrontOfList);
|
||||
oldQueues->push_back(queueAtFrontOfList);
|
||||
currQueues->erase(currQueues->begin());
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
entryToEmit = CoDelDequeue(queueAtFrontOfList, examiningNewQueues, now);
|
||||
if (! entryToEmit) {
|
||||
// Move to end of list of OLD queues
|
||||
|
@ -793,23 +795,25 @@ void Switch::aqm_dequeue(void *tPtr)
|
|||
send(tPtr, entryToEmit->packet, entryToEmit->encrypt, entryToEmit->flowId);
|
||||
(*nqcb).second->_currEnqueuedPackets--;
|
||||
}
|
||||
if (queueAtFrontOfList) {
|
||||
|
||||
// DEBUG_INFO("dequeuing from q=%p, len=%lu in NEW list (byteCredit=%d)", queueAtFrontOfList, queueAtFrontOfList->q.size(), queueAtFrontOfList->byteCredit);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Attempt dequeue from queues in OLD list
|
||||
examiningNewQueues = false;
|
||||
currQueues = &((*nqcb).second->oldQueues);
|
||||
while (currQueues->size()) {
|
||||
ManagedQueue *queueAtFrontOfList = currQueues->front();
|
||||
if (queueAtFrontOfList) {
|
||||
if (queueAtFrontOfList->byteCredit < 0) {
|
||||
queueAtFrontOfList->byteCredit += ZT_AQM_QUANTUM;
|
||||
oldQueues->push_back(queueAtFrontOfList);
|
||||
currQueues->erase(currQueues->begin());
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
entryToEmit = CoDelDequeue(queueAtFrontOfList, examiningNewQueues, now);
|
||||
if (! entryToEmit) {
|
||||
// DEBUG_INFO("moving q=%p from OLD to INACTIVE list", queueAtFrontOfList);
|
||||
|
@ -825,12 +829,12 @@ void Switch::aqm_dequeue(void *tPtr)
|
|||
send(tPtr, entryToEmit->packet, entryToEmit->encrypt, entryToEmit->flowId);
|
||||
(*nqcb).second->_currEnqueuedPackets--;
|
||||
}
|
||||
if (queueAtFrontOfList) {
|
||||
|
||||
// DEBUG_INFO("dequeuing from q=%p, len=%lu in OLD list (byteCredit=%d)", queueAtFrontOfList, queueAtFrontOfList->q.size(), queueAtFrontOfList->byteCredit);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
nqcb++;
|
||||
_aqm_m.unlock();
|
||||
}
|
||||
|
|
6
one.cpp
6
one.cpp
|
@ -1955,8 +1955,10 @@ static BOOL IsCurrentUserLocalAdministrator(void)
|
|||
if (!SetSecurityDescriptorDacl(psdAdmin, TRUE, pACL, FALSE))
|
||||
__leave;
|
||||
|
||||
SetSecurityDescriptorGroup(psdAdmin, psidAdmin, FALSE);
|
||||
SetSecurityDescriptorOwner(psdAdmin, psidAdmin, FALSE);
|
||||
if (!SetSecurityDescriptorGroup(psdAdmin, psidAdmin, FALSE))
|
||||
__leave;
|
||||
if (!SetSecurityDescriptorOwner(psdAdmin, psidAdmin, FALSE))
|
||||
__leave;
|
||||
|
||||
if (!IsValidSecurityDescriptor(psdAdmin))
|
||||
__leave;
|
||||
|
|
|
@ -828,6 +828,7 @@ void WindowsEthernetTap::setFriendlyName(const char *dn)
|
|||
hr = nsm->get_EnumEveryConnection(&nsecc);
|
||||
if (!nsecc) {
|
||||
fprintf(stderr, "Failed to get NSM connections");
|
||||
delete nsm;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -2039,7 +2039,7 @@ public:
|
|||
fprintf(stderr, "error: custom policy (%s) is invalid, unknown base policy (%s).\n",
|
||||
customPolicyStr.c_str(), basePolicyStr.c_str());
|
||||
continue;
|
||||
} if (_node->bondController()->getPolicyCodeByStr(customPolicyStr) != ZT_BOND_POLICY_NONE) {
|
||||
} else if (_node->bondController()->getPolicyCodeByStr(customPolicyStr) != ZT_BOND_POLICY_NONE) {
|
||||
fprintf(stderr, "error: custom policy (%s) will be ignored, cannot use standard policy names for custom policies.\n",
|
||||
customPolicyStr.c_str());
|
||||
continue;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue