static short BWLimiterProcess(PacketNode *head, PacketNode *tail) { int dropped = 0; DWORD currentTime = timeGetTime(); PacketNode *pac = tail->prev; // pick up all packets and fill in the current time while (pac != head) { if (checkDirection(pac->addr.Direction, BWLimiterInbound, BWLimiterOutbound)) { if ( bufSizeByte >= ((DWORD)BWQueueSizeValue*1024)) { LOG("droped with chance, direction %s", BOUND_TEXT(pac->addr.Direction)); freeNode(popNode(pac)); ++dropped; } else { insertAfter(popNode(pac), bufHead)->timestamp = timeGetTime(); ++bufSize; bufSizeByte += pac->packetLen; pac = tail->prev; } } else { pac = pac->prev; } } while (!isBufEmpty() && canSendPacket(currentTime)) { PacketNode *pac = bufTail->prev; bufSizeByte -= pac->packetLen; recordSentPacket(currentTime, pac->packetLen); insertAfter(popNode(bufTail->prev), head); --bufSize; } if (bufSize > 0) { LOG("Queued buffers : %d", bufSize); } return (bufSize>0) || (dropped>0); }
void Socket::processSendQueue() { uint32_t numPackets = mSendQueue.size(); if (numPackets == 0) return; if (numPackets == 1) { processSinglePacketQueue(); return; } CombinedPacket comb; for (uint32_t i = 0; i < numPackets; ++i) { Packet* p = mSendQueue[i]; uint16_t len = p->lengthWithOverhead(); if (len > SEND_PACKET_MAX_SIZE_BEFORE_CRC) { sendPacket(comb); sendPacketFragmented(p); continue; } if (p->hasSequence()) { p->setSequence(getNextSequence()); recordSentPacket(*p); } if (!comb.addPacket(p)) { sendPacket(comb); sendPacket(p); } } sendPacket(comb); for (Packet* p : mSendQueue) { if (!p->isNoDelete()) delete p; } mSendQueue.clear(); }
void Socket::processSinglePacketQueue() { Packet* p = mSendQueue[0]; if (p->lengthWithOverhead() > SEND_PACKET_MAX_SIZE_BEFORE_CRC) { sendPacketFragmented(p); } else { if (p->hasSequence()) { p->setSequence(getNextSequence()); recordSentPacket(*p); } sendPacket(p); } if (!p->isNoDelete()) delete p; mSendQueue.clear(); }