Author: file Date: Sat Apr 4 10:40:03 2015 New Revision: 433991 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=433991 Log: Replace the internal PJSIP resolver implementation at a lower level.
Unfortunately there's no easy way to cover all cases where resolution occurs without a change to PJSIP. I've made such a change which allows the resolution process to be taken over by an external implementation. This change has been sent to Teluu for inclusion and I will work with them to ensure it is. As a result though... no changes are required elsewhere to perform resolution using the new DNS work. It's just happening. This also fixes a bug with resolution of an IP address where the addresses structure was filled with garbage. Modified: team/group/dns_pjsip/include/asterisk/res_pjsip.h team/group/dns_pjsip/res/res_pjsip.c team/group/dns_pjsip/res/res_pjsip/include/res_pjsip_private.h team/group/dns_pjsip/res/res_pjsip/pjsip_resolver.c team/group/dns_pjsip/res/res_pjsip_session.c Modified: team/group/dns_pjsip/include/asterisk/res_pjsip.h URL: http://svnview.digium.com/svn/asterisk/team/group/dns_pjsip/include/asterisk/res_pjsip.h?view=diff&rev=433991&r1=433990&r2=433991 ============================================================================== --- team/group/dns_pjsip/include/asterisk/res_pjsip.h (original) +++ team/group/dns_pjsip/include/asterisk/res_pjsip.h Sat Apr 4 10:40:03 2015 @@ -1954,26 +1954,4 @@ */ unsigned int ast_sip_get_keep_alive_interval(void); -/*! - * \brief Callback which is invoked upon completion of the resolution process - * - * \param data The user specific data - * \param addresses The resolved target addresses - */ -typedef void (*ast_sip_resolve_callback)(void *data, pjsip_server_addresses *addresses); - -/*! - * \brief Perform DNS resolution according to RFC3263 and invoke a callback upon completion - * - * \param target The target we are looking up - * \param callback The callback to invoke upon completion - * \param data User specific data (must be ao2 allocated) - * - * \retval 0 success - * \retval -1 failure - * - * \note This function bumps the reference count of user data, it does not steal - */ -int ast_sip_resolve(const pjsip_host_info *target, ast_sip_resolve_callback callback, void *user_data); - #endif /* _RES_PJSIP_H */ Modified: team/group/dns_pjsip/res/res_pjsip.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns_pjsip/res/res_pjsip.c?view=diff&rev=433991&r1=433990&r2=433991 ============================================================================== --- team/group/dns_pjsip/res/res_pjsip.c (original) +++ team/group/dns_pjsip/res/res_pjsip.c Sat Apr 4 10:40:03 2015 @@ -2978,73 +2978,17 @@ return 0; } -struct sip_send_request_data { - struct pjsip_dialog *dlg; - struct ast_sip_endpoint *endpoint; - void *token; - void (*callback)(void *token, pjsip_event *e); - pjsip_tx_data *tdata; -}; - -static void sip_send_request_data_destroy(void *data) -{ - struct sip_send_request_data *send_request_data = data; - - if (send_request_data->dlg) { - pjsip_dlg_dec_session(send_request_data->dlg, &supplement_module); - } - - ao2_cleanup(send_request_data->endpoint); - ao2_cleanup(send_request_data->token); -} - -static void sip_send_request_resolve_cb(void *data, pjsip_server_addresses *addresses) -{ - struct sip_send_request_data *send_request_data = data; - - memcpy(&(send_request_data->tdata->dest_info.addr), addresses, sizeof(send_request_data->tdata->dest_info.addr)); - - if (send_request_data->dlg) { - send_in_dialog_request(send_request_data->tdata, send_request_data->dlg); - } else { - send_out_of_dialog_request(send_request_data->tdata, send_request_data->endpoint, - send_request_data->token, send_request_data->callback); - } -} - int ast_sip_send_request(pjsip_tx_data *tdata, struct pjsip_dialog *dlg, struct ast_sip_endpoint *endpoint, void *token, void (*callback)(void *token, pjsip_event *e)) { - pjsip_host_info target; - struct sip_send_request_data *send_request_data; - int res; - ast_assert(tdata->msg->type == PJSIP_REQUEST_MSG); - if (pjsip_get_request_dest(tdata, &target) != PJ_SUCCESS) { - return -1; - } - - send_request_data = ao2_alloc_options(sizeof(*send_request_data), sip_send_request_data_destroy, - AO2_ALLOC_OPT_LOCK_NOLOCK); - if (!send_request_data) { - return -1; - } - if (dlg) { - send_request_data->dlg = dlg; - pjsip_dlg_inc_session(dlg, &supplement_module); - } - send_request_data->endpoint = ao2_bump(endpoint); - send_request_data->token = ao2_bump(token); - send_request_data->callback = callback; - send_request_data->tdata = tdata; - - res = ast_sip_resolve(&target, sip_send_request_resolve_cb, send_request_data); - ao2_ref(send_request_data, -1); - - return res; + return send_in_dialog_request(tdata, dlg); + } else { + return send_out_of_dialog_request(tdata, endpoint, token, callback); + } } int ast_sip_set_outbound_proxy(pjsip_tx_data *tdata, const char *proxy) @@ -3431,7 +3375,6 @@ { ast_res_pjsip_reload_configuration(); ast_res_pjsip_init_options_handling(1); - ast_sip_initialize_dns(); return 0; } @@ -3498,7 +3441,7 @@ return AST_MODULE_LOAD_DECLINE; } - ast_sip_initialize_dns(); + ast_sip_initialize_resolver(); pjsip_tsx_layer_init_module(ast_pjsip_endpoint); pjsip_ua_init_module(ast_pjsip_endpoint, NULL); Modified: team/group/dns_pjsip/res/res_pjsip/include/res_pjsip_private.h URL: http://svnview.digium.com/svn/asterisk/team/group/dns_pjsip/res/res_pjsip/include/res_pjsip_private.h?view=diff&rev=433991&r1=433990&r2=433991 ============================================================================== --- team/group/dns_pjsip/res/res_pjsip/include/res_pjsip_private.h (original) +++ team/group/dns_pjsip/res/res_pjsip/include/res_pjsip_private.h Sat Apr 4 10:40:03 2015 @@ -232,6 +232,12 @@ /*! * \internal + * \brief Initialize our own resolver support + */ +void ast_sip_initialize_resolver(void); + +/*! + * \internal * \brief Initialize global configuration * * \retval 0 Success Modified: team/group/dns_pjsip/res/res_pjsip/pjsip_resolver.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns_pjsip/res/res_pjsip/pjsip_resolver.c?view=diff&rev=433991&r1=433990&r2=433991 ============================================================================== --- team/group/dns_pjsip/res/res_pjsip/pjsip_resolver.c (original) +++ team/group/dns_pjsip/res/res_pjsip/pjsip_resolver.c Sat Apr 4 10:40:03 2015 @@ -52,9 +52,9 @@ /*! \brief Active queries */ struct ast_dns_query_set *queries; /*! \brief Callback to invoke upon completion */ - ast_sip_resolve_callback callback; + pjsip_resolver_callback *callback; /*! \brief User provided data */ - void *user_data; + void *token; }; /*! \brief Destructor for resolution data */ @@ -65,7 +65,6 @@ AST_VECTOR_FREE(&resolve->resolving); AST_VECTOR_FREE(&resolve->resolved); ao2_cleanup(resolve->queries); - ao2_cleanup(resolve->user_data); } /*! \brief Perform resolution but keep transport and port information */ @@ -126,7 +125,7 @@ } ast_debug(2, "[%p] Invoking user callback with '%d' addresses\n", resolve, addresses.count); - resolve->callback(resolve->user_data, &addresses); + resolve->callback(PJ_SUCCESS, resolve->token, &addresses); ao2_ref(resolve, -1); @@ -232,7 +231,8 @@ return 0; } -int ast_sip_resolve(const pjsip_host_info *target, ast_sip_resolve_callback callback, void *user_data) +static void sip_resolve(pjsip_resolver_t *resolver, pj_pool_t *pool, const pjsip_host_info *target, + void *token, pjsip_resolver_callback *cb) { int ip_addr_ver; pjsip_transport_type_e type = target->type; @@ -269,7 +269,10 @@ /* If it's already an address call the callback immediately */ if (ip_addr_ver) { - pjsip_server_addresses addresses; + pjsip_server_addresses addresses = { + .entry[0].type = PJSIP_TRANSPORT_UDP, + .count = 1, + }; if (ip_addr_ver == 4) { pj_sockaddr_init(pj_AF_INET(), &addresses.entry[0].addr, NULL, 0); @@ -277,28 +280,29 @@ } else { pj_sockaddr_init(pj_AF_INET6(), &addresses.entry[0].addr, NULL, 0); pj_inet_pton(pj_AF_INET6(), &target->addr.host, &addresses.entry[0].addr.ipv6.sin6_addr); - type = (pjsip_transport_type_e)((int)type + PJSIP_TRANSPORT_IPV6); - } - addresses.count++; + addresses.entry[0].type = (pjsip_transport_type_e)((int)addresses.entry[0].type + PJSIP_TRANSPORT_IPV6); + } ast_debug(2, "Target '%s' is an IP address, skipping resolution\n", host); - callback(user_data, &addresses); - - return 0; + cb(PJ_SUCCESS, token, &addresses); + + return; } resolve = ao2_alloc_options(sizeof(*resolve), sip_resolve_destroy, AO2_ALLOC_OPT_LOCK_NOLOCK); if (!resolve) { - return -1; - } - - resolve->callback = callback; - resolve->user_data = ao2_bump(user_data); + cb(PJ_EINVAL, token, NULL); + return; + } + + resolve->callback = cb; + resolve->token = token; if (AST_VECTOR_INIT(&resolve->resolving, 2) || AST_VECTOR_INIT(&resolve->resolved, 2)) { ao2_ref(resolve, -1); - return -1; + cb(PJ_EINVAL, token, NULL); + return; } ast_debug(2, "[%p] Created resolution tracking for target '%s'\n", resolve, host); @@ -324,13 +328,24 @@ if (res) { ao2_ref(resolve, -1); - return -1; + cb(PJ_EINVAL, token, NULL); + return; } ast_debug(2, "[%p] Starting initial resolution using parallel queries for target '%s'\n", resolve, host); ast_dns_query_set_resolve_async(resolve->queries, sip_resolve_callback, resolve); ao2_ref(resolve, -1); - +} + +static int sip_replace_resolver(void *data) +{ + pjsip_endpt_set_resolver_implementation(ast_sip_get_pjsip_endpoint(), sip_resolve); return 0; +} + +void ast_sip_initialize_resolver(void) +{ + /* Replace the existing PJSIP resolver with our own implementation */ + ast_sip_push_task_synchronous(NULL, sip_replace_resolver, NULL); } Modified: team/group/dns_pjsip/res/res_pjsip_session.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns_pjsip/res/res_pjsip_session.c?view=diff&rev=433991&r1=433990&r2=433991 ============================================================================== --- team/group/dns_pjsip/res/res_pjsip_session.c (original) +++ team/group/dns_pjsip/res/res_pjsip_session.c Sat Apr 4 10:40:03 2015 @@ -1050,15 +1050,10 @@ .on_rx_request = session_reinvite_on_rx_request, }; -static void sip_session_resolve_cb(void *data, pjsip_server_addresses *addresses) -{ -} - void ast_sip_session_send_request_with_cb(struct ast_sip_session *session, pjsip_tx_data *tdata, ast_sip_session_response_cb on_response) { pjsip_inv_session *inv_session = session->inv_session; - pjsip_host_info target; if (inv_session->state == PJSIP_INV_STATE_DISCONNECTED) { /* Don't try to do anything with a hung-up call */ @@ -1082,9 +1077,6 @@ } handle_outgoing_request(session, tdata); - - pjsip_get_request_dest(tdata, &target); - ast_sip_resolve(&target, sip_session_resolve_cb, NULL); pjsip_inv_send_msg(session->inv_session, tdata); return; -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits