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; }
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; }
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; }
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; }
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; }
uint16_t getAvailTcpDataByte(uint8_t sock) { uint16_t len = calcMergeLen(sock); INFO_UTIL_VER("Availabled data: %d\n", len); return len; }