[Asterisk-code-review] chan pjsip: Multidomain endpoint finding on call (asterisk[13])

Norbert Varga asteriskteam at digium.com
Fri Jan 13 11:30:39 CST 2017


Norbert Varga has uploaded a new change for review. ( https://gerrit.asterisk.org/4719 )

Change subject: chan_pjsip: Multidomain endpoint finding on call
......................................................................

chan_pjsip: Multidomain endpoint finding on call

When PJSIP tries to call an endpoint with a domain (e.g. 1000 at test.com),
the user part is stripped down as it would be a trunk with a specified user,
and only the host part is called as a PJSIP endpoint and can't be found.
This is not correct in the case of a multidomain SIP account, so the stripping
after the @ sign is done only if the whole endpoint (in multidomain case
1000 at test.com) can't be found.

Change-Id: I3a2dd6f57f3bd042df46b961eccd81d31ab202e6
---
M channels/chan_pjsip.c
1 file changed, 23 insertions(+), 11 deletions(-)


  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/19/4719/1

diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c
index 6e3d087..50174a8 100644
--- a/channels/chan_pjsip.c
+++ b/channels/chan_pjsip.c
@@ -2078,22 +2078,34 @@
 
 	AST_NONSTANDARD_APP_ARGS(args, tmp, '/');
 
-	/* If a request user has been specified extract it from the endpoint name portion */
-	if ((endpoint_name = strchr(args.endpoint, '@'))) {
-		request_user = args.endpoint;
-		*endpoint_name++ = '\0';
-	} else {
-		endpoint_name = args.endpoint;
-	}
-
+	/* First try to find an exact endpoint match, for single (user) or multi-domain (user at domain) */
+	endpoint_name = args.endpoint;
 	if (ast_strlen_zero(endpoint_name)) {
 		ast_log(LOG_ERROR, "Unable to create PJSIP channel with empty endpoint name\n");
 		req_data->cause = AST_CAUSE_CHANNEL_UNACCEPTABLE;
 		return -1;
 	} else if (!(endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", endpoint_name))) {
-		ast_log(LOG_ERROR, "Unable to create PJSIP channel - endpoint '%s' was not found\n", endpoint_name);
-		req_data->cause = AST_CAUSE_NO_ROUTE_DESTINATION;
-		return -1;
+		/* It seems it's not a multi-domain endpoint or single endpoint,
+		 * it's possible that it's a SIP trunk with a specified user (user at trunkname),
+		 * so extract the user before @ sign.
+		 */
+		if ((endpoint_name = strchr(args.endpoint, '@'))) {
+			ast_log(LOG_VERBOSE, "Extract user portion from endpoint\n");
+			request_user = args.endpoint;
+			*endpoint_name++ = '\0';
+		}
+
+		if (ast_strlen_zero(endpoint_name)) {
+			ast_log(LOG_ERROR, "Unable to create PJSIP channel with empty endpoint name\n");
+			req_data->cause = AST_CAUSE_CHANNEL_UNACCEPTABLE;
+			return -1;
+		}
+
+		if (!(endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", endpoint_name))) {
+			ast_log(LOG_ERROR, "Unable to create PJSIP channel - endpoint '%s' was not found\n", endpoint_name);
+			req_data->cause = AST_CAUSE_NO_ROUTE_DESTINATION;
+			return -1;
+		}
 	}
 
 	if (!(session = ast_sip_session_create_outgoing(endpoint, NULL, args.aor, request_user, req_data->caps))) {

-- 
To view, visit https://gerrit.asterisk.org/4719
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3a2dd6f57f3bd042df46b961eccd81d31ab202e6
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-Owner: Norbert Varga <vnorbix at gmail.com>



More information about the asterisk-code-review mailing list