chan_rtp: Accept hostname as well as ip address as destination
authorGeorge Joseph <gjoseph@digium.com>
Wed, 21 Aug 2019 18:29:57 +0000 (12:29 -0600)
committerGeorge Joseph <gjoseph@digium.com>
Thu, 22 Aug 2019 12:39:50 +0000 (07:39 -0500)
The UnicastRTP channel driver provided by chan_rtp now accepts
"<hostname>:<port>" as an alternative to "<ip_address>:<port>"
in the destination. The first AAAA (preferred) or A record resolved
will be used as the destination. The lookup is synchronous so beware
of possible dialplan delays if you specify a hostname.

Change-Id: Ie6f95b983a8792bf0dacc64c7953a41032dba677

channels/chan_rtp.c
doc/CHANGES-staging/chan_rtp.txt [new file with mode: 0644]

index 7d9e26d..d8f7324 100644 (file)
@@ -43,6 +43,7 @@
 #include "asterisk/causes.h"
 #include "asterisk/format_cache.h"
 #include "asterisk/multicast_rtp.h"
+#include "asterisk/dns_core.h"
 
 /* Forward declarations */
 static struct ast_channel *multicast_rtp_request(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause);
@@ -293,9 +294,23 @@ static struct ast_channel *unicast_rtp_request(const char *type, struct ast_form
                ast_log(LOG_ERROR, "Destination is required for the 'UnicastRTP' channel\n");
                goto failure;
        }
+
        if (!ast_sockaddr_parse(&address, args.destination, PARSE_PORT_REQUIRE)) {
-               ast_log(LOG_ERROR, "Destination '%s' could not be parsed\n", args.destination);
-               goto failure;
+           int rc;
+           char *host;
+           char *port;
+
+           rc = ast_sockaddr_split_hostport(args.destination, &host, &port, PARSE_PORT_REQUIRE);
+           if (!rc) {
+               ast_log(LOG_ERROR, "Unable to parse destination '%s' into host and port\n", args.destination);
+               goto failure;
+           }
+
+           rc = ast_dns_resolve_ipv6_and_ipv4(&address, host, port);
+           if (rc != 0) {
+               ast_log(LOG_ERROR, "Unable to resolve host '%s'\n", host);
+               goto failure;
+           }
        }
 
        if (!ast_strlen_zero(args.options)
diff --git a/doc/CHANGES-staging/chan_rtp.txt b/doc/CHANGES-staging/chan_rtp.txt
new file mode 100644 (file)
index 0000000..ce908ee
--- /dev/null
@@ -0,0 +1,7 @@
+Subject: chan_rtp
+
+The UnicastRTP channel driver provided by chan_rtp now accepts
+"<hostname>:<port>" as an alternative to "<ip_address>:<port>" in the destination.
+The first AAAA (preferred) or A record resolved will be used as the destination.
+The lookup is synchronous so beware of possible dialplan delays if you specify a
+hostname.