diff options
Diffstat (limited to 'epan/dissectors/packet-ua.c')
-rw-r--r-- | epan/dissectors/packet-ua.c | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/epan/dissectors/packet-ua.c b/epan/dissectors/packet-ua.c new file mode 100644 index 00000000..c5e5d460 --- /dev/null +++ b/epan/dissectors/packet-ua.c @@ -0,0 +1,247 @@ +/* packet-ua.c + * Routines for UA/UDP (Universal Alcatel over UDP) packet dissection. + * Copyright 2012, Alcatel-Lucent Enterprise <lars.ruoff@alcatel-lucent.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 "packet-uaudp.h" + +void proto_register_ua_msg(void); +void proto_reg_handoff_ua_msg(void); +/*----------------------------------------------------------------------------- + GLOBALS + ---------------------------------------------------------------------------*/ + +#if 0 +static dissector_table_t ua_opcode_dissector_table; +#endif + +static int proto_ua_msg = -1; +static gint ett_ua_msg = -1; + +static dissector_handle_t noe_handle; +static dissector_handle_t ua3g_handle; + +static void uadecode(e_ua_direction direction, + proto_tree *tree, + packet_info *pinfo, + tvbuff_t *tvb, + gint offset, + gint opcode, + gint length) +{ + switch (opcode & 0x7f) /* suppression of the CP bit */ + { + case 0x15: + case 0x16: + { + call_dissector(noe_handle, + tvb_new_subset_length(tvb, offset, length), + pinfo, + tree); + break; + } + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: /* Only UA NOE */ + case 0x08: /* Only UA NOE */ + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x17: + case 0x18: + case 0x1F: /* case 0x9F */ + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: /* Only IP NOE */ + case 0x25: /* Only IP NOE */ + case 0x26: + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: /* Only UA NOE */ + case 0x2C: + case 0x2D: + case 0x2E: + case 0x30: + case 0x31: + case 0x32: /* Only UA NOE */ + case 0x33: + case 0x35: + case 0x36: /* IP Phone */ + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4A: + case 0x4B: + case 0x4C: + case 0x4D: + case 0x4E: + case 0x4F: + case 0x50: /* Only UA NOE */ + { + call_dissector_with_data(ua3g_handle, + tvb_new_subset_length(tvb, offset, length), + pinfo, + tree, &direction); + break; + } + default: + { + /* add text to the frame "INFO" column */ + col_append_fstr(pinfo->cinfo, COL_INFO, " - UA3G Message ERR: Opcode (0x%02x) Unknown", tvb_get_guint8(tvb, (offset + 2))); + + call_data_dissector(tvb_new_subset_length(tvb, offset, length), + pinfo, + tree); + break; + } + } +} + + + +/*----------------------------------------------------------------------------- + UA DISSECTOR + ---------------------------------------------------------------------------*/ +static void _dissect_ua_msg(tvbuff_t *tvb, + packet_info *pinfo, + proto_tree *tree, + e_ua_direction direction) +{ + gint offset = 0; + proto_item *ua_msg_item; + proto_tree *ua_msg_tree; + + ua_msg_item = proto_tree_add_protocol_format(tree, proto_ua_msg, tvb, 0, -1, + "Universal Alcatel Protocol, %s", + ((direction == SYS_TO_TERM) ? + "System -> Terminal" : "Terminal -> System")); + + ua_msg_tree = proto_item_add_subtree(ua_msg_item, ett_ua_msg); + + while (tvb_offset_exists(tvb, offset)) + { + gint length = tvb_get_letohs(tvb, offset) + 2; + gint opcode = tvb_get_guint8(tvb, offset+2); + + uadecode(direction, ua_msg_tree, pinfo, tvb, offset, opcode, length); + + offset += length; + } +} + + +static int dissect_ua_sys_to_term(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +{ + _dissect_ua_msg(tvb, pinfo, tree, SYS_TO_TERM); + return tvb_captured_length(tvb); +} + +static int dissect_ua_term_to_sys(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +{ + _dissect_ua_msg(tvb, pinfo, tree, TERM_TO_SYS); + return tvb_captured_length(tvb); +} + + +/*----------------------------------------------------------------------------- + DISSECTORS REGISTRATION FUNCTIONS + ---------------------------------------------------------------------------*/ + +void proto_register_ua_msg(void) +{ + static gint *ett[] = + { + &ett_ua_msg, + }; + + /* UA dissector registration */ + proto_ua_msg = proto_register_protocol("Universal Alcatel Protocol", "UA", "ua"); + + register_dissector("ua_sys_to_term", dissect_ua_sys_to_term, proto_ua_msg); + register_dissector("ua_term_to_sys", dissect_ua_term_to_sys, proto_ua_msg); + + /* Common subtree array registration */ + proto_register_subtree_array(ett, array_length(ett)); +} + +void proto_reg_handoff_ua_msg(void) +{ +#if 0 /* Future */ + dissector_handle_t handle_ua_msg; + + /* hooking of UA on UAUDP */ + /* XXX: The following is NG since the same 'pattern' is added twice */ + handle_ua_msg = find_dissector("ua_sys_to_term"); + dissector_add_uint("uaudp.opcode", UAUDP_DATA, handle_ua_msg); + + handle_ua_msg = find_dissector("ua_term_to_sys"); + dissector_add_uint("uaudp.opcode", UAUDP_DATA, handle_ua_msg); + + /* For hooking dissectors to UA */ + ua_opcode_dissector_table = + register_dissector_table("ua.opcode", + "ua.opcode", + FT_UINT8, + BASE_HEX); + + +#endif + noe_handle = find_dissector_add_dependency("noe", proto_ua_msg); + ua3g_handle = find_dissector_add_dependency("ua3g", proto_ua_msg); + +} + +/* + * 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: + */ |