Skip to content

Commit 0d7fe2f

Browse files
committed
DTLS: Introduce custom I/O callbacks API and structure
1 parent 9780137 commit 0d7fe2f

3 files changed

Lines changed: 44 additions & 8 deletions

File tree

src/wolfio.c

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,18 @@ static int isDGramSock(int sfd)
638638
}
639639
}
640640

641+
void wolfSSL_SetRecvFrom(WOLFSSL* ssl, WolfSSLRecvFrom recvFrom)
642+
{
643+
if (ssl != NULL)
644+
ssl->buffers.dtlsCtx.recvfrom = recvFrom;
645+
}
646+
647+
void wolfSSL_SetSendTo(WOLFSSL* ssl, WolfSSLSento sendTo)
648+
{
649+
if (ssl != NULL)
650+
ssl->buffers.dtlsCtx.sendto = sendTo;
651+
}
652+
641653
/* The receive embedded callback
642654
* return : nb bytes read, or error
643655
*/
@@ -686,10 +698,6 @@ int EmbedReceiveFrom(WOLFSSL *ssl, char *buf, int sz, void *ctx)
686698
/* Store the peer address. It is used to calculate the DTLS cookie. */
687699
newPeer = dtlsCtx->peer.sa == NULL || !ssl->options.dtlsStateful;
688700
peer = &lclPeer;
689-
if (dtlsCtx->peer.sa != NULL) {
690-
XMEMCPY(peer, (SOCKADDR_S*)dtlsCtx->peer.sa, MIN(sizeof(lclPeer),
691-
dtlsCtx->peer.sz));
692-
}
693701
peerSz = sizeof(lclPeer);
694702
}
695703

@@ -785,8 +793,16 @@ int EmbedReceiveFrom(WOLFSSL *ssl, char *buf, int sz, void *ctx)
785793

786794
{
787795
XSOCKLENT inPeerSz = peerSz;
788-
recvd = (int)DTLS_RECVFROM_FUNCTION(sd, buf, (size_t)sz,
789-
ssl->rflags, (SOCKADDR*)peer, peer != NULL ? &inPeerSz : NULL);
796+
if (dtlsCtx->recvfrom == NULL) {
797+
recvd = (int)DTLS_RECVFROM_FUNCTION(sd, buf, (size_t)sz,
798+
ssl->rflags, (SOCKADDR*)peer,
799+
peer != NULL ? &inPeerSz : NULL);
800+
}
801+
else {
802+
recvd = (int)dtlsCtx->recvfrom(sd, buf, (size_t) sz,
803+
ssl->rflags, (SOCKADDR*) peer,
804+
peer != NULL ? &inPeerSz : NULL);
805+
}
790806
/* Truncate peerSz. From the RECV(2) man page
791807
* The returned address is truncated if the buffer provided is too
792808
* small; in this case, addrlen will return a value greater than was
@@ -914,8 +930,14 @@ int EmbedSendTo(WOLFSSL* ssl, char *buf, int sz, void *ctx)
914930
#endif
915931
}
916932

917-
sent = (int)DTLS_SENDTO_FUNCTION(sd, buf, (size_t)sz, ssl->wflags,
918-
(const SOCKADDR*)peer, peerSz);
933+
if (dtlsCtx->sendto == NULL) {
934+
sent = (int)DTLS_SENDTO_FUNCTION(sd, buf, (size_t)sz, ssl->wflags,
935+
(const SOCKADDR*)peer, peerSz);
936+
}
937+
else {
938+
sent = (int)dtlsCtx->sendto(sd, buf, (size_t)sz, ssl->wflags,
939+
(const SOCKADDR*)peer, peerSz);
940+
}
919941

920942
sent = TranslateIoReturnCode(sent, sd, SOCKET_SENDING);
921943

wolfssl/internal.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
#include <wolfssl/wolfcrypt/types.h>
2828
#include <wolfssl/ssl.h>
29+
#include <wolfssl/wolfio.h>
2930
#ifdef HAVE_CRL
3031
#include <wolfssl/crl.h>
3132
#endif
@@ -2730,6 +2731,7 @@ struct WOLFSSL_SOCKADDR {
27302731
void* sa; /* pointer to the sockaddr_in or sockaddr_in6 */
27312732
};
27322733

2734+
#ifdef WOLFSSL_DTLS
27332735
typedef struct WOLFSSL_DTLS_CTX {
27342736
#ifdef WOLFSSL_RW_THREADED
27352737
/* Protect peer access after the handshake */
@@ -2743,6 +2745,8 @@ typedef struct WOLFSSL_DTLS_CTX {
27432745
#endif
27442746
int rfd;
27452747
int wfd;
2748+
WolfSSLRecvFrom recvfrom;
2749+
WolfSSLSento sendto;
27462750
byte userSet:1;
27472751
byte connected:1; /* When set indicates rfd and wfd sockets are
27482752
* connected (connect() and bind() both called).
@@ -2752,6 +2756,7 @@ typedef struct WOLFSSL_DTLS_CTX {
27522756
byte processingPendingRecord:1;
27532757
#endif
27542758
} WOLFSSL_DTLS_CTX;
2759+
#endif
27552760

27562761

27572762
typedef struct WOLFSSL_DTLS_PEERSEQ {

wolfssl/wolfio.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,15 @@ WOLFSSL_LOCAL int BioReceiveInternal(WOLFSSL_BIO* biord, WOLFSSL_BIO* biowr,
624624
char* buf, int sz);
625625
#endif
626626
WOLFSSL_LOCAL int SslBioReceive(WOLFSSL* ssl, char* buf, int sz, void* ctx);
627+
628+
#ifdef WOLFSSL_DTLS
629+
typedef ssize_t (*WolfSSLRecvFrom)(int sockfd, void* buf, size_t len, int flags,
630+
void* src_addr, void* addrlen);
631+
typedef ssize_t (*WolfSSLSento)(int sockfd, const void* buf, size_t len, int flags,
632+
const void* dest_addr, word32 addrlen);
633+
WOLFSSL_API void wolfSSL_SetRecvFrom(WOLFSSL* ssl, WolfSSLRecvFrom recvFrom);
634+
WOLFSSL_API void wolfSSL_SetSendTo(WOLFSSL* ssl, WolfSSLSento sendTo);
635+
#endif
627636
#if defined(USE_WOLFSSL_IO)
628637
/* default IO callbacks */
629638

0 commit comments

Comments
 (0)