diff --git a/src/wolfio.c b/src/wolfio.c index f927cd9bc..eb59ea43e 100644 --- a/src/wolfio.c +++ b/src/wolfio.c @@ -2070,8 +2070,7 @@ void wolfSSL_SetIO_Mynewt(WOLFSSL* ssl, struct mn_socket* mnSocket, struct mn_so #ifdef WOLFSSL_UIP #include - -#define SOCKLEN_UIP sizeof(struct sockaddr_uip) +#include /* uIP TCP/IP port, using the native tcp/udp socket api. * TCP and UDP are currently supported with the callbacks below. @@ -2084,11 +2083,26 @@ int uIPSend(WOLFSSL* ssl, char* buf, int sz, void* _ctx) { uip_wolfssl_ctx *ctx = (struct uip_wolfssl_ctx *)_ctx; int ret; + unsigned int max_sendlen; + int total_written = 0; (void)ssl; - ret = tcp_socket_send(&ctx->conn.tcp, (unsigned char *)buf, sz); - if (ret <= 0) - return WOLFSSL_CBIO_ERR_WANT_WRITE; - return ret; + do { + unsigned int bytes_left = sz - total_written; + max_sendlen = tcp_socket_max_sendlen(&ctx->conn.tcp); + if (bytes_left > max_sendlen) { + printf("Send limited by buffer\r\n"); + bytes_left = max_sendlen; + } + if (bytes_left == 0) { + printf("Buffer full!\r\n"); + break; + } + ret = tcp_socket_send(&ctx->conn.tcp, (unsigned char *)buf + total_written, bytes_left); + if (ret <= 0) + break; + total_written += ret; + } while(total_written < sz); + return total_written; } int uIPSendTo(WOLFSSL* ssl, char* buf, int sz, void* _ctx) @@ -2098,7 +2112,7 @@ int uIPSendTo(WOLFSSL* ssl, char* buf, int sz, void* _ctx) (void)ssl; ret = udp_socket_sendto(&ctx->conn.udp, (unsigned char *)buf, sz, &ctx->peer_addr, ctx->peer_port ); if (ret <= 0) - return WOLFSSL_CBIO_ERR_WANT_WRITE; + return 0; return ret; } @@ -2108,11 +2122,13 @@ int uIPSendTo(WOLFSSL* ssl, char* buf, int sz, void* _ctx) int uIPReceive(WOLFSSL *ssl, char *buf, int sz, void *_ctx) { uip_wolfssl_ctx *ctx = (uip_wolfssl_ctx *)_ctx; + if (!ctx || !ctx->ssl_rx_databuf) + return -1; (void)ssl; if (ctx->ssl_rb_len > 0) { if (sz > ctx->ssl_rb_len - ctx->ssl_rb_off) sz = ctx->ssl_rb_len - ctx->ssl_rb_off; - XMEMCPY(buf, ctx->ssl_recv_buffer + ctx->ssl_rb_off, sz); + XMEMCPY(buf, ctx->ssl_rx_databuf + ctx->ssl_rb_off, sz); ctx->ssl_rb_off += sz; if (ctx->ssl_rb_off >= ctx->ssl_rb_len) { ctx->ssl_rb_len = 0; diff --git a/wolfssl/wolfio.h b/wolfssl/wolfio.h index e95ccc47a..9d8fce6f0 100644 --- a/wolfssl/wolfio.h +++ b/wolfssl/wolfio.h @@ -424,29 +424,28 @@ WOLFSSL_API void wolfSSL_SetIOWriteFlags(WOLFSSL* ssl, int flags); #endif /* defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP) */ #ifdef WOLFSSL_UIP -#define SSL_DATABUF_LEN 1460 -struct uip_wolfssl_ctx { - union socket_connector { - struct tcp_socket tcp; - struct udp_socket udp; - } conn; - WOLFSSL_CTX *ctx; - WOLFSSL *ssl; - uint8_t input_databuf[SSL_DATABUF_LEN]; - uint8_t output_databuf[SSL_DATABUF_LEN]; - uint8_t ssl_recv_buffer[SSL_DATABUF_LEN]; - int ssl_rb_len; - int ssl_rb_off; - struct process *process; - tcp_socket_data_callback_t input_callback; - tcp_socket_event_callback_t event_callback; - int closing; - uip_ipaddr_t peer_addr; - uint16_t peer_port; -}; + struct uip_wolfssl_ctx { + union socket_connector { + struct tcp_socket tcp; + struct udp_socket udp; + } conn; + WOLFSSL_CTX *ctx; + WOLFSSL *ssl; + uint8_t *input_databuf; + uint8_t *output_databuf; + uint8_t *ssl_rx_databuf; + int ssl_rb_len; + int ssl_rb_off; + struct process *process; + tcp_socket_data_callback_t input_callback; + tcp_socket_event_callback_t event_callback; + int closing; + uip_ipaddr_t peer_addr; + uint16_t peer_port; + }; -typedef struct uip_wolfssl_ctx uip_wolfssl_ctx; + typedef struct uip_wolfssl_ctx uip_wolfssl_ctx; WOLFSSL_LOCAL int uIPSend(WOLFSSL* ssl, char* buf, int sz, void* ctx); WOLFSSL_LOCAL int uIPReceive(WOLFSSL* ssl, char* buf, int sz,