aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimo Rothenpieler <timo@rothenpieler.org>2025-07-12 21:42:59 +0200
committerTimo Rothenpieler <timo@rothenpieler.org>2025-07-16 18:46:55 +0200
commit87b09f3931fea37a8578d90c6700d73031dc958f (patch)
treef2c98a065ac29517de8a3631966c74f9b5ab8ec4
parent9c55f22ef234046dfd47ae414f59e9e2c1530263 (diff)
downloadffmpeg-87b09f3931fea37a8578d90c6700d73031dc958f.tar.gz
avformat/tls_openssl: set dtls remote addr in listen mode
Taken from the first received packet, which will signify the now permanent peer of this DTLS "connection".
-rw-r--r--libavformat/tls_openssl.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/libavformat/tls_openssl.c b/libavformat/tls_openssl.c
index 2a01fb387d..f6826222f9 100644
--- a/libavformat/tls_openssl.c
+++ b/libavformat/tls_openssl.c
@@ -465,6 +465,8 @@ typedef struct TLSContext {
BIO_METHOD* url_bio_method;
int io_err;
char error_message[256];
+ struct sockaddr_storage dest_addr;
+ socklen_t dest_addr_len;
} TLSContext;
/**
@@ -575,9 +577,23 @@ static int url_bio_destroy(BIO *b)
static int url_bio_bread(BIO *b, char *buf, int len)
{
TLSContext *c = BIO_get_data(b);
+ TLSShared *s = &c->tls_shared;
int ret = ffurl_read(c->tls_shared.is_dtls ? c->tls_shared.udp : c->tls_shared.tcp, buf, len);
- if (ret >= 0)
+ if (ret >= 0) {
+ if (s->is_dtls && s->listen && !c->dest_addr_len) {
+ int err_ret;
+
+ ff_udp_get_last_recv_addr(s->udp, &c->dest_addr, &c->dest_addr_len);
+ err_ret = ff_udp_set_remote_addr(s->udp, (struct sockaddr *)&c->dest_addr, c->dest_addr_len, 1);
+ if (err_ret < 0) {
+ av_log(c, AV_LOG_ERROR, "Failed connecting udp context\n");
+ return err_ret;
+ }
+ av_log(c, AV_LOG_TRACE, "Set UDP remote addr on UDP socket, now 'connected'\n");
+ }
+
return ret;
+ }
BIO_clear_retry_flags(b);
if (ret == AVERROR_EXIT)
return 0;