Added Allied Telesis Loop Detection Frames
parent
3106386f44
commit
d4cad23807
|
@ -3742,6 +3742,10 @@ Erik Rigtorp <erik[AT]rigtorp.se> {
|
|||
Support for reading ZSTD and LZ4 compressed files
|
||||
}
|
||||
|
||||
Martin Mayer <martin.mayer[AT]m2-it-solutions.de> {
|
||||
Allied Telesis Loop Detection Frames (LDF) dissector
|
||||
}
|
||||
|
||||
and by:
|
||||
|
||||
Georgi Guninski <guninski[AT]guninski.com>
|
||||
|
|
|
@ -128,6 +128,7 @@ Vector Informatik Binary Log File (BLF)
|
|||
// "Full protocol name (Abbreviation)"
|
||||
[commaize]
|
||||
--
|
||||
Allied Telesis Loop Detection Frames (AT LDF)
|
||||
Bluetooth Link Manager Protocol (BT LMP)
|
||||
Bundle Protocol version 7 (BPv7)
|
||||
Bundle Protocol version 7 Security (BPSec)
|
||||
|
|
|
@ -726,6 +726,7 @@ set(DISSECTOR_SRC
|
|||
${CMAKE_CURRENT_SOURCE_DIR}/packet-assa_r3.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/packet-asterix.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/packet-at.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/packet-at-ldf.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/packet-atalk.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/packet-ath.c
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/packet-atm.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 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, STR_ASCII,
|
||||
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));
|
||||
}
|
||||
|
||||
void
|
||||
proto_reg_handoff_at_ldf(void)
|
||||
{
|
||||
|
||||
static dissector_handle_t at_ldf_handle;
|
||||
|
||||
at_ldf_handle = create_dissector_handle(dissect_at_ldf, proto_at_ldf);
|
||||
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:
|
||||
*/
|
|
@ -78,6 +78,7 @@ static dissector_table_t xid_subdissector_table;
|
|||
|
||||
static dissector_table_t ethertype_subdissector_table;
|
||||
static dissector_table_t hpteam_subdissector_table;
|
||||
static dissector_table_t other_control_dissector_table;
|
||||
|
||||
static dissector_handle_t bpdu_handle;
|
||||
static dissector_handle_t eth_withoutfcs_handle;
|
||||
|
@ -470,7 +471,11 @@ dissect_llc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
|
|||
}
|
||||
}
|
||||
} else {
|
||||
call_data_dissector(next_tvb, pinfo, tree);
|
||||
if (!dissector_try_uint(
|
||||
other_control_dissector_table, control,
|
||||
next_tvb, pinfo, tree)) {
|
||||
call_data_dissector(next_tvb, pinfo, tree);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -835,6 +840,8 @@ proto_register_llc(void)
|
|||
"LLC SAP", proto_llc, FT_UINT8, BASE_HEX);
|
||||
xid_subdissector_table = register_dissector_table("llc.xid_dsap",
|
||||
"LLC XID SAP", proto_llc, FT_UINT8, BASE_HEX);
|
||||
other_control_dissector_table = register_dissector_table("llc.control",
|
||||
"LLC Control", proto_llc, FT_UINT16, BASE_HEX);
|
||||
register_capture_dissector_table("llc.dsap", "LLC");
|
||||
|
||||
llc_handle = register_dissector("llc", dissect_llc, proto_llc);
|
||||
|
|
Loading…
Reference in New Issue