[asterisk-commits] file: branch group/pimp_my_sip r380412 - in /team/group/pimp_my_sip: channels...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Jan 29 15:01:29 CST 2013


Author: file
Date: Tue Jan 29 15:01:26 2013
New Revision: 380412

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=380412
Log:
Add 100rel and session timers support. This is configurable on a per-endpoint basis.

Modified:
    team/group/pimp_my_sip/channels/chan_gulp.c
    team/group/pimp_my_sip/configs/res_sip.conf.sample
    team/group/pimp_my_sip/include/asterisk/res_sip.h
    team/group/pimp_my_sip/res/res_sip/sip_configuration.c
    team/group/pimp_my_sip/res/res_sip_session.c

Modified: team/group/pimp_my_sip/channels/chan_gulp.c
URL: http://svnview.digium.com/svn/asterisk/team/group/pimp_my_sip/channels/chan_gulp.c?view=diff&rev=380412&r1=380411&r2=380412
==============================================================================
--- team/group/pimp_my_sip/channels/chan_gulp.c (original)
+++ team/group/pimp_my_sip/channels/chan_gulp.c Tue Jan 29 15:01:26 2013
@@ -509,8 +509,11 @@
 		return NULL;
 	}
 
+	/* TODO: This needs to actually grab a proper endpoint and such */
 	ast_string_field_set(endpoint, context, "default");
 	ast_parse_allow_disallow(&endpoint->prefs, endpoint->codecs, "ulaw", 1);
+	endpoint->min_se = 90;
+	endpoint->sess_expires = 1800;
 
 	pj_thread_register_check();
 

Modified: team/group/pimp_my_sip/configs/res_sip.conf.sample
URL: http://svnview.digium.com/svn/asterisk/team/group/pimp_my_sip/configs/res_sip.conf.sample?view=diff&rev=380412&r1=380411&r2=380412
==============================================================================
--- team/group/pimp_my_sip/configs/res_sip.conf.sample (original)
+++ team/group/pimp_my_sip/configs/res_sip.conf.sample Tue Jan 29 15:01:26 2013
@@ -12,5 +12,9 @@
 context=default
 disallow=all
 allow=ulaw
-dtmfmode=rfc4733 ; Supported DTMF modes are rfc4733, inband, info, and none
-;transport=local ; Name of a specific transport to use when placing calls
+dtmfmode=rfc4733          ; Supported DTMF modes are rfc4733, inband, info, and none
+;transport=local          ; Name of a specific transport to use when placing calls
+;100rel=yes               ; Enable or disable 100rel support - valid options are: yes, no, required
+;timers=yes               ; Enable or disable session timers support - valid options are: yes, no, required, forced
+;timers_min_se=90         ; Minimum session timers expiration period, in seconds
+;timers_sess_expires=1800 ; Session timers expiration period, in seconds

Modified: team/group/pimp_my_sip/include/asterisk/res_sip.h
URL: http://svnview.digium.com/svn/asterisk/team/group/pimp_my_sip/include/asterisk/res_sip.h?view=diff&rev=380412&r1=380411&r2=380412
==============================================================================
--- team/group/pimp_my_sip/include/asterisk/res_sip.h (original)
+++ team/group/pimp_my_sip/include/asterisk/res_sip.h Tue Jan 29 15:01:26 2013
@@ -196,6 +196,12 @@
 	struct ast_format_cap *codecs;
 	/*! DTMF mode to use with this endpoint */
 	enum ast_sip_dtmf_mode dtmf;
+	/*! Enabled SIP extensions */
+	unsigned int extensions;
+	/*! Minimum session expiration period, in seconds */
+	unsigned min_se;
+	/*! Session expiration period, in seconds */
+	unsigned sess_expires;
 	/*! List of outbound registrations */
 	AST_LIST_HEAD_NOLOCK(, ast_sip_registration) registrations;
 	/*! Frequency to send OPTIONS requests to endpoint. 0 is disabled. */

Modified: team/group/pimp_my_sip/res/res_sip/sip_configuration.c
URL: http://svnview.digium.com/svn/asterisk/team/group/pimp_my_sip/res/res_sip/sip_configuration.c?view=diff&rev=380412&r1=380411&r2=380412
==============================================================================
--- team/group/pimp_my_sip/res/res_sip/sip_configuration.c (original)
+++ team/group/pimp_my_sip/res/res_sip/sip_configuration.c Tue Jan 29 15:01:26 2013
@@ -10,6 +10,7 @@
 #undef bzero
 #define bzero bzero
 #include "pjsip.h"
+#include "pjsip_ua.h"
 
 #include "asterisk/res_sip.h"
 #include "include/res_sip_private.h"
@@ -156,6 +157,42 @@
 	return 0;
 }
 
+static int prack_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
+{
+	struct ast_sip_endpoint *endpoint = obj;
+
+	if (ast_true(var->value)) {
+		endpoint->extensions |= PJSIP_INV_SUPPORT_100REL;
+	} else if (ast_false(var->value)) {
+		endpoint->extensions &= PJSIP_INV_SUPPORT_100REL;
+	} else if (!strcasecmp(var->value, "required")) {
+		endpoint->extensions |= PJSIP_INV_REQUIRE_100REL;
+	} else {
+		return -1;
+	}
+
+	return 0;
+}
+
+static int timers_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
+{
+	struct ast_sip_endpoint *endpoint = obj;
+
+	if (ast_true(var->value)) {
+		endpoint->extensions |= PJSIP_INV_SUPPORT_TIMER;
+	} else if (ast_false(var->value)) {
+		endpoint->extensions &= PJSIP_INV_SUPPORT_TIMER;
+	} else if (!strcasecmp(var->value, "required")) {
+		endpoint->extensions |= PJSIP_INV_REQUIRE_TIMER;
+	} else if (!strcasecmp(var->value, "always")) {
+		endpoint->extensions |= PJSIP_INV_ALWAYS_USE_TIMER;
+	} else {
+		return -1;
+	}
+
+	return 0;
+}
+
 int ast_res_sip_initialize_configuration(void)
 {
 	if (ast_cli_register_multiple(cli_commands, ARRAY_LEN(cli_commands))) {
@@ -191,6 +228,10 @@
 	ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "host", "", host_handler, NULL, 0, 0);
 	ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtmfmode", "rfc4733", dtmf_handler, NULL, 0, 0);
 	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "transport", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, transport));
