Improved support for contiki/uIP.

This commit is contained in:
Daniele Lacamera
2018-07-18 13:53:47 +02:00
parent 7bd16a2582
commit bdb5d3c191
2 changed files with 44 additions and 29 deletions

View File

@ -2070,8 +2070,7 @@ void wolfSSL_SetIO_Mynewt(WOLFSSL* ssl, struct mn_socket* mnSocket, struct mn_so
#ifdef WOLFSSL_UIP #ifdef WOLFSSL_UIP
#include <uip.h> #include <uip.h>
#include <stdio.h>
#define SOCKLEN_UIP sizeof(struct sockaddr_uip)
/* uIP TCP/IP port, using the native tcp/udp socket api. /* uIP TCP/IP port, using the native tcp/udp socket api.
* TCP and UDP are currently supported with the callbacks below. * 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; uip_wolfssl_ctx *ctx = (struct uip_wolfssl_ctx *)_ctx;
int ret; int ret;
unsigned int max_sendlen;
int total_written = 0;
(void)ssl; (void)ssl;
ret = tcp_socket_send(&ctx->conn.tcp, (unsigned char *)buf, sz); do {
if (ret <= 0) unsigned int bytes_left = sz - total_written;
return WOLFSSL_CBIO_ERR_WANT_WRITE; max_sendlen = tcp_socket_max_sendlen(&ctx->conn.tcp);
return ret; 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) 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; (void)ssl;
ret = udp_socket_sendto(&ctx->conn.udp, (unsigned char *)buf, sz, &ctx->peer_addr, ctx->peer_port ); ret = udp_socket_sendto(&ctx->conn.udp, (unsigned char *)buf, sz, &ctx->peer_addr, ctx->peer_port );
if (ret <= 0) if (ret <= 0)
return WOLFSSL_CBIO_ERR_WANT_WRITE; return 0;
return ret; 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) int uIPReceive(WOLFSSL *ssl, char *buf, int sz, void *_ctx)
{ {
uip_wolfssl_ctx *ctx = (uip_wolfssl_ctx *)_ctx; uip_wolfssl_ctx *ctx = (uip_wolfssl_ctx *)_ctx;
if (!ctx || !ctx->ssl_rx_databuf)
return -1;
(void)ssl; (void)ssl;
if (ctx->ssl_rb_len > 0) { if (ctx->ssl_rb_len > 0) {
if (sz > ctx->ssl_rb_len - ctx->ssl_rb_off) if (sz > ctx->ssl_rb_len - ctx->ssl_rb_off)
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; ctx->ssl_rb_off += sz;
if (ctx->ssl_rb_off >= ctx->ssl_rb_len) { if (ctx->ssl_rb_off >= ctx->ssl_rb_len) {
ctx->ssl_rb_len = 0; ctx->ssl_rb_len = 0;

View File

@ -424,29 +424,28 @@ WOLFSSL_API void wolfSSL_SetIOWriteFlags(WOLFSSL* ssl, int flags);
#endif /* defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP) */ #endif /* defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP) */
#ifdef WOLFSSL_UIP #ifdef WOLFSSL_UIP
#define SSL_DATABUF_LEN 1460
struct uip_wolfssl_ctx { struct uip_wolfssl_ctx {
union socket_connector { union socket_connector {
struct tcp_socket tcp; struct tcp_socket tcp;
struct udp_socket udp; struct udp_socket udp;
} conn; } conn;
WOLFSSL_CTX *ctx; WOLFSSL_CTX *ctx;
WOLFSSL *ssl; WOLFSSL *ssl;
uint8_t input_databuf[SSL_DATABUF_LEN]; uint8_t *input_databuf;
uint8_t output_databuf[SSL_DATABUF_LEN]; uint8_t *output_databuf;
uint8_t ssl_recv_buffer[SSL_DATABUF_LEN]; uint8_t *ssl_rx_databuf;
int ssl_rb_len; int ssl_rb_len;
int ssl_rb_off; int ssl_rb_off;
struct process *process; struct process *process;
tcp_socket_data_callback_t input_callback; tcp_socket_data_callback_t input_callback;
tcp_socket_event_callback_t event_callback; tcp_socket_event_callback_t event_callback;
int closing; int closing;
uip_ipaddr_t peer_addr; uip_ipaddr_t peer_addr;
uint16_t peer_port; 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 uIPSend(WOLFSSL* ssl, char* buf, int sz, void* ctx);
WOLFSSL_LOCAL int uIPReceive(WOLFSSL* ssl, char* buf, int sz, WOLFSSL_LOCAL int uIPReceive(WOLFSSL* ssl, char* buf, int sz,