From 6097d2904546a47d95692948882d354cd184b77f Mon Sep 17 00:00:00 2001 From: John Safranek Date: Mon, 23 Jan 2017 10:16:04 -0800 Subject: [PATCH] DTLS Multicast 1. Restore original EmbedRecvFrom callback. 2. Add new EmbedRecvFromMcast callback. (EmbedSendTo still the same.) 3. Set new receive from callback when setting the member ID. 4. Fixed bad rebase change. --- src/io.c | 67 +++++++++++++++++++++++++++++++++++++++++----- src/ssl.c | 3 +++ wolfssl/internal.h | 4 +-- 3 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/io.c b/src/io.c index 652c5643b..3791c0bbb 100644 --- a/src/io.c +++ b/src/io.c @@ -293,12 +293,12 @@ int EmbedReceiveFrom(WOLFSSL *ssl, char *buf, int sz, void *ctx) } } else { -// if (dtlsCtx->peer.sz > 0 -// && peerSz != (XSOCKLENT)dtlsCtx->peer.sz -// && XMEMCMP(&peer, dtlsCtx->peer.sa, peerSz) != 0) { -// WOLFSSL_MSG(" Ignored packet from invalid peer"); -// return WOLFSSL_CBIO_ERR_WANT_READ; -// } + if (dtlsCtx->peer.sz > 0 + && peerSz != (XSOCKLENT)dtlsCtx->peer.sz + && XMEMCMP(&peer, dtlsCtx->peer.sa, peerSz) != 0) { + WOLFSSL_MSG(" Ignored packet from invalid peer"); + return WOLFSSL_CBIO_ERR_WANT_READ; + } } return recvd; @@ -354,6 +354,61 @@ int EmbedSendTo(WOLFSSL* ssl, char *buf, int sz, void *ctx) } +#ifdef WOLFSSL_MULTICAST + +/* The alternate receive embedded callback for Multicast + * return : nb bytes read, or error + */ +int EmbedReceiveFromMcast(WOLFSSL *ssl, char *buf, int sz, void *ctx) +{ + WOLFSSL_DTLS_CTX* dtlsCtx = (WOLFSSL_DTLS_CTX*)ctx; + int recvd; + int err; + int sd = dtlsCtx->rfd; + + WOLFSSL_ENTER("EmbedReceiveFromMcast()"); + + recvd = (int)RECVFROM_FUNCTION(sd, buf, sz, ssl->rflags, NULL, NULL); + + recvd = TranslateReturnCode(recvd, sd); + + if (recvd < 0) { + err = LastError(); + WOLFSSL_MSG("Embed Receive From error"); + + if (err == SOCKET_EWOULDBLOCK || err == SOCKET_EAGAIN) { + if (wolfSSL_get_using_nonblock(ssl)) { + WOLFSSL_MSG("\tWould block"); + return WOLFSSL_CBIO_ERR_WANT_READ; + } + else { + WOLFSSL_MSG("\tSocket timeout"); + return WOLFSSL_CBIO_ERR_TIMEOUT; + } + } + else if (err == SOCKET_ECONNRESET) { + WOLFSSL_MSG("\tConnection reset"); + return WOLFSSL_CBIO_ERR_CONN_RST; + } + else if (err == SOCKET_EINTR) { + WOLFSSL_MSG("\tSocket interrupted"); + return WOLFSSL_CBIO_ERR_ISR; + } + else if (err == SOCKET_ECONNREFUSED) { + WOLFSSL_MSG("\tConnection refused"); + return WOLFSSL_CBIO_ERR_WANT_READ; + } + else { + WOLFSSL_MSG("\tGeneral error"); + return WOLFSSL_CBIO_ERR_GENERAL; + } + } + + return recvd; +} +#endif /* WOLFSSL_MULTICAST */ + + /* The DTLS Generate Cookie callback * return : number of bytes copied into buf, or error */ diff --git a/src/ssl.c b/src/ssl.c index 8c0ce7585..c0871ec71 100755 --- a/src/ssl.c +++ b/src/ssl.c @@ -859,6 +859,9 @@ int wolfSSL_CTX_mcast_set_member_id(WOLFSSL_CTX* ctx, word16 id) ctx->haveEMS = 0; ctx->haveMcast = 1; ctx->mcastID = id; +#ifndef WOLFSSL_USER_IO + ctx->CBIORecv = EmbedReceiveFromMcast; +#endif /* WOLFSSL_USER_IO */ } if (ret == 0) diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 3459212f1..d1911b259 100755 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -2872,13 +2872,11 @@ typedef struct Options { #endif #ifdef WOLFSSL_DTLS word16 dtlsHsRetain:1; /* DTLS retaining HS data */ + word16 haveMcast:1; /* using multicast ? */ #ifdef WOLFSSL_SCTP word16 dtlsSctp:1; /* DTLS-over-SCTP mode */ #endif #endif - word16 haveMcast:1; /* using multicast ? */ -#endif - word16 haveEMS:1; /* using extended master secret */ #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SUPPORTED_CURVES) word16 userCurves:1; /* indicates user called wolfSSL_UseSupportedCurve */ #endif