aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap/ascend-grammar.y
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2005-02-05 17:39:12 +0000
committerGerald Combs <gerald@wireshark.org>2005-02-05 17:39:12 +0000
commit9e93bf474710d9ef0eb4ba33bde284b6685fd360 (patch)
tree59d8d2204fb8fef65bf8a637ed5c4284558230fc /wiretap/ascend-grammar.y
parent17608107ff86cd057a7a46983616a01b4ff25cd8 (diff)
From Josh Bailey:
Attached is an update to Lucent/Ascend trace parsing: fix a few bugs, add support for ISDN and Ethernet captures - diffs to 0.10.9. svn path=/trunk/; revision=13311
Diffstat (limited to 'wiretap/ascend-grammar.y')
-rw-r--r--wiretap/ascend-grammar.y228
1 files changed, 165 insertions, 63 deletions
diff --git a/wiretap/ascend-grammar.y b/wiretap/ascend-grammar.y
index 323b5c497d..50dc36d6cf 100644
--- a/wiretap/ascend-grammar.y
+++ b/wiretap/ascend-grammar.y
@@ -23,7 +23,32 @@
*/
/*
- Example 'wandsess' output data:
+ Example 'pridisp' output data - one paragraph/frame:
+
+PRI-XMIT-27: (task "l1Task" at 0x10216fe0, time: 560194.01) 4 octets @ 0x1027c5b0
+ [0000]: 00 01 01 a9 ....
+PRI-RCV-27: (task "idle task" at 0x10123570, time: 560194.01) 4 octets @ 0x1027fb00
+ [0000]: 00 01 01 dd
+
+ Example 'pridisp' output data - two paragraphs/frame for XMIT case only:
+
+PRI-XMIT-19/1: (task "l1Task" at 0x10216840, time: 274759.98) 4 octets @ 0x1027f230
+ [0000]: 00 01 30 d8 ..0.
+PRI-XMIT-19/2 (task "l1Task" at 0x10216840, time: 274759.98) 11 octets @ 0x1027f234
+ [0000]: 08 02 8c bf 02 18 04 e9 82 83 8f ........ ...
+
+ Example 'ether-disp' output data:
+
+ETHER3ND RECV: (task "_sarTask" at 0x802c6eb0, time: 259848.03) 775 octets @ 0xa8fb2020
+ [0000]: 00 d0 52 04 e7 1e 08 00 20 ae 51 b5 08 00 45 00 ..R..... .Q...E.
+ [0010]: 02 f9 05 e6 40 00 3f 11 6e 39 87 fe c4 95 3c 3c ....@.?. n9....<<
+ [0020]: 3c 05 13 c4 13 c4 02 e5 ef ed 49 4e 56 49 54 45 <....... ..INVITE
+ [0030]: 20 73 69 70 3a 35 32 30 37 33 40 36 30 2e 36 30 sip:520 73@60.60
+ [0040]: 2e 36 30 2e 35 20 53 49 50 2f 32 2e 30 0d 0a 56 .60.5 SI P/2.0..V
+ [0050]: 69 61 3a 20 53 49 50 2f 32 2e 30 2f 55 44 50 20 ia: SIP/ 2.0/UDP
+ [0060]: 31 33 35 2e 135.
+
+ Example 'wandsess' output data:
RECV-iguana:241:(task: B02614C0, time: 1975432.85) 49 octets @ 8003BD94
[0000]: FF 03 00 3D C0 06 CA 22 2F 45 00 00 28 6A 3B 40
@@ -109,11 +134,13 @@ XMIT-Max7:20: (task "_brouterControlTask" at 0xb094ac20, time: 1481.51) 20 octet
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include "wtap-int.h"
#include "buffer.h"
#include "ascend.h"
#include "ascend-int.h"
+#include "file_wrappers.h"
#define NO_USER "<none>"
@@ -122,11 +149,13 @@ void yyerror(char *);
gchar *ascend_parse_error;
-static unsigned int bcur = 0, bcount;
+static unsigned int bcur;
static guint32 start_time, secs, usecs, caplen, wirelen;
static ascend_pkthdr *header;
struct ascend_phdr *pseudo_header;
static guint8 *pkt_data;
+static long first_hexbyte;
+static FILE_T *fh_ptr;
%}
@@ -136,17 +165,20 @@ guint32 d;
guint8 b;
}
-%token <s> STRING KEYWORD WDD_DATE WDD_CHUNK COUNTER
-%token <d> WDS_PREFIX DECNUM HEXNUM
+%token <s> STRING KEYWORD WDD_DATE WDD_CHUNK COUNTER SLASH_SUFFIX
+%token <d> WDS_PREFIX ISDN_PREFIX ETHER_PREFIX DECNUM HEXNUM
%token <b> HEXBYTE
-%type <s> string dataln datagroup
-%type <d> wds_prefix decnum hexnum
+%type <s> string dataln datagroup
+%type <d> wds_prefix isdn_prefix ether_prefix decnum hexnum
%type <b> byte bytegroup
%%
data_packet:
+ | ether_hdr datagroup
+ | deferred_isdn_hdr datagroup deferred_isdn_hdr datagroup
+ | isdn_hdr datagroup
| wds_hdr datagroup
| wds8_hdr datagroup
| wdp7_hdr datagroup
@@ -155,6 +187,10 @@ data_packet:
| wdd_hdr datagroup
;
+isdn_prefix: ISDN_PREFIX;
+
+ether_prefix: ETHER_PREFIX;
+
wds_prefix: WDS_PREFIX;
string: STRING;
@@ -163,16 +199,80 @@ decnum: DECNUM;
hexnum: HEXNUM;
+/*
+ pridisp special case - I-frame header printed separately from contents,
+ one frame across two messages.
+
+PRI-XMIT-0/1: (task "l1Task" at 0x80152b20, time: 283529.65) 4 octets @
+0x80128220
+ [0000]: 00 01 ae b2 ....
+PRI-XMIT-0/2 (task "l1Task" at 0x80152b20, time: 283529.65) 10 octets @
+0x80128224
+ [0000]: 08 02 d7 e3 02 18 03 a9 83 8a ........
+
+*/
+deferred_isdn_hdr: isdn_prefix decnum SLASH_SUFFIX KEYWORD string KEYWORD hexnum KEYWORD decnum decnum decnum KEYWORD HEXNUM {
+ wirelen += $11;
+ caplen += $11;
+ secs = $9;
+ usecs = $10;
+ if (pseudo_header != NULL) {
+ pseudo_header->type = $1;
+ pseudo_header->sess = $2;
+ pseudo_header->call_num[0] = '\0';
+ pseudo_header->chunk = 0;
+ pseudo_header->task = $7;
+ }
+ /* because we have two data groups */
+ first_hexbyte = 0;
+}
+;
+
+/*
+PRI-XMIT-19: (task "l1Task" at 0x10216840, time: 274758.67) 4 octets @ 0x1027c1c0
+ ... or ...
+PRI-RCV-27: (task "idle task" at 0x10123570, time: 560194.01) 4 octets @ 0x1027fb00
+*/
+isdn_hdr: isdn_prefix decnum KEYWORD string KEYWORD hexnum KEYWORD decnum decnum decnum KEYWORD HEXNUM {
+ wirelen = $10;
+ caplen = $10;
+ secs = $8;
+ usecs = $9;
+ if (pseudo_header != NULL) {
+ pseudo_header->type = $1;
+ pseudo_header->sess = $2;
+ pseudo_header->call_num[0] = '\0';
+ pseudo_header->chunk = 0;
+ pseudo_header->task = $6;
+ }
+ first_hexbyte = 0;
+}
+;
+
+/*
+ETHER3ND XMIT: (task "_sarTask" at 0x802c6eb0, time: 259848.11) 414 octets @ 0xa
+885f80e
+*/
+ether_hdr: ether_prefix string KEYWORD string KEYWORD hexnum KEYWORD decnum decnum
+ decnum KEYWORD HEXNUM {
+ wirelen = $10;
+ caplen = $10;
+ secs = $8;
+ usecs = $9;
+ if (pseudo_header != NULL) {
+ pseudo_header->type = $1;
+ pseudo_header->call_num[0] = '\0';
+ pseudo_header->chunk = 0;
+ pseudo_header->task = $6;
+ }
+}
+;
+
/* RECV-iguana:241:(task: B02614C0, time: 1975432.85) 49 octets @ 8003BD94 */
/* 1 2 3 4 5 6 7 8 9 10 11 */
wds_hdr: wds_prefix string decnum KEYWORD hexnum KEYWORD decnum decnum decnum KEYWORD HEXNUM {
wirelen = $9;
- caplen = ($9 < ASCEND_MAX_PKT_LEN) ? $9 : ASCEND_MAX_PKT_LEN;
- /* If we don't have as many bytes of data as the octet count in
- the header, make the capture length the number of bytes we
- actually have. */
- if (bcount > 0 && bcount <= caplen)
- caplen = bcount;
+ caplen = $9;
secs = $7;
usecs = $8;
if (pseudo_header != NULL) {
@@ -183,8 +283,6 @@ wds_hdr: wds_prefix string decnum KEYWORD hexnum KEYWORD decnum decnum decnum KE
pseudo_header->chunk = 0;
pseudo_header->task = $5;
}
-
- bcur = 0;
}
;
@@ -192,12 +290,7 @@ wds_hdr: wds_prefix string decnum KEYWORD hexnum KEYWORD decnum decnum decnum KE
/* 1 2 3 4 5 6 7 8 9 10 11 12 13 */
wds8_hdr: wds_prefix string decnum KEYWORD string KEYWORD hexnum KEYWORD decnum decnum decnum KEYWORD HEXNUM {
wirelen = $11;
- caplen = ($11 < ASCEND_MAX_PKT_LEN) ? $11 : ASCEND_MAX_PKT_LEN;
- /* If we don't have as many bytes of data as the octet count in
- the header, make the capture length the number of bytes we
- actually have. */
- if (bcount > 0 && bcount <= caplen)
- caplen = bcount;
+ caplen = $11;
secs = $9;
usecs = $10;
if (pseudo_header != NULL) {
@@ -208,8 +301,6 @@ wds8_hdr: wds_prefix string decnum KEYWORD string KEYWORD hexnum KEYWORD decnum
pseudo_header->chunk = 0;
pseudo_header->task = $7;
}
-
- bcur = 0;
}
;
@@ -217,12 +308,7 @@ wds8_hdr: wds_prefix string decnum KEYWORD string KEYWORD hexnum KEYWORD decnum
/* 1 2 3 4 5 6 7 8 9 10 */
wdp7_hdr: wds_prefix decnum KEYWORD hexnum KEYWORD decnum decnum decnum KEYWORD HEXNUM {
wirelen = $8;
- caplen = ($8 < ASCEND_MAX_PKT_LEN) ? $8 : ASCEND_MAX_PKT_LEN;
- /* If we don't have as many bytes of data as the octet count in
- the header, make the capture length the number of bytes we
- actually have. */
- if (bcount > 0 && bcount <= caplen)
- caplen = bcount;
+ caplen = $8;
secs = $6;
usecs = $7;
if (pseudo_header != NULL) {
@@ -233,8 +319,6 @@ wdp7_hdr: wds_prefix decnum KEYWORD hexnum KEYWORD decnum decnum decnum KEYWORD
pseudo_header->chunk = 0;
pseudo_header->task = $4;
}
-
- bcur = 0;
}
;
@@ -242,12 +326,7 @@ wdp7_hdr: wds_prefix decnum KEYWORD hexnum KEYWORD decnum decnum decnum KEYWORD
/* 1 2 3 4 5 6 7 8 9 10 11 12 */
wdp8_hdr: wds_prefix decnum KEYWORD string KEYWORD hexnum KEYWORD decnum decnum decnum KEYWORD HEXNUM {
wirelen = $10;
- caplen = ($10 < ASCEND_MAX_PKT_LEN) ? $10 : ASCEND_MAX_PKT_LEN;
- /* If we don't have as many bytes of data as the octet count in
- the header, make the capture length the number of bytes we
- actually have. */
- if (bcount > 0 && bcount <= caplen)
- caplen = bcount;
+ caplen = $10;
secs = $8;
usecs = $9;
if (pseudo_header != NULL) {
@@ -258,8 +337,6 @@ wdp8_hdr: wds_prefix decnum KEYWORD string KEYWORD hexnum KEYWORD decnum decnum
pseudo_header->chunk = 0;
pseudo_header->task = $6;
}
-
- bcur = 0;
}
;
@@ -286,7 +363,7 @@ wdd_date: WDD_DATE decnum decnum decnum KEYWORD decnum decnum decnum KEYWORD str
start_time = mktime(&wddt);
}
;
-
+
/*
WD_DIALOUT_DISP: chunk 2515EE type IP.
(task: 251790, time: 994953.28) 44 octets @ 2782B8
@@ -294,12 +371,7 @@ WD_DIALOUT_DISP: chunk 2515EE type IP.
/* 1 2 3 4 5 6 7 8 9 10 11*/
wdd_hdr: WDD_CHUNK hexnum KEYWORD KEYWORD hexnum KEYWORD decnum decnum decnum KEYWORD HEXNUM {
wirelen = $9;
- caplen = ($9 < ASCEND_MAX_PKT_LEN) ? $9 : ASCEND_MAX_PKT_LEN;
- /* If we don't have as many bytes of data as the octet count in
- the header, make the capture length the number of bytes we
- actually have. */
- if (bcount > 0 && bcount <= caplen)
- caplen = bcount;
+ caplen = $9;
secs = $7;
usecs = $8;
if (pseudo_header != NULL) {
@@ -310,27 +382,23 @@ wdd_hdr: WDD_CHUNK hexnum KEYWORD KEYWORD hexnum KEYWORD decnum decnum decnum KE
pseudo_header->chunk = $2;
pseudo_header->task = $5;
}
-
- bcur = 0;
}
;
byte: HEXBYTE {
+ /* remember the position of the data group in the trace, to tip
+ off ascend_seek() as to where to look for the next header. */
+ if (first_hexbyte == 0)
+ first_hexbyte = file_tell(*fh_ptr);
+
if (bcur < caplen) {
pkt_data[bcur] = $1;
bcur++;
}
- if (bcur >= caplen) {
- if (header != NULL) {
- header->start_time = start_time;
- header->secs = secs;
- header->usecs = usecs;
- header->caplen = caplen;
- header->len = wirelen;
- }
+ /* arbitrary safety maximum... */
+ if (bcur >= ASCEND_MAX_PKT_LEN)
YYACCEPT;
- }
}
;
@@ -370,7 +438,6 @@ datagroup: dataln
void
init_parse_ascend()
{
- bcur = 0;
at_eof = 0;
start_time = 0; /* we haven't see a date/time yet */
}
@@ -379,16 +446,21 @@ init_parse_ascend()
if there is none. */
int
parse_ascend(FILE_T fh, guint8 *pd, struct ascend_phdr *phdr,
- ascend_pkthdr *hdr, int len)
+ ascend_pkthdr *hdr, long *start_of_data)
{
/* yydebug = 1; */
-
+ int retval;
ascend_init_lexer(fh);
pkt_data = pd;
pseudo_header = phdr;
header = hdr;
- bcount = len;
-
+ fh_ptr = &fh;
+
+ bcur = 0;
+ first_hexbyte = 0;
+ wirelen = 0;
+ caplen = 0;
+
/*
* Not all packets in a "wdd" dump necessarily have a "Cause an
* attempt to place call to" header (I presume this can happen if
@@ -402,9 +474,39 @@ parse_ascend(FILE_T fh, guint8 *pd, struct ascend_phdr *phdr,
*/
pseudo_header->call_num[0] = '\0';
- if (yyparse())
- return 0;
+ retval = yyparse();
+
+ caplen = bcur;
+
+ /* did we see any data (hex bytes)? if so, tip off ascend_seek()
+ as to where to look for the next packet, if any. If we didn't,
+ maybe this record was broken. Advance so we don't get into
+ an infinite loop reading a broken trace. */
+ if (first_hexbyte)
+ *start_of_data = first_hexbyte;
else
+ *start_of_data++;
+
+ /* if we got at least some data, return success even if the parser
+ reported an error. This is because the debug header gives the number
+ of bytes on the wire, not actually how many bytes are in the trace.
+ We won't know where the data ends until we run into the next packet. */
+ if (caplen) {
+ if (header) {
+ header->start_time = start_time;
+ header->secs = secs;
+ header->usecs = usecs;
+ header->caplen = caplen;
+ header->len = wirelen;
+ }
+
+ return 1;
+ }
+
+ /* Didn't see any data. Still, perhaps the parser was happy. */
+ if (retval)
+ return 0;
+ else
return 1;
}