+	ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "100rel", "yes", prack_handler, NULL, 0, 0);
+	ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "timers", "yes", timers_handler, NULL, 0, 0);
+	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "timers_min_se", "90", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, min_se));
+	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "timers_sess_expires", "1800", OPT_UINT_T, 0, FLDSET(struct ast_sip_endpoint, sess_expires));
 
 	if (ast_sip_initialize_sorcery_transport(sip_sorcery)) {
 		ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");

Modified: team/group/pimp_my_sip/res/res_sip_session.c
URL: http://svnview.digium.com/svn/asterisk/team/group/pimp_my_sip/res/res_sip_session.c?view=diff&rev=380412&r1=380411&r2=380412
==============================================================================
--- team/group/pimp_my_sip/res/res_sip_session.c (original)
+++ team/group/pimp_my_sip/res/res_sip_session.c Tue Jan 29 15:01:26 2013
@@ -541,6 +541,7 @@
 	struct ast_sip_session *session = NULL;
 	pjmedia_sdp_session *offer = NULL;
 	pjsip_tpselector selector = { .type = PJSIP_TPSELECTOR_NONE, };
+	pjsip_timer_setting timer;
 
 	if (pjsip_dlg_create_uac(pjsip_ua_instance(), &local_uri, NULL, &remote_uri, NULL, &dlg) != PJ_SUCCESS) {
 		return NULL;
@@ -576,12 +577,17 @@
 	dlg->local.info->uri = pjsip_parse_uri(dlg->pool, dlg->local.info_str.ptr, dlg->local.info_str.slen, 0);
 	dlg->local.contact = pjsip_parse_hdr(dlg->pool, &HCONTACT, local_uri.ptr, local_uri.slen, NULL);
 
-	if (pjsip_inv_create_uac(dlg, NULL, 0, &inv_session) != PJ_SUCCESS) {
+	if (pjsip_inv_create_uac(dlg, NULL, endpoint->extensions, &inv_session) != PJ_SUCCESS) {
 		pjsip_dlg_terminate(dlg);
 		return NULL;
 	}
 
 	pjsip_dlg_set_transport(dlg, &selector);
+
+	pjsip_timer_setting_default(&timer);
+	timer.min_se = endpoint->min_se;
+	timer.sess_expires = endpoint->sess_expires;
+	pjsip_timer_init_session(inv_session, &timer);
 	
 	if (pjsip_dlg_add_usage(dlg, &session_module, NULL) != PJ_SUCCESS) {
 		pjsip_inv_terminate(inv_session, 500, PJ_FALSE);
@@ -641,12 +647,12 @@
 	return SIP_GET_DEST_EXTEN_NOT_FOUND;
 }
 
-static pjsip_inv_session *pre_session_setup(pjsip_rx_data *rdata)
+static pjsip_inv_session *pre_session_setup(pjsip_rx_data *rdata, const struct ast_sip_endpoint *endpoint)
 {
 	pjsip_tx_data *tdata;
 	pjsip_dialog *dlg;
 	pjsip_inv_session *inv_session;
-	unsigned int options = 0;
+	unsigned int options = endpoint->extensions;
 
 	if (pjsip_inv_verify_request(rdata, &options, NULL, NULL, ast_sip_get_pjsip_endpoint(), &tdata) != PJ_SUCCESS) {
 		if (tdata) {
@@ -688,22 +694,19 @@
 	pjsip_inv_session *inv_session = NULL;
 	struct ast_sip_endpoint *endpoint = NULL;
 	struct ast_sip_session *session = NULL;
+	pjsip_timer_setting timer;
 	pjsip_rdata_sdp_info *sdp_info;
 	pjmedia_sdp_session *local = NULL;
 
-	inv_session = pre_session_setup(rdata);
+	endpoint = ast_sip_identify_endpoint(rdata);
+	if (!endpoint) {
+		pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, 403, NULL, NULL, NULL);
+		return;
+	}
+
+	inv_session = pre_session_setup(rdata, endpoint);
 	if (!inv_session) {
 		/* pre_session_setup() returns a response on failure */
-		return;
-	}
-
-	endpoint = ast_sip_identify_endpoint(rdata);
-	if (!endpoint) {
-		if (pjsip_inv_initial_answer(inv_session, rdata, 403, NULL, NULL, &tdata) == PJ_SUCCESS) {
-			pjsip_inv_send_msg(inv_session, tdata);
-		} else  {
-			pjsip_inv_terminate(inv_session, 403, PJ_FALSE);
-		}
 		return;
 	}
 
@@ -792,6 +795,11 @@
 	} else {
 		pjsip_inv_set_local_sdp(inv_session, local);
 	}
+
+	pjsip_timer_setting_default(&timer);
+	timer.min_se = endpoint->min_se;
+	timer.sess_expires = endpoint->sess_expires;
+	pjsip_timer_init_session(inv_session, &timer);
 
 	/* At this point, we've verified what we can, so let's go ahead and send a 100 Trying out */
 	if (pjsip_inv_initial_answer(inv_session, rdata, 100, NULL, NULL, &tdata) != PJ_SUCCESS) {
@@ -1125,6 +1133,7 @@
 	pjsip_ua_init_module(endpt, NULL);
 	pjsip_inv_usage_init(endpt, &inv_callback);
 	pjsip_100rel_init_module(endpt);
+	pjsip_timer_init_module(endpt);
 	if (ast_sip_register_service(&session_module)) {
 		return AST_MODULE_LOAD_DECLINE;
 	}




More information about the asterisk-commits mailing list