It appears that the "packet" records are actually "stuff from the ISDN

link" records, including stuff that's from a G.704 PRI frame but not
from a D or H channel in that frame.  Handle them (currently, we ignore
them).

The low-order bit of the flags field for "packet" records" is "network
to user" (NT->TE), not "user to network" (TE->NT).

svn path=/trunk/; revision=39663
This commit is contained in:
Guy Harris 2011-10-28 22:57:33 +00:00
parent 760813589c
commit 42c2e1c57b
1 changed files with 64 additions and 11 deletions

View File

@ -77,15 +77,31 @@ struct aethrarec_hdr {
* time stamp as PC108 displays for the Stop Monitor record), and a
* flags value of 0.
*/
#define AETHRA_STOP_MONITOR 0 /* end of capture */
#define AETHRA_PACKET 1 /* packet */
#define AETHRA_MONITOR 0 /* indication from the monitoring device */
#define AETHRA_ISDN_LINK 1 /* information from the ISDN link */
/*
* Flags.
*
* XXX - what does this mean for AETHRA_STOP_MONITOR records?
* In AETHRA_MONITOR records, the flags field has what appears to
* be a record subtype.
*/
#define AETHRA_U_TO_N 0x01
#define AETHRA_MONITOR_STOP 0 /* Stop Monitor */
#define AETHRA_MONITOR_START 4 /* Start Monitor */
#define AETHRA_MONITOR_ACTIVATION 5 /* Activation */
/*
* In AETHRA_ISDN_LINK records, the flags field has a subtype, a direction
* flag, and possibly some other bits.
*
* XXX - does this contain any information about B or H channels? Does
* a subtype of 0 mean "D channel", with other subtypes being used for
* B or H channels?
*/
#define AETHRA_ISDN_LINK_SUBTYPE 0xFE
#define AETHRA_ISDN_LINK_LAPD 0x00 /* LAPD frame */
#define AETHRA_ISDN_LINK_SA_BITS 0x2E /* 2048K PRI Sa bits (G.704 section 2.3.2) */
#define AETHRA_ISDN_LINK_ALL_ALARMS_CLEARED 0x30 /* All Alarms Cleared */
#define AETHRA_ISDN_LINK_N_TO_U 0x01 /* set for NT->TE */
typedef struct {
time_t start;
@ -172,10 +188,10 @@ static gboolean aethra_read(wtap *wth, int *err, gchar **err_info,
guint32 msecs;
/*
* Keep reading until we see an AETHRA_PACKET record or get
* an end-of-file.
* Keep reading until we see an AETHRA_ISDN_LINK with a subtype
* of AETHRA_ISDN_LINK_LAPD record or get an end-of-file.
*/
do {
for (;;) {
*data_offset = wth->data_offset;
/* Read record header. */
@ -205,8 +221,45 @@ static gboolean aethra_read(wtap *wth, int *err, gchar **err_info,
return FALSE; /* Read error */
wth->data_offset += packet_size;
}
} while (hdr.rec_type != AETHRA_PACKET);
switch (hdr.rec_type) {
case AETHRA_ISDN_LINK:
switch (hdr.flags & AETHRA_ISDN_LINK_SUBTYPE) {
case AETHRA_ISDN_LINK_LAPD:
/*
* The data is a LAPD frame.
*/
goto found;
case AETHRA_ISDN_LINK_SA_BITS:
/*
* These records have one data byte, which
* has the Sa bits in the lower 5 bits.
*
* XXX - what about stuff other than 2048K
* PRI lines?
*/
break;
case AETHRA_ISDN_LINK_ALL_ALARMS_CLEARED:
/*
* No data, just an "all alarms cleared"
* indication.
*/
break;
default:
break;
}
break;
default:
break;
}
}
found:
msecs = pletohl(hdr.timestamp);
wth->phdr.ts.secs = aethra->start + (msecs / 1000);
wth->phdr.ts.nsecs = (msecs % 1000) * 1000000;
@ -254,7 +307,7 @@ aethra_read_rec_header(FILE_T fh, struct aethrarec_hdr *hdr,
return FALSE;
}
pseudo_header->isdn.uton = hdr->flags & AETHRA_U_TO_N;
pseudo_header->isdn.uton = !(hdr->flags & AETHRA_ISDN_LINK_N_TO_U);
pseudo_header->isdn.channel = 0; /* XXX - D channel */
return TRUE;