[libpri-commits] rmudgett: branch 1.4 r2320 - in /branches/1.4: libpri.h pri.c pri_q931.h q931.c

SVN commits to the libpri project libpri-commits at lists.digium.com
Mon May 12 17:45:23 CDT 2014


Author: rmudgett
Date: Mon May 12 17:45:13 2014
New Revision: 2320

URL: http://svnview.digium.com/svn/libpri?view=rev&rev=2320
Log:
libpri: Add control of inband audio progress indication ie to the SETUP_ACKNOWLEDGE message.

Added support to the libpri API to control the inband audio available
progress indication ie on the SETUP_ACKNOWLEDGE message.

* Added the progress indication ie progressmask value to the struct
pri_event_setup_ack so the PRI_EVENT_SETUP_ACK event can indicate when a
SETUP_ACKNOWLEDGE comes in with inband audio (ie dialtone).

* Added pri_setup_ack() so when the SETUP_ACKNOWLEDGE message is sent it
can indicate if inband audio is present (ie dialtone).

This patch and a corresponding change in Asterisk work together to allow
Asterisk to control the inband audio available progress indication ie on
the SETUP_ACKNOWLEDGE message when dialtone is present.

AST-1338 #close
Reported by: Tyler Stewart

Review: https://reviewboard.asterisk.org/r/3520/

Modified:
    branches/1.4/libpri.h
    branches/1.4/pri.c
    branches/1.4/pri_q931.h
    branches/1.4/q931.c

Modified: branches/1.4/libpri.h
URL: http://svnview.digium.com/svn/libpri/branches/1.4/libpri.h?view=diff&rev=2320&r1=2319&r2=2320
==============================================================================
--- branches/1.4/libpri.h (original)
+++ branches/1.4/libpri.h Mon May 12 17:45:13 2014
@@ -1213,6 +1213,7 @@
 	int channel;
 	q931_call *call;
 	struct pri_subcommands *subcmds;
+	int progressmask;
 } pri_event_setup_ack;
 
 typedef struct pri_event_notify {
@@ -1408,8 +1409,17 @@
  */
 const char *pri_facility_reject2str(int facility_reject_code);
 
-/* Acknowledge a call and place it on the given channel.  Set info to non-zero if there
-   is in-band data available on the channel */
+/*!
+ * \brief Send the ALERTING message.
+ *
+ * \param pri D channel controller.
+ * \param call Q.931 call leg.
+ * \param channel Encoded channel id to use.  If zero do not change channel id.
+ * \param info Nonzero to include a progress ie indicating inband audio available (ie ringback).
+ *
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
 int pri_acknowledge(struct pri *pri, q931_call *call, int channel, int info);
 
 /* Send a digit in overlap mode */
@@ -1419,12 +1429,44 @@
 /* Send a keypad facility string of digits */
 int pri_keypad_facility(struct pri *pri, q931_call *call, const char *digits);
 
-/* Answer the incomplete(call without called number) call on the given channel.
-   Set non-isdn to non-zero if you are not connecting to ISDN equipment */
+/*!
+ * \brief Send the SETUP_ACKNOWLEDGE message.
+ *
+ * \param pri D channel controller.
+ * \param call Q.931 call leg.
+ * \param channel Encoded channel id to use.  If zero do not change channel id.
+ * \param nonisdn Nonzero to include a progress ie indicating non-end-to-end-ISDN.
+ *
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
 int pri_need_more_info(struct pri *pri, q931_call *call, int channel, int nonisdn);
 
-/* Answer(CONNECT) the call on the given channel.
-   Set non-isdn to non-zero if you are not connecting to ISDN equipment */
+/*!
+ * \brief Send the SETUP_ACKNOWLEDGE message.
+ *
+ * \param ctrl D channel controller.
+ * \param call Q.931 call leg.
+ * \param channel Encoded channel id to use.  If zero do not change channel id.
+ * \param nonisdn Nonzero to include a progress ie indicating non-end-to-end-ISDN.
+ * \param inband Nonzero to include a progress ie indicating inband audio available (ie dialtone).
+ *
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int pri_setup_ack(struct pri *ctrl, q931_call *call, int channel, int nonisdn, int inband);
+
+/*!
+ * \brief Send the CONNECT message.
+ *
+ * \param pri D channel controller.
+ * \param call Q.931 call leg.
+ * \param channel Encoded channel id to use.  If zero do not change channel id.
+ * \param nonisdn Nonzero to include a progress ie indicating non-end-to-end-ISDN.
+ *
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
 int pri_answer(struct pri *pri, q931_call *call, int channel, int nonisdn);
 
 /*!
@@ -1692,7 +1734,17 @@
 int pri_progress_with_cause(struct pri *pri, q931_call *c, int channel, int info, int cause);
 
 #define PRI_PROCEEDING_FULL
-/* Send call proceeding */
+/*!
+ * \brief Send the PROCEEDING message.
+ *
+ * \param pri D channel controller.
+ * \param c Q.931 call leg.
+ * \param channel Encoded channel id to use.  If zero do not change channel id.
+ * \param info Nonzero to include a progress ie indicating inband audio available.
+ *
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
 int pri_proceeding(struct pri *pri, q931_call *c, int channel, int info);
 
 /* Enable inband progress when a DISCONNECT is received */

Modified: branches/1.4/pri.c
URL: http://svnview.digium.com/svn/libpri/branches/1.4/pri.c?view=diff&rev=2320&r1=2319&r2=2320
==============================================================================
--- branches/1.4/pri.c (original)
+++ branches/1.4/pri.c Mon May 12 17:45:13 2014
@@ -939,7 +939,15 @@
 	if (!pri || !pri_is_call_valid(pri, call)) {
 		return -1;
 	}
-	return q931_setup_ack(pri, call, channel, nonisdn);
+	return q931_setup_ack(pri, call, channel, nonisdn, 0);
+}
+
+int pri_setup_ack(struct pri *ctrl, q931_call *call, int channel, int nonisdn, int inband)
+{
+	if (!ctrl || !pri_is_call_valid(ctrl, call)) {
+		return -1;
+	}
+	return q931_setup_ack(ctrl, call, channel, nonisdn, inband);
 }
 
 int pri_answer(struct pri *pri, q931_call *call, int channel, int nonisdn)

Modified: branches/1.4/pri_q931.h
URL: http://svnview.digium.com/svn/libpri/branches/1.4/pri_q931.h?view=diff&rev=2320&r1=2319&r2=2320
==============================================================================
--- branches/1.4/pri_q931.h (original)
+++ branches/1.4/pri_q931.h Mon May 12 17:45:13 2014
@@ -468,7 +468,7 @@
 
 extern int q931_call_proceeding(struct pri *pri, q931_call *call, int channel, int info);
 
-extern int q931_setup_ack(struct pri *pri, q931_call *call, int channel, int nonisdn);
+extern int q931_setup_ack(struct pri *ctrl, q931_call *c, int channel, int nonisdn, int inband);
 
 extern int q931_information(struct pri *pri, q931_call *call, char digit);
 

