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-tte.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-tte.c')
-rw-r--r-- | epan/dissectors/packet-tte.c | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/epan/dissectors/packet-tte.c b/epan/dissectors/packet-tte.c new file mode 100644 index 00000000..200f7107 --- /dev/null +++ b/epan/dissectors/packet-tte.c @@ -0,0 +1,200 @@ +/* packet-tte.c + * Routines for Time Triggered Ethernet dissection + * + * Author: Valentin Ecker, valentin.ecker (AT) tttech.com + * Author: Benjamin Roch, benjamin.roch (AT) tttech.com + * + * TTTech Computertechnik AG, Austria. + * https://www.tttech.com/technologies/time-triggered-ethernet/ + * + * 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> +#include <epan/prefs.h> +#include <epan/etypes.h> + +#include "packet-tte.h" + +void proto_register_tte(void); +void proto_reg_handoff_tte(void); + +static dissector_handle_t ethertype_handle; + +/* Initialize the protocol and registered fields */ +static int proto_tte = -1; + +static int hf_eth_dst = -1; +static int hf_tte_dst_cf = -1; +static int hf_tte_ctid = -1; +static int hf_eth_src = -1; +static int hf_eth_type = -1; + +/* preference value pointers */ +static guint32 tte_pref_ct_marker = 0xFFFFFFFF; +static guint32 tte_pref_ct_mask = 0x0; + +/* Initialize the subtree pointers */ +static gint ett_tte = -1; +static gint ett_tte_macdest = -1; + + +/* Code to actually dissect the packets */ +static int +dissect_tte(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +{ + int is_frame_pcf; + ethertype_data_t ethertype_data; + + /* Set up structures needed to add the protocol subtree and manage it */ + proto_item *tte_root_item, *tte_macdest_item; + proto_tree *tte_tree, *tte_macdest_tree; + + /* Check that there's enough data */ + if (tvb_reported_length(tvb) < TTE_HEADER_LENGTH) + return 0; + + /* check if data of pcf frame */ + is_frame_pcf = + (tvb_get_ntohs(tvb, TTE_MAC_LENGTH * 2) == ETHERTYPE_TTE_PCF); + + /* return if no valid constant field is found */ + if (!is_frame_pcf) + { + if ( (tvb_get_ntohl(tvb, 0) & tte_pref_ct_mask) != tte_pref_ct_marker) + return 0; + } + + /* Make entries in Protocol column and Info column on summary display */ + col_set_str(pinfo->cinfo, COL_PROTOCOL, "TTE/"); + + if (tvb_get_ntohs(tvb, TTE_MAC_LENGTH * 2) <= IEEE_802_3_MAX_LEN) + { + col_set_str(pinfo->cinfo, COL_INFO, "TTEthernet Frame"); + } + else + { + col_set_str(pinfo->cinfo, COL_INFO, "Bogus TTEthernet Frame"); + } + + if (tree) { + + /* create display subtree for the protocol */ + tte_root_item = proto_tree_add_item(tree, proto_tte, tvb, 0, + TTE_HEADER_LENGTH, ENC_NA); + + tte_tree = proto_item_add_subtree(tte_root_item, ett_tte); + + tte_macdest_item = proto_tree_add_item(tte_tree, + hf_eth_dst, tvb, 0, TTE_MAC_LENGTH, ENC_NA); + + proto_tree_add_item(tte_tree, + hf_eth_src, tvb, TTE_MAC_LENGTH, TTE_MAC_LENGTH, ENC_NA); + + proto_tree_add_item(tte_tree, + hf_eth_type, tvb, TTE_MAC_LENGTH*2, TTE_ETHERTYPE_LENGTH, + ENC_BIG_ENDIAN); + + tte_macdest_tree = proto_item_add_subtree(tte_macdest_item, + ett_tte_macdest); + + proto_tree_add_item(tte_macdest_tree, + hf_tte_dst_cf, tvb, 0, TTE_MACDEST_CF_LENGTH, ENC_BIG_ENDIAN); + + proto_tree_add_item(tte_macdest_tree, + hf_tte_ctid, tvb, TTE_MACDEST_CF_LENGTH, + TTE_MACDEST_CTID_LENGTH, ENC_BIG_ENDIAN); + } + + /* prevent clearing the Columns...appending cannot be prevented */ + col_set_fence(pinfo->cinfo, COL_PROTOCOL); + + /* call std Ethernet dissector */ + ethertype_data.etype = tvb_get_ntohs(tvb, TTE_MAC_LENGTH * 2); + ethertype_data.payload_offset = TTE_HEADER_LENGTH; + ethertype_data.fh_tree = NULL; + ethertype_data.trailer_id = 0; + ethertype_data.fcs_len = 0; + + call_dissector_with_data(ethertype_handle, tvb, pinfo, tree, ðertype_data); + return tvb_reported_length(tvb); +} + + +void +proto_register_tte(void) +{ + module_t *tte_module; + + static hf_register_info hf[] = { + { &hf_tte_dst_cf, + { "Constant Field", "tte.cf", + FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL } + }, + { &hf_tte_ctid, + { "Critical Traffic Identifier", "tte.ctid", + FT_UINT16, BASE_HEX, NULL, 0x0, + NULL, HFILL } + } + }; + + /* Setup protocol subtree array */ + static gint *ett[] = { + &ett_tte, + &ett_tte_macdest + }; + + /* Register the protocol name and description */ + proto_tte = proto_register_protocol("TTEthernet", "TTE", "tte"); + + /* Required function calls to register header fields and subtrees used */ + proto_register_field_array(proto_tte, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + + /* Register preferences module */ + tte_module = prefs_register_protocol(proto_tte, NULL); + + /* Register preferences */ + prefs_register_uint_preference(tte_module, "ct_mask_value", + "CT Mask (in hex)", + "Critical Traffic Mask (base hex)", + 16, &tte_pref_ct_mask); + + prefs_register_uint_preference(tte_module, "ct_marker_value", + "CT Marker (in hex)", + "Critical Traffic Marker (base hex)", + 16, &tte_pref_ct_marker); +} + + +void +proto_reg_handoff_tte(void) +{ + heur_dissector_add("eth", dissect_tte, "TTEthernet", "tte_eth", proto_tte, HEURISTIC_ENABLE); + + hf_eth_dst = proto_registrar_get_id_byname ("eth.dst"); + hf_eth_src = proto_registrar_get_id_byname ("eth.src"); + hf_eth_type = proto_registrar_get_id_byname ("eth.type"); + + ethertype_handle = find_dissector_add_dependency("ethertype", proto_tte); +} + +/* + * 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: + */ |