375 lines
10 KiB
C
375 lines
10 KiB
C
#include "primitives.h"
|
|
#include "phone_1TR6.h"
|
|
#include "prot_1TR6_common.h"
|
|
#include "q_data.h"
|
|
#include "streams.h"
|
|
#include "streamlib.h"
|
|
|
|
#ifndef NULL
|
|
#define NULL (void *)0L
|
|
#endif
|
|
|
|
void
|
|
report_addnsf (mblk_t * mb, uchar_t * data, ushort_t len)
|
|
{
|
|
uchar_t facility;
|
|
ushort_t service = 0;
|
|
char nlen;
|
|
|
|
QD_INIT (data, len) return;
|
|
QD {
|
|
QD_CASE (0, PT_N0_netSpecFac):
|
|
if (qd_len == 0)
|
|
break;
|
|
nlen = *qd_data++;
|
|
if (qd_len < nlen + 1)
|
|
break;
|
|
qd_data += nlen;
|
|
facility = *qd_data++;
|
|
qd_len -= nlen + 1;
|
|
switch (qd_len) {
|
|
case 0:
|
|
service = 0;
|
|
break;
|
|
case 1:
|
|
service = *qd_data++ << 8;
|
|
qd_len -= 1;
|
|
break;
|
|
default:
|
|
service = *qd_data++ << 8;
|
|
service = (service << 8) | *qd_data++;
|
|
qd_len -= 2;
|
|
break;
|
|
}
|
|
m_putsx (mb, ID_N0_netSpecFac);
|
|
m_putx (mb, service);
|
|
switch (facility) {
|
|
case N1_FAC_Sperre:
|
|
m_putsx2 (mb, ID_N1_FAC_Sperre);
|
|
while (qd_len > 0)
|
|
switch (*qd_data++) {
|
|
case N1_FAC_Sperre_All:
|
|
m_putsx2 (mb, ID_N1_FAC_Sperre_All);
|
|
break;
|
|
case N1_FAC_Sperre_Fern:
|
|
m_putsx2 (mb, ID_N1_FAC_Sperre_Fern);
|
|
break;
|
|
case N1_FAC_Sperre_Intl:
|
|
m_putsx2 (mb, ID_N1_FAC_Sperre_Intl);
|
|
break;
|
|
case N1_FAC_Sperre_interk:
|
|
m_putsx2 (mb, ID_N1_FAC_Sperre_interk);
|
|
break;
|
|
}
|
|
break;
|
|
case N1_FAC_Forward1:
|
|
m_putsx2 (mb, ID_N1_FAC_Forward1);
|
|
m_puts (mb, qd_data, qd_len);
|
|
break;
|
|
case N1_FAC_Forward2:
|
|
m_putsx2 (mb, ID_N1_FAC_Forward2);
|
|
m_puts (mb, qd_data, qd_len);
|
|
break;
|
|
break;
|
|
case N1_FAC_Konferenz:
|
|
m_putsx2 (mb, ID_N1_FAC_Konferenz);
|
|
break;
|
|
case N1_FAC_GrabBchan:
|
|
m_putsx2 (mb, ID_N1_FAC_GrabBchan);
|
|
break;
|
|
if (qd_len > 0)
|
|
m_puti (mb, *qd_data);
|
|
break;
|
|
case N1_FAC_Reactivate:
|
|
m_putsx2 (mb, ID_N1_FAC_Reactivate);
|
|
break;
|
|
case N1_FAC_Konferenz3:
|
|
m_putsx2 (mb, ID_N1_FAC_Konferenz3);
|
|
break;
|
|
case N1_FAC_Dienstwechsel1:
|
|
m_putsx2 (mb, ID_N1_FAC_Dienstwechsel1);
|
|
m_puts (mb, qd_data, qd_len);
|
|
break;
|
|
break;
|
|
case N1_FAC_Dienstwechsel2:
|
|
m_putsx2 (mb, ID_N1_FAC_Dienstwechsel2);
|
|
m_puts (mb, qd_data, qd_len);
|
|
break;
|
|
break;
|
|
case N1_FAC_NummernIdent:
|
|
m_putsx2 (mb, ID_N1_FAC_NummernIdent);
|
|
break;
|
|
case N1_FAC_GBG:
|
|
m_putsx2 (mb, ID_N1_FAC_GBG);
|
|
break;
|
|
case N1_FAC_DisplayUebergeben:
|
|
m_putsx2 (mb, ID_N1_FAC_DisplayUebergeben);
|
|
break;
|
|
case N1_FAC_DisplayUmgeleitet:
|
|
m_putsx2 (mb, ID_N1_FAC_DisplayUmgeleitet);
|
|
break;
|
|
case N1_FAC_Unterdruecke:
|
|
m_putsx2 (mb, ID_N1_FAC_Unterdruecke);
|
|
break;
|
|
case N1_FAC_Deactivate:
|
|
m_putsx2 (mb, ID_N1_FAC_Deactivate);
|
|
break;
|
|
case N1_FAC_Activate:
|
|
m_putsx2 (mb, ID_N1_FAC_Activate);
|
|
break;
|
|
case N1_FAC_SVC:
|
|
m_putsx2 (mb, ID_N1_FAC_SVC);
|
|
break;
|
|
case N1_FAC_Rueckwechsel:
|
|
m_putsx2 (mb, ID_N1_FAC_Rueckwechsel);
|
|
break;
|
|
case N1_FAC_Umleitung:
|
|
m_putsx2 (mb, ID_N1_FAC_Umleitung);
|
|
break;
|
|
default:
|
|
m_putx (mb, facility);
|
|
}
|
|
}
|
|
}
|
|
|
|
uchar_t
|
|
report_addcause (mblk_t * mb, uchar_t * data, int len)
|
|
{
|
|
int qd_len;
|
|
uchar_t *qd_data;
|
|
|
|
qd_data = qd_find (data, len, 0, PT_N0_cause, &qd_len);
|
|
if (qd_data == NULL)
|
|
return 0;
|
|
if (qd_len < 1)
|
|
return 0;
|
|
m_putsx (mb, ARG_CAUSE);
|
|
m_putsx2(mb,n1_causetoid(*qd_data & 0x7F));
|
|
do {
|
|
} while(--qd_len > 0 && !(*qd_data++ & 0x80));
|
|
if(qd_len > 0)
|
|
m_putx(mb,*qd_data & 0x0F);
|
|
|
|
return *qd_data;
|
|
}
|
|
|
|
void
|
|
report_addisplay (mblk_t * mb, uchar_t * data, int len)
|
|
{
|
|
int qd_len;
|
|
uchar_t *qd_data;
|
|
|
|
qd_data = qd_find (data, len, 0, PT_N0_display, &qd_len);
|
|
if (qd_data == NULL)
|
|
return;
|
|
if (qd_len < 1)
|
|
return;
|
|
m_putsx (mb, ID_N0_display);
|
|
m_puts (mb, qd_data, qd_len);
|
|
}
|
|
|
|
void
|
|
report_adddate (mblk_t * mb, uchar_t * data, int len)
|
|
{
|
|
int qd_len;
|
|
uchar_t *qd_data;
|
|
|
|
qd_data = qd_find (data, len, 6, PT_N6_date, &qd_len);
|
|
if (qd_data == NULL)
|
|
return;
|
|
if (qd_len < 1)
|
|
return;
|
|
m_putsx (mb, ID_N6_date);
|
|
m_puts (mb, qd_data, qd_len);
|
|
}
|
|
|
|
void
|
|
report_addcost (mblk_t * mb, uchar_t * data, int len)
|
|
{
|
|
int qd_len;
|
|
uchar_t *qd_data;
|
|
|
|
qd_data = qd_find (data, len, 6, PT_N6_chargingInfo, &qd_len);
|
|
if (qd_data == NULL)
|
|
return;
|
|
if (qd_len < 2)
|
|
return;
|
|
m_putsx (mb, ARG_CHARGE);
|
|
m_puts (mb, qd_data + 1, qd_len - 1);
|
|
}
|
|
|
|
void
|
|
report_addstatus (mblk_t * mb, uchar_t * data, int len)
|
|
{
|
|
int qd_len;
|
|
uchar_t *qd_data;
|
|
|
|
qd_data = qd_find (data, len, 6, PT_N6_statusCalled, &qd_len);
|
|
if (qd_data == NULL)
|
|
return;
|
|
if (qd_len < 1)
|
|
return;
|
|
m_putsx (mb, ID_N6_statusCalled);
|
|
switch (*qd_data) {
|
|
case N1_St_Unknown:
|
|
m_putsx2 (mb, ID_N1_St_Unknown);
|
|
break;
|
|
case N1_St_Calling:
|
|
m_putsx2 (mb, ID_N1_St_Calling);
|
|
break;
|
|
default:
|
|
m_putx (mb, *qd_data & 0x7f);
|
|
}
|
|
m_puts (mb, qd_data, qd_len);
|
|
}
|
|
|
|
ushort_t
|
|
n1_causetoid(uchar_t id)
|
|
{
|
|
switch(id) {
|
|
default: return CHAR2('?','?');
|
|
case N1_InvCRef: return ID_N1_InvCRef;
|
|
case N1_BearerNotImpl: return ID_N1_BearerNotImpl;
|
|
case N1_CIDinUse: return ID_N1_CIDinUse;
|
|
case N1_CIDunknown: return ID_N1_CIDunknown;
|
|
case N1_NoChans: return ID_N1_NoChans;
|
|
case N1_FacNotImpl: return ID_N1_FacNotImpl;
|
|
case N1_FacNotSubscr: return ID_N1_FacNotSubscr;
|
|
case N1_OutgoingBarred: return ID_N1_OutgoingBarred;
|
|
case N1_UserAssessBusy: return ID_N1_UserAssessBusy;
|
|
case N1_NegativeGBG: return ID_N1_NegativeGBG;
|
|
case N1_UnknownGBG: return ID_N1_UnknownGBG;
|
|
case N1_NoSPVknown: return ID_N1_NoSPVknown;
|
|
case N1_DestNotObtain: return ID_N1_DestNotObtain;
|
|
case N1_NumberChanged: return ID_N1_NumberChanged;
|
|
case N1_OutOfOrder: return ID_N1_OutOfOrder;
|
|
case N1_NoUserResponse: return ID_N1_NoUserResponse;
|
|
case N1_UserBusy: return ID_N1_UserBusy;
|
|
case N1_IncomingBarred: return ID_N1_IncomingBarred;
|
|
case N1_CallRejected: return ID_N1_CallRejected;
|
|
case N1_NetworkCongestion: return ID_N1_NetworkCongestion;
|
|
case N1_RemoteUser: return ID_N1_RemoteUser;
|
|
case N1_LocalProcErr: return ID_N1_LocalProcErr;
|
|
case N1_RemoteProcErr: return ID_N1_RemoteProcErr;
|
|
case N1_RemoteUserSuspend: return ID_N1_RemoteUserSuspend;
|
|
case N1_RemoteUserResumed: return ID_N1_RemoteUserResumed;
|
|
case N1_UserInfoDiscarded: return ID_N1_UserInfoDiscarded;
|
|
/* case N1_St_Unknown: return ID_N1_St_Unknown; */
|
|
case N1_St_Calling: return ID_N1_St_Calling;
|
|
}
|
|
}
|
|
|
|
uchar_t
|
|
n1_idtocause(ushort_t id)
|
|
{
|
|
switch(id) {
|
|
default: return 0;
|
|
case ID_N1_InvCRef: return N1_InvCRef;
|
|
case ID_N1_BearerNotImpl: return N1_BearerNotImpl;
|
|
case ID_N1_CIDinUse: return N1_CIDinUse;
|
|
case ID_N1_CIDunknown: return N1_CIDunknown;
|
|
case ID_N1_NoChans: return N1_NoChans;
|
|
case ID_N1_FacNotImpl: return N1_FacNotImpl;
|
|
case ID_N1_FacNotSubscr: return N1_FacNotSubscr;
|
|
case ID_N1_OutgoingBarred: return N1_OutgoingBarred;
|
|
case ID_N1_UserAssessBusy: return N1_UserAssessBusy;
|
|
case ID_N1_NegativeGBG: return N1_NegativeGBG;
|
|
case ID_N1_UnknownGBG: return N1_UnknownGBG;
|
|
case ID_N1_NoSPVknown: return N1_NoSPVknown;
|
|
case ID_N1_DestNotObtain: return N1_DestNotObtain;
|
|
case ID_N1_NumberChanged: return N1_NumberChanged;
|
|
case ID_N1_OutOfOrder: return N1_OutOfOrder;
|
|
case ID_N1_NoUserResponse: return N1_NoUserResponse;
|
|
case ID_N1_UserBusy: return N1_UserBusy;
|
|
case ID_N1_IncomingBarred: return N1_IncomingBarred;
|
|
case ID_N1_CallRejected: return N1_CallRejected;
|
|
case ID_N1_NetworkCongestion: return N1_NetworkCongestion;
|
|
case ID_N1_RemoteUser: return N1_RemoteUser;
|
|
case ID_N1_LocalProcErr: return N1_LocalProcErr;
|
|
case ID_N1_RemoteProcErr: return N1_RemoteProcErr;
|
|
case ID_N1_RemoteUserSuspend: return N1_RemoteUserSuspend;
|
|
case ID_N1_RemoteUserResumed: return N1_RemoteUserResumed;
|
|
case ID_N1_UserInfoDiscarded: return N1_UserInfoDiscarded;
|
|
case ID_N1_St_Unknown: return N1_St_Unknown;
|
|
case ID_N1_St_Calling: return N1_St_Calling;
|
|
}
|
|
}
|
|
|
|
ushort_t
|
|
n1_facsubtoid(uchar_t id)
|
|
{
|
|
switch(id) {
|
|
default: return CHAR2('?','?');
|
|
case N1_FAC_Sperre_All: return ID_N1_FAC_Sperre_All;
|
|
case N1_FAC_Sperre_Fern: return ID_N1_FAC_Sperre_Fern;
|
|
case N1_FAC_Sperre_Intl: return ID_N1_FAC_Sperre_Intl;
|
|
case N1_FAC_Sperre_interk: return ID_N1_FAC_Sperre_interk;
|
|
}
|
|
}
|
|
|
|
ushort_t
|
|
n1_factoid(uchar_t id)
|
|
{
|
|
switch(id) {
|
|
default: return CHAR2('?','?');
|
|
case N1_FAC_Sperre: return ID_N1_FAC_Sperre;
|
|
case N1_FAC_Forward1: return ID_N1_FAC_Forward1;
|
|
case N1_FAC_Forward2: return ID_N1_FAC_Forward2;
|
|
case N1_FAC_Konferenz: return ID_N1_FAC_Konferenz;
|
|
case N1_FAC_GrabBchan: return ID_N1_FAC_GrabBchan;
|
|
case N1_FAC_Reactivate: return ID_N1_FAC_Reactivate;
|
|
case N1_FAC_Konferenz3: return ID_N1_FAC_Konferenz3;
|
|
case N1_FAC_Dienstwechsel1: return ID_N1_FAC_Dienstwechsel1;
|
|
case N1_FAC_Dienstwechsel2: return ID_N1_FAC_Dienstwechsel2;
|
|
case N1_FAC_NummernIdent: return ID_N1_FAC_NummernIdent;
|
|
case N1_FAC_GBG: return ID_N1_FAC_GBG;
|
|
case N1_FAC_DisplayUebergeben: return ID_N1_FAC_DisplayUebergeben;
|
|
case N1_FAC_DisplayUmgeleitet: return ID_N1_FAC_DisplayUmgeleitet;
|
|
case N1_FAC_Unterdruecke: return ID_N1_FAC_Unterdruecke;
|
|
case N1_FAC_Deactivate: return ID_N1_FAC_Deactivate;
|
|
case N1_FAC_Activate: return ID_N1_FAC_Activate;
|
|
case N1_FAC_SVC: return ID_N1_FAC_SVC;
|
|
case N1_FAC_Rueckwechsel: return ID_N1_FAC_Rueckwechsel;
|
|
case N1_FAC_Umleitung: return ID_N1_FAC_Umleitung;
|
|
}
|
|
}
|
|
|
|
uchar_t
|
|
n1_idtofacsub(ushort_t id)
|
|
{
|
|
switch(id) {
|
|
default: return 0;
|
|
case ID_N1_FAC_Sperre_All: return N1_FAC_Sperre_All;
|
|
case ID_N1_FAC_Sperre_Fern: return N1_FAC_Sperre_Fern;
|
|
case ID_N1_FAC_Sperre_Intl: return N1_FAC_Sperre_Intl;
|
|
case ID_N1_FAC_Sperre_interk: return N1_FAC_Sperre_interk;
|
|
}
|
|
}
|
|
|
|
uchar_t
|
|
n1_idtofac(ushort_t id)
|
|
{
|
|
switch(id) {
|
|
default: return 0;
|
|
case ID_N1_FAC_Sperre: return N1_FAC_Sperre;
|
|
case ID_N1_FAC_Forward1: return N1_FAC_Forward1;
|
|
case ID_N1_FAC_Forward2: return N1_FAC_Forward2;
|
|
case ID_N1_FAC_Konferenz: return N1_FAC_Konferenz;
|
|
case ID_N1_FAC_GrabBchan: return N1_FAC_GrabBchan;
|
|
case ID_N1_FAC_Reactivate: return N1_FAC_Reactivate;
|
|
case ID_N1_FAC_Konferenz3: return N1_FAC_Konferenz3;
|
|
case ID_N1_FAC_Dienstwechsel1: return N1_FAC_Dienstwechsel1;
|
|
case ID_N1_FAC_Dienstwechsel2: return N1_FAC_Dienstwechsel2;
|
|
case ID_N1_FAC_NummernIdent: return N1_FAC_NummernIdent;
|
|
case ID_N1_FAC_GBG: return N1_FAC_GBG;
|
|
case ID_N1_FAC_DisplayUebergeben: return N1_FAC_DisplayUebergeben;
|
|
case ID_N1_FAC_DisplayUmgeleitet: return N1_FAC_DisplayUmgeleitet;
|
|
case ID_N1_FAC_Unterdruecke: return N1_FAC_Unterdruecke;
|
|
case ID_N1_FAC_Deactivate: return N1_FAC_Deactivate;
|
|
case ID_N1_FAC_Activate: return N1_FAC_Activate;
|
|
case ID_N1_FAC_SVC: return N1_FAC_SVC;
|
|
case ID_N1_FAC_Rueckwechsel: return N1_FAC_Rueckwechsel;
|
|
case ID_N1_FAC_Umleitung: return N1_FAC_Umleitung;
|
|
}
|
|
}
|