[asterisk-commits] file: branch file/stasis_peerevent r390399 - in /team/file/stasis_peerevent: ...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Jun 4 11:02:48 CDT 2013
Author: file
Date: Tue Jun 4 11:02:46 2013
New Revision: 390399
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=390399
Log:
Add a persistent runtime endpoint to chan_pjsip.
Modified:
team/file/stasis_peerevent/channels/chan_gulp.c
team/file/stasis_peerevent/include/asterisk/res_sip.h
team/file/stasis_peerevent/res/res_sip/sip_configuration.c
Modified: team/file/stasis_peerevent/channels/chan_gulp.c
URL: http://svnview.digium.com/svn/asterisk/team/file/stasis_peerevent/channels/chan_gulp.c?view=diff&rev=390399&r1=390398&r2=390399
==============================================================================
--- team/file/stasis_peerevent/channels/chan_gulp.c (original)
+++ team/file/stasis_peerevent/channels/chan_gulp.c Tue Jun 4 11:02:46 2013
@@ -460,6 +460,8 @@
ast_channel_context_set(chan, session->endpoint->context);
ast_channel_exten_set(chan, S_OR(exten, "s"));
ast_channel_priority_set(chan, 1);
+
+ ast_endpoint_add_channel(session->endpoint->persistent, chan);
return chan;
}
Modified: team/file/stasis_peerevent/include/asterisk/res_sip.h
URL: http://svnview.digium.com/svn/asterisk/team/file/stasis_peerevent/include/asterisk/res_sip.h?view=diff&rev=390399&r1=390398&r2=390399
==============================================================================
--- team/file/stasis_peerevent/include/asterisk/res_sip.h (original)
+++ team/file/stasis_peerevent/include/asterisk/res_sip.h Tue Jun 4 11:02:46 2013
@@ -30,6 +30,8 @@
#include "asterisk/sorcery.h"
/* Needed for ast_dnsmgr */
#include "asterisk/dnsmgr.h"
+/* Needed for ast_endpoint */
+#include "asterisk/endpoints.h"
/* Needed for pj_sockaddr */
#include <pjlib.h>
@@ -326,6 +328,8 @@
unsigned int send_rpid;
/*! Should unsolicited MWI be aggregated into a single NOTIFY? */
unsigned int aggregate_mwi;
+ /*! Pointer to the persistent Asterisk endpoint */
+ struct ast_endpoint *persistent;
};
/*!
Modified: team/file/stasis_peerevent/res/res_sip/sip_configuration.c
URL: http://svnview.digium.com/svn/asterisk/team/file/stasis_peerevent/res/res_sip/sip_configuration.c?view=diff&rev=390399&r1=390398&r2=390399
==============================================================================
--- team/file/stasis_peerevent/res/res_sip/sip_configuration.c (original)
+++ team/file/stasis_peerevent/res/res_sip/sip_configuration.c Tue Jun 4 11:02:46 2013
@@ -17,8 +17,42 @@
#include "asterisk/utils.h"
#include "asterisk/sorcery.h"
#include "asterisk/callerid.h"
+#include "asterisk/stasis_endpoints.h"
+
+/*! \brief Number of buckets for persistent endpoint information */
+#define PERSISTENT_BUCKETS 53
+
+/*! \brief Persistent endpoint information */
+struct sip_persistent_endpoint {
+ /*! \brief Asterisk endpoint itself */
+ struct ast_endpoint *endpoint;
+ /*! \brief AORs that we should react to */
+ char *aors;
+};
+
+/*! \brief Container for persistent endpoint information */
+static struct ao2_container *persistent_endpoints;
static struct ast_sorcery *sip_sorcery;
+
+/*! \brief Hashing function for persistent endpoint information */
+static int persistent_endpoint_hash(const void *obj, const int flags)
+{
+ const struct sip_persistent_endpoint *persistent = obj;
+ const char *id = (flags & OBJ_KEY ? obj : ast_endpoint_get_resource(persistent->endpoint));
+
+ return ast_str_hash(id);
+}
+
+/*! \brief Comparison function for persistent endpoint information */
+static int persistent_endpoint_cmp(void *obj, void *arg, int flags)
+{
+ const struct sip_persistent_endpoint *persistent1 = obj;
+ const struct sip_persistent_endpoint *persistent2 = arg;
+ const char *id = (flags & OBJ_KEY ? arg : ast_endpoint_get_resource(persistent2->endpoint));
+
+ return !strcmp(ast_endpoint_get_resource(persistent1->endpoint), id) ? CMP_MATCH | CMP_STOP : 0;
+}
static char *handle_cli_show_endpoints(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
@@ -281,9 +315,59 @@
return ao2_alloc(sizeof(struct ast_sip_nat_hook), NULL);
}
+/*! \brief Destructor function for persistent endpoint information */
+static void persistent_endpoint_destroy(void *obj)
+{
+ struct sip_persistent_endpoint *persistent = obj;
+
+ ast_endpoint_shutdown(persistent->endpoint);
+ ast_free(persistent->aors);
+}
+
+/*! \brief Internal function which finds (or creates) persistent endpoint information */
+static struct ast_endpoint *persistent_endpoint_find_or_create(const struct ast_sip_endpoint *endpoint)
+{
+ RAII_VAR(struct sip_persistent_endpoint *, persistent, NULL, ao2_cleanup);
+ SCOPED_AO2LOCK(lock, persistent_endpoints);
+
+ if (!(persistent = ao2_find(persistent_endpoints, ast_sorcery_object_get_id(endpoint), OBJ_KEY | OBJ_NOLOCK))) {
+ if (!(persistent = ao2_alloc(sizeof(*persistent), persistent_endpoint_destroy))) {
+ return NULL;
+ }
+
+ if (!(persistent->endpoint = ast_endpoint_create("Gulp", ast_sorcery_object_get_id(endpoint)))) {
+ return NULL;
+ }
+
+ ao2_link_flags(persistent_endpoints, persistent, OBJ_NOLOCK);
+ }
+
+ ast_free(persistent->aors);
+ persistent->aors = ast_strdup(endpoint->aors);
+
+ ao2_ref(persistent->endpoint, +1);
+ return persistent->endpoint;
+}
+
+/*! \brief Callback function for when an object is finalized */
+static int sip_endpoint_apply_handler(const struct ast_sorcery *sorcery, void *obj)
+{
+ struct ast_sip_endpoint *endpoint = obj;
+
+ if (!(endpoint->persistent = persistent_endpoint_find_or_create(endpoint))) {
+ return -1;
+ }
+
+ return 0;
+}
+
int ast_res_sip_initialize_configuration(void)
{
if (ast_cli_register_multiple(cli_commands, ARRAY_LEN(cli_commands))) {
+ return -1;
+ }
+
+ if (!(persistent_endpoints = ao2_container_alloc(PERSISTENT_BUCKETS, persistent_endpoint_hash, persistent_endpoint_cmp))) {
return -1;
}
@@ -305,7 +389,7 @@
ast_sorcery_apply_default(sip_sorcery, "nat_hook", "memory", NULL);
- if (ast_sorcery_object_register(sip_sorcery, "endpoint", ast_sip_endpoint_alloc, NULL, NULL)) {
+ if (ast_sorcery_object_register(sip_sorcery, "endpoint", ast_sip_endpoint_alloc, NULL, sip_endpoint_apply_handler)) {
ast_log(LOG_ERROR, "Failed to register SIP endpoint object with sorcery\n");
ast_sorcery_unref(sip_sorcery);
sip_sorcery = NULL;
@@ -404,6 +488,7 @@
destroy_auths(endpoint->sip_inbound_auths, endpoint->num_inbound_auths);
destroy_auths(endpoint->sip_outbound_auths, endpoint->num_outbound_auths);
ast_party_id_free(&endpoint->id);
+ ao2_cleanup(endpoint->persistent);
}
void *ast_sip_endpoint_alloc(const char *name)
More information about the asterisk-commits
mailing list