summaryrefslogtreecommitdiff
path: root/wiretap
diff options
context:
space:
mode:
authorJeff Morriss <jeff.morriss@ulticom.com>2007-02-18 11:32:54 +0000
committerJeff Morriss <jeff.morriss@ulticom.com>2007-02-18 11:32:54 +0000
commit28767302a53d02ad408e93ea03b9c3def7584bc6 (patch)
tree54145a1b52f5722239d7d4f8501860242f8beb3e /wiretap
parent43e550c754298e9be2a83178bfb54f053a08eef0 (diff)
downloadwireshark-28767302a53d02ad408e93ea03b9c3def7584bc6.tar.gz
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.c16
-rw-r--r--wiretap/erf.h11
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__ */