[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


git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.4@1823 2fbb986a-6c06-0410-b554-c9c1f0a7f128
This commit is contained in:
Richard Mudgett 2010-06-29 16:15:03 +00:00
parent bf5ef150e6
commit c5fce8da41
2 changed files with 29 additions and 12 deletions

View File

@ -534,6 +534,8 @@ struct q931_call {
* (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.

39
q931.c
View File

@ -2130,26 +2130,41 @@ static int transmit_called_party_number(int full_ie, struct pri *ctrl, q931_call
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;
struct q931_party_number number;
q931_party_number_init(&number);
number.valid = 1;
number.presentation = PRI_PRES_ALLOWED | PRI_PRES_USER_NUMBER_UNSCREENED;
call->remote_id.number.valid = 1;
call->remote_id.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;
}
@ -3707,6 +3722,7 @@ void q931_init_call_record(struct pri *ctrl, struct q931_call *call, int cr)
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 */
@ -6075,6 +6091,7 @@ static int prepare_to_handle_q931_message(struct pri *ctrl, q931_mh *mh, q931_ca
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);
/*
@ -6891,11 +6908,9 @@ static void q931_fill_ring_event(struct pri *ctrl, struct q931_call *call)
/* 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;