mirror of
https://github.com/ZeroTier/ZeroTierOne
synced 2025-08-23 06:35:49 -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) {
|
if (nqcb->oldQueues[i]->id == qosBucket) {
|
||||||
selectedQueue = nqcb->oldQueues[i];
|
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) {
|
if (nqcb->newQueues[i]->id == qosBucket) {
|
||||||
selectedQueue = nqcb->newQueues[i];
|
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) {
|
if (nqcb->inactiveQueues[i]->id == qosBucket) {
|
||||||
selectedQueue = nqcb->inactiveQueues[i];
|
selectedQueue = nqcb->inactiveQueues[i];
|
||||||
// move queue to end of NEW queue list
|
// 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;
|
maxQueueLength = nqcb->oldQueues[i]->byteLength;
|
||||||
selectedQueueToDropFrom = nqcb->oldQueues[i];
|
selectedQueueToDropFrom = nqcb->oldQueues[i];
|
||||||
}
|
}
|
||||||
} if (i < nqcb->newQueues.size()) {
|
} else if (i < nqcb->newQueues.size()) {
|
||||||
if (nqcb->newQueues[i]->byteLength > maxQueueLength) {
|
if (nqcb->newQueues[i]->byteLength > maxQueueLength) {
|
||||||
maxQueueLength = nqcb->newQueues[i]->byteLength;
|
maxQueueLength = nqcb->newQueues[i]->byteLength;
|
||||||
selectedQueueToDropFrom = nqcb->newQueues[i];
|
selectedQueueToDropFrom = nqcb->newQueues[i];
|
||||||
}
|
}
|
||||||
} if (i < nqcb->inactiveQueues.size()) {
|
} else if (i < nqcb->inactiveQueues.size()) {
|
||||||
if (nqcb->inactiveQueues[i]->byteLength > maxQueueLength) {
|
if (nqcb->inactiveQueues[i]->byteLength > maxQueueLength) {
|
||||||
maxQueueLength = nqcb->inactiveQueues[i]->byteLength;
|
maxQueueLength = nqcb->inactiveQueues[i]->byteLength;
|
||||||
selectedQueueToDropFrom = nqcb->inactiveQueues[i];
|
selectedQueueToDropFrom = nqcb->inactiveQueues[i];
|
||||||
|
@ -770,13 +770,15 @@ void Switch::aqm_dequeue(void *tPtr)
|
||||||
bool examiningNewQueues = true;
|
bool examiningNewQueues = true;
|
||||||
while (currQueues->size()) {
|
while (currQueues->size()) {
|
||||||
ManagedQueue *queueAtFrontOfList = currQueues->front();
|
ManagedQueue *queueAtFrontOfList = currQueues->front();
|
||||||
|
if (queueAtFrontOfList) {
|
||||||
if (queueAtFrontOfList->byteCredit < 0) {
|
if (queueAtFrontOfList->byteCredit < 0) {
|
||||||
queueAtFrontOfList->byteCredit += ZT_AQM_QUANTUM;
|
queueAtFrontOfList->byteCredit += ZT_AQM_QUANTUM;
|
||||||
// Move to list of OLD queues
|
// Move to list of OLD queues
|
||||||
// DEBUG_INFO("moving q=%p from NEW to OLD list", queueAtFrontOfList);
|
// DEBUG_INFO("moving q=%p from NEW to OLD list", queueAtFrontOfList);
|
||||||
oldQueues->push_back(queueAtFrontOfList);
|
oldQueues->push_back(queueAtFrontOfList);
|
||||||
currQueues->erase(currQueues->begin());
|
currQueues->erase(currQueues->begin());
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
entryToEmit = CoDelDequeue(queueAtFrontOfList, examiningNewQueues, now);
|
entryToEmit = CoDelDequeue(queueAtFrontOfList, examiningNewQueues, now);
|
||||||
if (! entryToEmit) {
|
if (! entryToEmit) {
|
||||||
// Move to end of list of OLD queues
|
// 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);
|
send(tPtr, entryToEmit->packet, entryToEmit->encrypt, entryToEmit->flowId);
|
||||||
(*nqcb).second->_currEnqueuedPackets--;
|
(*nqcb).second->_currEnqueuedPackets--;
|
||||||
}
|
}
|
||||||
if (queueAtFrontOfList) {
|
|
||||||
// DEBUG_INFO("dequeuing from q=%p, len=%lu in NEW list (byteCredit=%d)", queueAtFrontOfList, queueAtFrontOfList->q.size(), queueAtFrontOfList->byteCredit);
|
// DEBUG_INFO("dequeuing from q=%p, len=%lu in NEW list (byteCredit=%d)", queueAtFrontOfList, queueAtFrontOfList->q.size(), queueAtFrontOfList->byteCredit);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Attempt dequeue from queues in OLD list
|
// Attempt dequeue from queues in OLD list
|
||||||
examiningNewQueues = false;
|
examiningNewQueues = false;
|
||||||
currQueues = &((*nqcb).second->oldQueues);
|
currQueues = &((*nqcb).second->oldQueues);
|
||||||
while (currQueues->size()) {
|
while (currQueues->size()) {
|
||||||
ManagedQueue *queueAtFrontOfList = currQueues->front();
|
ManagedQueue *queueAtFrontOfList = currQueues->front();
|
||||||
|
if (queueAtFrontOfList) {
|
||||||
if (queueAtFrontOfList->byteCredit < 0) {
|
if (queueAtFrontOfList->byteCredit < 0) {
|
||||||
queueAtFrontOfList->byteCredit += ZT_AQM_QUANTUM;
|
queueAtFrontOfList->byteCredit += ZT_AQM_QUANTUM;
|
||||||
oldQueues->push_back(queueAtFrontOfList);
|
oldQueues->push_back(queueAtFrontOfList);
|
||||||
currQueues->erase(currQueues->begin());
|
currQueues->erase(currQueues->begin());
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
entryToEmit = CoDelDequeue(queueAtFrontOfList, examiningNewQueues, now);
|
entryToEmit = CoDelDequeue(queueAtFrontOfList, examiningNewQueues, now);
|
||||||
if (! entryToEmit) {
|
if (! entryToEmit) {
|
||||||
// DEBUG_INFO("moving q=%p from OLD to INACTIVE list", queueAtFrontOfList);
|
// 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);
|
send(tPtr, entryToEmit->packet, entryToEmit->encrypt, entryToEmit->flowId);
|
||||||
(*nqcb).second->_currEnqueuedPackets--;
|
(*nqcb).second->_currEnqueuedPackets--;
|
||||||
}
|
}
|
||||||
if (queueAtFrontOfList) {
|
|
||||||
// DEBUG_INFO("dequeuing from q=%p, len=%lu in OLD list (byteCredit=%d)", queueAtFrontOfList, queueAtFrontOfList->q.size(), queueAtFrontOfList->byteCredit);
|
// DEBUG_INFO("dequeuing from q=%p, len=%lu in OLD list (byteCredit=%d)", queueAtFrontOfList, queueAtFrontOfList->q.size(), queueAtFrontOfList->byteCredit);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
nqcb++;
|
nqcb++;
|
||||||
_aqm_m.unlock();
|
_aqm_m.unlock();
|
||||||
}
|
}
|
||||||
|
|
6
one.cpp
6
one.cpp
|
@ -1955,8 +1955,10 @@ static BOOL IsCurrentUserLocalAdministrator(void)
|
||||||
if (!SetSecurityDescriptorDacl(psdAdmin, TRUE, pACL, FALSE))
|
if (!SetSecurityDescriptorDacl(psdAdmin, TRUE, pACL, FALSE))
|
||||||
__leave;
|
__leave;
|
||||||
|
|
||||||
SetSecurityDescriptorGroup(psdAdmin, psidAdmin, FALSE);
|
if (!SetSecurityDescriptorGroup(psdAdmin, psidAdmin, FALSE))
|
||||||
SetSecurityDescriptorOwner(psdAdmin, psidAdmin, FALSE);
|
__leave;
|
||||||
|
if (!SetSecurityDescriptorOwner(psdAdmin, psidAdmin, FALSE))
|
||||||
|
__leave;
|
||||||
|
|
||||||
if (!IsValidSecurityDescriptor(psdAdmin))
|
if (!IsValidSecurityDescriptor(psdAdmin))
|
||||||
__leave;
|
__leave;
|
||||||
|
|
|
@ -828,6 +828,7 @@ void WindowsEthernetTap::setFriendlyName(const char *dn)
|
||||||
hr = nsm->get_EnumEveryConnection(&nsecc);
|
hr = nsm->get_EnumEveryConnection(&nsecc);
|
||||||
if (!nsecc) {
|
if (!nsecc) {
|
||||||
fprintf(stderr, "Failed to get NSM connections");
|
fprintf(stderr, "Failed to get NSM connections");
|
||||||
|
delete nsm;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2039,7 +2039,7 @@ public:
|
||||||
fprintf(stderr, "error: custom policy (%s) is invalid, unknown base policy (%s).\n",
|
fprintf(stderr, "error: custom policy (%s) is invalid, unknown base policy (%s).\n",
|
||||||
customPolicyStr.c_str(), basePolicyStr.c_str());
|
customPolicyStr.c_str(), basePolicyStr.c_str());
|
||||||
continue;
|
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",
|
fprintf(stderr, "error: custom policy (%s) will be ignored, cannot use standard policy names for custom policies.\n",
|
||||||
customPolicyStr.c_str());
|
customPolicyStr.c_str());
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue