[asterisk-commits] file: branch group/dns_pjsip r433991 - in /team/group/dns_pjsip: include/aste...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Apr 4 10:40:14 CDT 2015


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;




More information about the asterisk-commits mailing list