Added Guy's patch to use the pseudo header facility to pass up the Ascend
metadata. Also added filter items for the session and task number. svn path=/trunk/; revision=664
This commit is contained in:
parent
4ac044cc3e
commit
feda83f7e0
|
@ -1,7 +1,7 @@
|
|||
/* packet-ascend.c
|
||||
* Routines for decoding Lucent/Ascend packet traces
|
||||
*
|
||||
* $Id: packet-ascend.c,v 1.2 1999/09/11 06:51:28 guy Exp $
|
||||
* $Id: packet-ascend.c,v 1.3 1999/09/11 22:36:29 gerald Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@zing.org>
|
||||
|
@ -33,20 +33,20 @@
|
|||
#include <string.h>
|
||||
#include "packet.h"
|
||||
|
||||
#include "wiretap/ascend.h"
|
||||
static int proto_ascend = -1;
|
||||
static int hf_session_id = -1;
|
||||
static int hf_task = -1;
|
||||
|
||||
static const value_string encaps_vals[] = {
|
||||
{ASCEND_PFX_ETHER, "Ethernet" },
|
||||
{ASCEND_PFX_PPP_X, "PPP Transmit"},
|
||||
{ASCEND_PFX_PPP_R, "PPP Receive" },
|
||||
{0, NULL } };
|
||||
|
||||
void
|
||||
dissect_ascend( const u_char *pd, frame_data *fd, proto_tree *tree ) {
|
||||
proto_tree *fh_tree;
|
||||
proto_item *ti;
|
||||
ascend_pkthdr header;
|
||||
static const value_string encaps_vals[] = {
|
||||
{ASCEND_PFX_ETHER, "Ethernet" },
|
||||
{ASCEND_PFX_PPP_X, "PPP Transmit"},
|
||||
{ASCEND_PFX_PPP_R, "PPP Receive" },
|
||||
{0, NULL } };
|
||||
|
||||
memcpy(&header, pd, ASCEND_PKTHDR_OFFSET);
|
||||
|
||||
/* load the top pane info. This should be overwritten by
|
||||
the next protocol in the stack */
|
||||
|
@ -64,18 +64,24 @@ dissect_ascend( const u_char *pd, frame_data *fd, proto_tree *tree ) {
|
|||
if(tree) {
|
||||
ti = proto_tree_add_text(tree, 0, 0, "Lucent/Ascend packet trace" );
|
||||
fh_tree = proto_item_add_subtree(ti, ETT_RAW);
|
||||
proto_tree_add_text(fh_tree, 0, 0, "Link type: %s", val_to_str(header.type,
|
||||
encaps_vals, "Unknown (%d)"));
|
||||
proto_tree_add_text(fh_tree, 0, 0, "Username: %s", header.user);
|
||||
proto_tree_add_text(fh_tree, 0, 0, "Session: %d", header.sess);
|
||||
proto_tree_add_text(fh_tree, 0, 0, "Task: %08X", header.task);
|
||||
|
||||
/* XXX - should these be added with "proto_tree_add_item_format()"
|
||||
(see "dissect_packet()" for an example of how to add items
|
||||
that aren't in the packet data in that fashion) so that we
|
||||
can filter on them? */
|
||||
proto_tree_add_text(fh_tree, 0, 0, "Link type: %s",
|
||||
val_to_str(fd->pseudo_header.ascend.type, encaps_vals, "Unknown (%d)"));
|
||||
proto_tree_add_text(fh_tree, 0, 0, "Username: %s",
|
||||
fd->pseudo_header.ascend.user);
|
||||
proto_tree_add_item_format(fh_tree, hf_session_id, 0, 0,
|
||||
fd->pseudo_header.ascend.sess, "Session: %d",
|
||||
fd->pseudo_header.ascend.sess);
|
||||
proto_tree_add_item_format(fh_tree, hf_task, 0, 0,
|
||||
fd->pseudo_header.ascend.task, "Task: 0x%08X",
|
||||
fd->pseudo_header.ascend.task);
|
||||
}
|
||||
|
||||
/* The header is metadata, so we copy the packet data to the front */
|
||||
/* XXX Maybe we should leave it in, and mark it as metadata, so that
|
||||
it can be filtered upon? */
|
||||
memmove(pd, pd + ASCEND_PKTHDR_OFFSET, fd->cap_len);
|
||||
switch (header.type) {
|
||||
switch (fd->pseudo_header.ascend.type) {
|
||||
case ASCEND_PFX_ETHER:
|
||||
dissect_eth(pd, 0, fd, tree);
|
||||
break;
|
||||
|
@ -86,3 +92,18 @@ dissect_ascend( const u_char *pd, frame_data *fd, proto_tree *tree ) {
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
proto_register_ascend(void)
|
||||
{
|
||||
static hf_register_info hf[] = {
|
||||
{ &hf_session_id,
|
||||
{ "Session ID", "ascend.sess", FT_UINT32, NULL }},
|
||||
|
||||
{ &hf_task,
|
||||
{ "Task", "ascend.task", FT_UINT32, NULL }}
|
||||
};
|
||||
|
||||
proto_ascend = proto_register_protocol("Lucent/Ascend debug output", "ascend");
|
||||
proto_register_field_array(proto_ascend, hf, array_length(hf));
|
||||
}
|
||||
|
||||
|
|
4
proto.c
4
proto.c
|
@ -1,7 +1,7 @@
|
|||
/* proto.c
|
||||
* Routines for protocol tree
|
||||
*
|
||||
* $Id: proto.c,v 1.22 1999/09/11 16:41:18 deniel Exp $
|
||||
* $Id: proto.c,v 1.23 1999/09/11 22:36:30 gerald Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@zing.org>
|
||||
|
@ -87,6 +87,7 @@ static int proto_register_field_init(header_field_info *hfinfo, int parent);
|
|||
/* centralization of registration functions */
|
||||
void proto_register_aarp(void);
|
||||
void proto_register_arp(void);
|
||||
void proto_register_ascend(void);
|
||||
void proto_register_atalk(void);
|
||||
void proto_register_atm(void);
|
||||
void proto_register_bootp(void);
|
||||
|
@ -191,6 +192,7 @@ proto_init(void)
|
|||
* just to make it easy. */
|
||||
proto_register_aarp();
|
||||
proto_register_arp();
|
||||
proto_register_ascend();
|
||||
proto_register_atalk();
|
||||
proto_register_atm();
|
||||
proto_register_bootp();
|
||||
|
|
|
@ -35,7 +35,8 @@ void yyerror(char *);
|
|||
|
||||
int bcur = 0, bcount;
|
||||
guint32 secs, usecs, caplen, wirelen;
|
||||
ascend_pkthdr header;
|
||||
ascend_pkthdr *header;
|
||||
struct ascend_phdr *pseudo_header;
|
||||
char *pkt_data;
|
||||
FILE *nfh = NULL;
|
||||
|
||||
|
@ -84,10 +85,12 @@ header: prefix username sessnum KEYWORD tasknum KEYWORD timeval timeval octets K
|
|||
else
|
||||
secs = $7;
|
||||
usecs = $8;
|
||||
/* header.user is set in ascend-scanner.l */
|
||||
header.type = $1;
|
||||
header.sess = $3;
|
||||
header.task = $5;
|
||||
if (pseudo_header != NULL) {
|
||||
/* pseudo_header->user is set in ascend-scanner.l */
|
||||
pseudo_header->type = $1;
|
||||
pseudo_header->sess = $3;
|
||||
pseudo_header->task = $5;
|
||||
}
|
||||
|
||||
bcur = 0;
|
||||
}
|
||||
|
@ -95,16 +98,17 @@ header: prefix username sessnum KEYWORD tasknum KEYWORD timeval timeval octets K
|
|||
|
||||
byte: BYTE {
|
||||
if (bcur < caplen) {
|
||||
pkt_data[bcur + ASCEND_PKTHDR_OFFSET] = $1;
|
||||
pkt_data[bcur] = $1;
|
||||
bcur++;
|
||||
}
|
||||
|
||||
if (bcur >= caplen) {
|
||||
header.secs = secs;
|
||||
header.usecs = usecs;
|
||||
header.caplen = caplen;
|
||||
header.len = wirelen;
|
||||
memcpy(pkt_data, &header, ASCEND_PKTHDR_OFFSET);
|
||||
if (header != NULL) {
|
||||
header->secs = secs;
|
||||
header->usecs = usecs;
|
||||
header->caplen = caplen;
|
||||
header->len = wirelen;
|
||||
}
|
||||
YYACCEPT;
|
||||
}
|
||||
}
|
||||
|
@ -160,15 +164,17 @@ init_parse_ascend()
|
|||
/* Parse the capture file. Return the offset of the next packet, or zero
|
||||
if there is none. */
|
||||
int
|
||||
parse_ascend(FILE *fh, void *pd, int len)
|
||||
parse_ascend(FILE *fh, void *pd, struct ascend_phdr *phdr,
|
||||
ascend_pkthdr *hdr, int len)
|
||||
{
|
||||
/* yydebug = 1; */
|
||||
|
||||
ascend_init_lexer(fh, nfh);
|
||||
pkt_data = pd;
|
||||
pseudo_header = phdr;
|
||||
header = hdr;
|
||||
bcount = len;
|
||||
|
||||
/* Skip errors until we get something parsed. */
|
||||
if (yyparse())
|
||||
return 0;
|
||||
else
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include "ascend.h"
|
||||
#include "ascend-grammar.h"
|
||||
|
||||
extern ascend_pkthdr header;
|
||||
struct ascend_phdr *pseudo_header;
|
||||
|
||||
int at_eof;
|
||||
int mul, scratch;
|
||||
|
@ -57,8 +57,10 @@ EPFX "ETHER "
|
|||
|
||||
<sc_user>[^:]+ {
|
||||
BEGIN(sc_sess);
|
||||
strncpy(header.user, ascendtext, ASCEND_MAX_STR_LEN);
|
||||
header.user[ASCEND_MAX_STR_LEN - 1] = '\0';
|
||||
if (pseudo_header != NULL) {
|
||||
strncpy(pseudo_header->user, ascendtext, ASCEND_MAX_STR_LEN);
|
||||
pseudo_header->user[ASCEND_MAX_STR_LEN - 1] = '\0';
|
||||
}
|
||||
return USERNAME;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* ascend.c
|
||||
*
|
||||
* $Id: ascend.c,v 1.3 1999/09/11 07:07:41 guy Exp $
|
||||
* $Id: ascend.c,v 1.4 1999/09/11 22:36:38 gerald Exp $
|
||||
*
|
||||
* Wiretap Library
|
||||
* Copyright (c) 1998 by Gilbert Ramirez <gram@verdict.uthscsa.edu>
|
||||
|
@ -129,13 +129,18 @@ int ascend_open(wtap *wth, int *err)
|
|||
wth->subtype_read = ascend_read;
|
||||
wth->capture.ascend = g_malloc(sizeof(ascend_t));
|
||||
|
||||
/* MAXen and Pipelines report the time since reboot. In order to keep
|
||||
from reporting packet times near the epoch, we subtract the first
|
||||
packet's timestamp from the capture file's ctime, which gives us an
|
||||
offset that we can apply to each packet.
|
||||
*/
|
||||
fstat(fileno(wth->fh), &statbuf);
|
||||
wth->capture.ascend->inittime = statbuf.st_ctime;
|
||||
wth->capture.ascend->adjusted = 0;
|
||||
wth->capture.ascend->seek_add = -1;
|
||||
|
||||
init_parse_ascend();
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -157,15 +162,13 @@ static int ascend_read(wtap *wth, int *err)
|
|||
if (offset < 1) {
|
||||
return 0;
|
||||
}
|
||||
if (! parse_ascend(wth->fh, buf, 0)) {
|
||||
if (! parse_ascend(wth->fh, buf, &wth->phdr.pseudo_header.ascend, &header, 0)) {
|
||||
*err = WTAP_ERR_BAD_RECORD;
|
||||
return -1;
|
||||
}
|
||||
|
||||
buffer_assure_space(wth->frame_buffer, wth->snapshot_length +
|
||||
ASCEND_PKTHDR_OFFSET);
|
||||
buffer_assure_space(wth->frame_buffer, wth->snapshot_length);
|
||||
|
||||
memcpy(&header, buf, ASCEND_PKTHDR_OFFSET);
|
||||
if (! wth->capture.ascend->adjusted) {
|
||||
wth->capture.ascend->adjusted = 1;
|
||||
if (wth->capture.ascend->inittime > header.secs)
|
||||
|
@ -177,12 +180,12 @@ static int ascend_read(wtap *wth, int *err)
|
|||
wth->phdr.len = header.len;
|
||||
wth->phdr.pkt_encap = wth->file_encap;
|
||||
wth->data_offset = offset;
|
||||
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
int ascend_seek_read (FILE *fh, int seek_off, guint8 *pd, int len)
|
||||
{
|
||||
fseek(fh, seek_off - 1, SEEK_SET);
|
||||
return parse_ascend(fh, pd, len);
|
||||
return parse_ascend(fh, pd, NULL, NULL, len);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* ascend.h
|
||||
*
|
||||
* $Id: ascend.h,v 1.2 1999/09/11 06:49:42 guy Exp $
|
||||
* $Id: ascend.h,v 1.3 1999/09/11 22:36:38 gerald Exp $
|
||||
*
|
||||
* Wiretap Library
|
||||
* Copyright (c) 1998 by Gilbert Ramirez <gram@verdict.uthscsa.edu>
|
||||
|
@ -21,29 +21,19 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#define ASCEND_MAX_STR_LEN 64
|
||||
#define ASCEND_MAX_DATA_ROWS 8
|
||||
#define ASCEND_MAX_DATA_COLS 16
|
||||
#define ASCEND_MAX_PKT_LEN (ASCEND_MAX_DATA_ROWS * ASCEND_MAX_DATA_COLS)
|
||||
|
||||
#define ASCEND_PFX_ETHER 1
|
||||
#define ASCEND_PFX_PPP_X 2
|
||||
#define ASCEND_PFX_PPP_R 3
|
||||
|
||||
typedef struct {
|
||||
guint16 type; /* ASCEND_PFX_*, as defined above */
|
||||
char user[ASCEND_MAX_STR_LEN]; /* Username, from header */
|
||||
guint32 sess; /* Session number */
|
||||
guint32 task; /* Task number */
|
||||
guint32 secs;
|
||||
guint32 usecs;
|
||||
time_t secs;
|
||||
time_t usecs;
|
||||
guint32 caplen;
|
||||
guint32 len;
|
||||
} ascend_pkthdr;
|
||||
|
||||
#define ASCEND_PKTHDR_OFFSET sizeof(ascend_pkthdr)
|
||||
|
||||
int ascend_open(wtap *wth, int *err);
|
||||
void init_parse_ascend();
|
||||
int parse_ascend(FILE *fh, void *pd, int len);
|
||||
int parse_ascend(FILE *fh, void *pd, struct ascend_phdr *phdr,
|
||||
ascend_pkthdr *hdr, int len);
|
||||
int ascend_seek_read (FILE *fh, int seek_off, guint8 *pd, int len);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* wtap.h
|
||||
*
|
||||
* $Id: wtap.h,v 1.36 1999/09/11 04:50:44 gerald Exp $
|
||||
* $Id: wtap.h,v 1.37 1999/09/11 22:36:38 gerald Exp $
|
||||
*
|
||||
* Wiretap Library
|
||||
* Copyright (c) 1998 by Gilbert Ramirez <gram@verdict.uthscsa.edu>
|
||||
|
@ -189,6 +189,22 @@ struct ngsniffer_atm_phdr {
|
|||
guint32 aal5t_chksum; /* checksum for AAL5 packet */
|
||||
};
|
||||
|
||||
/* Packet "pseudo-header" for the output from "wandsession", "wannext",
|
||||
"wandisplay", and similar commands on Lucent/Ascend access equipment. */
|
||||
|
||||
#define ASCEND_MAX_STR_LEN 64
|
||||
|
||||
#define ASCEND_PFX_ETHER 1
|
||||
#define ASCEND_PFX_PPP_X 2
|
||||
#define ASCEND_PFX_PPP_R 3
|
||||
|
||||
struct ascend_phdr {
|
||||
guint16 type; /* ASCEND_PFX_*, as defined above */
|
||||
char user[ASCEND_MAX_STR_LEN]; /* Username, from header */
|
||||
guint32 sess; /* Session number */
|
||||
guint32 task; /* Task number */
|
||||
};
|
||||
|
||||
/*
|
||||
* Bits in AppTrafType.
|
||||
*
|
||||
|
@ -244,6 +260,7 @@ struct ngsniffer_atm_phdr {
|
|||
union pseudo_header {
|
||||
struct x25_phdr x25;
|
||||
struct ngsniffer_atm_phdr ngsniffer_atm;
|
||||
struct ascend_phdr ascend;
|
||||
};
|
||||
|
||||
struct wtap_pkthdr {
|
||||
|
|
Loading…
Reference in New Issue