logging 1TR6 messages correctly Karsten Keil
This commit is contained in:
parent
f83bee8cc0
commit
e1c0dd5194
|
@ -10,7 +10,13 @@
|
|||
*
|
||||
* Beat Doebeli cause texts, display information element
|
||||
*
|
||||
* Karsten Keil cause texts, display information element for 1TR6
|
||||
*
|
||||
*
|
||||
* $Log$
|
||||
* Revision 1.2 1996/04/20 16:48:19 fritz
|
||||
* Misc. typos
|
||||
*
|
||||
* Revision 1.1 1996/04/13 10:27:49 fritz
|
||||
* Initial revision
|
||||
*
|
||||
|
@ -20,6 +26,7 @@
|
|||
|
||||
#define __NO_VERSION__
|
||||
#include "teles.h"
|
||||
#include "l3_1TR6.h"
|
||||
|
||||
byte *
|
||||
findie(byte * p, int size, byte ie, int wanted_set)
|
||||
|
@ -171,9 +178,87 @@ struct MessageType {
|
|||
|
||||
#define MTSIZE sizeof(mtlist)/sizeof(struct MessageType)
|
||||
|
||||
static
|
||||
struct MessageType mt_n0[] =
|
||||
{
|
||||
{MT_N0_REG_IND, "REGister INDication"},
|
||||
{MT_N0_CANC_IND, "CANCel INDication"},
|
||||
{MT_N0_FAC_STA, "FACility STAtus"},
|
||||
{MT_N0_STA_ACK, "STAtus ACKnowledge"},
|
||||
{MT_N0_STA_REJ, "STAtus REJect"},
|
||||
{MT_N0_FAC_INF, "FACility INFormation"},
|
||||
{MT_N0_INF_ACK, "INFormation ACKnowledge"},
|
||||
{MT_N0_INF_REJ, "INFormation REJect"},
|
||||
{MT_N0_CLOSE, "CLOSE"},
|
||||
{MT_N0_CLO_ACK, "CLOse ACKnowledge"}
|
||||
};
|
||||
|
||||
int mt_n0_len = (sizeof(mt_n0) / sizeof(struct MessageType));
|
||||
|
||||
static
|
||||
int
|
||||
struct MessageType mt_n1[] =
|
||||
{
|
||||
{MT_N1_ESC, "ESCape"},
|
||||
{MT_N1_ALERT, "ALERT"},
|
||||
{MT_N1_CALL_SENT, "CALL SENT"},
|
||||
{MT_N1_CONN, "CONNect"},
|
||||
{MT_N1_CONN_ACK, "CONNect ACKnowledge"},
|
||||
{MT_N1_SETUP, "SETUP"},
|
||||
{MT_N1_SETUP_ACK, "SETUP ACKnowledge"},
|
||||
{MT_N1_RES, "RESume"},
|
||||
{MT_N1_RES_ACK, "RESume ACKnowledge"},
|
||||
{MT_N1_RES_REJ, "RESume REJect"},
|
||||
{MT_N1_SUSP, "SUSPend"},
|
||||
{MT_N1_SUSP_ACK, "SUSPend ACKnowledge"},
|
||||
{MT_N1_SUSP_REJ, "SUSPend REJect"},
|
||||
{MT_N1_USER_INFO, "USER INFO"},
|
||||
{MT_N1_DET, "DETach"},
|
||||
{MT_N1_DISC, "DISConnect"},
|
||||
{MT_N1_REL, "RELease"},
|
||||
{MT_N1_REL_ACK, "RELease ACKnowledge"},
|
||||
{MT_N1_CANC_ACK, "CANCel ACKnowledge"},
|
||||
{MT_N1_CANC_REJ, "CANCel REJect"},
|
||||
{MT_N1_CON_CON, "CONgestion CONtrol"},
|
||||
{MT_N1_FAC, "FACility"},
|
||||
{MT_N1_FAC_ACK, "FACility ACKnowledge"},
|
||||
{MT_N1_FAC_CAN, "FACility CANcel"},
|
||||
{MT_N1_FAC_REG, "FACility REGister"},
|
||||
{MT_N1_FAC_REJ, "FACility REJect"},
|
||||
{MT_N1_INFO, "INFOmation"},
|
||||
{MT_N1_REG_ACK, "REGister ACKnowledge"},
|
||||
{MT_N1_REG_REJ, "REGister REJect"},
|
||||
{MT_N1_STAT, "STATus"}
|
||||
};
|
||||
|
||||
int mt_n1_len = (sizeof(mt_n1) / sizeof(struct MessageType));
|
||||
|
||||
static struct MessageType fac_1tr6[] =
|
||||
{
|
||||
{FAC_Sperre, "Sperre"},
|
||||
{FAC_Forward1, "Forward 1"},
|
||||
{FAC_Forward2, "Forward 2"},
|
||||
{FAC_Konferenz, "Konferenz"},
|
||||
{FAC_GrabBchan, "Grab Bchannel"},
|
||||
{FAC_Reactivate, "Reactivate"},
|
||||
{FAC_Konferenz3, "Dreier Konferenz"},
|
||||
{FAC_Dienstwechsel1, "Einseitiger Dienstwechsel"},
|
||||
{FAC_Dienstwechsel2, "Zweiseitiger Dienstwechsel"},
|
||||
{FAC_NummernIdent, "Rufnummer-Identifizierung"},
|
||||
{FAC_GBG, "GBG"},
|
||||
{FAC_DisplayUebergeben, "Display Uebergeben"},
|
||||
{FAC_DisplayUmgeleitet, "Display Umgeleitet"},
|
||||
{FAC_Unterdruecke, "Unterdruecke Rufnummer"},
|
||||
{FAC_Deactivate, "Deactivate"},
|
||||
{FAC_Activate, "Activate"},
|
||||
{FAC_SPV, "SPV"},
|
||||
{FAC_Rueckwechsel, "Rueckwechsel"},
|
||||
{FAC_Umleitung, "Umleitung"}
|
||||
};
|
||||
int fac_1tr6_len = (sizeof(fac_1tr6) / sizeof(struct MessageType));
|
||||
|
||||
|
||||
|
||||
static int
|
||||
prbits(char *dest, byte b, int start, int len)
|
||||
{
|
||||
char *dp = dest;
|
||||
|
@ -468,9 +553,75 @@ prcause(char *dest, byte * p)
|
|||
}
|
||||
|
||||
static
|
||||
int
|
||||
prchident(char *dest, byte * p)
|
||||
struct MessageType cause_1tr6[] =
|
||||
{
|
||||
{CAUSE_InvCRef, "Invalid Call Reference"},
|
||||
{CAUSE_BearerNotImpl, "Bearer Service Not Implemented"},
|
||||
{CAUSE_CIDunknown, "Caller Identity unknown"},
|
||||
{CAUSE_CIDinUse, "Caller Identity in Use"},
|
||||
{CAUSE_NoChans, "No Channels available"},
|
||||
{CAUSE_FacNotImpl, "Facility Not Implemented"},
|
||||
{CAUSE_FacNotSubscr, "Facility Not Subscribed"},
|
||||
{CAUSE_OutgoingBarred, "Outgoing calls barred"},
|
||||
{CAUSE_UserAccessBusy, "User Access Busy"},
|
||||
{CAUSE_NegativeGBG, "Negative GBG"},
|
||||
{CAUSE_UnknownGBG, "Unknown GBG"},
|
||||
{CAUSE_NoSPVknown, "No SPV known"},
|
||||
{CAUSE_DestNotObtain, "Destination not obtainable"},
|
||||
{CAUSE_NumberChanged, "Number changed"},
|
||||
{CAUSE_OutOfOrder, "Out Of Order"},
|
||||
{CAUSE_NoUserResponse, "No User Response"},
|
||||
{CAUSE_UserBusy, "User Busy"},
|
||||
{CAUSE_IncomingBarred, "Incoming Barred"},
|
||||
{CAUSE_CallRejected, "Call Rejected"},
|
||||
{CAUSE_NetworkCongestion, "Network Congestion"},
|
||||
{CAUSE_RemoteUser, "Remote User initiated"},
|
||||
{CAUSE_LocalProcErr, "Local Procedure Error"},
|
||||
{CAUSE_RemoteProcErr, "Remote Procedure Error"},
|
||||
{CAUSE_RemoteUserSuspend, "Remote User Suspend"},
|
||||
{CAUSE_RemoteUserResumed, "Remote User Resumed"},
|
||||
{CAUSE_UserInfoDiscarded, "User Info Discarded"}
|
||||
};
|
||||
|
||||
int cause_1tr6_len = (sizeof(cause_1tr6) / sizeof(struct MessageType));
|
||||
|
||||
static int
|
||||
prcause_1tr6(char *dest, byte * p)
|
||||
{
|
||||
char *dp = dest;
|
||||
int i, cause;
|
||||
|
||||
p++;
|
||||
if (0 == *p) {
|
||||
dp += sprintf(dp, " OK (cause length=0)\n");
|
||||
return (dp - dest);
|
||||
} else if (*p > 1) {
|
||||
dp += sprintf(dp, " coding ");
|
||||
dp += prbits(dp, p[2], 7, 2);
|
||||
dp += sprintf(dp, " location ");
|
||||
dp += prbits(dp, p[2], 4, 4);
|
||||
*dp++ = '\n';
|
||||
}
|
||||
p++;
|
||||
cause = 0x7f & *p;
|
||||
|
||||
/* locate cause value */
|
||||
for (i = 0; i < cause_1tr6_len; i++)
|
||||
if (cause_1tr6[i].nr == cause)
|
||||
break;
|
||||
|
||||
/* display cause value if it exists */
|
||||
if (i == cause_1tr6_len)
|
||||
dp += sprintf(dp, "Unknown cause type %x!\n", cause);
|
||||
else
|
||||
dp += sprintf(dp, " cause value %x : %s \n", cause, cause_1tr6[i].descr);
|
||||
|
||||
return (dp - dest);
|
||||
|
||||
}
|
||||
|
||||
static int
|
||||
prchident(char *dest, byte * p) {
|
||||
char *dp = dest;
|
||||
|
||||
p += 2;
|
||||
|
@ -479,10 +630,9 @@ prchident(char *dest, byte * p)
|
|||
*dp++ = '\n';
|
||||
return (dp - dest);
|
||||
}
|
||||
static
|
||||
int
|
||||
prcalled(char *dest, byte * p)
|
||||
{
|
||||
|
||||
static int
|
||||
prcalled(char *dest, byte * p) {
|
||||
int l;
|
||||
char *dp = dest;
|
||||
|
||||
|
@ -497,10 +647,8 @@ prcalled(char *dest, byte * p)
|
|||
*dp++ = '\n';
|
||||
return (dp - dest);
|
||||
}
|
||||
static
|
||||
int
|
||||
prcalling(char *dest, byte * p)
|
||||
{
|
||||
static int
|
||||
prcalling(char *dest, byte * p) {
|
||||
int l;
|
||||
char *dp = dest;
|
||||
|
||||
|
@ -515,7 +663,6 @@ prcalling(char *dest, byte * p)
|
|||
*dp++ = '\n';
|
||||
l--;
|
||||
};
|
||||
|
||||
p++;
|
||||
|
||||
dp += sprintf(dp, " number digits ");
|
||||
|
@ -572,10 +719,8 @@ prbearer(char *dest, byte * p)
|
|||
return (dp - dest);
|
||||
}
|
||||
|
||||
static
|
||||
int
|
||||
general(char *dest, byte * p)
|
||||
{
|
||||
static int
|
||||
general(char *dest, byte * p) {
|
||||
char *dp = dest;
|
||||
char ch = ' ';
|
||||
int l, octet = 3;
|
||||
|
@ -594,17 +739,44 @@ general(char *dest, byte * p)
|
|||
ch = ' ';
|
||||
} else if (ch == ' ')
|
||||
ch = 'a';
|
||||
|
||||
else
|
||||
ch++;
|
||||
}
|
||||
return (dp - dest);
|
||||
}
|
||||
|
||||
static
|
||||
int
|
||||
display(char *dest, byte * p)
|
||||
{
|
||||
static int
|
||||
prcharge(char *dest, byte * p) {
|
||||
char *dp = dest;
|
||||
int l;
|
||||
|
||||
p++;
|
||||
l = *p++ - 1;
|
||||
dp += sprintf(dp, " GEA ");
|
||||
dp += prbits(dp, *p++, 8, 8);
|
||||
dp += sprintf(dp, " Anzahl: ");
|
||||
/* Iterate over all octets in the * information element */
|
||||
while (l--)
|
||||
*dp++ = *p++;
|
||||
*dp++ = '\n';
|
||||
return (dp - dest);
|
||||
}
|
||||
static int
|
||||
prtext(char *dest, byte * p) {
|
||||
char *dp = dest;
|
||||
int l;
|
||||
|
||||
p++;
|
||||
l = *p++;
|
||||
dp += sprintf(dp, " ");
|
||||
/* Iterate over all octets in the * information element */
|
||||
while (l--)
|
||||
*dp++ = *p++;
|
||||
*dp++ = '\n';
|
||||
return (dp - dest);
|
||||
}
|
||||
static int
|
||||
display(char *dest, byte * p) {
|
||||
char *dp = dest;
|
||||
char ch = ' ';
|
||||
int l, octet = 3;
|
||||
|
@ -769,8 +941,37 @@ struct InformationElement {
|
|||
},
|
||||
};
|
||||
|
||||
|
||||
#define IESIZE sizeof(ielist)/sizeof(struct InformationElement)
|
||||
|
||||
static struct InformationElement we_0[] =
|
||||
{
|
||||
{WE0_cause, "Cause", prcause_1tr6},
|
||||
{WE0_connAddr, "Connecting Address", prcalled},
|
||||
{WE0_callID, "Call IDentity", general},
|
||||
{WE0_chanID, "Channel IDentity", general},
|
||||
{WE0_netSpecFac, "Network Specific Facility", general},
|
||||
{WE0_display, "Display", general},
|
||||
{WE0_keypad, "Keypad", general},
|
||||
{WE0_origAddr, "Origination Address", prcalled},
|
||||
{WE0_destAddr, "Destination Address", prcalled},
|
||||
{WE0_userInfo, "User Info", general}
|
||||
};
|
||||
|
||||
static int we_0_len = (sizeof(we_0) / sizeof(struct InformationElement));
|
||||
|
||||
static struct InformationElement we_6[] =
|
||||
{
|
||||
{WE6_serviceInd, "Service Indicator", general},
|
||||
{WE6_chargingInfo, "Charging Information", prcharge},
|
||||
{WE6_date, "Date", prtext},
|
||||
{WE6_facSelect, "Facility Select", general},
|
||||
{WE6_facStatus, "Facility Status", general},
|
||||
{WE6_statusCalled, "Status Called", general},
|
||||
{WE6_addTransAttr, "Additional Transmission Attributes", general}
|
||||
};
|
||||
static int we_6_len = (sizeof(we_6) / sizeof(struct InformationElement));
|
||||
|
||||
#ifdef FRITZDEBUG
|
||||
void
|
||||
hexdump(byte * buf, int len, char *comment)
|
||||
|
@ -790,11 +991,10 @@ hexdump(byte * buf, int len, char *comment)
|
|||
#endif
|
||||
|
||||
void
|
||||
dlogframe(struct IsdnCardState *sp, byte * buf, int size, char *comment)
|
||||
{
|
||||
dlogframe(struct IsdnCardState *sp, byte * buf, int size, char *comment) {
|
||||
byte *bend = buf + size;
|
||||
char *dp;
|
||||
int i;
|
||||
int i, cs = 0, cs_old = 0, cs_fest = 0;
|
||||
|
||||
/* display header */
|
||||
dp = sp->dlogspace;
|
||||
|
@ -802,7 +1002,6 @@ dlogframe(struct IsdnCardState *sp, byte * buf, int size, char *comment)
|
|||
|
||||
{
|
||||
byte *p = buf;
|
||||
|
||||
dp += sprintf(dp, "hex: ");
|
||||
while (p < bend)
|
||||
dp += sprintf(dp, "%02x ", *p++);
|
||||
|
@ -810,6 +1009,96 @@ dlogframe(struct IsdnCardState *sp, byte * buf, int size, char *comment)
|
|||
teles_putstatus(sp->dlogspace);
|
||||
dp = sp->dlogspace;
|
||||
}
|
||||
if ((0xfe & buf[0]) == PROTO_DIS_N0) { /* 1TR6 */
|
||||
/* locate message type */
|
||||
if (buf[0] == PROTO_DIS_N0) { /* N0 */
|
||||
for (i = 0; i < mt_n0_len; i++)
|
||||
if (mt_n0[i].nr == buf[3])
|
||||
break;
|
||||
/* display message type iff it exists */
|
||||
if (i == mt_n0_len)
|
||||
dp += sprintf(dp, "Unknown message type N0 %x!\n", buf[3]);
|
||||
else
|
||||
dp += sprintf(dp, "call reference %d size %d message type %s\n",
|
||||
buf[2], size, mt_n0[i].descr);
|
||||
} else { /* N1 */
|
||||
for (i = 0; i < mt_n1_len; i++)
|
||||
if (mt_n1[i].nr == buf[3])
|
||||
break;
|
||||
/* display message type iff it exists */
|
||||
if (i == mt_n1_len)
|
||||
dp += sprintf(dp, "Unknown message type N1 %x!\n", buf[3]);
|
||||
else
|
||||
dp += sprintf(dp, "call reference %d size %d message type %s\n",
|
||||
buf[2], size, mt_n1[i].descr);
|
||||
}
|
||||
|
||||
/* display each information element */
|
||||
buf += 4;
|
||||
while (buf < bend) {
|
||||
/* Is it a single octet information element? */
|
||||
if (*buf & 0x80) {
|
||||
switch ((*buf >> 4) & 7) {
|
||||
case 1:
|
||||
dp += sprintf(dp, " Shift %x\n", *buf & 0xf);
|
||||
cs_old = cs;
|
||||
cs = *buf & 7;
|
||||
cs_fest = *buf & 8;
|
||||
break;
|
||||
case 3:
|
||||
dp += sprintf(dp, " Congestion level %x\n", *buf & 0xf);
|
||||
break;
|
||||
case 2:
|
||||
if (*buf == 0xa0) {
|
||||
dp += sprintf(dp, " More data\n");
|
||||
break;
|
||||
}
|
||||
if (*buf == 0xa1) {
|
||||
dp += sprintf(dp, " Sending complete\n");
|
||||
}
|
||||
break;
|
||||
/* fall through */
|
||||
default:
|
||||
dp += sprintf(dp, " Reserved %x\n", *buf);
|
||||
break;
|
||||
}
|
||||
buf++;
|
||||
continue;
|
||||
}
|
||||
/* No, locate it in the table */
|
||||
if (cs == 0) {
|
||||
for (i = 0; i < we_0_len; i++)
|
||||
if (*buf == we_0[i].nr)
|
||||
break;
|
||||
|
||||
/* When found, give appropriate msg */
|
||||
if (i != we_0_len) {
|
||||
dp += sprintf(dp, " %s\n", we_0[i].descr);
|
||||
dp += we_0[i].f(dp, buf);
|
||||
} else
|
||||
dp += sprintf(dp, " Codeset %d attribute %x attribute size %d\n", cs, *buf, buf[1]);
|
||||
} else if (cs == 6) {
|
||||
for (i = 0; i < we_6_len; i++)
|
||||
if (*buf == we_6[i].nr)
|
||||
break;
|
||||
|
||||
/* When found, give appropriate msg */
|
||||
if (i != we_6_len) {
|
||||
dp += sprintf(dp, " %s\n", we_6[i].descr);
|
||||
dp += we_6[i].f(dp, buf);
|
||||
} else
|
||||
dp += sprintf(dp, " Codeset %d attribute %x attribute size %d\n", cs, *buf, buf[1]);
|
||||
} else
|
||||
dp += sprintf(dp, " Unknown Codeset %d attribute %x attribute size %d\n", cs, *buf, buf[1]);
|
||||
/* Skip to next element */
|
||||
if (cs_fest == 8) {
|
||||
cs = cs_old;
|
||||
cs_old = 0;
|
||||
cs_fest = 0;
|
||||
}
|
||||
buf += buf[1] + 2;
|
||||
}
|
||||
} else { /* EURO */
|
||||
/* locate message type */
|
||||
for (i = 0; i < MTSIZE; i++)
|
||||
if (mtlist[i].nr == buf[3])
|
||||
|
@ -869,7 +1158,7 @@ dlogframe(struct IsdnCardState *sp, byte * buf, int size, char *comment)
|
|||
/* Skip to next element */
|
||||
buf += buf[1] + 2;
|
||||
}
|
||||
|
||||
}
|
||||
dp += sprintf(dp, "\n");
|
||||
teles_putstatus(sp->dlogspace);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue