diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
commit | e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch) | |
tree | 68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-at-ldf.c | |
parent | Initial commit. (diff) | |
download | wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip |
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/packet-at-ldf.c')
-rw-r--r-- | epan/dissectors/packet-at-ldf.c | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/epan/dissectors/packet-at-ldf.c b/epan/dissectors/packet-at-ldf.c new file mode 100644 index 00000000..7a9392f8 --- /dev/null +++ b/epan/dissectors/packet-at-ldf.c @@ -0,0 +1,162 @@ +/* packet-at-ldf.c + * Dissector for Allied Telesis Loop Detection Frames + * + * Copyright (c) 2021 by Martin Mayer <martin.mayer@m2-it-solutions.de> + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" +#include <epan/packet.h> + +#define AT_LDF_LLC_CTRL 0xE3 + +void proto_register_at_ldf(void); +void proto_reg_handoff_at_ldf(void); + +static dissector_handle_t at_ldf_handle; + +static int proto_at_ldf = -1; + +/* Fields */ +static int hf_at_ldf_version = -1; +static int hf_at_ldf_src_vlan = -1; +static int hf_at_ldf_src_port = -1; +static int hf_at_ldf_ttl = -1; +static int hf_at_ldf_id = -1; +static int hf_at_ldf_text = -1; + +static gint ett_at_ldf = -1; + +static int +dissect_at_ldf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, void *data _U_) +{ + /* + * Packet description + * + * The frame is an LLC frame (non-SNAP) with DSAP=0, SSAP=0, Control=0xE3. + * Ethernet destination address is the non-existing device address + * with Allied Telesis OUI (00:00:f4:27:71:01). + * + * The payload contains information about protocol version, source VLAN and port, + * TTL, random LDF identifier and an informational text. + */ + + + /* Check if packet is destined to AT test address */ + if(pinfo->dl_dst.type == AT_ETHER) { + const guint8 *dstaddr; + dstaddr = (const guint8 *)pinfo->dl_dst.data; + if( + dstaddr[0] != 0x00 || + dstaddr[1] != 0x00 || + dstaddr[2] != 0xF4 || + dstaddr[3] != 0x27 || + dstaddr[4] != 0x71 || + dstaddr[5] != 0x01 + ) return 0; + } else { + return 0; + } + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "ATLDF"); + col_clear(pinfo->cinfo,COL_INFO); + col_add_fstr(pinfo->cinfo, COL_INFO, "Source VLAN: %u, Port: %u", + tvb_get_guint16(tvb, 1, ENC_BIG_ENDIAN), + tvb_get_guint16(tvb, 5, ENC_BIG_ENDIAN)); + + proto_item *ti = proto_tree_add_item(tree, proto_at_ldf, tvb, 0, -1, ENC_NA); + proto_tree *at_ldf_tree = proto_item_add_subtree(ti, ett_at_ldf); + + gint offset = 0; + proto_tree_add_item(at_ldf_tree, hf_at_ldf_version, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + proto_tree_add_item(at_ldf_tree, hf_at_ldf_src_vlan, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + proto_tree_add_item(at_ldf_tree, hf_at_ldf_src_port, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + proto_tree_add_item(at_ldf_tree, hf_at_ldf_ttl, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + proto_tree_add_item(at_ldf_tree, hf_at_ldf_id, tvb, offset, 7, ENC_BIG_ENDIAN); + offset += 7; + proto_tree_add_item(at_ldf_tree, hf_at_ldf_text, tvb, offset, -1, ENC_BIG_ENDIAN); + + return tvb_captured_length(tvb); +} + +void +proto_register_at_ldf(void) +{ + static hf_register_info hf[] = { + { &hf_at_ldf_version, + { "Version", "atldf.version", + FT_UINT8, BASE_DEC, + NULL, 0x0, + NULL, HFILL } + }, + { &hf_at_ldf_src_vlan, + { "Source VLAN", "atldf.vlan", + FT_UINT16, BASE_DEC, + NULL, 0x0, + NULL, HFILL } + }, + { &hf_at_ldf_src_port, + { "Source Port", "atldf.port", + FT_UINT32, BASE_DEC, + NULL, 0x0, + NULL, HFILL } + }, + { &hf_at_ldf_ttl, + { "Time to Live", "atldf.ttl", + FT_UINT8, BASE_DEC, + NULL, 0x0, + NULL, HFILL } + }, + { &hf_at_ldf_id, + { "Identifier", "atldf.id", + FT_UINT56, BASE_HEX, + NULL, 0x0, + NULL, HFILL } + }, + { &hf_at_ldf_text, + { "Information", "atldf.info", + FT_STRINGZPAD, BASE_NONE, + NULL, 0x0, + NULL, HFILL } + } + }; + + static gint *ett[] = { + &ett_at_ldf + }; + + proto_at_ldf = proto_register_protocol ("Allied Telesis Loop Detection", "AT LDF", "atldf"); + + proto_register_field_array(proto_at_ldf, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + + at_ldf_handle = register_dissector("atldf", dissect_at_ldf, proto_at_ldf); +} + +void +proto_reg_handoff_at_ldf(void) +{ + dissector_add_uint("llc.control", AT_LDF_LLC_CTRL, at_ldf_handle); +} + +/* + * Editor modelines - https://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ |