[svn-commits] kharwell: trunk r433029 - in /trunk: ./ configs/samples/ contrib/ast-db-manag...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Mar 17 13:22:23 CDT 2015


Author: kharwell
Date: Tue Mar 17 13:22:20 2015
New Revision: 433029

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=433029
Log:
res_pjsip: Allow configuration of endpoint identifier query order

This patch fixes previously reverted code that caused binary incompatibility
problems with some modules. And like the original patch it makes sure that
no matter what order the endpoint identifier modules were loaded, priority is
given based on the ones specified in the new global 'endpoint_identifier_order'
option.

ASTERISK-24840
Reported by: Mark Michelson
Review: https://reviewboard.asterisk.org/r/4489/
........

Merged revisions 433028 from http://svn.asterisk.org/svn/asterisk/branches/13

Modified:
    trunk/   (props changed)
    trunk/CHANGES
    trunk/configs/samples/pjsip.conf.sample
    trunk/contrib/ast-db-manage/config/versions/45e3f47c6c44_add_pjsip_endpoint_identifier_order.py
    trunk/include/asterisk/res_pjsip.h
    trunk/res/res_pjsip.c
    trunk/res/res_pjsip/config_global.c
    trunk/res/res_pjsip_endpoint_identifier_anonymous.c
    trunk/res/res_pjsip_endpoint_identifier_ip.c
    trunk/res/res_pjsip_endpoint_identifier_user.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-13-merged' - no diff available.

Modified: trunk/CHANGES
URL: http://svnview.digium.com/svn/asterisk/trunk/CHANGES?view=diff&rev=433029&r1=433028&r2=433029
==============================================================================
--- trunk/CHANGES (original)
+++ trunk/CHANGES Tue Mar 17 13:22:20 2015
@@ -123,6 +123,12 @@
    on the channel to a specified endpoint or destination. In the case of SIP
    technologies, this is either a 302 Redirect response to an on-going INVITE
    dialog or a SIP REFER request.
+
+res_pjsip
+------------------
+ * A new 'endpoint_identifier_order' option has been added that allows one to
+   set the order by which endpoint identifiers are processed and checked. This
+   option is specified under the 'global' type configuration section.
 
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 13.1.0 to Asterisk 13.2.0 ------------

Modified: trunk/configs/samples/pjsip.conf.sample
URL: http://svnview.digium.com/svn/asterisk/trunk/configs/samples/pjsip.conf.sample?view=diff&rev=433029&r1=433028&r2=433029
==============================================================================
--- trunk/configs/samples/pjsip.conf.sample (original)
+++ trunk/configs/samples/pjsip.conf.sample Tue Mar 17 13:22:20 2015
@@ -863,6 +863,10 @@
 ;keep_alive_interval=20 ; The interval (in seconds) at which to send keepalive
                         ; messages on all active connection-oriented transports
                         ; (default: "0")
+;endpoint_identifier_order=ip,username,anonymous
+            ; The order by which endpoint identifiers are given priority.
+            ; Identifier names are derived from res_pjsip_endpoint_identifier_*
+            ; modules. (default: ip,username,anonymous)
 
 
 ; MODULE PROVIDING BELOW SECTION(S): res_pjsip_acl

Modified: trunk/contrib/ast-db-manage/config/versions/45e3f47c6c44_add_pjsip_endpoint_identifier_order.py
URL: http://svnview.digium.com/svn/asterisk/trunk/contrib/ast-db-manage/config/versions/45e3f47c6c44_add_pjsip_endpoint_identifier_order.py?view=diff&rev=433029&r1=433028&r2=433029
==============================================================================
--- trunk/contrib/ast-db-manage/config/versions/45e3f47c6c44_add_pjsip_endpoint_identifier_order.py (original)
+++ trunk/contrib/ast-db-manage/config/versions/45e3f47c6c44_add_pjsip_endpoint_identifier_order.py Tue Mar 17 13:22:20 2015
@@ -1,0 +1,21 @@
+"""add pjsip endpoint_identifier_order
+
+Revision ID: 45e3f47c6c44
+Revises: 371a3bf4143e
+Create Date: 2015-03-02 09:32:20.632015
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '45e3f47c6c44'
+down_revision = '371a3bf4143e'
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+    op.add_column('ps_globals', sa.Column('endpoint_identifier_order', sa.String(40)))
+
+def downgrade():
+    op.drop_column('ps_globals', 'endpoint_identifier_order')

Modified: trunk/include/asterisk/res_pjsip.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/res_pjsip.h?view=diff&rev=433029&r1=433028&r2=433029
==============================================================================
--- trunk/include/asterisk/res_pjsip.h (original)
+++ trunk/include/asterisk/res_pjsip.h Tue Mar 17 13:22:20 2015
@@ -780,6 +780,23 @@
 void ast_sip_unregister_outbound_authenticator(struct ast_sip_outbound_authenticator *auth);
 
 /*!
+ * \brief Register a SIP endpoint identifier with a name.
+ *
+ * An endpoint identifier's purpose is to determine which endpoint a given SIP
+ * message has come from.
+ *
+ * Multiple endpoint identifiers may be registered so that if an endpoint
+ * cannot be identified by one identifier, it may be identified by another.
+ *
+ * \param identifier The SIP endpoint identifier to register
+ * \param name The name of the endpoint identifier
+ * \retval 0 Success
+ * \retval -1 Failure
+ */
+int ast_sip_register_endpoint_identifier_by_name(struct ast_sip_endpoint_identifier *identifier,
+						 const char *name);
+
+/*!
  * \brief Register a SIP endpoint identifier
  *
  * An endpoint identifier's purpose is to determine which endpoint a given SIP
@@ -1883,6 +1900,15 @@
  */
 char *ast_sip_get_debug(void);
 
+/*!
+ * \brief Retrieve the global endpoint_identifier_order setting.
+ *
+ * Specifies the order by which endpoint identifiers should be regarded.
+ *
+ * \retval the global endpoint_identifier_order value
+ */
+char *ast_sip_get_endpoint_identifier_order(void);
+
 /*! \brief Determines whether the res_pjsip module is loaded */
 #define CHECK_PJSIP_MODULE_LOADED()				\
 	do {							\

Modified: trunk/res/res_pjsip.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_pjsip.c?view=diff&rev=433029&r1=433028&r2=433029
==============================================================================
--- trunk/res/res_pjsip.c (original)
+++ trunk/res/res_pjsip.c Tue Mar 17 13:22:20 2015
@@ -36,6 +36,7 @@
 #include "asterisk/uuid.h"
 #include "asterisk/sorcery.h"
 #include "asterisk/file.h"
+#include "asterisk/cli.h"
 
 /*** MODULEINFO
 	<depend>pjproject</depend>
@@ -1195,6 +1196,11 @@
 				<configOption name="debug" default="no">
 					<synopsis>Enable/Disable SIP debug logging.  Valid options include yes|no or
                                         a host address</synopsis>
+				</configOption>
+				<configOption name="endpoint_identifier_order" default="ip,username,anonymous">
+					<synopsis>The order by which endpoint identifiers are processed and checked.
+                                        Identifier names are usually derived from and can be found in the endpoint
+                                        identifier module itself (res_pjsip_endpoint_identifier_*)</synopsis>
 				</configOption>
 			</configObject>
 		</configFile>
@@ -1964,15 +1970,19 @@
 }
 
 struct endpoint_identifier_list {
+	const char *name;
+	unsigned int priority;
 	struct ast_sip_endpoint_identifier *identifier;
 	AST_RWLIST_ENTRY(endpoint_identifier_list) list;
 };
 
 static AST_RWLIST_HEAD_STATIC(endpoint_identifiers, endpoint_identifier_list);
 
-int ast_sip_register_endpoint_identifier(struct ast_sip_endpoint_identifier *identifier)
-{
-	struct endpoint_identifier_list *id_list_item;
+int ast_sip_register_endpoint_identifier_by_name(struct ast_sip_endpoint_identifier *identifier,
+						 const char *name)
+{
+	char *prev, *current, *identifier_order;
+	struct endpoint_identifier_list *iter, *id_list_item;
 	SCOPED_LOCK(lock, &endpoint_identifiers, AST_RWLIST_WRLOCK, AST_RWLIST_UNLOCK);
 
 	id_list_item = ast_calloc(1, sizeof(*id_list_item));
@@ -1981,12 +1991,76 @@
 		return -1;
 	}
 	id_list_item->identifier = identifier;
-
-	AST_RWLIST_INSERT_TAIL(&endpoint_identifiers, id_list_item, list);
-	ast_debug(1, "Registered endpoint identifier %p\n", identifier);
+	id_list_item->name = name;
+
+	ast_debug(1, "Register endpoint identifier %s (%p)\n", name, identifier);
+
+	if (ast_strlen_zero(name)) {
+		/* if an identifier has no name then place in front */
+		AST_RWLIST_INSERT_HEAD(&endpoint_identifiers, id_list_item, list);
+		ast_module_ref(ast_module_info->self);
+		return 0;
+	}
+
+	/* see if the name of the identifier is in the global endpoint_identifier_order list */
+	identifier_order = prev = current = ast_sip_get_endpoint_identifier_order();
+
+	if (ast_strlen_zero(identifier_order)) {
+		id_list_item->priority = UINT_MAX;
+		AST_RWLIST_INSERT_TAIL(&endpoint_identifiers, id_list_item, list);
+		ast_module_ref(ast_module_info->self);
+		ast_free(identifier_order);
+		return 0;
+	}
+
+	id_list_item->priority = 0;
+	while ((current = strchr(current, ','))) {
+		++id_list_item->priority;
+		if (!strncmp(prev, name, current - prev)) {
+			break;
+		}
+		prev = ++current;
+	}
+
+	if (!current) {
+		/* check to see if it is the only or last item */
+		if (!strcmp(prev, name)) {
+			++id_list_item->priority;
+		} else {
+			id_list_item->priority = UINT_MAX;
+		}
+	}
+
+	if (id_list_item->priority == UINT_MAX || AST_RWLIST_EMPTY(&endpoint_identifiers)) {
+		/* if not in the endpoint_identifier_order list then consider it less in
+		   priority and add it to the end */
+		AST_RWLIST_INSERT_TAIL(&endpoint_identifiers, id_list_item, list);
+		ast_module_ref(ast_module_info->self);
+		ast_free(identifier_order);
+		return 0;
+	}
+
+	AST_RWLIST_TRAVERSE_SAFE_BEGIN(&endpoint_identifiers, iter, list) {
+		if (id_list_item->priority < iter->priority) {
+			AST_RWLIST_INSERT_BEFORE_CURRENT(id_list_item, list);
+			break;
+		}
+
+		if (!AST_RWLIST_NEXT(iter, list)) {
+			AST_RWLIST_INSERT_AFTER(&endpoint_identifiers, iter, id_list_item, list);
+			break;
+		}
+	}
+	AST_RWLIST_TRAVERSE_SAFE_END;
 
 	ast_module_ref(ast_module_info->self);
+	ast_free(identifier_order);
 	return 0;
+}
+
+int ast_sip_register_endpoint_identifier(struct ast_sip_endpoint_identifier *identifier)
+{
+	return ast_sip_register_endpoint_identifier_by_name(identifier, NULL);
 }
 
 void ast_sip_unregister_endpoint_identifier(struct ast_sip_endpoint_identifier *identifier)
@@ -2019,6 +2093,41 @@
 	}
 	return endpoint;
 }
+
+static char *cli_show_endpoint_identifiers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+#define ENDPOINT_IDENTIFIER_FORMAT "%-20.20s\n"
+	struct endpoint_identifier_list *iter;
+
+	switch (cmd) {
+	case CLI_INIT:
+		e->command = "pjsip show identifiers";
+		e->usage = "Usage: pjsip show identifiers\n"
+		            "      List all registered endpoint identifiers\n";
+		return NULL;
+	case CLI_GENERATE:
+		return NULL;
+	}
+
+	if (a->argc != 3) {
+                return CLI_SHOWUSAGE;
+        }
+
+	ast_cli(a->fd, ENDPOINT_IDENTIFIER_FORMAT, "Identifier Names:");
+	{
+		SCOPED_LOCK(lock, &endpoint_identifiers, AST_RWLIST_RDLOCK, AST_RWLIST_UNLOCK);
+		AST_RWLIST_TRAVERSE(&endpoint_identifiers, iter, list) {
+			ast_cli(a->fd, ENDPOINT_IDENTIFIER_FORMAT,
+				iter->name ? iter->name : "name not specified");
+		}
+	}
+	return CLI_SUCCESS;
+#undef ENDPOINT_IDENTIFIER_FORMAT
+}
+
+static struct ast_cli_entry cli_commands[] = {
+        AST_CLI_DEFINE(cli_show_endpoint_identifiers, "List registered endpoint identifiers")
+};
 
 AST_RWLIST_HEAD_STATIC(endpoint_formatters, ast_sip_endpoint_formatter);
 
@@ -3362,6 +3471,7 @@
 	}
 
 	ast_res_pjsip_init_options_handling(0);
+	ast_cli_register_multiple(cli_commands, ARRAY_LEN(cli_commands));
 
 	return AST_MODULE_LOAD_SUCCESS;
 }
@@ -3382,6 +3492,7 @@
 
 static int unload_pjsip(void *data)
 {
+	ast_cli_unregister_multiple(cli_commands, ARRAY_LEN(cli_commands));
 	if (memory_pool) {
 		pj_pool_release(memory_pool);
 		memory_pool = NULL;

Modified: trunk/res/res_pjsip/config_global.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_pjsip/config_global.c?view=diff&rev=433029&r1=433028&r2=433029
==============================================================================
--- trunk/res/res_pjsip/config_global.c (original)
+++ trunk/res/res_pjsip/config_global.c Tue Mar 17 13:22:20 2015
@@ -31,6 +31,7 @@
 #define DEFAULT_USERAGENT_PREFIX "Asterisk PBX"
 #define DEFAULT_OUTBOUND_ENDPOINT "default_outbound_endpoint"
 #define DEFAULT_DEBUG "no"
+#define DEFAULT_ENDPOINT_IDENTIFIER_ORDER "ip,username,anonymous"
 
 static char default_useragent[256];
 
@@ -41,6 +42,8 @@
 		AST_STRING_FIELD(default_outbound_endpoint);
 		/*! Debug logging yes|no|host */
 		AST_STRING_FIELD(debug);
+		/*! Order by which endpoint identifiers are checked (comma separated list) */
+		AST_STRING_FIELD(endpoint_identifier_order);
 	);
 	/* Value to put in Max-Forwards header */
 	unsigned int max_forwards;
@@ -123,6 +126,21 @@
 	}
 
 	res = ast_strdup(cfg->debug);
+	ao2_ref(cfg, -1);
+	return res;
+}
+
+char *ast_sip_get_endpoint_identifier_order(void)
+{
+	char *res;
+	struct global_config *cfg;
+
+	cfg = get_global_cfg();
+	if (!cfg) {
+		return ast_strdup(DEFAULT_ENDPOINT_IDENTIFIER_ORDER);
+	}
+
+	res = ast_strdup(cfg->endpoint_identifier_order);
 	ao2_ref(cfg, -1);
 	return res;
 }
@@ -228,6 +246,9 @@
 		OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, default_outbound_endpoint));
 	ast_sorcery_object_field_register(sorcery, "global", "debug", DEFAULT_DEBUG,
 		OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, debug));
+	ast_sorcery_object_field_register(sorcery, "global", "endpoint_identifier_order",
+		DEFAULT_ENDPOINT_IDENTIFIER_ORDER,
+		OPT_STRINGFIELD_T, 0, STRFLDSET(struct global_config, endpoint_identifier_order));
 	ast_sorcery_object_field_register(sorcery, "global", "keep_alive_interval",
 		__stringify(DEFAULT_KEEPALIVE_INTERVAL),
 		OPT_UINT_T, 0, FLDSET(struct global_config, keep_alive_interval));

Modified: trunk/res/res_pjsip_endpoint_identifier_anonymous.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_pjsip_endpoint_identifier_anonymous.c?view=diff&rev=433029&r1=433028&r2=433029
==============================================================================
--- trunk/res/res_pjsip_endpoint_identifier_anonymous.c (original)
+++ trunk/res/res_pjsip_endpoint_identifier_anonymous.c Tue Mar 17 13:22:20 2015
@@ -110,7 +110,7 @@
 {
 	CHECK_PJSIP_MODULE_LOADED();
 
-	ast_sip_register_endpoint_identifier(&anonymous_identifier);
+	ast_sip_register_endpoint_identifier_by_name(&anonymous_identifier, "anonymous");
 	return AST_MODULE_LOAD_SUCCESS;
 }
 

Modified: trunk/res/res_pjsip_endpoint_identifier_ip.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_pjsip_endpoint_identifier_ip.c?view=diff&rev=433029&r1=433028&r2=433029
==============================================================================
--- trunk/res/res_pjsip_endpoint_identifier_ip.c (original)
+++ trunk/res/res_pjsip_endpoint_identifier_ip.c Tue Mar 17 13:22:20 2015
@@ -491,7 +491,7 @@
 	ast_sorcery_object_field_register_custom(ast_sip_get_sorcery(), "identify", "match", "", ip_identify_match_handler, match_to_str, match_to_var_list, 0, 0);
 	ast_sorcery_reload_object(ast_sip_get_sorcery(), "identify");
 
-	ast_sip_register_endpoint_identifier(&ip_identifier);
+	ast_sip_register_endpoint_identifier_by_name(&ip_identifier, "ip");
 	ast_sip_register_endpoint_formatter(&endpoint_identify_formatter);
 
 	cli_formatter = ao2_alloc(sizeof(struct ast_sip_cli_formatter_entry), NULL);

Modified: trunk/res/res_pjsip_endpoint_identifier_user.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_pjsip_endpoint_identifier_user.c?view=diff&rev=433029&r1=433028&r2=433029
==============================================================================
--- trunk/res/res_pjsip_endpoint_identifier_user.c (original)
+++ trunk/res/res_pjsip_endpoint_identifier_user.c Tue Mar 17 13:22:20 2015
@@ -116,7 +116,7 @@
 {
 	CHECK_PJSIP_MODULE_LOADED();
 
-	ast_sip_register_endpoint_identifier(&username_identifier);
+	ast_sip_register_endpoint_identifier_by_name(&username_identifier, "username");
 	return AST_MODULE_LOAD_SUCCESS;
 }
 




More information about the svn-commits mailing list