diff options
author | Jeff Morriss <jeff.morriss@ulticom.com> | 2007-02-18 11:32:54 +0000 |
---|---|---|
committer | Jeff Morriss <jeff.morriss@ulticom.com> | 2007-02-18 11:32:54 +0000 |
commit | 28767302a53d02ad408e93ea03b9c3def7584bc6 (patch) | |
tree | 54145a1b52f5722239d7d4f8501860242f8beb3e /wiretap | |
parent | 43e550c754298e9be2a83178bfb54f053a08eef0 (diff) |
From Florent Drouin: support for MTP2 in ERF type 5 (Multi-Channel HDLC) files
svn path=/trunk/; revision=20838
Diffstat (limited to 'wiretap')
-rw-r--r-- | wiretap/erf.c | 16 | ||||
-rw-r--r-- | wiretap/erf.h | 11 |
2 files changed, 25 insertions, 2 deletions
diff --git a/wiretap/erf.c b/wiretap/erf.c index 60b2dfba2f..a9bfb95246 100644 --- a/wiretap/erf.c +++ b/wiretap/erf.c @@ -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; } diff --git a/wiretap/erf.h b/wiretap/erf.h index 6be021bd19..ed7ade992a 100644 --- a/wiretap/erf.h +++ b/wiretap/erf.h @@ -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__ */ |