From Florent Drouin: support for MTP2 in ERF type 5 (Multi-Channel HDLC) files

svn path=/trunk/; revision=20838
This commit is contained in:
Jeff Morriss 2007-02-18 11:32:54 +00:00
parent 43e550c754
commit 28767302a5
2 changed files with 25 additions and 2 deletions

View File

@ -136,8 +136,8 @@ int erf_open(wtap *wth, int *err, gchar **err_info _U_)
packet_size = g_ntohs(header.rlen) - sizeof(header);
/* fail on invalid record type, decreasing timestamps or non-zero pad-bits */
if (header.type == 0 || header.type > TYPE_AAL5 ||
(header.flags & 0xc0) != 0) {
/* Only header type up to Multi Channel HDLC are taken into account in this software version */
if (header.type == 0 || header.type > TYPE_MC_HDLC ) {
return 0;
}
@ -386,6 +386,15 @@ static int erf_read_header(
memset(&pseudo_header->p2p, 0, sizeof(pseudo_header->p2p));
pseudo_header->p2p.sent = ((erf_header->flags & 0x01) ? TRUE : FALSE);
break;
case TYPE_MC_HDLC:
if (phdr != NULL) {
phdr->caplen = MC_HDLC_SLEN(erf_header, erf);
phdr->len = MC_HDLC_WLEN(erf_header, erf);
}
/* Skip the MC header, so the first data to dissect will be the MTP2 header */
skip = 4;
memset(&pseudo_header->mtp2, 0, sizeof(pseudo_header->mtp2));
break;
default:
*err = WTAP_ERR_UNSUPPORTED_ENCAP;
*err_info = g_strdup_printf("erf: unknown record encapsulation %u",
@ -425,6 +434,9 @@ static int erf_encap_to_wtap_encap(erf_t *erf, guint8 erf_encap)
case TYPE_HDLC_POS:
wtap_encap = (erf->is_ppp ? WTAP_ENCAP_PPP : WTAP_ENCAP_CHDLC);
break;
case TYPE_MC_HDLC:
wtap_encap = WTAP_ENCAP_MTP2;
break;
default:
break;
}

View File

@ -44,6 +44,11 @@
#define TYPE_ETH 2
#define TYPE_ATM 3
#define TYPE_AAL5 4
#define TYPE_MC_HDLC 5
#define TYPE_MC_RAW 6
#define TYPE_MC_ATM 7
#define TYPE_MC_AAL2 9
#define TYPE_MC_AAL5 12
/*
* The timestamp is 64bit unsigned fixed point little-endian value with
@ -91,6 +96,12 @@ typedef struct erf_record {
#define HDLC_WLEN(h, e) (g_htons((h)->wlen))
#define HDLC_SLEN(h, e) min(HDLC_WLEN(h, e), g_htons((h)->rlen) - sizeof(*(h)))
/*
* Size of MC_HDLC payload
*/
#define MC_HDLC_WLEN(h, e) (g_htons((h)->wlen))
#define MC_HDLC_SLEN(h, e) min(HDLC_WLEN(h, e), g_htons((h)->rlen) - sizeof(*(h)) )
int erf_open(wtap *wth, int *err, gchar **err_info);
#endif /* __W_ERF_H__ */