// Network Headers & Variables & Functions int s7g2_read(Network* n, unsigned char* buffer, int len, int timeout_ms) { ULONG copied_idx = 0; Timer t; countdown_ms(&t , timeout_ms); while(len != 0){ ULONG left_len; ULONG recv_len = 0; ULONG bytes_copied = 0; if(prepend_offset == 0){ nx_tcp_socket_receive(&n->my_socket, &read_packet_ptr, timeout_ms); } nx_packet_length_get(read_packet_ptr, &recv_len); left_len = recv_len - prepend_offset; if(recv_len == 0){ if(expired(&t))break; } if( left_len >= len ) { nx_packet_data_extract_offset(read_packet_ptr, prepend_offset, &buffer[copied_idx], len, &bytes_copied); if( left_len == bytes_copied ){ prepend_offset = 0; nx_packet_release(read_packet_ptr); read_packet_ptr = NULL; } else { prepend_offset += bytes_copied; } } else { nx_packet_data_extract_offset(read_packet_ptr, prepend_offset, &buffer[copied_idx], left_len, &bytes_copied); prepend_offset = 0; nx_packet_release(read_packet_ptr); read_packet_ptr = NULL; } len -= bytes_copied; copied_idx += bytes_copied; } return copied_idx; }
/* The NetX receive callback * return : bytes read, or error */ int NetX_Receive(CYASSL *ssl, char *buf, int sz, void *ctx) { NetX_Ctx* nxCtx = (NetX_Ctx*)ctx; ULONG left; ULONG total; ULONG copied = 0; UINT status; if (nxCtx == NULL || nxCtx->nxSocket == NULL) { CYASSL_MSG("NetX Recv NULL parameters"); return CYASSL_CBIO_ERR_GENERAL; } if (nxCtx->nxPacket == NULL) { status = nx_tcp_socket_receive(nxCtx->nxSocket, &nxCtx->nxPacket, nxCtx->nxWait); if (status != NX_SUCCESS) { CYASSL_MSG("NetX Recv receive error"); return CYASSL_CBIO_ERR_GENERAL; } } if (nxCtx->nxPacket) { status = nx_packet_length_get(nxCtx->nxPacket, &total); if (status != NX_SUCCESS) { CYASSL_MSG("NetX Recv length get error"); return CYASSL_CBIO_ERR_GENERAL; } left = total - nxCtx->nxOffset; status = nx_packet_data_extract_offset(nxCtx->nxPacket, nxCtx->nxOffset, buf, sz, &copied); if (status != NX_SUCCESS) { CYASSL_MSG("NetX Recv data extract offset error"); return CYASSL_CBIO_ERR_GENERAL; } nxCtx->nxOffset += copied; if (copied == left) { CYASSL_MSG("NetX Recv Drained packet"); nx_packet_release(nxCtx->nxPacket); nxCtx->nxPacket = NULL; nxCtx->nxOffset = 0; } } return copied; }