From 0c486e7edf9afae2e649aba47be2464e9a25db38 Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Thu, 14 Nov 2019 06:19:04 -0400 Subject: [PATCH] res_rtp_asterisk: Always return provided DTLS packet length. OpenSSL can not tolerate if the packet sent out does not match the length that it provided to the sender. This change lies and says that each time the full packet was sent. If a problem does occur then a retransmission will occur as appropriate. ASTERISK-28576 Change-Id: Id42455b15c9dc4eb987c8c023ece6fbf3c22a449 --- res/res_rtp_asterisk.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c index 19c73380a9..bac57344ef 100644 --- a/res/res_rtp_asterisk.c +++ b/res/res_rtp_asterisk.c @@ -660,6 +660,10 @@ static int dtls_bio_write(BIO *bio, const char *buf, int len) struct ast_sockaddr remote_address = { {0, } }; int ice; + /* OpenSSL can't tolerate a packet not being sent, so we always state that + * we sent the packet. If it isn't then retransmission will occur. + */ + if (rtp->rtcp && rtp->rtcp->dtls.write_bio == bio) { rtcp = 1; ast_sockaddr_copy(&remote_address, &rtp->rtcp->them); @@ -668,10 +672,12 @@ static int dtls_bio_write(BIO *bio, const char *buf, int len) } if (ast_sockaddr_isnull(&remote_address)) { - return 0; + return len; } - return __rtp_sendto(instance, (char *)buf, len, 0, &remote_address, rtcp, &ice, 0); + __rtp_sendto(instance, (char *)buf, len, 0, &remote_address, rtcp, &ice, 0); + + return len; } static long dtls_bio_ctrl(BIO *bio, int cmd, long arg1, void *arg2)