Skip to content

Commit 5db48e5

Browse files
author
hmohide
committed
Add UDP support to NetX sockets for DTLS sessions
1 parent 50da0c0 commit 5db48e5

4 files changed

Lines changed: 149 additions & 12 deletions

File tree

src/internal.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2668,6 +2668,12 @@ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
26682668
#ifdef HAVE_NETX
26692669
ctx->CBIORecv = NetX_Receive;
26702670
ctx->CBIOSend = NetX_Send;
2671+
#ifdef WOLFSSL_DTLS
2672+
if (method->version.major == DTLS_MAJOR) {
2673+
ctx->CBIORecv = NetX_ReceiveFrom;
2674+
ctx->CBIOSend = NetX_SendTo;
2675+
}
2676+
#endif
26712677
#elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
26722678
ctx->CBIORecv = Mynewt_Receive;
26732679
ctx->CBIOSend = Mynewt_Send;
@@ -7907,9 +7913,13 @@ int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
79077913
if (wc_InitRwLock(&ssl->buffers.dtlsCtx.peerLock) != 0)
79087914
return BAD_MUTEX_E;
79097915
#endif
7910-
7916+
#ifdef HAVE_NETX
7917+
ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */
7918+
ssl->IOCB_WriteCtx = &ssl->nxCtx; /* and write */
7919+
#else
79117920
ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx; /* prevent invalid pointer access if not */
79127921
ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx; /* correctly set */
7922+
#endif
79137923
#else
79147924
#ifdef HAVE_NETX
79157925
ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */

src/wolfio.c

Lines changed: 128 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2530,7 +2530,7 @@ void wolfSSL_CTX_SetIOSetPeer(WOLFSSL_CTX* ctx, CallbackSetPeer cb)
25302530

25312531
#ifdef HAVE_NETX
25322532

2533-
/* The NetX receive callback
2533+
/* The NetX receive callback for TLS
25342534
* return : bytes read, or error
25352535
*/
25362536
int NetX_Receive(WOLFSSL *ssl, char *buf, int sz, void *ctx)
@@ -2543,13 +2543,13 @@ int NetX_Receive(WOLFSSL *ssl, char *buf, int sz, void *ctx)
25432543

25442544
(void)ssl;
25452545

