diff options
Diffstat (limited to 'tools/dissectors/packet-octoclock.c')
-rw-r--r-- | tools/dissectors/packet-octoclock.c | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/tools/dissectors/packet-octoclock.c b/tools/dissectors/packet-octoclock.c new file mode 100644 index 000000000..453c325d7 --- /dev/null +++ b/tools/dissectors/packet-octoclock.c @@ -0,0 +1,212 @@ +/* + * Dissector for Ettus Octoclock packets + * + * Copyright 2016 Ettus Research + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include "config.h" + +#include <glib.h> +#include <epan/packet.h> +#include <ctype.h> +#include <stdio.h> +#include <stddef.h> + +#include "../../host/lib/usrp_clock/octoclock/common.h" + +#define LOG_HEADER "[Octoclock] " +#define size_mem(t,m) sizeof(((t*)0)->m) +#define packet_elem_size(m) (size_mem(octoclock_packet_t,m)) +#define packet_offset(m) (offsetof(octoclock_packet_t, m)) +const unsigned int OCTOCLOCK_PORT = OCTOCLOCK_UDP_CTRL_PORT; + +static int proto_octo = -1; +static int hf_octo_proto_version = -1; +static int hf_octo_proto_sequence = -1; +static int hf_octo_proto_code = -1; +static int hf_octo_proto_poolsize = -1; +static int hf_octo_proto_data = -1; +static int hf_octo_proto_payload = -1; +static int hf_octo_proto_len = -1; +static gint ett_octo = -1; +static const value_string packetcodes[] = { + {1, "OCTOCLOCK_QUERY_CMD"}, + {2, "OCTOCLOCK_QUERY_ACK"}, + {3, "SEND_EEPROM_CMD"}, + {4, "SEND_EEPROM_ACK"}, + {5, "BURN_EEPROM_CMD"}, + {6, "BURN_EEPROM_SUCCESS_ACK"}, + {7, "BURN_EEPROM_FAILURE_ACK"}, + {8, "CLEAR_EEPROM_CMD"}, + {9, "CLEAR_EEPROM_ACK"}, + {10, "SEND_STATE_CMD"}, + {11, "SEND_STATE_ACK"}, + {12, "RESET_CMD"}, + {13, "RESET_ACK"}, + {14, "HOST_SEND_TO_GPSDO_CMD"}, + {15, "HOST_SEND_TO_GPSDO_ACK"}, + {16, "SEND_POOLSIZE_CMD"}, + {17, "SEND_POOLSIZE_ACK"}, + {18, "SEND_CACHE_STATE_CMD"}, + {19, "SEND_CACHE_STATE_ACK"}, + {20, "SEND_GPSDO_CACHE_CMD"}, + {21, "SEND_GPSDO_CACHE_ACK"}, + {22, "PREPARE_FW_BURN_CMD"}, + {23, "FW_BURN_READY_ACK"}, + {24, "FILE_TRANSFER_CMD"}, + {25, "FILE_TRANSFER_ACK"}, + {26, "READ_FW_CMD"}, + {27, "READ_FW_ACK"}, + {28, "FINALIZE_BURNING_CMD"}, + {29, "FINALIZE_BURNING_ACK"}, + { 0, NULL } +}; +/* Forward-declare the dissector functions */ +void proto_register_octo(void); +void proto_reg_handoff_octo(void); +static void dissect_octo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); + +static void dissect_octo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +{ + col_set_str(pinfo->cinfo, COL_PROTOCOL, "OCTO"); + col_clear(pinfo->cinfo, COL_INFO); + proto_item *ti = proto_tree_add_item(tree, proto_octo, tvb, 0, -1, ENC_NA); + proto_tree *octo_tree = proto_item_add_subtree(ti, ett_octo); + proto_tree_add_item(octo_tree, + hf_octo_proto_version, + tvb, + packet_offset(proto_ver), + packet_elem_size(proto_ver), + ENC_LITTLE_ENDIAN); + guint32 rev = tvb_get_letohl(tvb, packet_offset(proto_ver)); + if(rev==3) + { + proto_tree_add_item(octo_tree, + hf_octo_proto_sequence, + tvb, + packet_offset(sequence), + packet_elem_size(sequence), + ENC_LITTLE_ENDIAN); + proto_tree_add_item(octo_tree, + hf_octo_proto_code, + tvb, + packet_offset(code), + packet_elem_size(code), + ENC_LITTLE_ENDIAN); + proto_tree_add_item(octo_tree, + hf_octo_proto_poolsize, + tvb, + packet_offset(poolsize), + packet_elem_size(poolsize), + ENC_LITTLE_ENDIAN); + + //packet_code_t code = (packet_code_t)(tvb_get_guint8(tvb, packet_offset(code))); + + guint16 len = tvb_get_letohs(tvb, packet_offset(len)); + if(len && len <= packet_elem_size(data)) + { + proto_tree_add_item(octo_tree, + hf_octo_proto_payload, + tvb, + packet_offset(data), + len, + ENC_LITTLE_ENDIAN); + } + proto_tree_add_item(octo_tree, + hf_octo_proto_data, + tvb, + packet_offset(data), + packet_elem_size(data), + ENC_LITTLE_ENDIAN); + proto_tree_add_item(octo_tree, + hf_octo_proto_len, + tvb, + packet_offset(len), + packet_elem_size(len), + ENC_LITTLE_ENDIAN); + } +} + + +void proto_register_octo(void) +{ + static hf_register_info hf[] = { + { &hf_octo_proto_version, + { "version", "octo.rev", + FT_UINT32, BASE_DEC, + NULL, 0x0, + "Protocol Revision", HFILL } + }, + { &hf_octo_proto_sequence, + { "sequence number", "octo.seq", + FT_UINT32, BASE_DEC, + NULL, 0x0, + NULL, HFILL } + }, + { &hf_octo_proto_code, + { "code", "octo.code", + FT_UINT8, BASE_DEC, + VALS(packetcodes), 0x0, + NULL, HFILL } + }, + { &hf_octo_proto_poolsize, + { "poolsize", "octo.poolsize", + FT_UINT16, BASE_DEC, + NULL, 0x0, + NULL, HFILL } + }, + { &hf_octo_proto_payload, + { "payload", "octo.payload", + FT_STRING, BASE_NONE, + NULL, 0x0, + NULL, HFILL } + }, + { &hf_octo_proto_data, + { "data", "octo.data", + FT_BYTES, BASE_NONE, + NULL, 0x0, + NULL, HFILL } + }, + { &hf_octo_proto_len, + { "length", "octo.len", + FT_UINT16, BASE_DEC, + NULL, 0x0, + NULL, HFILL } + } + }; + //protocol subtree array + static gint *ett[] = { + &ett_octo + }; + proto_octo = proto_register_protocol( + "Octoclock", + "Octoclock", + "octo" + ); + + proto_register_field_array(proto_octo, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + register_dissector("octo", dissect_octo, proto_octo); +} + +void proto_reg_handoff_octo(void) +{ + static dissector_handle_t octo_handle; + octo_handle = create_dissector_handle(dissect_octo, proto_octo); + dissector_add_uint("udp.port", OCTOCLOCK_PORT, octo_handle); + dissector_add_uint("udp.port", OCTOCLOCK_UDP_GPSDO_PORT, octo_handle); +} |