Пример #1
0
bool getTcpDataByte(uint8_t sock, uint8_t* payload, uint8_t peek)
{
	// ref field in struct pbuf has been used as index pointer for byte data
	tData* p = get_pBuf(sock);

	if (p != NULL)
	{
		if (p->idx < p->len)
		{
		uint8_t* buf = (uint8_t*)p->data;
		if (peek)
			*payload = buf[p->idx];
		else
			*payload = buf[p->idx++];
		INFO_UTIL_VER("get:%d %p %d\n",p->idx, p->data, *payload);
		return true;
		}else{
			//dealloc current buffer
			INFO_UTIL("Free %p\n", p->data);
			freetData(p->data, sock);
			ack_recved(p->pcb, p->len);
		}
	}
	return false;
}
Пример #2
0
tData* get_pBuf(uint8_t sock)
{
	if (IS_BUF_EMPTY(sock))
		return NULL;

	if (IS_BUF_AVAIL(sock))
	{
		tData* p = &(pBufStore[tailBuf[sock]][sock]);
		INFO_UTIL_VER("%p [%d,%d]\n", p, headBuf[sock], tailBuf[sock]);
		return p;
	}
	return NULL;
}
Пример #3
0
uint16_t calcMergeLen(uint8_t sock)
{
	uint16_t len = 0;

	unsigned char index = tailBuf[sock];
	do {
	if (pBufStore[index][sock].data != NULL)
	{
		len += pBufStore[index][sock].len;
		len -= pBufStore[index][sock].idx;
		INFO_UTIL_VER(" [%d]: len:%d idx:%d tot:%d\n", sock, pBufStore[index][sock].len, pBufStore[index][sock].idx, len);
	}
	++index;
	if (index == MAX_PBUF_STORED)
		index = 0;
	}while (index!=headBuf[sock]);
	return len;
}
Пример #4
0
bool isAvailTcpDataByte(uint8_t sock)
{
	tData* p = get_pBuf(sock);

	if (p != NULL)
	{
		INFO_UTIL_VER("check:%d %d %p\n",p->idx, p->len, p->data);
		if (p->idx == p->len)
		{
			INFO_UTIL("Free %p other buf %d tail:%d head:%d\n",
					p->data, IS_BUF_AVAIL(sock), tailBuf[sock], headBuf[sock]);
			ackAndFreeData(p->pcb, p->len, sock, p->data);						
			return (IS_BUF_AVAIL(sock));
		}else{
			return true;
		}
	}
	return false;
}
Пример #5
0
bool getTcpDataByte(uint8_t sock, uint8_t* payload, uint8_t peek)
{
	// ref field in struct pbuf has been used as index pointer for byte data
	tData* p = get_pBuf(sock);

	if (p != NULL)
	{
		if (p->idx < p->len)
		{
		uint8_t* buf = (uint8_t*)p->data;
		if (peek)
			*payload = buf[p->idx];
		else
			*payload = buf[p->idx++];
		INFO_UTIL_VER("get:%d %p %d\n",p->idx, p->data, *payload);
		if (p->idx == p->len)
			ackAndFreeData(p->pcb, p->len, sock, p->data);
		return true;
		}else{
			ackAndFreeData(p->pcb, p->len, sock, p->data);
		}
	}
	return false;
}
Пример #6
0
uint16_t getAvailTcpDataByte(uint8_t sock)
{
	uint16_t len = calcMergeLen(sock);
	INFO_UTIL_VER("Availabled data: %d\n", len);
	return len;
}