diff options
author | Gerald Combs <gerald@wireshark.org> | 2005-02-05 17:39:12 +0000 |
---|---|---|
committer | Gerald Combs <gerald@wireshark.org> | 2005-02-05 17:39:12 +0000 |
commit | 9e93bf474710d9ef0eb4ba33bde284b6685fd360 (patch) | |
tree | 59d8d2204fb8fef65bf8a637ed5c4284558230fc /wiretap/ascend-grammar.y | |
parent | 17608107ff86cd057a7a46983616a01b4ff25cd8 (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.y | 228 |
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; } |