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; }
void ackAndFreeData(void* pcb, int len, uint8_t sock, uint8_t* data) { INFO_TCP("Ack pcb:%p len:%d sock:%d data:%p\n", pcb, len, sock, data); if (!IS_UDP_SOCK(sock)) ack_recved(pcb, len); if (data != NULL) freetData(data, sock); }
void freeAllTcpData(uint8_t sock) { tData* p = NULL; do{ p = get_pBuf(sock); if (p != NULL) freetData(p->data, sock); }while(p!=NULL); }
bool freeTcpData(uint8_t sock) { tData* p = NULL; p = get_pBuf(sock); if (p != NULL) { freetData(p->data, sock); ack_recved(p->pcb, p->len); return true; } return false; }
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) { freetData(p->data, sock); ack_recved(p->pcb, p->len); INFO_UTIL("Free %p other buf %d tail:%d head:%d\n", p->data, IS_BUF_AVAIL(), tailBuf, headBuf); return (IS_BUF_AVAIL()); }else{ return true; } } return false; }