/* 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>
#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 */
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;
}
}
+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));
+}
+
/* 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>
/* 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);
* just to make it easy. */
proto_register_aarp();
proto_register_arp();
+ proto_register_ascend();
proto_register_atalk();
proto_register_atm();
proto_register_bootp();
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;
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;
}
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;
}
}
/* 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
#include "ascend.h"
#include "ascend-grammar.h"
-extern ascend_pkthdr header;
+struct ascend_phdr *pseudo_header;
int at_eof;
int mul, scratch;
<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;
}
/* 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>
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;
}
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)
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);
}
/* 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>
*
*/
-#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);
/* 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>
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.
*
union pseudo_header {
struct x25_phdr x25;
struct ngsniffer_atm_phdr ngsniffer_atm;
+ struct ascend_phdr ascend;
};
struct wtap_pkthdr {