📄 packet-gryphon.c
字号:
static const value_string responses[] = { {RESP_OK, "OK - no error"}, {RESP_UNKNOWN_ERR, "Unknown error"}, {RESP_UNKNOWN_CMD, "Unrecognised command"}, {RESP_UNSUPPORTED, "Unsupported command"}, {RESP_INVAL_CHAN, "Invalid channel specified"}, {RESP_INVAL_DST, "Invalid destination"}, {RESP_INVAL_PARAM, "Invalid parameter(s)"}, {RESP_INVAL_MSG, "Invalid message"}, {RESP_INVAL_LEN, "Invalid length field"}, {RESP_TX_FAIL, "Transmit failed"}, {RESP_RX_FAIL, "Receive failed"}, {RESP_AUTH_FAIL, "Authorization failed"}, {RESP_MEM_ALLOC_ERR, "Memory allocation error"}, {RESP_TIMEOUT, "Command timed out"}, {RESP_UNAVAILABLE, "Unavailable"}, {RESP_BUF_FULL, "Buffer full"}, {RESP_NO_SUCH_JOB, "No such job"}, {-1, "- unknown -"}, }; static const value_string filter_data_types[] = { {FILTER_DATA_TYPE_HEADER_FRAME, "frame header"}, {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 -"}, };static const value_string operators[] = { {BIT_FIELD_CHECK, "Bit field check"}, {SVALUE_GT, "Greater than (signed)"}, {SVALUE_GE, "Greater than or equal to (signed)"}, {SVALUE_LT, "Less than (signed)"}, {SVALUE_LE, "Less than or equal to (signed)"}, {VALUE_EQ, "Equal to"}, {VALUE_NE, "Not equal to"}, {UVALUE_GT, "Greater than (unsigned)"}, {UVALUE_GE, "Greater than or equal to (unsigned)"}, {UVALUE_LT, "Less than (unsigned)"}, {UVALUE_LE, "Less than or equal to (unsigned)"}, {DIG_LOW_TO_HIGH, "Digital, low to high transistion"}, {DIG_HIGH_TO_LOW, "Digital, high to low transistion"}, {DIG_TRANSITION, "Digital, change of state"}, {-1, "- unknown -"}, };static const value_string modes[] = { {FILTER_OFF_PASS_ALL, "Filter off, pass all messages"}, {FILTER_OFF_BLOCK_ALL, "Filter off, block all messages"}, {FILTER_ON, "Filter on"}, {-1, "- unknown -"}, };static const value_string dmodes[] = { {DEFAULT_FILTER_BLOCK, "Block"}, {DEFAULT_FILTER_PASS, "Pass"}, {-1, "- unknown -"}, };static const value_string filtacts[] = { {DELETE_FILTER, "Delete"}, {ACTIVATE_FILTER, "Activate"}, {DEACTIVATE_FILTER, "Deactivate"}, {-1, "- unknown -"}, };static const value_string ioctls[] = { {GINIT, "GINIT: Initialize"}, {GLOOPON, "GLOOPON: Loop on"}, {GLOOPOFF, "GLOOPOFF: Loop off"}, {GGETHWTYPE, "GGETHWTYPE: Get hardware type"}, {GGETREG, "GGETREG: Get register"}, {GSETREG, "GSETREG: Set register"}, {GGETRXCOUNT, "GGETRXCOUNT: Get the receive message counter"}, {GSETRXCOUNT, "GSETRXCOUNT: Set the receive message counter"}, {GGETTXCOUNT, "GGETTXCOUNT: Get the transmit message counter"}, {GSETTXCOUNT, "GSETTXCOUNT: Set the transmit message counter"}, {GGETRXDROP, "GGETRXDROP: Get the number of dropped receive messages"}, {GSETRXDROP, "GSETRXDROP: Set the number of dropped receive messages"}, {GGETTXDROP, "GGETTXDROP: Get the number of dropped transmit messages"}, {GSETTXDROP, "GSETTXDROP: Set the number of dropped transmit messages"}, {GGETRXBAD, "GGETRXBAD: Get the number of bad receive messages"}, {GGETTXBAD, "GGETTXBAD: Get the number of bad transmit messages"}, {GGETCOUNTS, "GGETCOUNTS: Get total message counter"}, {GGETBLMON, "GGETBLMON: Get bus load monitoring status"}, {GSETBLMON, "GSETBLMON: Set bus load monitoring status (turn on/off)"}, {GGETERRLEV, "GGETERRLEV: Get error level"}, {GSETERRLEV, "GSETERRLEV: Set error level"}, {GGETBITRATE, "GGETBITRATE: Get bit rate"}, {GGETRAM, "GGETRAM: Read value from RAM"}, {GSETRAM, "GSETRAM: Write value to RAM"}, {GCANGETBTRS, "GCANGETBTRS: Read CAN bit timing registers"}, {GCANSETBTRS, "GCANSETBTRS: Write CAN bit timing registers"}, {GCANGETBC, "GCANGETBC: Read CAN byte count"}, {GCANSETBC, "GCANSETBC: Write CAN byte count"}, {GCANGETMODE, "GCANGETMODE"}, {GCANSETMODE, "GCANSETMODE"}, {GCANGETTRANS, "GCANGETTRANS"}, {GCANSETTRANS, "GCANSETTRANS"}, {GCANSENDERR, "GCANSENDERR"}, {GCANRGETOBJ, "GCANRGETOBJ"}, {GCANRSETSTDID, "GCANRSETSTDID"}, {GCANRSETEXTID, "GCANRSETEXTID"}, {GCANRSETDATA, "GCANRSETDATA"}, {GCANRENABLE, "GCANRENABLE"}, {GCANRDISABLE, "GCANRDISABLE"}, {GCANRGETMASKS, "GCANRGETMASKS"}, {GCANRSETMASKS, "GCANRSETMASKS"}, {GCANSWGETMODE, "GCANSWGETMODE"}, {GCANSWSETMODE, "GCANSWSETMODE"}, {GDLCGETFOURX, "GDLCGETFOURX"}, {GDLCSETFOURX, "GDLCSETFOURX"}, {GDLCGETLOAD, "GDLCGETLOAD"}, {GDLCSETLOAD, "GDLCSETLOAD"}, {GDLCSENDBREAK, "GDLCSENDBREAK"}, {GDLCABORTTX, "GDLCABORTTX"}, {GDLCGETHDRMODE, "DLCGETHDRMODE"}, {GDLCSETHDRMODE, "GDLCSETHDRMODE"}, {GHONSLEEP, "GHONSLEEP"}, {GHONSILENCE, "GHONSILENCE"}, {GKWPSETPTIMES, "GKWPSETPTIMES"}, {GKWPSETWTIMES, "GKWPSETWTIMES"}, {GKWPDOWAKEUP, "GKWPDOWAKEUP"}, {GKWPGETBITTIME, "GKWPGETBITTIME"}, {GKWPSETBITTIME, "GKWPSETBITTIME"}, {GKWPSETNODEADDR, "GKWPSETNODEADDR"}, {GKWPGETNODETYPE, "GKWPGETNODETYPE"}, {GKWPSETNODETYPE, "GKWPSETNODETYPE"}, {GKWPSETWAKETYPE, "GKWPSETWAKETYPE"}, {GKWPSETTARGADDR, "GKWPSETTARGADDR"}, {GKWPSETKEYBYTES, "GKWPSETKEYBYTES"}, {GKWPSETSTARTREQ, "GKWPSETSTARTREQ"}, {GKWPSETSTARTRESP, "GKWPSETSTARTRESP"}, {GKWPSETPROTOCOL, "GKWPSETPROTOCOL"}, {GKWPGETLASTKEYBYTES, "GKWPGETLASTKEYBYTES"}, {GKWPSETLASTKEYBYTES, "GKWPSETLASTKEYBYTES"}, {GSCPGETBBR, "GSCPGETBBR"}, {GSCPSETBBR, "GSCPSETBBR"}, {GSCPGETID, "GSCPGETID"}, {GSCPSETID, "GSCPSETID"}, {GSCPADDFUNCID, "GSCPADDFUNCID"}, {GSCPCLRFUNCID, "GSCPCLRFUNCID"}, {GUBPGETBITRATE, "GUBPGETBITRATE"}, {GUBPSETBITRATE, "GUBPSETBITRATE"}, {GUBPGETINTERBYTE, "GUBPGETINTERBYTE"}, {GUBPSETINTERBYTE, "GUBPSETINTERBYTE"}, {GUBPGETNACKMODE, "GUBPGETNACKMODE"}, {GUBPSETNACKMODE, "GUBPSETNACKMODE"}, {-1, "- unknown -"}, };static intdecode_command(tvbuff_t *tvb, int offset, int dst, int msglen, proto_tree *pt){ int cmd, padding; unsigned int i; proto_tree *ft; proto_item *ti; cmd = tvb_get_guint8(tvb, offset); proto_tree_add_uint_hidden(pt, hf_gryph_cmd, tvb, offset, 1, cmd); if (cmd > 0x3F) cmd += dst * 256; for (i = 0; i < SIZEOF(cmds); i++) { if (cmds[i].value == cmd) break; } if (i >= SIZEOF(cmds) && dst >= SD_KNOWN) { cmd = (cmd & 0xFF) + SD_CARD * 256; for (i = 0; i < SIZEOF(cmds); i++) { if (cmds[i].value == cmd) break; } } if (i >= SIZEOF(cmds)) i = SIZEOF(cmds) - 1; proto_tree_add_text (pt, tvb, offset, 4, "Command: %s", cmds[i].strptr); offset += 4; msglen -= 4; if (cmds[i].cmd_fnct && msglen > 0) { padding = 3 - (msglen + 3) % 4; ti = proto_tree_add_text(pt, tvb, offset, msglen, "Data: (%d bytes)", msglen); ft = proto_item_add_subtree(ti, ett_gryphon_command_data); offset = (*(cmds[i].cmd_fnct)) (tvb, offset, dst, msglen, ft); } return offset;}static intdecode_response(tvbuff_t *tvb, int offset, int src, int msglen, proto_tree *pt){ int cmd; unsigned int i, j, resp; proto_tree *ft; proto_item *ti; cmd = tvb_get_guint8(tvb, offset); if (cmd > 0x3F) cmd += src * 256; for (i = 0; i < SIZEOF(cmds); i++) { if (cmds[i].value == cmd) break; } if (i >= SIZEOF(cmds) && src >= SD_KNOWN) { cmd = (cmd & 0xFF) + SD_CARD * 256; for (i = 0; i < SIZEOF(cmds); i++) { if (cmds[i].value == cmd) break; } } if (i >= SIZEOF(cmds)) i = SIZEOF(cmds) - 1; proto_tree_add_text (pt, tvb, offset, 4, "Command: %s", cmds[i].strptr); offset += 4; msglen -= 4; resp = tvb_get_ntohl (tvb, offset); for (j = 0; j < SIZEOF(responses); j++) { if (responses[j].value == resp) break; } if (j >= SIZEOF(responses)) j = SIZEOF(responses) - 1; proto_tree_add_text (pt, tvb, offset, 4, "Status: %s", responses[j].strptr); offset += 4; msglen -= 4; if (cmds[i].rsp_fnct && msglen > 0) { ti = proto_tree_add_text(pt, tvb, offset, msglen, "Data: (%d bytes)", msglen); ft = proto_item_add_subtree(ti, ett_gryphon_response_data); offset = (*(cmds[i].rsp_fnct)) (tvb, offset, src, msglen, ft); } return offset;}static intdecode_data(tvbuff_t *tvb, int offset, int src, int msglen, proto_tree *pt){ proto_item *item, *item1; proto_tree *tree, *tree1; int hdrsize, datasize, extrasize, hdrbits, msgsize, padding, mode; int hours, minutes, seconds, fraction; unsigned long timestamp; hdrsize = tvb_get_guint8(tvb, offset+0); hdrbits = tvb_get_guint8(tvb, offset+1); datasize = tvb_get_ntohs(tvb, offset+2); extrasize = tvb_get_guint8(tvb, offset+4); padding = 3 - (hdrsize + datasize + extrasize + 3) % 4; msgsize = hdrsize + datasize + extrasize + padding + 16; item = proto_tree_add_text(pt, tvb, offset, 16, "Message header"); tree = proto_item_add_subtree (item, ett_gryphon_data_header); proto_tree_add_text(tree, tvb, offset, 2, "Header length: %d bytes, %d bits", hdrsize, hdrbits); proto_tree_add_text(tree, tvb, offset+2, 2, "Data length: %d bytes", datasize); proto_tree_add_text(tree, tvb, offset+4, 1, "Extra data length: %d bytes", extrasize); mode = tvb_get_guint8(tvb, offset+5); item1 = proto_tree_add_text(tree, tvb, offset+5, 1, "Mode: %d", mode); if (mode) { tree1 = proto_item_add_subtree (item1, ett_gryphon_flags); if (mode & 0x80) proto_tree_add_text(tree1, tvb, offset+5, 1, "1... .... = Transmitted message"); if (mode & 0x40) proto_tree_add_text(tree1, tvb, offset+5, 1, ".1.. .... = Received message"); if (mode & 0x20) proto_tree_add_text(tree1, tvb, offset+5, 1, "..1. .... = Local message"); if (mode & 0x10) proto_tree_add_text(tree1, tvb, offset+5, 1, "...1 .... = Remote message"); if (mode & 0x01) proto_tree_add_text(tree1, tvb, offset+5, 1, ".... ...1 = Internal message"); } proto_tree_add_text(tree, tvb, offset+6, 1, "Priority: %u", tvb_get_guint8(tvb, offset+6)); proto_tree_add_text(tree, tvb, offset+7, 1, "Error status: %u", tvb_get_guint8(tvb, offset+7)); timestamp = tvb_get_ntohl(tvb, offset+8); hours = timestamp /(100000 * 60 *60); minutes = (timestamp / (100000 * 60)) % 60; seconds = (timestamp / 100000) % 60; fraction = timestamp % 100000; proto_tree_add_text(tree, tvb, offset+8, 4, "Timestamp: %d:%02d:%02d.%05d", hours, minutes, seconds, fraction); proto_tree_add_text(tree, tvb, offset+12, 1, "Context: %u", tvb_get_guint8(tvb, offset+12)); proto_tree_add_text(tree, tvb, offset+13, 3, "reserved:"); offset += 16; item = proto_tree_add_text(pt, tvb, offset, msgsize-16-padding, "Message Body"); tree = proto_item_add_subtree (item, ett_gryphon_data_body); if (hdrsize) { proto_tree_add_text(tree, tvb, offset, hdrsize, "Header"); offset += hdrsize; } if (datasize) { proto_tree_add_text(tree, tvb, offset, datasize, "Data"); offset += datasize; } if (extrasize) { proto_tree_add_text(tree, tvb, offset, extrasize, "Extra data"); offset += extrasize; } if (padding) { proto_tree_add_text(pt, tvb, offset, padding, "padding"); offset += padding; } return offset;}static intdecode_event(tvbuff_t *tvb, int offset, int src, int msglen, proto_tree *pt){ int hours, minutes, seconds, fraction, padding, length; unsigned long timestamp; int msgend; padding = 3 - (msglen + 3) % 4; msgend = offset + msglen; proto_tree_add_text(pt, tvb, offset, 1, "Event ID: %u", tvb_get_guint8(tvb, offset)); proto_tree_add_text(pt, tvb, offset+1, 1, "Event context: %u", tvb_get_guint8(tvb, offset+1)); proto_tree_add_text(pt, tvb, offset+2, 2, "reserved"); offset += 4; timestamp = tvb_get_ntohl(tvb, offset); hours = timestamp /(100000 * 60 *60); minutes = (timestamp / (100000 * 60)) % 60; seconds = (timestamp / 100000) % 60; fraction = timestamp % 100000; proto_tree_add_text(pt, tvb, offset, 4, "Timestamp: %d:%02d:%02d.%05d", hours, minutes, seconds, fraction); offset += 4; if (offset < msgend) { length = msgend - offset; proto_tree_add_text (pt, tvb, offset, length, "Data (%d bytes)", length); offset += length; } if (padding) { proto_tree_add_text(pt, tvb, offset, padding, "padding"); offset += padding; } return offset;}static intcmd_init(tvbuff_t *tvb, int offset, int src, int msglen, proto_tree *pt){ char *ptr; if (tvb_get_guint8(tvb, offset) == 0) ptr = "Always initialize"; else ptr = "Initialize if not previously initialized"; proto_tree_add_text(pt, tvb, offset, 1, "Mode: %s", ptr); proto_tree_add_text(pt, tvb, offset+1, 3, "reserved"); offset += 4; return offset;}static inteventnum(tvbuff_t *tvb, int offset, int src, int msglen, proto_tree *pt){ guint8 event = tvb_get_guint8(tvb, offset); if (event) proto_tree_add_text(pt, tvb, offset, 1, "Event number: %u", event); else proto_tree_add_text(pt, tvb, offset, 1, "Event numbers: All"); proto_tree_add_text(pt, tvb, offset+1, 3, "padding"); offset += 4; return offset;}static intresp_time(tvbuff_t *tvb, int offset, int src, int msglen, proto_tree *pt)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -