[svn-commits] rmudgett: branch 1.4 r1152 - /branches/1.4/pri_facility.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Oct 7 13:34:13 CDT 2009


Author: rmudgett
Date: Wed Oct  7 13:34:06 2009
New Revision: 1152

URL: http://svnview.digium.com/svn/libpri?view=rev&rev=1152
Log:
Sent Q.SIG call rerouting message fixes.

a) Account for pSS1InfoElement where the bearer capability for the new
rerouted call is described.  The call could be a fax or data call, let's
use the appropriate signaling to avoid call rejects on the other end.
b) Handle calling number appropriately, number can be prohibited or
non-existent.
c) Add calling name if available.
d) Use the diversion counter from DivLegInfo2 (if was present in the
incoming Setup) and increment.

(issue #14292)
Reported by: tomaso
Patches:
      libpri-1.4-2009-01-29-rerouting-0.1.9.patch uploaded by tomaso (license 564)
      (Used as a guide since it no longer will apply.)
      (This patch is unrelated to the issue.)


Modified:
    branches/1.4/pri_facility.c

Modified: branches/1.4/pri_facility.c
URL: http://svnview.digium.com/svn/libpri/branches/1.4/pri_facility.c?view=diff&rev=1152&r1=1151&r2=1152
==============================================================================
--- branches/1.4/pri_facility.c (original)
+++ branches/1.4/pri_facility.c Wed Oct  7 13:34:06 2009
@@ -1653,7 +1653,8 @@
  * \param ctrl D channel controller for diagnostic messages or global options.
  * \param pos Starting position to encode the facility ie contents.
  * \param end End of facility ie contents encoding data buffer.
- * \param calling Calling number.
+ * \param call Q.931 call leg.
+ * \param calling Calling party info.
  * \param dest Destination number.
  * \param original Original called number.
  * \param reason Rerouting reason: cfu, cfb, cfnr
@@ -1662,23 +1663,12 @@
  * \retval NULL on error.
  */
 static unsigned char *enc_qsig_call_rerouting(struct pri *ctrl, unsigned char *pos,
-	unsigned char *end, const char *calling, const char *dest, const char *original,
-	const char *reason)
+	unsigned char *end, q931_call *call, const struct q931_party_id *calling,
+	const char *dest, const char *original, const char *reason)
 {
 	struct fac_extension_header header;
 	struct rose_msg_invoke msg;
-
-	static const unsigned char q931ie[] = {
-		0x04,	/* Bearer Capability IE */
-		0x03,	/* len */
-		0x80,	/* ETSI Standard, Speech */
-		0x90,	/* circuit mode, 64kbit/s */
-		0xa3,	/* level1 protocol, a-law */
-		0x95,	/* locking shift to codeset 5 (national use) */
-		0x32,	/* Unknown ie */
-		0x01,	/* Unknown ie len */
-		0x81,	/* Unknown ie body */
-	};
+	unsigned char *q931ie_pos;
 
 	memset(&header, 0, sizeof(header));
 	header.nfe_present = 1;
@@ -1714,11 +1704,21 @@
 	msg.args.qsig.CallRerouting.called.number.length = strlen((char *)
 		msg.args.qsig.CallRerouting.called.number.str);
 
-	msg.args.qsig.CallRerouting.diversion_counter = 1;
+	msg.args.qsig.CallRerouting.diversion_counter = call->redirecting.count + 1;
 
 	/* pSS1InfoElement */
-	msg.args.qsig.CallRerouting.q931ie.length = sizeof(q931ie);
-	memcpy(msg.args.qsig.CallRerouting.q931ie_contents, q931ie, sizeof(q931ie));
+	q931ie_pos = msg.args.qsig.CallRerouting.q931ie_contents;
+	*q931ie_pos++ = 0x04;	/* Bearer Capability IE */
+	*q931ie_pos++ = 0x03;	/* len */
+	*q931ie_pos++ = 0x80 | call->transcapability;	/* Rxed transfer capability. */
+	*q931ie_pos++ = 0x90;	/* circuit mode, 64kbit/s */
+	*q931ie_pos++ = 0xa3;	/* level1 protocol, a-law */
+	*q931ie_pos++ = 0x95;	/* locking shift to codeset 5 (national use) */
+	*q931ie_pos++ = 0x32;	/* Unknown ie */
+	*q931ie_pos++ = 0x01;	/* Unknown ie len */
+	*q931ie_pos++ = 0x81;	/* Unknown ie body */
+	msg.args.qsig.CallRerouting.q931ie.length = q931ie_pos
+		- msg.args.qsig.CallRerouting.q931ie_contents;
 
 	/* lastReroutingNr is the passed in original number */
 	msg.args.qsig.CallRerouting.last_rerouting.presentation = 0;	/* presentationAllowedNumber */
@@ -1731,15 +1731,15 @@
 
 	msg.args.qsig.CallRerouting.subscription_option = 0;	/* noNotification */
 
-	/* callingNumber is the passed in calling number */
-	msg.args.qsig.CallRerouting.calling.presentation = 0;	/* presentationAllowedNumber */
-	msg.args.qsig.CallRerouting.calling.screened.number.plan = 1;	/* public */
-	msg.args.qsig.CallRerouting.calling.screened.number.ton = 0;	/* unknown */
-	libpri_copy_string((char *) msg.args.qsig.CallRerouting.calling.screened.number.str,
-		calling, sizeof(msg.args.qsig.CallRerouting.calling.screened.number.str));
-	msg.args.qsig.CallRerouting.calling.screened.number.length = strlen((char *)
-		msg.args.qsig.CallRerouting.calling.screened.number.str);
-	msg.args.qsig.CallRerouting.calling.screened.screening_indicator = 3;	/* networkProvided */
+	/* callingNumber is the passed in calling->number */
+	q931_copy_presented_number_screened_to_rose(ctrl,
+		&msg.args.qsig.CallRerouting.calling, &calling->number);
+
+	/* callingName is the passed in calling->name if valid */
+	if (calling->name.valid) {
+		msg.args.qsig.CallRerouting.calling_name_present = 1;
+		q931_copy_name_to_rose(ctrl, &msg.args.qsig.CallRerouting.calling_name, &calling->name);
+	}
 
 	pos = rose_encode_invoke(ctrl, pos, end, &msg);
 
@@ -1750,7 +1750,7 @@
  * \brief Send the Q.SIG CallRerouting invoke message.
  *
  * \param ctrl D channel controller for diagnostic messages or global options.
- * \param call Call leg from which to encode name.
+ * \param call Q.931 call leg.
  * \param dest Destination number.
  * \param original Original called number.
  * \param reason Rerouting reason: cfu, cfb, cfnr
@@ -1770,9 +1770,9 @@
 	 * Therefore, the Caller-ID is the remote party.
 	 */
 	end =
-		enc_qsig_call_rerouting(ctrl, buffer, buffer + sizeof(buffer),
-			call->remote_id.number.str, dest, original ? original :
-			call->called.number.str, reason);
+		enc_qsig_call_rerouting(ctrl, buffer, buffer + sizeof(buffer), call,
+			&call->remote_id, dest, original ? original : call->called.number.str,
+			reason);
 	if (!end) {
 		return -1;
 	}




More information about the svn-commits mailing list