Improved support for contiki/uIP.

pull/1656/head
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
#include <uip.h>
#define SOCKLEN_UIP sizeof(struct sockaddr_uip)
#include <stdio.h>
/* 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;

View File

@ -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,