[libpri-commits] rmudgett: tag 1.4.11.3 r1824 - in /tags/1.4.11.3: pri_internal.h q931.c
SVN commits to the libpri project
libpri-commits at lists.digium.com
Tue Jun 29 11:17:59 CDT 2010
Author: rmudgett
Date: Tue Jun 29 11:17:54 2010
New Revision: 1824
URL: http://svnview.digium.com/svn/libpri?view=rev&rev=1824
Log:
[regression] Calling Number assignment logic change in libpri 1.4.11.
Restored the old behaviour if there is more than one calling number in the
incoming SETUP message. A network provided number is reported as ANI.
(closes issue #17495)
Reported by: ibercom
Patches:
issue_17495_v1.4.11.2.patch uploaded by rmudgett (license 664)
issue_17495_v1.4.patch uploaded by rmudgett (license 664)
Tested by: ibercom
Modified:
tags/1.4.11.3/pri_internal.h
tags/1.4.11.3/q931.c
Modified: tags/1.4.11.3/pri_internal.h
URL: http://svnview.digium.com/svn/libpri/tags/1.4.11.3/pri_internal.h?view=diff&rev=1824&r1=1823&r2=1824
==============================================================================
--- tags/1.4.11.3/pri_internal.h (original)
+++ tags/1.4.11.3/pri_internal.h Tue Jun 29 11:17:54 2010
@@ -458,6 +458,8 @@
* (Caller-ID for answered or connected-line for originated calls.)
*/
struct q931_party_id remote_id;
+ /*! \brief Automatic Number Identification (ANI) */
+ struct q931_party_number ani;
/*!
* \brief Staging place for the Q.931 redirection number ie.
Modified: tags/1.4.11.3/q931.c
URL: http://svnview.digium.com/svn/libpri/tags/1.4.11.3/q931.c?view=diff&rev=1824&r1=1823&r2=1824
==============================================================================
--- tags/1.4.11.3/q931.c (original)
+++ tags/1.4.11.3/q931.c Tue Jun 29 11:17:54 2010
@@ -1994,26 +1994,41 @@
static int receive_calling_party_number(int full_ie, struct pri *ctrl, q931_call *call, int msgtype, q931_ie *ie, int len)
{
int i = 0;
-
- call->remote_id.number.valid = 1;
- call->remote_id.number.presentation =
- PRI_PRES_ALLOWED | PRI_PRES_USER_NUMBER_UNSCREENED;
+ struct q931_party_number number;
+
+ q931_party_number_init(&number);
+ number.valid = 1;
+ number.presentation = PRI_PRES_ALLOWED | PRI_PRES_USER_NUMBER_UNSCREENED;
+
/* To follow Q.931 (4.5.1), we must search for start of octet 4 by
walking through all bytes until one with ext bit (8) set to 1 */
do {
switch (i) {
case 0:
- call->remote_id.number.plan = ie->data[i] & 0x7f;
+ number.plan = ie->data[i] & 0x7f;
break;
case 1:
/* Keep only the presentation and screening fields */
- call->remote_id.number.presentation =
+ number.presentation =
ie->data[i] & (PRI_PRES_RESTRICTION | PRI_PRES_NUMBER_TYPE);
break;
}
} while (!(ie->data[i++] & 0x80));
- q931_get_number((unsigned char *) call->remote_id.number.str,
- sizeof(call->remote_id.number.str), ie->data + i, ie->len - i);
+ q931_get_number((unsigned char *) number.str, sizeof(number.str), ie->data + i,
+ ie->len - i);
+
+ /* There can be more than one calling party number ie in the SETUP message. */
+ if (number.presentation == (PRI_PRES_ALLOWED | PRI_PRES_NETWORK_NUMBER)
+ || number.presentation == (PRI_PRES_RESTRICTED | PRI_PRES_NETWORK_NUMBER)) {
+ /* The number is network provided so it is an ANI number. */
+ call->ani = number;
+ if (!call->remote_id.number.valid) {
+ /* Copy ANI to CallerID if CallerID is not already set. */
+ call->remote_id.number = number;
+ }
+ } else {
+ call->remote_id.number = number;
+ }
return 0;
}
@@ -3514,6 +3529,7 @@
q931_party_address_init(&call->called);
q931_party_id_init(&call->local_id);
q931_party_id_init(&call->remote_id);
+ q931_party_number_init(&call->ani);
q931_party_redirecting_init(&call->redirecting);
/* PRI is set to whoever called us */
@@ -5673,6 +5689,7 @@
q931_party_address_init(&c->called);
q931_party_id_init(&c->local_id);
q931_party_id_init(&c->remote_id);
+ q931_party_number_init(&c->ani);
q931_party_redirecting_init(&c->redirecting);
/*
@@ -6477,11 +6494,9 @@
/* Calling party information */
ctrl->ev.ring.callingpres = q931_party_id_presentation(&call->remote_id);
ctrl->ev.ring.callingplan = call->remote_id.number.plan;
- if (call->remote_id.number.valid
- && (call->remote_id.number.presentation == PRES_ALLOWED_NETWORK_NUMBER
- || call->remote_id.number.presentation == PRES_PROHIB_NETWORK_NUMBER)) {
- ctrl->ev.ring.callingplanani = call->remote_id.number.plan;
- libpri_copy_string(ctrl->ev.ring.callingani, call->remote_id.number.str,
+ if (call->ani.valid) {
+ ctrl->ev.ring.callingplanani = call->ani.plan;
+ libpri_copy_string(ctrl->ev.ring.callingani, call->ani.str,
sizeof(ctrl->ev.ring.callingani));
} else {
ctrl->ev.ring.callingplanani = -1;
More information about the libpri-commits
mailing list