2546-
if (nxCtx == NULL || nxCtx->nxSocket == NULL) {
2546+
if (nxCtx == NULL || nxCtx->nxTcpSocket == NULL) {
25472547
WOLFSSL_MSG("NetX Recv NULL parameters");
25482548
return WOLFSSL_CBIO_ERR_GENERAL;
25492549
}
25502550

25512551
if (nxCtx->nxPacket == NULL) {
2552-
status = nx_tcp_socket_receive(nxCtx->nxSocket, &nxCtx->nxPacket,
2552+
status = nx_tcp_socket_receive(nxCtx->nxTcpSocket, &nxCtx->nxPacket,
25532553
nxCtx->nxWait);
25542554
if (status != NX_SUCCESS) {
25552555
WOLFSSL_MSG("NetX Recv receive error");
@@ -2586,7 +2586,7 @@ int NetX_Receive(WOLFSSL *ssl, char *buf, int sz, void *ctx)
25862586
}
25872587

25882588

2589-
/* The NetX send callback
2589+
/* The NetX send callback for TLS
25902590
* return : bytes sent, or error
25912591
*/
25922592
int NetX_Send(WOLFSSL* ssl, char *buf, int sz, void *ctx)
@@ -2598,12 +2598,12 @@ int NetX_Send(WOLFSSL* ssl, char *buf, int sz, void *ctx)
25982598

25992599
(void)ssl;
26002600

2601-
if (nxCtx == NULL || nxCtx->nxSocket == NULL) {
2601+
if (nxCtx == NULL || nxCtx->nxTcpSocket == NULL) {
26022602
WOLFSSL_MSG("NetX Send NULL parameters");
26032603
return WOLFSSL_CBIO_ERR_GENERAL;
26042604
}
26052605

2606-
pool = nxCtx->nxSocket->nx_tcp_socket_ip_ptr->nx_ip_default_packet_pool;
2606+
pool = nxCtx->nxTcpSocket->nx_tcp_socket_ip_ptr->nx_ip_default_packet_pool;
26072607
status = nx_packet_allocate(pool, &packet, NX_TCP_PACKET,
26082608
nxCtx->nxWait);
26092609
if (status != NX_SUCCESS) {
@@ -2618,7 +2618,7 @@ int NetX_Send(WOLFSSL* ssl, char *buf, int sz, void *ctx)
26182618
return WOLFSSL_CBIO_ERR_GENERAL;
26192619
}
26202620

2621-
status = nx_tcp_socket_send(nxCtx->nxSocket, packet, nxCtx->nxWait);
2621+
status = nx_tcp_socket_send(nxCtx->nxTcpSocket, packet, nxCtx->nxWait);
26222622
if (status != NX_SUCCESS) {
26232623
nx_packet_release(packet);
26242624
WOLFSSL_MSG("NetX Send socket send error");
@@ -2628,13 +2628,131 @@ int NetX_Send(WOLFSSL* ssl, char *buf, int sz, void *ctx)
26282628
return sz;
26292629
}
26302630

2631+
/* The NetX receive callback for DTLS
2632+
* return : bytes read, or error
2633+
*/
2634+
int NetX_ReceiveFrom(WOLFSSL *ssl, char *buf, int sz, void *ctx)
2635+
{
2636+
NetX_Ctx* nxCtx = (NetX_Ctx*)ctx;
2637+
ULONG left;
2638+
ULONG total;
2639+
ULONG copied = 0;
2640+
UINT status;
2641+
2642+
(void)ssl;
2643+
2644+
if (nxCtx == NULL || nxCtx->nxUdpSocket == NULL) {
2645+
WOLFSSL_MSG("NetX Recv NULL parameters");
2646+
return WOLFSSL_CBIO_ERR_GENERAL;
2647+
}
2648+
2649+
if (nxCtx->nxPacket == NULL) {
2650+
status = nx_udp_socket_receive(nxCtx->nxUdpSocket, &nxCtx->nxPacket,
2651+
nxCtx->nxWait);
2652+
if (status != NX_SUCCESS) {
2653+
WOLFSSL_MSG("NetX Recv receive error");
2654+
return WOLFSSL_CBIO_ERR_GENERAL;
2655+
}
2656+
}
2657+
2658+
if (nxCtx->nxPacket) {
2659+
status = nx_packet_length_get(nxCtx->nxPacket, &total);
2660+
if (status != NX_SUCCESS) {
2661+
WOLFSSL_MSG("NetX Recv length get error");
2662+
return WOLFSSL_CBIO_ERR_GENERAL;
2663+
}
2664+
2665+
left = total - nxCtx->nxOffset;
2666+
status = nx_packet_data_extract_offset(nxCtx->nxPacket, nxCtx->nxOffset,
2667+
buf, sz, &copied);
2668+
if (status != NX_SUCCESS) {
2669+
WOLFSSL_MSG("NetX Recv data extract offset error");
2670+
return WOLFSSL_CBIO_ERR_GENERAL;
2671+
}
2672+
2673+
nxCtx->nxOffset += copied;
2674+
2675+
if (copied == left) {
2676+
WOLFSSL_MSG("NetX Recv Drained packet");
2677+
nx_packet_release(nxCtx->nxPacket);
2678+
nxCtx->nxPacket = NULL;
2679+
nxCtx->nxOffset = 0;
2680+
}
2681+
}
2682+
2683+
return copied;
2684+
}
2685+
2686+
/* The NetX send callback for DTLS
2687+
* return : bytes sent, or error
2688+
*/
2689+
int NetX_SendTo(WOLFSSL* ssl, char *buf, int sz, void *ctx)
2690+
{
2691+
NetX_Ctx* nxCtx = (NetX_Ctx*)ctx;
2692+
NX_PACKET* packet;
2693+
NX_PACKET_POOL* pool; /* shorthand */
2694+
UINT status;
2695+
2696+
(void)ssl;
2697+
2698+
if (nxCtx == NULL || nxCtx->nxUdpSocket == NULL
2699+
|| nxCtx->nxdIp == NULL || nxCtx->nxPort == NULL) {
2700+
WOLFSSL_MSG("NetX Send NULL parameters");
2701+
return WOLFSSL_CBIO_ERR_GENERAL;
2702+
}
2703+
2704+
pool = nxCtx->nxUdpSocket->nx_udp_socket_ip_ptr->nx_ip_default_packet_pool;
2705+
status = nx_packet_allocate(pool, &packet, NX_UDP_PACKET,
2706+
nxCtx->nxWait);
2707+
if (status != NX_SUCCESS) {
2708+
WOLFSSL_MSG("NetX Send packet alloc error");
2709+
return WOLFSSL_CBIO_ERR_GENERAL;
2710+
}
2711+
2712+
status = nx_packet_data_append(packet, buf, sz, pool, nxCtx->nxWait);
2713+
if (status != NX_SUCCESS) {
2714+
nx_packet_release(packet);
2715+
WOLFSSL_MSG("NetX Send data append error");
2716+
return WOLFSSL_CBIO_ERR_GENERAL;
2717+
}
2718+
2719+
if(nxCtx->nxdIp->nxd_ip_version == NX_IP_VERSION_V4)
2720+
{
2721+
status = nx_udp_socket_send(nxCtx->nxUdpSocket, packet, nxCtx->nxdIp->nxd_ip_address.v4, (UINT)(*nxCtx->nxPort));
2722+
if (status != NX_SUCCESS) {
2723+
nx_packet_release(packet);
2724+
WOLFSSL_MSG("NetX Send socket send error");
2725+
return WOLFSSL_CBIO_ERR_GENERAL;
2726+
}
2727+
}else
2728+
{
2729+
status = nxd_udp_socket_send(nxCtx->nxUdpSocket, packet, nxCtx->nxdIp, (UINT)(*nxCtx->nxPort));
2730+
if (status != NX_SUCCESS) {
2731+
nx_packet_release(packet);
2732+
WOLFSSL_MSG("NetX Send socket send error");
2733+
return WOLFSSL_CBIO_ERR_GENERAL;
2734+
}
2735+
}
2736+
2737+
return sz;
2738+
}
26312739

26322740
/* like set_fd, but for default NetX context */
2633-
void wolfSSL_SetIO_NetX(WOLFSSL* ssl, NX_TCP_SOCKET* nxSocket, ULONG waitOption)
2741+
void wolfSSL_SetIO_NetX(WOLFSSL* ssl, NX_TCP_SOCKET* nxsocket, ULONG waitoption)
2742+
{
2743+
if (ssl) {
2744+
ssl->nxCtx.nxTcpSocket = nxsocket;
2745+
ssl->nxCtx.nxWait = waitoption;
2746+
}
2747+
}
2748+
2749+
void wolfSSL_SetIO_NetX_Dtls(WOLFSSL* ssl, NX_UDP_SOCKET* nxsocket, NXD_ADDRESS *nxdip, USHORT *nxport, ULONG waitoption)
26342750
{
26352751
if (ssl) {
2636-
ssl->nxCtx.nxSocket = nxSocket;
2637-
ssl->nxCtx.nxWait = waitOption;
2752+
ssl->nxCtx.nxUdpSocket = nxsocket;
2753+
ssl->nxCtx.nxdIp = nxdip;
2754+
ssl->nxCtx.nxPort = nxport;
2755+
ssl->nxCtx.nxWait = waitoption;
26382756
}
26392757
}
26402758

wolfssl/internal.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5711,10 +5711,13 @@ typedef struct DtlsMsg {
57115711

57125712
/* NETX I/O Callback default */
57135713
typedef struct NetX_Ctx {
5714-
NX_TCP_SOCKET* nxSocket; /* send/recv socket handle */
5714+
NX_TCP_SOCKET* nxTcpSocket; /* send/recv tcp socket handle */
5715+
NX_UDP_SOCKET* nxUdpSocket; /* send/recv udp socket handle */
57155716
NX_PACKET* nxPacket; /* incoming packet handle for short reads */
57165717
ULONG nxOffset; /* offset already read from nxPacket */
57175718
ULONG nxWait; /* wait option flag */
5719+
NXD_ADDRESS* nxdIp; /* IP address for udp send*/
5720+
USHORT* nxPort; /* Port number for udp recv*/
57185721
} NetX_Ctx;
57195722

57205723
#endif

wolfssl/wolfio.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,9 +790,15 @@ WOLFSSL_API void wolfSSL_SetIOWriteFlags(WOLFSSL* ssl, int flags);
790790
#ifdef HAVE_NETX
791791
WOLFSSL_LOCAL int NetX_Receive(WOLFSSL *ssl, char *buf, int sz, void *ctx);
792792
WOLFSSL_LOCAL int NetX_Send(WOLFSSL *ssl, char *buf, int sz, void *ctx);
793+
WOLFSSL_LOCAL int NetX_ReceiveFrom(WOLFSSL *ssl, char *buf, int sz, void *ctx);
794+
WOLFSSL_LOCAL int NetX_SendTo(WOLFSSL *ssl, char *buf, int sz, void *ctx);
793795

794796
WOLFSSL_API void wolfSSL_SetIO_NetX(WOLFSSL* ssl, NX_TCP_SOCKET* nxsocket,
795797
ULONG waitoption);
798+
WOLFSSL_API void wolfSSL_SetIO_NetX_Dtls(WOLFSSL* ssl, NX_UDP_SOCKET* nxsocket,
799+
NXD_ADDRESS *nxdip,
800+
USHORT* nxport,
801+
ULONG waitoption);
796802
#endif /* HAVE_NETX */
797803

798804
#ifdef MICRIUM

0 commit comments

Comments
 (0)