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

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Jan 25 12:42:37 CST 2013


Author: file
Date: Fri Jan 25 12:42:34 2013
New Revision: 380106

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=380106
Log:
Write a module that implements RFC3326.

This adds a Reason header to outgoing SIP requests and responses with the Q.850 cause code. For
incoming SIP requests and responses the header is parsed and the cause code in it set on the
channel.

This serves as both a functional implementation and an example of what can be done with the new SIP
architecture.

Added:
    team/group/pimp_my_sip/res/res_sip_rfc3326.c   (with props)
Modified:
    team/group/pimp_my_sip/channels/chan_gulp.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=380106&r1=380105&r2=380106
==============================================================================
--- team/group/pimp_my_sip/channels/chan_gulp.c (original)
+++ team/group/pimp_my_sip/channels/chan_gulp.c Fri Jan 25 12:42:34 2013
@@ -603,10 +603,16 @@
 /*! \brief Function called when the session ends */
 static void gulp_session_end(struct ast_sip_session *session)
 {
-	if (session->channel) {
+	if (!session->channel) {
+		return;
+	}
+
+	if (!ast_channel_hangupcause(session->channel)) {
 		int cause = hangup_sip2cause(session->inv_session->cause);
 
 		ast_queue_hangup_with_cause(session->channel, cause);
+	} else {
+		ast_queue_hangup(session->channel);
 	}
 }
 

Added: team/group/pimp_my_sip/res/res_sip_rfc3326.c
URL: http://svnview.digium.com/svn/asterisk/team/group/pimp_my_sip/res/res_sip_rfc3326.c?view=auto&rev=380106
==============================================================================
--- team/group/pimp_my_sip/res/res_sip_rfc3326.c (added)
+++ team/group/pimp_my_sip/res/res_sip_rfc3326.c Fri Jan 25 12:42:34 2013
@@ -1,0 +1,141 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2013, Digium, Inc.
+ *
+ * Joshua Colp <jcolp at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*** MODULEINFO
+	<support_level>core</support_level>
+ ***/
+
+#include "asterisk.h"
+
+#undef bzero
+#define bzero bzero
+#include <pjsip.h>
+#include <pjsip_ua.h>
+
+#include "asterisk/res_sip.h"
+#include "asterisk/res_sip_session.h"
+#include "asterisk/module.h"
+
+static void rfc3326_use_reason_header(struct ast_sip_session *session, struct pjsip_rx_data *rdata)
+{
+	const pj_str_t str_reason = { "Reason", 6 };
+	pjsip_generic_string_hdr *header = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, &str_reason, NULL);
+	char buf[20], *cause, *text;
+	int code;
+
+	if (!header) {
+		return;
+	}
+
+	ast_copy_pj_str(buf, &header->hvalue, sizeof(buf));
+	cause = ast_skip_blanks(buf);
+
+	if (strncasecmp(cause, "Q.850", 5) || !(cause = strstr(cause, "cause="))) {
+		return;
+	}
+
+	/* If text is present get rid of it */
+	if ((text = strstr(cause, ";"))) {
+		*text = '\0';
+	}
+
+	if (sscanf(cause, "cause=%30d", &code) != 1) {
+		return;
+	}
+
+	ast_channel_hangupcause_set(session->channel, code & 0x7f);
+}
+
+static int rfc3326_incoming_request(struct ast_sip_session *session, struct pjsip_rx_data *rdata)
+{
+	if ((pjsip_method_cmp(&rdata->msg_info.msg->line.req.method, &pjsip_bye_method) &&
+	     pjsip_method_cmp(&rdata->msg_info.msg->line.req.method, &pjsip_cancel_method)) ||
+	    !session->channel) {
+		return 0;
+	}
+
+	rfc3326_use_reason_header(session, rdata);
+
+	return 0;
+}
+
+static void rfc3326_incoming_response(struct ast_sip_session *session, struct pjsip_rx_data *rdata)
+{
+	struct pjsip_status_line status = rdata->msg_info.msg->line.status;
+
+	if ((status.code < 300) || !session->channel) {
+		return;
+	}
+
+	rfc3326_use_reason_header(session, rdata);
+}
+
+static void rfc3326_add_reason_header(struct ast_sip_session *session, struct pjsip_tx_data *tdata)
+{
+	char buf[20];
+
+	snprintf(buf, sizeof(buf), "Q.850;cause=%i", ast_channel_hangupcause(session->channel) & 0x7f);
+	ast_sip_add_header(tdata, "Reason", buf);
+}
+
+static void rfc3326_outgoing_request(struct ast_sip_session *session, struct pjsip_tx_data *tdata)
+{
+	if ((pjsip_method_cmp(&tdata->msg->line.req.method, &pjsip_bye_method) &&
+	     pjsip_method_cmp(&tdata->msg->line.req.method, &pjsip_cancel_method)) ||
+	    !session->channel) {
+		return;
+	}
+
+	rfc3326_add_reason_header(session, tdata);
+}
+
+static void rfc3326_outgoing_response(struct ast_sip_session *session, struct pjsip_tx_data *tdata)
+{
+	struct pjsip_status_line status = tdata->msg->line.status;
+
+	if ((status.code < 300) || !session->channel) {
+		return;
+	}
+
+	rfc3326_add_reason_header(session, tdata);
+}
+
+static struct ast_sip_session_supplement rfc3326_supplement = {
+	.incoming_request = rfc3326_incoming_request,
+	.incoming_response = rfc3326_incoming_response,
+	.outgoing_request = rfc3326_outgoing_request,
+	.outgoing_response = rfc3326_outgoing_response,
+};
+
+static int load_module(void)
+{
+	ast_sip_session_register_supplement(&rfc3326_supplement);
+	return AST_MODULE_LOAD_SUCCESS;
+}
+
+static int unload_module(void)
+{
+	ast_sip_session_unregister_supplement(&rfc3326_supplement);
+	return 0;
+}
+
+AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "SIP RFC3326 Support",
+		.load = load_module,
+		.unload = unload_module,
+		.load_pri = AST_MODPRI_APP_DEPEND,
+	       );

Propchange: team/group/pimp_my_sip/res/res_sip_rfc3326.c
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: team/group/pimp_my_sip/res/res_sip_rfc3326.c
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: team/group/pimp_my_sip/res/res_sip_rfc3326.c
------------------------------------------------------------------------------
    svn:mime-type = text/plain




More information about the asterisk-commits mailing list