diff options
author | Joshua Colp <jcolp@digium.com> | 2015-08-25 09:17:34 -0300 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2015-08-25 13:55:33 -0300 |
commit | d013ecf7486ad4a04d8ccb52340c5e62bb44b6f6 (patch) | |
tree | 2269da22459b95fc71e10faf182430ae47187478 /res/res_pjsip.c | |
parent | 6b8734fe6890dfa4754b07eceaab52a4712297a9 (diff) |
res_pjsip: Add common ast_sip_get_host_ip API.
Modules commonly used the pj_gethostip function for retrieving the
IP address of the host. This function does not cache the result and may
result in a DNS lookup occurring, or additional work. If the DNS
server is unreachable or network issues arise this can cause the
pj_gethostip function to block for a period of time.
This change adds an ast_sip_get_host_ip and ast_sip_get_host_ip_string
function which does the same thing but caches the host IP address at
module load time. This results in no additional work being done each
time the local host IP address is needed.
ASTERISK-25342 #close
Change-Id: I3205deb679b01fa5ac05a94b623bfd620a2abe1e
Diffstat (limited to 'res/res_pjsip.c')
-rw-r--r-- | res/res_pjsip.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/res/res_pjsip.c b/res/res_pjsip.c index 04e16c415..479b8863f 100644 --- a/res/res_pjsip.c +++ b/res/res_pjsip.c @@ -1912,6 +1912,18 @@ static pjsip_endpoint *ast_pjsip_endpoint; static struct ast_threadpool *sip_threadpool; +/*! Local host address for IPv4 */ +static pj_sockaddr host_ip_ipv4; + +/*! Local host address for IPv4 (string form) */ +static char host_ip_ipv4_string[PJ_INET6_ADDRSTRLEN + 2]; + +/*! Local host address for IPv6 */ +static pj_sockaddr host_ip_ipv6; + +/*! Local host address for IPv6 (string form) */ +static char host_ip_ipv6_string[PJ_INET6_ADDRSTRLEN + 2]; + static int register_service_noref(void *data) { pjsip_module **module = data; @@ -3751,6 +3763,30 @@ int ast_sip_create_response(const pjsip_rx_data *rdata, int st_code, return res; } +int ast_sip_get_host_ip(int af, pj_sockaddr *addr) +{ + if (af == pj_AF_INET() && !ast_strlen_zero(host_ip_ipv4_string)) { + pj_sockaddr_copy_addr(addr, &host_ip_ipv4); + return 0; + } else if (af == pj_AF_INET6() && !ast_strlen_zero(host_ip_ipv6_string)) { + pj_sockaddr_copy_addr(addr, &host_ip_ipv6); + return 0; + } + + return -1; +} + +const char *ast_sip_get_host_ip_string(int af) +{ + if (af == pj_AF_INET()) { + return host_ip_ipv4_string; + } else if (af == pj_AF_INET6()) { + return host_ip_ipv6_string; + } + + return NULL; +} + static void remove_request_headers(pjsip_endpoint *endpt) { const pjsip_hdr *request_headers = pjsip_endpt_get_request_headers(endpt); @@ -3865,6 +3901,16 @@ static int load_module(void) return AST_MODULE_LOAD_DECLINE; } + if (!pj_gethostip(pj_AF_INET(), &host_ip_ipv4)) { + pj_sockaddr_print(&host_ip_ipv4, host_ip_ipv4_string, sizeof(host_ip_ipv4_string), 2); + ast_verb(3, "Local IPv4 address determined to be: %s\n", host_ip_ipv4_string); + } + + if (!pj_gethostip(pj_AF_INET6(), &host_ip_ipv6)) { + pj_sockaddr_print(&host_ip_ipv6, host_ip_ipv6_string, sizeof(host_ip_ipv6_string), 2); + ast_verb(3, "Local IPv6 address determined to be: %s\n", host_ip_ipv6_string); + } + if (ast_sip_initialize_system()) { ast_log(LOG_ERROR, "Failed to initialize SIP 'system' configuration section. Aborting load\n"); pj_pool_release(memory_pool); |