Example #1
0
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);
}
Example #2
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();
}
Example #3
0
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();
}