Don't allow notification codes outside of the Q.931 spec for switches other

than EuroISDN.  Also take out some old facility IE code.


git-svn-id: https://origsvn.digium.com/svn/libpri/trunk@238 2fbb986a-6c06-0410-b554-c9c1f0a7f128
This commit is contained in:
Matthew Fredrickson 2005-07-11 17:48:30 +00:00
parent 00d12810bb
commit ac9bba5121

181
q931.c
View File

@ -1120,182 +1120,6 @@ static FUNC_SEND(transmit_facility)
return i + 2;
}
#if 0
static FUNC_SEND(transmit_facility)
{
int i = 0, j, first_i, compsp = 0;
struct rose_component *comp, *compstk[10];
unsigned char namelen = strlen(call->callername);
if ((pri->switchtype == PRI_SWITCH_NI2) && (namelen > 15))
namelen = 15; /* According to GR-1367, for NI2 switches it can't be > 15 characters */
if ((namelen > 0) && ((pri->switchtype == PRI_SWITCH_QSIG) ||
((pri->switchtype == PRI_SWITCH_NI2) && (pri->localtype == PRI_NETWORK)))) {
do {
first_i = i;
ie->data[i] = 0x80 | Q932_PROTOCOL_EXTENSIONS;
i++;
/* Interpretation component */
ASN1_ADD_BYTECOMP(comp, COMP_TYPE_INTERPRETATION, ie->data, i, 0x00 /* Discard unrecognized invokes */);
/* Invoke ID */
ASN1_ADD_SIMPLE(comp, COMP_TYPE_INVOKE, ie->data, i);
ASN1_PUSH(compstk, compsp, comp);
/* Invoke component contents */
/* Invoke ID */
ASN1_ADD_BYTECOMP(comp, ASN1_INTEGER, ie->data, i, ++pri->last_invoke);
/* Operation Tag */
ASN1_ADD_BYTECOMP(comp, ASN1_INTEGER, ie->data, i, SS_CNID_CALLINGNAME);
/* Arugement Tag */
j = asn1_string_encode(ROSE_NAME_PRESENTATION_ALLOWED_SIMPLE, &ie->data[i], len - i, 15, call->callername, namelen);
if (j < 0) {
i = first_i;
break;
}
i += j;
/* Fix length of stacked components */
while(compsp > 0) {
ASN1_FIXUP(compstk, compsp, ie->data, i);
}
} while (0);
}
if (/*(pri->switchtype == PRI_SWITCH_EUROISDN_E1) &&*/ call->redirectingnum && *call->redirectingnum) {
if (!(first_i = i)) {
/* Add protocol information header */
ie->data[i++] = 0x80 | Q932_PROTOCOL_ROSE;
}
/* ROSE invoke component */
ASN1_ADD_SIMPLE(comp, COMP_TYPE_INVOKE, ie->data, i);
ASN1_PUSH(compstk, compsp, comp);
/* ROSE invokeId component */
ASN1_ADD_BYTECOMP(comp, ASN1_INTEGER, ie->data, i, ++pri->last_invoke);
/* ROSE operationId component */
ASN1_ADD_BYTECOMP(comp, ASN1_INTEGER, ie->data, i, ROSE_DIVERTING_LEG_INFORMATION2);
/* ROSE ARGUMENT component */
ASN1_ADD_SIMPLE(comp, 0x30, ie->data, i);
ASN1_PUSH(compstk, compsp, comp);
/* ROSE DivertingLegInformation2.diversionCounter component */
/* Always is 1 because other isn't available in the current design */
ASN1_ADD_BYTECOMP(comp, ASN1_INTEGER, ie->data, i, 1);
/* ROSE DivertingLegInformation2.diversionReason component */
ASN1_ADD_BYTECOMP(comp, ASN1_ENUMERATED, ie->data, i, redirectingreason_from_q931(pri, call->redirectingreason));
/* ROSE DivertingLegInformation2.divertingNr component */
ASN1_ADD_SIMPLE(comp, 0xA1, ie->data, i);
ASN1_PUSH(compstk, compsp, comp);
/* Redirecting information always not screened */
switch(call->redirectingpres) {
case PRES_ALLOWED_USER_NUMBER_NOT_SCREENED:
case PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN:
if (call->redirectingnum && *call->redirectingnum) {
ASN1_ADD_SIMPLE(comp, 0xA0, ie->data, i);
ASN1_PUSH(compstk, compsp, comp);
/* NPI of redirected number is not supported in the current design */
ASN1_ADD_SIMPLE(comp, 0xA1, ie->data, i);
ASN1_PUSH(compstk, compsp, comp);
ASN1_ADD_BYTECOMP(comp, ASN1_ENUMERATED, ie->data, i, typeofnumber_from_q931(pri, call->redirectingplan >> 4));
j = asn1_string_encode(ASN1_NUMERICSTRING, &ie->data[i], len - i, 20, call->redirectingnum, strlen(call->redirectingnum));
if (j < 0) {
i = first_i;
goto finish2;
}
i += j;
ASN1_FIXUP(compstk, compsp, ie->data, i);
ASN1_FIXUP(compstk, compsp, ie->data, i);
break;
}
/* fall through */
case PRES_PROHIB_USER_NUMBER_PASSED_SCREEN:
case PRES_PROHIB_USER_NUMBER_NOT_SCREENED:
ASN1_ADD_SIMPLE(comp, 0x81, ie->data, i);
break;
/* Don't know how to handle this */
case PRES_ALLOWED_NETWORK_NUMBER:
case PRES_PROHIB_NETWORK_NUMBER:
case PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN:
case PRES_PROHIB_USER_NUMBER_FAILED_SCREEN:
ASN1_ADD_SIMPLE(comp, 0x81, ie->data, i);
break;
default:
pri_message(pri, "!! Undefined presentation value for redirecting number: %d\n", call->redirectingpres);
case PRES_NUMBER_NOT_AVAILABLE:
ASN1_ADD_SIMPLE(comp, 0x82, ie->data, i);
break;
}
ASN1_FIXUP(compstk, compsp, ie->data, i);
/* ROSE DivertingLegInformation2.originalCalledNr component */
/* This information isn't supported by current design - duplicate divertingNr */
ASN1_ADD_SIMPLE(comp, 0xA2, ie->data, i);
ASN1_PUSH(compstk, compsp, comp);
/* Redirecting information always not screened */
switch(call->redirectingpres) {
case PRES_ALLOWED_USER_NUMBER_NOT_SCREENED:
case PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN:
if (call->redirectingnum && *call->redirectingnum) {
ASN1_ADD_SIMPLE(comp, 0xA0, ie->data, i);
ASN1_PUSH(compstk, compsp, comp);
ASN1_ADD_SIMPLE(comp, 0xA1, ie->data, i);
ASN1_PUSH(compstk, compsp, comp);
ASN1_ADD_BYTECOMP(comp, ASN1_ENUMERATED, ie->data, i, typeofnumber_from_q931(pri, call->redirectingplan >> 4));
j = asn1_string_encode(ASN1_NUMERICSTRING, &ie->data[i], len - i, 20, call->redirectingnum, strlen(call->redirectingnum));
if (j < 0) {
i = first_i;
goto finish2;
}
i += j;
ASN1_FIXUP(compstk, compsp, ie->data, i);
ASN1_FIXUP(compstk, compsp, ie->data, i);
break;
}
/* fall through */
case PRES_PROHIB_USER_NUMBER_PASSED_SCREEN:
case PRES_PROHIB_USER_NUMBER_NOT_SCREENED:
ASN1_ADD_SIMPLE(comp, 0x81, ie->data, i);
break;
/* Don't know how to handle this */
case PRES_ALLOWED_NETWORK_NUMBER:
case PRES_PROHIB_NETWORK_NUMBER:
case PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN:
case PRES_PROHIB_USER_NUMBER_FAILED_SCREEN:
ASN1_ADD_SIMPLE(comp, 0x81, ie->data, i);
break;
default:
pri_message(pri, "!! Undefined presentation value for redirecting number: %d\n", call->redirectingpres);
case PRES_NUMBER_NOT_AVAILABLE:
ASN1_ADD_SIMPLE(comp, 0x82, ie->data, i);
break;
}
ASN1_FIXUP(compstk, compsp, ie->data, i);
/* Fix length of stacked components */
while(compsp > 0) {
ASN1_FIXUP(compstk, compsp, ie->data, i);
}
}
finish2:
return (i ? i+2 : 0);
}
#endif
static FUNC_RECV(receive_facility)
{
int i = 0;
@ -2615,6 +2439,11 @@ static int notify_ies[] = { Q931_IE_NOTIFY_IND, -1 };
int q931_notify(struct pri *pri, q931_call *c, int channel, int info)
{
if ((pri->switchtype == PRI_SWITCH_EUROISDN_T1) || (pri->switchtype != PRI_SWITCH_EUROISDN_E1)) {
if ((info > 0x2) || (info < 0x00))
return 0;
}
if (info >= 0)
c->notify = info & 0x7F;
else