mirror of https://github.com/wolfSSL/wolfssl.git
Improved support for contiki/uIP.
parent
7bd16a2582
commit
bdb5d3c191
32
src/wolfio.c
32
src/wolfio.c
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue