wireshark/epan/dissectors/packet-at-ldf.c
João Valverde 19dcb725b6 epan: Remove STR_ASCII and STR_UNICODE
These display bases work to replace unprintable characters so the
name is a misnomer. In addition they are the same option and this
display behaviour is not something that is configurable.

This does not affect encodings because all our internal text strings
need to be valid UTF-8 and the source encoding is specified using
ENC_*.

Remove the assertion for valid UTF-8 in proto.c because
tvb_get_*_string() must return a valid UTF-8 string, always, and we
don't need to assert that, it is expensive.
2021-12-03 04:35:56 +00:00

163 lines
4.6 KiB
C

/* 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, 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));
}
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:
*/