Modified: branches/1.4/q931.c
URL: http://svnview.digium.com/svn/libpri/branches/1.4/q931.c?view=diff&rev=2320&r1=2319&r2=2320
==============================================================================
--- branches/1.4/q931.c (original)
+++ branches/1.4/q931.c Mon May 12 17:45:13 2014
@@ -2807,7 +2807,8 @@
 {
 	call->progloc = ie->data[0] & 0xf;
 	call->progcode = (ie->data[0] & 0x60) >> 5;
-	switch (call->progress = (ie->data[1] & 0x7f)) {
+	call->progress = (ie->data[1] & 0x7f);
+	switch (call->progress) {
 	case Q931_PROG_CALL_NOT_E2E_ISDN:
 		call->progressmask |= PRI_PROG_CALL_NOT_E2E_ISDN;
 		break;
@@ -3084,7 +3085,9 @@
 
 static int transmit_progress_indicator(int full_ie, struct pri *ctrl, q931_call *call, int msgtype, q931_ie *ie, int len, int order)
 {
-	int code, mask;
+	int code;
+	int mask;
+
 	/* Can't send progress indicator on GR-303 -- EVER! */
 	if (ctrl->link.next && !ctrl->bri)
 		return 0;
@@ -5755,9 +5758,14 @@
 	return send_message(ctrl, c, Q931_ALERTING, alerting_ies);
 }
 
-static int setup_ack_ies[] = { Q931_CHANNEL_IDENT, Q931_IE_FACILITY, Q931_PROGRESS_INDICATOR, -1 };
+static int setup_ack_ies[] = {
+	Q931_CHANNEL_IDENT,
+	Q931_IE_FACILITY,
+	Q931_PROGRESS_INDICATOR,
+	-1
+};
  
-int q931_setup_ack(struct pri *ctrl, q931_call *c, int channel, int nonisdn)
+int q931_setup_ack(struct pri *ctrl, q931_call *c, int channel, int nonisdn, int inband)
 {
 	if (c->ourcallstate == Q931_CALL_STATE_CALL_INDEPENDENT_SERVICE) {
 		/* Cannot send this message when in this state */
@@ -5770,12 +5778,20 @@
 	}
 	c->chanflags &= ~FLAG_PREFERRED;
 	c->chanflags |= FLAG_EXCLUSIVE;
+
+	c->progressmask = 0;
 	if (nonisdn && (ctrl->switchtype != PRI_SWITCH_DMS100)) {
-		c->progloc  = LOC_PRIV_NET_LOCAL_USER;
+		c->progloc = LOC_PRIV_NET_LOCAL_USER;
 		c->progcode = CODE_CCITT;
-		c->progressmask = PRI_PROG_CALLED_NOT_ISDN;
-	} else
-		c->progressmask = 0;
+		c->progressmask |= PRI_PROG_CALLED_NOT_ISDN;
+	}
+	if (inband) {
+		/* Inband audio is present (i.e. dialtone) */
+		c->progloc = LOC_PRIV_NET_LOCAL_USER;
+		c->progcode = CODE_CCITT;
+		c->progressmask |= PRI_PROG_INBAND_AVAILABLE;
+	}
+
 	UPDATE_OURCALLSTATE(ctrl, c, Q931_CALL_STATE_OVERLAP_RECEIVING);
 	c->peercallstate = Q931_CALL_STATE_OVERLAP_SENDING;
 	c->alive = 1;
@@ -5876,7 +5892,7 @@
 	c->chanflags &= ~FLAG_PREFERRED;
 	c->chanflags |= FLAG_EXCLUSIVE;
 	if (nonisdn && (ctrl->switchtype != PRI_SWITCH_DMS100)) {
-		c->progloc  = LOC_PRIV_NET_LOCAL_USER;
+		c->progloc = LOC_PRIV_NET_LOCAL_USER;
 		c->progcode = CODE_CCITT;
 		c->progressmask = PRI_PROG_CALLED_NOT_ISDN;
 	} else
@@ -7243,6 +7259,7 @@
 		c->useruserinfo[0] = '\0';
 		c->cause = -1;
 		/* Fall through */
+	case Q931_SETUP_ACKNOWLEDGE:
 	case Q931_CALL_PROCEEDING:
 		c->progress = -1;
 		c->progressmask = 0;
@@ -7288,8 +7305,6 @@
 		c->overlap_digits[0] = '\0';
 		break;
 	case Q931_STATUS_ENQUIRY:
-		break;
-	case Q931_SETUP_ACKNOWLEDGE:
 		break;
 	case Q931_NOTIFY:
 		c->notify = -1;
@@ -9199,6 +9214,7 @@
 		ctrl->ev.setup_ack.subcmds = &ctrl->subcmds;
 		ctrl->ev.setup_ack.channel = q931_encode_channel(c);
 		ctrl->ev.setup_ack.call = c->master_call;
+		ctrl->ev.setup_ack.progressmask = c->progressmask;
 
 		for (cur = c->apdus; cur; cur = cur->next) {
 			if (!cur->sent && cur->message == Q931_FACILITY) {




More information about the libpri-commits mailing list