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-nt-tpcp.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-nt-tpcp.c')
-rw-r--r-- | epan/dissectors/packet-nt-tpcp.c | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/epan/dissectors/packet-nt-tpcp.c b/epan/dissectors/packet-nt-tpcp.c new file mode 100644 index 00000000..acf0a887 --- /dev/null +++ b/epan/dissectors/packet-nt-tpcp.c @@ -0,0 +1,249 @@ +/* packet-nt-tpcp.c + * Routines for Transparent Proxy Cache Protocol packet disassembly + * (c) Copyright Giles Scott <giles.scott1 [AT] btinternet.com> + * + * 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/addr_resolv.h> /* this is for get_hostname and udp_port_to_display */ + +void proto_register_tpcp(void); +void proto_reg_handoff_tpcp(void); + +static dissector_handle_t tpcp_handle; + +#define UDP_PORT_TPCP 3121 /* Not IANA registered */ + +/* TPCP version1/2 PDU format */ +typedef struct _tpcppdu_t { + guint8 version; /* PDU version 1 */ + guint8 type; /* PDU type: 1=request, 2=reply, 3=add filter, 4=rem filter */ + /* Version 2 adds 5=add session 6= remove session */ + guint16 flags; /* 0x0001: 0=UDP, 1=TCP*/ + /* 0x0002: 0=NONE, 1=DONT_REDIRECT */ + /* 0x0004: 0=NONE, 1=Xon */ + /* 0x0008: 0=NONE, 1=Xoff */ + guint16 id; /* request/response identification or TTL */ + guint16 cport; /* client UDP or TCP port number */ + guint32 caddr; /* client IPv4 address */ + guint32 saddr; /* server IPV4 address */ + /* tpcp version 2 only*/ + guint32 vaddr; /* Virtual Server IPv4 address */ + guint32 rasaddr; /* RAS server IPv4 address */ + guint32 signature; /* 0x74706370 - tpcp */ +} tpcpdu_t; + + +static const value_string type_vals[] = { + { 1, "Request" }, + { 2, "Reply" }, + { 3, "Add Filter" }, + { 4, "Remove Filter" }, + /* 5 and 6 are for version 2 only */ + { 5, "Add Session" }, + { 6, "Remove Session" }, + { 0, NULL } +}; + +/* TPCP Flags */ +#define TF_TPCP_UDPTCP 0x0001 +#define TF_TPCP_DONTREDIRECT 0x0002 +#define TF_TPCP_XON 0x0004 +#define TF_TPCP_XOFF 0x0008 + + +/* Version info */ +#define TPCP_VER_1 1 +#define TPCP_VER_2 2 + +#define TPCP_VER_1_LENGTH 16 +#define TPCP_VER_2_LENGTH 28 + +/* things we can do filters on */ +static int hf_tpcp_version = -1; +static int hf_tpcp_type = -1; +static int hf_tpcp_flags = -1; +static int hf_tpcp_flags_tcp = -1; +static int hf_tpcp_flags_redir = -1; +static int hf_tpcp_flags_xon = -1; +static int hf_tpcp_flags_xoff = -1; +static int hf_tpcp_id = -1; +static int hf_tpcp_cport = -1; +static int hf_tpcp_caddr = -1; +static int hf_tpcp_saddr = -1; +static int hf_tpcp_vaddr = -1; +static int hf_tpcp_rasaddr = -1; +static int hf_tpcp_signature = -1; + +static int proto_tpcp = -1; + +static gint ett_tpcp = -1; +static gint ett_tpcp_flags = -1; + + +static int +dissect_tpcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +{ + proto_tree *tpcp_tree = NULL; + proto_item *ti; + guint8 version, type; + guint16 id, cport; + + static int * const tpcp_flags[] = { + &hf_tpcp_flags_tcp, + &hf_tpcp_flags_redir, + &hf_tpcp_flags_xon, + &hf_tpcp_flags_xoff, + NULL + }; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "TPCP"); + col_clear(pinfo->cinfo, COL_INFO); + + /* need to find out which version!! */ + version = tvb_get_guint8(tvb, 0); + if ((version != TPCP_VER_1) && (version != TPCP_VER_2)) { + /* Not us */ + return 0; + } + + ti = proto_tree_add_protocol_format(tree, proto_tpcp, tvb, 0, -1, + "Alteon WebSystems - Transparent Proxy Cache Protocol"); + + tpcp_tree = proto_item_add_subtree(ti, ett_tpcp); + + proto_tree_add_item(tpcp_tree, hf_tpcp_version, tvb, 0, 1, ENC_BIG_ENDIAN); + type = tvb_get_guint8(tvb, 1); + proto_tree_add_item(tpcp_tree, hf_tpcp_type, tvb, 1, 1, ENC_BIG_ENDIAN); + + proto_tree_add_bitmask(tpcp_tree, tvb, 2, hf_tpcp_flags, ett_tpcp_flags, tpcp_flags, ENC_NA); + + id = tvb_get_ntohs(tvb, 4); + proto_tree_add_item(tpcp_tree, hf_tpcp_id, tvb, 4, 2, ENC_BIG_ENDIAN); + + cport = tvb_get_ntohs(tvb, 6); + proto_tree_add_uint_format_value(tpcp_tree, hf_tpcp_cport, tvb, 6, 2, cport, + "%s", udp_port_to_display(pinfo->pool, cport)); + + proto_tree_add_item(tpcp_tree, hf_tpcp_caddr, tvb, 8, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tpcp_tree, hf_tpcp_saddr, tvb, 12, 4, ENC_BIG_ENDIAN); + + if (version == TPCP_VER_2) { + proto_tree_add_item(tpcp_tree, hf_tpcp_vaddr, tvb, 16, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tpcp_tree, hf_tpcp_rasaddr, tvb, 20, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tpcp_tree, hf_tpcp_signature, tvb, 24, 4, ENC_BIG_ENDIAN); + } + + col_add_fstr(pinfo->cinfo, COL_INFO,"%s id %d CPort %s CIP %s SIP %s", + val_to_str_const(type, type_vals, "Unknown"), + id, + udp_port_to_display(pinfo->pool, cport), + tvb_ip_to_str(pinfo->pool, tvb, 8), + tvb_ip_to_str(pinfo->pool, tvb, 12)); + + if (version == TPCP_VER_1) + return TPCP_VER_1_LENGTH; + + return TPCP_VER_2_LENGTH; +} + +void +proto_register_tpcp(void) +{ + static hf_register_info hf[] = { + { &hf_tpcp_version, + { "Version", "tpcp.version", FT_UINT8, BASE_DEC, NULL, 0x0, + "TPCP version", HFILL }}, + + { &hf_tpcp_type, + { "Type", "tpcp.type", FT_UINT8, BASE_DEC, VALS(type_vals), 0x0, + "PDU type", HFILL }}, + + { &hf_tpcp_flags, + { "Flags", "tpcp.flags", FT_UINT16, BASE_HEX, NULL, 0x0, + NULL, HFILL }}, + + { &hf_tpcp_flags_tcp, + { "UDP/TCP", "tpcp.flags.tcp", FT_BOOLEAN, 8, TFS(&tfs_set_notset), TF_TPCP_UDPTCP, + "Protocol type", HFILL }}, + + { &hf_tpcp_flags_redir, + { "No Redirect", "tpcp.flags.redir", FT_BOOLEAN, 8, TFS(&tfs_set_notset), TF_TPCP_DONTREDIRECT, + "Don't redirect client", HFILL }}, + + { &hf_tpcp_flags_xon, + { "XON", "tpcp.flags.xon", FT_BOOLEAN, 8, TFS(&tfs_set_notset), TF_TPCP_XON, + NULL, HFILL }}, + + { &hf_tpcp_flags_xoff, + { "XOFF", "tpcp.flags.xoff", FT_BOOLEAN, 8, TFS(&tfs_set_notset), TF_TPCP_XOFF, + NULL, HFILL }}, + + { &hf_tpcp_id, + { "Client indent", "tpcp.cid", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + { &hf_tpcp_cport, + { "Client Source Port", "tpcp.cport", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + { &hf_tpcp_caddr, + { "Client Source IP address", "tpcp.caddr", FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + + { &hf_tpcp_saddr, + { "Server IP address", "tpcp.saddr", FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + + { &hf_tpcp_vaddr, + { "Virtual Server IP address", "tpcp.vaddr", FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + + { &hf_tpcp_rasaddr, + { "RAS server IP address", "tpcp.rasaddr", FT_IPv4, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + + { &hf_tpcp_signature, + { "Signature", "tpcp.signature", FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + }; + + + static gint *ett[] = { + &ett_tpcp, + &ett_tpcp_flags, + }; + + proto_tpcp = proto_register_protocol("Alteon - Transparent Proxy Cache Protocol", "TPCP", "tpcp"); + proto_register_field_array(proto_tpcp, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + + tpcp_handle = register_dissector("tpcp", dissect_tpcp, proto_tpcp); +} + +void +proto_reg_handoff_tpcp(void) +{ + dissector_add_uint_with_preference("udp.port", UDP_PORT_TPCP, tpcp_handle); +} + +/* + * Editor modelines - https://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 8 + * tab-width: 8 + * indent-tabs-mode: t + * End: + * + * vi: set shiftwidth=8 tabstop=8 noexpandtab: + * :indentSize=8:tabSize=8:noTabs=false: + */ |