mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-04 20:04:50 +00:00
res_pjsip: Enable PJSIP DNS client support.
This change enables DNS client support within PJSIP. System nameservers are automatically discovered using res_init or res_ninit. If this fails then PJSIP will resort to using gethostbyname for resolution. By enabling this support we gain SRV support, failover, and weight support. (closes issue ASTERISK-23435) Reported by: Matt Jordan Review: https://reviewboard.asterisk.org/r/3343/ ........ Merged revisions 410795 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@410796 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
#include "asterisk/sorcery.h"
|
||||
#include "include/res_pjsip_private.h"
|
||||
#include "asterisk/threadpool.h"
|
||||
#include "asterisk/dns.h"
|
||||
|
||||
#define TIMER_T1_MIN 100
|
||||
#define DEFAULT_TIMER_T1 500
|
||||
@@ -174,3 +175,70 @@ void ast_sip_destroy_system(void)
|
||||
ast_sorcery_unref(system_sorcery);
|
||||
}
|
||||
|
||||
static int system_create_resolver_and_set_nameservers(void *data)
|
||||
{
|
||||
struct ao2_container *discovered_nameservers;
|
||||
struct ao2_iterator it_nameservers;
|
||||
char *nameserver;
|
||||
pj_status_t status;
|
||||
pj_dns_resolver *resolver;
|
||||
pj_str_t nameservers[PJ_DNS_RESOLVER_MAX_NS];
|
||||
unsigned int count = 0;
|
||||
|
||||
discovered_nameservers = ast_dns_get_nameservers();
|
||||
if (!discovered_nameservers) {
|
||||
ast_log(LOG_ERROR, "Could not retrieve local system nameservers, resorting to system resolution\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!ao2_container_count(discovered_nameservers)) {
|
||||
ast_log(LOG_ERROR, "There are no local system nameservers configured, resorting to system resolution\n");
|
||||
ao2_ref(discovered_nameservers, -1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!(resolver = pjsip_endpt_get_resolver(ast_sip_get_pjsip_endpoint()))) {
|
||||
status = pjsip_endpt_create_resolver(ast_sip_get_pjsip_endpoint(), &resolver);
|
||||
if (status != PJ_SUCCESS) {
|
||||
ast_log(LOG_ERROR, "Could not create DNS resolver(%d), resorting to system resolution\n", status);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
it_nameservers = ao2_iterator_init(discovered_nameservers, 0);
|
||||
while ((nameserver = ao2_iterator_next(&it_nameservers))) {
|
||||
pj_strset2(&nameservers[count++], nameserver);
|
||||
ao2_ref(nameserver, -1);
|
||||
|
||||
if (count == (PJ_DNS_RESOLVER_MAX_NS - 1)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
ao2_iterator_destroy(&it_nameservers);
|
||||
|
||||
status = pj_dns_resolver_set_ns(resolver, count, nameservers, NULL);
|
||||
|
||||
/* Since we no longer need the nameservers we can drop the list of them */
|
||||
ao2_ref(discovered_nameservers, -1);
|
||||
|
||||
if (status != PJ_SUCCESS) {
|
||||
ast_log(LOG_ERROR, "Could not set nameservers on DNS resolver in PJSIP(%d), resorting to system resolution\n",
|
||||
status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!pjsip_endpt_get_resolver(ast_sip_get_pjsip_endpoint())) {
|
||||
status = pjsip_endpt_set_resolver(ast_sip_get_pjsip_endpoint(), resolver);
|
||||
if (status != PJ_SUCCESS) {
|
||||
ast_log(LOG_ERROR, "Could not set DNS resolver in PJSIP(%d), resorting to system resolution\n", status);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ast_sip_initialize_dns(void)
|
||||
{
|
||||
ast_sip_push_task_synchronous(NULL, system_create_resolver_and_set_nameservers, NULL);
|
||||
}
|
Reference in New Issue
Block a user