From e00b7b9472bcf5e59f622cc1081b7d8ef54828ed Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Thu, 30 Aug 2018 11:24:56 +0200 Subject: [PATCH] RTP UDP: Resolve rather to IPv4-mapped addrs This will cause that unless user requests explicitly IPv4, IPv6 socket accepting also IPv4 traffic will be opened. This fixes potential issues when host specifies IPv4 address (or hostname resolvable to IPv4), thus opens IPv4 socket. But the other peer uses IPv6 address of the host which causes that the host doesn't receive anything. --- src/hd-rum-translator/hd-rum-translator.cpp | 2 +- src/main.cpp | 2 +- src/rtp/net_udp.cpp | 5 +++-- src/rtp/rtp.c | 2 +- src/video_capture/rtsp.cpp | 2 +- src/video_capture/ug_input.cpp | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/hd-rum-translator/hd-rum-translator.cpp b/src/hd-rum-translator/hd-rum-translator.cpp index cff7cab9d..3e2e39c3f 100644 --- a/src/hd-rum-translator/hd-rum-translator.cpp +++ b/src/hd-rum-translator/hd-rum-translator.cpp @@ -706,7 +706,7 @@ int main(int argc, char **argv) state.qhead = state.qtail = state.queue = qinit(qsize); /* input socket */ - if ((sock_in = udp_init_if("::1", NULL, params.port, 0, 255, false, false)) == NULL) { + if ((sock_in = udp_init_if("localhost", NULL, params.port, 0, 255, false, false)) == NULL) { perror("input socket"); return 2; } diff --git a/src/main.cpp b/src/main.cpp index 7dd520b13..b760a3592 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -506,7 +506,7 @@ int main(int argc, char *argv[]) unsigned requested_mtu = 0; const char *postprocess = NULL; const char *requested_display = "none"; - const char *requested_receiver = "::1"; + const char *requested_receiver = "localhost"; const char *requested_encryption = NULL; struct exporter *exporter = NULL; diff --git a/src/rtp/net_udp.cpp b/src/rtp/net_udp.cpp index 1907ca8cc..8c3d314c8 100644 --- a/src/rtp/net_udp.cpp +++ b/src/rtp/net_udp.cpp @@ -1268,7 +1268,8 @@ static int resolve_address(socket_udp *s, const char *addr, uint16_t tx_port) memset(&hints, 0, sizeof(hints)); switch (s->local->mode) { case 0: - hints.ai_family = AF_UNSPEC; + hints.ai_family = AF_INET6; + hints.ai_flags = AI_V4MAPPED | AI_ALL; break; case IPv4: hints.ai_family = AF_INET; @@ -1454,7 +1455,7 @@ static void udp_clean_async_state(socket_udp *s) bool udp_is_ipv6(socket_udp *s) { - return s->local->mode == IPv6; + return s->local->mode == IPv6 && !IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *) &s->sock)->sin6_addr); } bool udp_port_pair_is_free(const char *addr, int force_ip_version, int even_port) diff --git a/src/rtp/rtp.c b/src/rtp/rtp.c index c9c31a69a..90837931e 100644 --- a/src/rtp/rtp.c +++ b/src/rtp/rtp.c @@ -1212,7 +1212,7 @@ rtp_t rtp_init_with_udp_socket(struct socket_udp_local *l, struct sockaddr *sa, session->send_rtcp_to_origin = true; session->rtp_socket = udp_init_with_local(l, sa, len); - session->rtcp_socket = udp_init_if("::1", NULL, 0, 0, ttl, true, false); + session->rtcp_socket = udp_init_if("localhost", NULL, 0, 0, ttl, true, false); init_opt(session); diff --git a/src/video_capture/rtsp.cpp b/src/video_capture/rtsp.cpp index 1ce408fac..91fb5bfd4 100644 --- a/src/video_capture/rtsp.cpp +++ b/src/video_capture/rtsp.cpp @@ -612,7 +612,7 @@ vidcap_rtsp_init(const struct vidcap_params *params, void **state) { s->should_exit = FALSE; - s->vrtsp_state->device = rtp_init_if("::1", s->vrtsp_state->mcast_if, s->vrtsp_state->port, 0, s->vrtsp_state->ttl, s->vrtsp_state->rtcp_bw, + s->vrtsp_state->device = rtp_init_if("localhost", s->vrtsp_state->mcast_if, s->vrtsp_state->port, 0, s->vrtsp_state->ttl, s->vrtsp_state->rtcp_bw, 0, rtp_recv_callback, (uint8_t *) s->vrtsp_state->participants, 0, true); if (s->vrtsp_state->device != NULL) { diff --git a/src/video_capture/ug_input.cpp b/src/video_capture/ug_input.cpp index 370e0a315..c56b06f40 100644 --- a/src/video_capture/ug_input.cpp +++ b/src/video_capture/ug_input.cpp @@ -116,7 +116,7 @@ static int vidcap_ug_input_init(const struct vidcap_params *cap_params, void **s //RTP params["mtu"].i = 9000; // doesn't matter anyway... // should be localhost and RX TX ports the same (here dynamic) in order to work like a pipe - params["receiver"].ptr = (void *) "::1"; + params["receiver"].ptr = (void *) "localhost"; if (isdigit(vidcap_params_get_fmt(cap_params)[0])) params["rx_port"].i = atoi(vidcap_params_get_fmt(cap_params)); else