diff --git a/channels/chan_rtp.c b/channels/chan_rtp.c index 7d9e26db89d8af07175f18e8992a49b47d3cdd9b..d8f7324c84b82c2f99e20827f50943ed0e5adfc5 100644 --- a/channels/chan_rtp.c +++ b/channels/chan_rtp.c @@ -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 index 0000000000000000000000000000000000000000..ce908ee0376a2759c090815c8532b9143f50188e --- /dev/null +++ b/doc/CHANGES-staging/chan_rtp.txt @@ -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.