Updates from Steve Limkemann.

svn path=/trunk/; revision=2545
This commit is contained in:
Guy Harris 2000-11-01 00:16:18 +00:00
parent 67a70df328
commit b2929352b6
2 changed files with 180 additions and 16 deletions

View File

@ -1,7 +1,7 @@
/* packet-gryphon.c
* Routines for Gryphon protocol packet disassembly
*
* $Id: packet-gryphon.c,v 1.11 2000/08/18 13:47:59 deniel Exp $
* $Id: packet-gryphon.c,v 1.12 2000/11/01 00:16:17 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Steve Limkemann <stevelim@dgtech.com>
@ -91,8 +91,8 @@ DLLEXPORT void
dissector(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
{
proto_tree *gryphon_tree, *header_tree, *body_tree;
proto_item *ti, *header_item, *body_item;
proto_tree *gryphon_tree, *header_tree, *body_tree, *localTree;
proto_item *ti, *header_item, *body_item, *localItem;
const u_char *data, *dataend, *msgend;
int src, msglen, msgpad, dest, frmtyp, i, end_of_frame;
static const u_char *frame_type[] = {"",
@ -114,7 +114,7 @@ dissector(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
{SD_FLIGHT, "Flight Recorder"},
{SD_RESP, "Message Responder"},
{-1, "- unknown -"},
};
};
data = &pd[offset];
if (fd) {
@ -136,7 +136,11 @@ dissector(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
/*
* Indicate what kind of message this is.
*/
col_add_str (fd, COL_INFO, frame_type[data[6]]);
frmtyp = data[6] & ~RESPONSE_FLAGS;
if (frmtyp >= SIZEOF (frame_type))
col_add_str (fd, COL_INFO, "- Invalid -");
else
col_add_str (fd, COL_INFO, frame_type[frmtyp]);
}
if (tree) {
if (fd) {
@ -149,7 +153,13 @@ dissector(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
while (data < dataend) {
src = data[0];
dest = data[2];
frmtyp = data[6];
frmtyp = data[6] & ~RESPONSE_FLAGS;
if (frmtyp >= SIZEOF (frame_type)) {
i = dataend - data;
proto_tree_add_text(gryphon_tree, NullTVB, offset, i, "Data");
BUMP (offset, data, i);
continue;
}
msglen = pntohs ((unsigned short *)&data[4]);
header_item = proto_tree_add_text(gryphon_tree, NullTVB, offset,
@ -182,6 +192,24 @@ dissector(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
"Data length: %d bytes", msglen);
proto_tree_add_text(header_tree, NullTVB, offset+6, 1,
"Frame type: %s", frame_type[frmtyp]);
if (!fd) {
localItem = proto_tree_add_text(header_tree, NullTVB, offset+6, 1, "Flags");
localTree = proto_item_add_subtree (localItem, ett_gryphon_flags);
if (data[6] & DONT_WAIT_FOR_RESP) {
proto_tree_add_text(localTree, NullTVB, offset+6, 1,
"1... .... = Don't wait for response");
} else {
proto_tree_add_text(localTree, NullTVB, offset+6, 1,
"0... .... = Wait for response");
}
if (data[6] & WAIT_FOR_PREV_RESP) {
proto_tree_add_text(localTree, NullTVB, offset+6, 1,
".1.. .... = Wait for previous responses");
} else {
proto_tree_add_text(localTree, NullTVB, offset+6, 1,
".0.. .... = Don't wait for previous responses");
}
}
proto_tree_add_text(header_tree, NullTVB, offset+7, 1, "reserved");
proto_tree_add_uint_hidden(header_tree, hf_gryph_type, NullTVB, offset+6, 1, frmtyp);
@ -224,7 +252,6 @@ dissector(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
proto_tree_add_text(gryphon_tree, NullTVB, offset, i, "padding");
BUMP (offset, data, i);
}
/* data = dataend;*/
}
}
@ -258,8 +285,10 @@ static const val_str_dsp cmds[] = {
{CMD_CARD_SET_FILTER_MODE, "Set filter mode", filtmode, NULL},
{CMD_CARD_GET_FILTER_MODE, "Get filter mode", NULL, filtmode},
{CMD_CARD_GET_EVNAMES, "Get event names", NULL, resp_events},
{CMD_CARD_GET_SPEEDS, "Get defined speeds", NULL, NULL},
{CMD_CARD_GET_SPEEDS, "Get defined speeds", NULL, resp_getspeeds},
{CMD_SERVER_REG, "Register with server", cmd_register, resp_register},
{CMD_SERVER_SET_SORT, "Set the sorting behavior", cmd_sort, NULL},
{CMD_SERVER_SET_OPT, "Set the type of optimization", cmd_optimize, NULL},
{CMD_BLM_SET_MODE, "Set Bus Load Monitoring mode", blm_mode, NULL},
{CMD_BLM_GET_MODE, "Get Bus Load Monitoring mode", NULL, blm_mode},
{CMD_BLM_GET_DATA, "Get Bus Load data", NULL, resp_blm_data},
@ -279,9 +308,11 @@ static const val_str_dsp cmds[] = {
{CMD_PGM_STOP, "Stop an uploaded program", resp_start, NULL},
{CMD_PGM_STATUS, "Get status of an uploaded program", cmd_delete, resp_status},
{CMD_PGM_OPTIONS, "Set program upload options", cmd_options, resp_status},
{CMD_PGM_FILES, "Get a list of files & directories", cmd_files, resp_files},
{CMD_SCHED_TX, "Schedule transmission of messages", cmd_sched, resp_sched},
{CMD_SCHED_KILL_TX, "Stop and destroy a message transmission", NULL, NULL},
{CMD_SCHED_STOP_TX, "Kill a message transmission (deprecated)", NULL, NULL},
{CMD_USDT_IOCTL, "Register/Unregister with USDT server", cmd_usdt, NULL},
{-1, "- unknown -", NULL, NULL},
};
@ -311,6 +342,8 @@ static const value_string filter_data_types[] = {
{FILTER_DATA_TYPE_HEADER, "data message header"},
{FILTER_DATA_TYPE_DATA, "data message data"},
{FILTER_DATA_TYPE_EXTRA_DATA, "data message extra data"},
{FILTER_EVENT_TYPE_HEADER, "event message header"},
{FILTER_EVENT_TYPE_DATA, "event message"},
{-1, "- unknown -"},
};
@ -441,7 +474,7 @@ static const value_string ioctls[] = {
void
decode_command (int dst, const u_char **data, const u_char *dataend, int *offset, int msglen, proto_tree *pt)
{
int cmd, i;
int cmd, i, padding;
proto_tree *ft;
proto_item *ti;
@ -467,8 +500,10 @@ decode_command (int dst, const u_char **data, const u_char *dataend, int *offset
proto_tree_add_text (pt, NullTVB, *offset, 4, "Command: %s", cmds[i].strptr);
BUMP (*offset, *data, 4);
if (cmds[i].cmd_fnct && dataend - *data) {
ti = proto_tree_add_text(pt, NullTVB, *offset, dataend - *data, "Data: (%d bytes)", dataend - *data);
/* if (cmds[i].cmd_fnct && dataend - *data) { */
if (cmds[i].cmd_fnct && msglen > 4) {
padding = 3 - (msglen + 3) % 4;
ti = proto_tree_add_text(pt, NullTVB, *offset, msglen-4, "Data: (%d bytes)", msglen-4);
ft = proto_item_add_subtree(ti, ett_gryphon_command_data);
(*(cmds[i].cmd_fnct)) (dst, data, dataend, offset, msglen, ft);
}
@ -512,7 +547,7 @@ decode_response (int src, const u_char **data, const u_char *dataend, int *offse
BUMP (*offset, *data, 4);
if (cmds[i].rsp_fnct) {
ti = proto_tree_add_text(pt, NullTVB, *offset, dataend - *data, "Data: (%d bytes)", dataend - *data);
ti = proto_tree_add_text(pt, NullTVB, *offset, msglen-8, "Data: (%d bytes)", msglen-8);
ft = proto_item_add_subtree(ti, ett_gryphon_response_data);
(*(cmds[i].rsp_fnct)) (src, data, dataend, offset, msglen, ft);
}
@ -714,8 +749,10 @@ cmd_ioctl (int src, const u_char **data, const u_char *dataend, int *offset, int
i = SIZEOF(ioctls) - 1;
proto_tree_add_text(pt, NullTVB, *offset, 4, "IOCTL: %s", ioctls[i].strptr);
BUMP (*offset, *data, 4);
proto_tree_add_text(pt, NullTVB, *offset, dataend - *data, "Data");
BUMP (*offset, *data, dataend - *data);
if (msglen > 8) {
proto_tree_add_text(pt, NullTVB, *offset, msglen-8, "Data");
BUMP (*offset, *data, msglen-8);
}
}
void
@ -875,6 +912,49 @@ resp_register (int src, const u_char **data, const u_char *dataend, int *offset,
BUMP (*offset, *data, 4);
}
void
resp_getspeeds (int src, const u_char **data, const u_char *dataend, int *offset, int msglen, proto_tree *pt) {
int number = (*data)[9];
int size = (*data)[8];
int index;
proto_tree_add_text(pt, NullTVB, *offset, 4, "Set Speed IOCTL");
proto_tree_add_text(pt, NullTVB, *offset+4, 4, "Get Speed IOCTL");
proto_tree_add_text(pt, NullTVB, *offset+8, 1, "Speed data size is %d bytes", size);
proto_tree_add_text(pt, NullTVB, *offset+9, 1, "There are %d preset speeds", number);
BUMP (*offset, *data, 10);
for (index = 0; index < number; index++) {
proto_tree_add_text(pt, NullTVB, *offset, size, "Data for preset %d", index+1);
BUMP (*offset, *data, size);
}
}
void
cmd_sort (int src, const u_char **data, const u_char *dataend, int *offset, int msglen, proto_tree *pt)
{
char *which;
which = (*data)[0] ? "Sort into blocks of up to 16 messages" :
"Do not sort messages";
proto_tree_add_text(pt, NullTVB, *offset, 1, "Set sorting: %s", which);
BUMP (*offset, *data, 1);
}
void
cmd_optimize (int src, const u_char **data, const u_char *dataend, int *offset, int msglen, proto_tree *pt)
{
char *which;
which = (*data)[0] ? "Optimize for latency (Nagle algorithm disabled)" :
"Optimize for throughput (Nagle algorithm enabled)";
proto_tree_add_text(pt, NullTVB, *offset, 1, "Set optimization: %s", which);
BUMP (*offset, *data, 1);
}
void
resp_config (int src, const u_char **data, const u_char *dataend, int *offset, int msglen, proto_tree *pt) {
proto_item *ti;
@ -892,7 +972,7 @@ resp_config (int src, const u_char **data, const u_char *dataend, int *offset, i
{GJ1850 * 256 + GDLC, "J1850, GM DLC subtype"},
{GJ1850 * 256 + GCHRYSLER, "J1850, Chrysler subtype"},
{GJ1850 * 256 + GDEHC12, "J1850, DE HC12 KWP/BDLC subtype"},
{GKWP2000, "Keyword protocol 2000"},
{GKWP2000 * 256 + GDEHC12KWP, "Keyword protocol 2000"},
{GHONDA * 256 + GDGHC08, "Honda UART, DG HC08 subtype"},
{GFORDUBP * 256 + GDGUBP08, "Ford UBP, DG HC08 subtype"},
{-1, "- unknown -"},
@ -1426,6 +1506,64 @@ cmd_options (int src, const u_char **data, const u_char *dataend, int *offset, i
}
}
void
cmd_files (int src, const u_char **data, const u_char *dataend, int *offset, int msglen, proto_tree *pt) {
u_char *which, dir[256];
int len;
if ((*data)[0] == 0)
which = "First group of names";
else
which = "Subsequent group of names";
msglen -= 4;
len = msglen > 255 ? 255: msglen;
memset (dir, 0, 256);
strncpy (dir, (*data)+1, len);
proto_tree_add_text(pt, NullTVB, *offset, 1, "%s", which);
proto_tree_add_text(pt, NullTVB, *offset+1, msglen-1, "Directory: %s", dir);
BUMP (*offset, *data, msglen);
}
void
resp_files (int src, const u_char **data, const u_char *dataend, int *offset, int msglen, proto_tree *pt) {
u_char *flag;
msglen -= 8;
flag = (*data)[0] ? "Yes": "No";
proto_tree_add_text(pt, NullTVB, *offset, 1, "More filenames to return: %s", flag);
proto_tree_add_text(pt, NullTVB, *offset+1, msglen-1, "File and directory names");
BUMP (*offset, *data, msglen);
}
void
cmd_usdt (int src, const u_char **data, const u_char *dataend, int *offset, int msglen, proto_tree *pt)
{
u_char *desc;
if ((*data)[0])
desc = "Register with gusdt";
else
desc = "Unregister with gusdt";
proto_tree_add_text(pt, NullTVB, *offset, 1, "%s", desc);
if ((*data)[1])
desc = "Echo long transmit messages back to the client";
else
desc = "Do not echo long transmit messages back to the client";
proto_tree_add_text(pt, NullTVB, (*offset)+1, 1, "%s", desc);
if ((*data)[2] == 2)
desc = "Assemble long received messages but do not send them to the client";
else if ((*data)[2])
desc = "Assemble long received messages and send them to the client";
else
desc = "Do not assemble long received messages on behalf of the client";
proto_tree_add_text(pt, NullTVB, (*offset)+2, 1, "%s", desc);
BUMP (*offset, *data, 4);
}
void
speed (int src, const u_char **data, const u_char *dataend, int *offset, int msglen, proto_tree *pt) {

View File

@ -1,7 +1,7 @@
/* packet-gryphon.c
* Definitions for Gryphon packet disassembly structures and routines
*
* $Id: packet-gryphon.h,v 1.1 1999/12/15 06:53:36 gram Exp $
* $Id: packet-gryphon.h,v 1.2 2000/11/01 00:16:18 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Steve Limkemann <stevelim@dgtech.com>
@ -26,6 +26,7 @@
*/
#define MSG_HDR_SZ 8
#define CMD_HDR_SZ 4
/* source/destinations: */
@ -92,6 +93,8 @@
/* SD_SERVER command types: */
#define CMD_SERVER_REG (SD_SERVER * 256 + 0x50) /* register connection */
#define CMD_SERVER_SET_SORT (SD_SERVER * 256 + 0x51) /* set sorting behavior */
#define CMD_SERVER_SET_OPT (SD_SERVER * 256 + 0x52) /* set type of optimization */
/* SD_CLIENT command types: */
@ -128,6 +131,7 @@
#define CMD_PGM_STOP (SD_PGM * 256 + 0x95) /* Stop an uploaded program */
#define CMD_PGM_STATUS (SD_PGM * 256 + 0x96) /* Get the status of an uploaded program */
#define CMD_PGM_OPTIONS (SD_PGM * 256 + 0x97) /* Set the upload options */
#define CMD_PGM_FILES (SD_PGM * 256 + 0x98) /* Get a list of files & directories */
/* Scheduler (SD_SCHED) target commands: */
@ -135,6 +139,11 @@
#define CMD_SCHED_KILL_TX (SD_SCHED * 256 + 0x71) /* stop and destroy job */
#define CMD_SCHED_STOP_TX (SD_SCHED * 256 + 0x71) /* deprecated */
/* USDT (SD_USDT) target commands: */
#define CMD_USDT_IOCTL (SD_USDT * 256 + 0x47) /* Register/Unregister with USDT */
/* response frame (FT_RESP) response field definitions: */
#define RESP_OK 0x00 /* no error */
@ -171,6 +180,8 @@
#define FILTER_DATA_TYPE_HEADER 0x01
#define FILTER_DATA_TYPE_DATA 0x02
#define FILTER_DATA_TYPE_EXTRA_DATA 0x03
#define FILTER_EVENT_TYPE_HEADER 0x04
#define FILTER_EVENT_TYPE_DATA 0x05
/* filter flags */
@ -208,6 +219,14 @@
#define ACTIVATE_FILTER 1
#define DEACTIVATE_FILTER 2
/* Flags to modify how FT_CMD (command) messages are handled */
/* These values are ORed with FT_CMD and stored in the Frame Header's */
/* Frame Type field for each response. */
#define DONT_WAIT_FOR_RESP 0x80
#define WAIT_FOR_PREV_RESP 0x40
#define RESPONSE_FLAGS (DONT_WAIT_FOR_RESP | WAIT_FOR_PREV_RESP)
/* Program loader options */
#define PGM_CONV 1 /* Type of data conversion to perform */
#define PGM_TYPE 2 /* Type of file */
@ -329,6 +348,7 @@
#define GDEHC12 0x04 /* DE HC12 KWP/BDLC SUBTYPE */
#define GKWP2000 0x04 /* Keyword protocol 2000 TYPE */
#define GDEHC12KWP 0x01 /* DE HC12 KWP/BDLC card SUBTYPE */
#define GHONDA 0x05 /* Honda UART TYPE */
#define GDGHC08 0x01 /* DG HC08 SUBTYPE */
@ -373,6 +393,9 @@ void filtmode (int, const u_char**, const u_char*, int*, int, proto_tree*);
void resp_events (int, const u_char**, const u_char*, int*, int, proto_tree*);
void cmd_register (int, const u_char**, const u_char*, int*, int, proto_tree*);
void resp_register (int, const u_char**, const u_char*, int*, int, proto_tree*);
void resp_getspeeds (int, const u_char**, const u_char*, int*, int, proto_tree*);
void cmd_sort (int, const u_char**, const u_char*, int*, int, proto_tree*);
void cmd_optimize (int, const u_char**, const u_char*, int*, int, proto_tree*);
void resp_config (int, const u_char**, const u_char*, int*, int, proto_tree*);
void cmd_sched (int, const u_char**, const u_char*, int*, int, proto_tree*);
void resp_blm_data (int, const u_char**, const u_char*, int*, int, proto_tree*);
@ -392,7 +415,10 @@ void cmd_start (int, const u_char**, const u_char*, int*, int, proto_tree*);
void resp_start (int, const u_char**, const u_char*, int*, int, proto_tree*);
void resp_status (int, const u_char**, const u_char*, int*, int, proto_tree*);
void cmd_options (int, const u_char**, const u_char*, int*, int, proto_tree*);
void cmd_files (int, const u_char**, const u_char*, int*, int, proto_tree*);
void resp_files (int, const u_char**, const u_char*, int*, int, proto_tree*);
void eventnum (int, const u_char**, const u_char*, int*, int, proto_tree*);
void speed (int, const u_char**, const u_char*, int*, int, proto_tree*);
void filter_block (int, const u_char**, const u_char*, int*, int, proto_tree*);
void blm_mode (int, const u_char**, const u_char*, int*, int, proto_tree*);
void cmd_usdt (int, const u_char**, const u_char*, int*, int, proto_tree*);