forked from osmocom/wireshark
![Michael Mann](/assets/img/avatar_default.png)
They already know who they are when they register themselves. Saving the handle then to avoid finding it later. Not sure if this will increase unnecessary register_dissector functions (instead of using create_dissector_handle in proto_reg_handoff function) when other dissectors copy/paste, but it should make startup time a few microseconds better. Change-Id: I3839be791b32b84887ac51a6a65fb5733e9f1f43 Reviewed-on: https://code.wireshark.org/review/19481 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
3448 lines
133 KiB
C
3448 lines
133 KiB
C
/* packet-sprt.h
|
|
*
|
|
* Routines for SPRT dissection
|
|
* SPRT = Simple Packet Relay Transport
|
|
*
|
|
* Written by Jamison Adcock <jamison.adcock@cobham.com>
|
|
* for Sparta Inc., dba Cobham Analytic Solutions
|
|
* This code is largely based on the RTP parsing code
|
|
*
|
|
* Wireshark - Network traffic analyzer
|
|
* By Gerald Combs <gerald@wireshark.org>
|
|
* Copyright 1998 Gerald Combs
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
/* TODO:
|
|
* - work on conversations
|
|
*
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <epan/packet.h>
|
|
#include <epan/prefs.h>
|
|
#include <epan/conversation.h>
|
|
#include <epan/expert.h>
|
|
#include "packet-sprt.h"
|
|
|
|
void proto_register_sprt(void);
|
|
void proto_reg_handoff_sprt(void);
|
|
|
|
/* for some "range_string"s, there's only one value in the range */
|
|
#define SPRT_VALUE_RANGE(a) a,a
|
|
|
|
/* TODO - conversation states */
|
|
#define SPRT_STATE_XXX_TODO 0
|
|
|
|
#define SPRT_CONV_MAX_SETUP_METHOD_SIZE 12
|
|
|
|
/* is DLCI field present in I_OCTET message? See "DLCI enabled" in CONNECT message */
|
|
typedef enum {
|
|
DLCI_UNKNOWN,
|
|
DLCI_PRESENT,
|
|
DLCI_ABSENT
|
|
} i_octet_dlci_status_t;
|
|
|
|
|
|
/* Keep conversation info for one side of an SPRT conversation
|
|
* TODO - this needs to be bidirectional
|
|
*/
|
|
struct _sprt_conversation_info
|
|
{
|
|
gchar method[SPRT_CONV_MAX_SETUP_METHOD_SIZE + 1];
|
|
gboolean stream_started;
|
|
guint32 frame_number; /* the frame where this conversation is started */
|
|
|
|
/* sequence numbers for each channel: */
|
|
guint32 seqnum[4];
|
|
|
|
/* are we using the DLCI field in I_OCTET messages? See CONNECT message ("DLCI enabled") */
|
|
i_octet_dlci_status_t i_octet_dlci_status;
|
|
guint32 connect_frame_number; /* the CONNECT frame that tells us if the DLCI is enabled */
|
|
|
|
/* TODO - maintain state */
|
|
|
|
};
|
|
|
|
/* SPRT Message IDs: */
|
|
#define SPRT_MODEM_RELAY_MSG_ID_NULL 0
|
|
#define SPRT_MODEM_RELAY_MSG_ID_INIT 1
|
|
#define SPRT_MODEM_RELAY_MSG_ID_XID_XCHG 2
|
|
#define SPRT_MODEM_RELAY_MSG_ID_JM_INFO 3
|
|
#define SPRT_MODEM_RELAY_MSG_ID_START_JM 4
|
|
#define SPRT_MODEM_RELAY_MSG_ID_CONNECT 5
|
|
#define SPRT_MODEM_RELAY_MSG_ID_BREAK 6
|
|
#define SPRT_MODEM_RELAY_MSG_ID_BREAK_ACK 7
|
|
#define SPRT_MODEM_RELAY_MSG_ID_MR_EVENT 8
|
|
#define SPRT_MODEM_RELAY_MSG_ID_CLEARDOWN 9
|
|
#define SPRT_MODEM_RELAY_MSG_ID_PROF_XCHG 10
|
|
/* 11 -15 Reserved */
|
|
#define SPRT_MODEM_RELAY_MSG_ID_RESERVED1_START 11
|
|
#define SPRT_MODEM_RELAY_MSG_ID_RESERVED1_END 15
|
|
/* Data */
|
|
#define SPRT_MODEM_RELAY_MSG_ID_I_RAW_OCTET 16
|
|
#define SPRT_MODEM_RELAY_MSG_ID_I_RAW_BIT 17
|
|
#define SPRT_MODEM_RELAY_MSG_ID_I_OCTET 18
|
|
#define SPRT_MODEM_RELAY_MSG_ID_I_CHAR_STAT 19
|
|
#define SPRT_MODEM_RELAY_MSG_ID_I_CHAR_DYN 20
|
|
#define SPRT_MODEM_RELAY_MSG_ID_I_FRAME 21
|
|
#define SPRT_MODEM_RELAY_MSG_ID_I_OCTET_CS 22
|
|
#define SPRT_MODEM_RELAY_MSG_ID_I_CHAR_STAT_CS 23
|
|
#define SPRT_MODEM_RELAY_MSG_ID_I_CHAR_DYN_CS 24
|
|
/* 25 - 99 Reserved */
|
|
#define SPRT_MODEM_RELAY_MSG_ID_RESERVED2_START 25
|
|
#define SPRT_MODEM_RELAY_MSG_ID_RESERVED2_END 99
|
|
/* 100 - 127 Vendor-specific */
|
|
#define SPRT_MODEM_RELAY_MSG_ID_VENDOR_START 100
|
|
#define SPRT_MODEM_RELAY_MSG_ID_VENDOR_END 127
|
|
|
|
|
|
/* error correcting protocol in XID_XCHG message: */
|
|
#define SPRT_ECP_NO_LINK_LAYER_PROTO 0
|
|
#define SPRT_ECP_V42_LAPM 1
|
|
#define SPRT_ECP_ANNEX_AV42_1996 2
|
|
/* 3 - 25 Reserved for ITU-T */
|
|
#define SPRT_ECP_RESERVED_START 3
|
|
#define SPRT_ECP_RESERVED_END 25
|
|
|
|
|
|
/* category ID used in JM_INFO message: */
|
|
#define SPRT_JM_INFO_CAT_ID_CALL_FUNCT 0x8
|
|
#define SPRT_JM_INFO_CAT_ID_MOD_MODES 0xA
|
|
#define SPRT_JM_INFO_CAT_ID_PROTOCOLS 0x5
|
|
#define SPRT_JM_INFO_CAT_ID_PSTN_ACCESS 0xB
|
|
#define SPRT_JM_INFO_CAT_ID_PCM_MODEM_AVAIL 0xE
|
|
#define SPRT_JM_INFO_CAT_ID_CATEGORY_EXTENSION 0x0
|
|
|
|
|
|
#define SPRT_JMINFO_TBC_CALL_FUNCT_PSTN_MULTIMEDIA_TERM 0x4
|
|
#define SPRT_JMINFO_TBC_CALL_FUNCT_TEXTPHONE_ITU_T_REC_V18 0x2
|
|
#define SPRT_JMINFO_TBC_CALL_FUNCT_VIDEOTEXT_ITU_T_REC_T101 0x6
|
|
#define SPRT_JMINFO_TBC_CALL_FUNCT_TRANS_FAX_ITU_T_REC_T30 0x1
|
|
#define SPRT_JMINFO_TBC_CALL_FUNCT_RECV_FAX_ITU_T_REC_T30 0x5
|
|
#define SPRT_JMINFO_TBC_CALL_FUNCT_DATA_V_SERIES_MODEM_REC 0x3
|
|
|
|
|
|
#define SPRT_JMINFO_TBC_PROTOCOL_LAPM_ITU_T_REC_V42 0x4
|
|
|
|
|
|
/* selected modulations in CONNECT message: */
|
|
#define SPRT_SELMOD_NULL 0
|
|
#define SPRT_SELMOD_V92 1
|
|
#define SPRT_SELMOD_V91 2
|
|
#define SPRT_SELMOD_V90 3
|
|
#define SPRT_SELMOD_V34 4
|
|
#define SPRT_SELMOD_V32_BIS 5
|
|
#define SPRT_SELMOD_V32 6
|
|
#define SPRT_SELMOD_V22_BIS 7
|
|
#define SPRT_SELMOD_V22 8
|
|
#define SPRT_SELMOD_V17 9
|
|
#define SPRT_SELMOD_V29 10
|
|
#define SPRT_SELMOD_V27_TER 11
|
|
#define SPRT_SELMOD_V26_TER 12
|
|
#define SPRT_SELMOD_V26_BIS 13
|
|
#define SPRT_SELMOD_V23 14
|
|
#define SPRT_SELMOD_V21 15
|
|
#define SPRT_SELMOD_BELL_212 16
|
|
#define SPRT_SELMOD_BELL_103 17
|
|
/* 18 - 30 Vendor-specific modulations */
|
|
#define SPRT_SELMOD_VENDOR_START 18
|
|
#define SPRT_SELMOD_VENDOR_END 30
|
|
/* 31 - 63 Reserved for ITU-T */
|
|
#define SPRT_SELMOD_RESERVED_START 31
|
|
#define SPRT_SELMOD_RESERVED_END 63
|
|
|
|
|
|
/* Compression direction in CONNECT message: */
|
|
#define SPRT_COMPR_DIR_NO_COMPRESSION 0
|
|
#define SPRT_COMPR_DIR_TRANSMIT 1
|
|
#define SPRT_COMPR_DIR_RECEIVE 2
|
|
#define SPRT_COMPR_DIR_BIDIRECTIONAL 3
|
|
|
|
|
|
/* Selected compression modes in CONNECT message: */
|
|
#define SPRT_SELECTED_COMPR_NONE 0
|
|
#define SPRT_SELECTED_COMPR_V42_BIS 1
|
|
#define SPRT_SELECTED_COMPR_V44 2
|
|
#define SPRT_SELECTED_COMPR_MNP5 3
|
|
/* 4 - 15 Reserved by ITU-T */
|
|
#define SPRT_SELECTED_COMPR_RESERVED_START 4
|
|
#define SPRT_SELECTED_COMPR_RESERVED_END 15
|
|
|
|
|
|
/* Selected error correction modes in CONNECT message: */
|
|
#define SPRT_SELECTED_ERR_CORR_V14_OR_NONE 0
|
|
#define SPRT_SELECTED_ERR_CORR_V42_LAPM 1
|
|
#define SPRT_SELECTED_ERR_CORR_ANNEX_AV42 2
|
|
/* 3 - 15 Reserved for ITU-T */
|
|
#define SPRT_SELECTED_ERR_CORR_RESERVED_START 3
|
|
#define SPRT_SELECTED_ERR_CORR_RESERVED_END 15
|
|
|
|
|
|
/* Break source protocol in BREAK message: */
|
|
#define SPRT_BREAK_SRC_PROTO_V42_LAPM 0
|
|
#define SPRT_BREAK_SRC_PROTO_ANNEX_AV42_1996 1
|
|
#define SPRT_BREAK_SRC_PROTO_V14 2
|
|
/* 3 - 15 Reserved for ITU-T */
|
|
#define SPRT_BREAK_SRC_PROTO_RESERVED_START 3
|
|
#define SPRT_BREAK_SRC_PROTO_RESERVED_END 15
|
|
|
|
|
|
#define SPRT_BREAK_TYPE_NOT_APPLICABLE 0
|
|
#define SPRT_BREAK_TYPE_DESTRUCTIVE_AND_EXPEDITED 1
|
|
#define SPRT_BREAK_TYPE_NONDESTRUCTIVE_AND_EXPEDITED 2
|
|
#define SPRT_BREAK_TYPE_NONDESTRUCTIVE_AND_NONEXPEDITED 3
|
|
/* 4 - 15 Reserved for ITU-T */
|
|
#define SPRT_BREAK_TYPE_RESERVED_START 4
|
|
#define SPRT_BREAK_TYPE_RESERVED_END 15
|
|
|
|
|
|
/* Modem relay info in MR_EVENT messages: */
|
|
#define SPRT_MREVT_EVENT_ID_NULL 0
|
|
#define SPRT_MREVT_EVENT_ID_RATE_RENEGOTIATION 1
|
|
#define SPRT_MREVT_EVENT_ID_RETRAIN 2
|
|
#define SPRT_MREVT_EVENT_ID_PHYSUP 3
|
|
/* 4 - 255 Reserved for ITU-T */
|
|
#define SPRT_MREVT_EVENT_ID_RESERVED_START 4
|
|
#define SPRT_MREVT_EVENT_ID_RESERVED_END 255
|
|
|
|
|
|
#define SPRT_MREVT_REASON_CODE_NULL 0
|
|
#define SPRT_MREVT_REASON_CODE_INIT 1
|
|
#define SPRT_MREVT_REASON_CODE_RESPONDING 2
|
|
/* 3 - 255 Undefined */
|
|
#define SPRT_MREVT_REASON_CODE_RESERVED_START 3
|
|
#define SPRT_MREVT_REASON_CODE_RESERVED_END 255
|
|
|
|
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_NULL 0
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_600 1
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_1200 2
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_1600 3
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_2400 4
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_2743 5
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_3000 6
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_3200 7
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_3429 8
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_8000 9
|
|
/* 10 - 254 Reserved for ITU-T */
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_RESERVED_START 10
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_RESERVED_END 254
|
|
#define SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_UNSPECIFIED 255
|
|
|
|
|
|
/* Cleardown reason codes: */
|
|
#define SPRT_CLEARDOWN_RIC_UNKNOWN 0
|
|
#define SPRT_CLEARDOWN_RIC_PHYSICAL_LAYER_RELEASE 1
|
|
#define SPRT_CLEARDOWN_RIC_LINK_LAYER_DISCONNECT 2
|
|
#define SPRT_CLEARDOWN_RIC_DATA_COMPRESSION_DISCONNECT 3
|
|
#define SPRT_CLEARDOWN_RIC_ABORT 4
|
|
#define SPRT_CLEARDOWN_RIC_ON_HOOK 5
|
|
#define SPRT_CLEARDOWN_RIC_NETWORK_LAYER_TERMINATION 6
|
|
#define SPRT_CLEARDOWN_RIC_ADMINISTRATIVE 7
|
|
|
|
|
|
/* PROF_XCHG messages (XID profile exchange for MR1): */
|
|
#define SPRT_PROF_XCHG_SUPPORT_NO 0
|
|
#define SPRT_PROF_XCHG_SUPPORT_YES 1
|
|
#define SPRT_PROF_XCHG_SUPPORT_UNKNOWN 2
|
|
|
|
|
|
/* DLCI field in I_OCTET: */
|
|
#define SPRT_PAYLOAD_DLCI1_DTE2DTE 0
|
|
#define SPRT_PAYLOAD_DLCI1_RESERVED_START 1
|
|
#define SPRT_PAYLOAD_DLCI1_RESERVED_END 31
|
|
#define SPRT_PAYLOAD_DLCI1_NOT_RESERVED_START 32
|
|
#define SPRT_PAYLOAD_DLCI1_NOT_RESERVED_END 62
|
|
#define SPRT_PAYLOAD_DLCI1_CTRLFN2CTRLFN 63
|
|
|
|
#define SPRT_PAYLOAD_DLCI2_START 0
|
|
#define SPRT_PAYLOAD_DLCI2_END 127
|
|
|
|
/* Payload fields for I_CHAR_STAT_CS, etc.: */
|
|
/* # of data bits */
|
|
#define SPRT_PAYLOAD_D_0 0
|
|
#define SPRT_PAYLOAD_D_1 1
|
|
#define SPRT_PAYLOAD_D_2 2
|
|
#define SPRT_PAYLOAD_D_3 3
|
|
|
|
|
|
/* parity */
|
|
#define SPRT_PAYLOAD_P_0 0
|
|
#define SPRT_PAYLOAD_P_1 1
|
|
#define SPRT_PAYLOAD_P_2 2
|
|
#define SPRT_PAYLOAD_P_3 3
|
|
#define SPRT_PAYLOAD_P_4 4
|
|
#define SPRT_PAYLOAD_P_5 5
|
|
#define SPRT_PAYLOAD_P_6 6
|
|
#define SPRT_PAYLOAD_P_7 7
|
|
|
|
|
|
/* # of stop bits */
|
|
#define SPRT_PAYLOAD_S_0 0
|
|
#define SPRT_PAYLOAD_S_1 1
|
|
#define SPRT_PAYLOAD_S_2 2
|
|
#define SPRT_PAYLOAD_S_3 3
|
|
|
|
|
|
/* data frame state */
|
|
#define SPRT_PAYLOAD_FR_0 0
|
|
#define SPRT_PAYLOAD_FR_1 1
|
|
#define SPRT_PAYLOAD_FR_2 2
|
|
#define SPRT_PAYLOAD_FR_3 3
|
|
|
|
|
|
/* Initialize the protocol & registered fields */
|
|
static int proto_sprt = -1;
|
|
|
|
static int hf_sprt_setup = -1;
|
|
static int hf_sprt_setup_frame = -1;
|
|
static int hf_sprt_setup_method = -1;
|
|
|
|
static int hf_sprt_header_extension_bit = -1;
|
|
static int hf_sprt_subsession_id = -1;
|
|
static int hf_sprt_reserved_bit = -1;
|
|
static int hf_sprt_payload_type = -1;
|
|
static int hf_sprt_transport_channel_id = -1;
|
|
static int hf_sprt_sequence_number = -1;
|
|
static int hf_sprt_number_of_ack_fields = -1;
|
|
static int hf_sprt_base_sequence_number = -1;
|
|
static int hf_sprt_ack_field_items = -1;
|
|
static int hf_sprt_transport_channel_item = -1;
|
|
static int hf_sprt_sequence_item = -1;
|
|
|
|
static int hf_sprt_payload_length = -1;
|
|
static int hf_sprt_payload_no_data = -1;
|
|
static int hf_sprt_payload_reserved_bit = -1;
|
|
static int hf_sprt_payload_message_id = -1;
|
|
|
|
static int hf_sprt_payload_data = -1; /* stuff after msgid */
|
|
/* INIT msg: */
|
|
static int hf_sprt_payload_msg_init_all_fields = -1;
|
|
static int hf_sprt_payload_msg_init_necrxch = -1;
|
|
static int hf_sprt_payload_msg_init_ecrxch = -1;
|
|
static int hf_sprt_payload_msg_init_xid_prof_exch = -1;
|
|
static int hf_sprt_payload_msg_init_assym_data_types = -1;
|
|
static int hf_sprt_payload_msg_init_opt_moip_types_i_raw_bit = -1;
|
|
static int hf_sprt_payload_msg_init_opt_moip_types_i_frame = -1;
|
|
static int hf_sprt_payload_msg_init_opt_moip_types_i_char_stat = -1;
|
|
static int hf_sprt_payload_msg_init_opt_moip_types_i_char_dyn = -1;
|
|
static int hf_sprt_payload_msg_init_opt_moip_types_i_octet_cs = -1;
|
|
static int hf_sprt_payload_msg_init_opt_moip_types_i_char_stat_cs = -1;
|
|
static int hf_sprt_payload_msg_init_opt_moip_types_i_char_dyn_cs = -1;
|
|
static int hf_sprt_payload_msg_init_opt_moip_types_reserved = -1;
|
|
/* XID_XCHG message: */
|
|
static int hf_sprt_payload_msg_xidxchg_ecp = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr1_v42bis = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr1_v44 = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr1_mnp5 = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr1_reserved = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr2_v42bis_compr_req = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr3and4_v42bis_num_codewords = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr5_v42bis_max_strlen = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr6_v44_capability = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr7_v44_compr_req = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr8and9_v44_num_codewords_trans = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr10and11_v44_num_codewords_recv = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr12_v44_max_strlen_trans = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr13_v44_max_strlen_recv = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr14and15_v44_history_len_trans = -1;
|
|
static int hf_sprt_payload_msg_xidxchg_xidlr16and17_v44_history_len_recv = -1;
|
|
/* V.8 JM_INFO msg: */
|
|
static int hf_sprt_payload_msg_jminfo_category_data = -1;
|
|
static int hf_sprt_payload_msg_jminfo_category_id = -1;
|
|
static int hf_sprt_payload_msg_jminfo_category_ext_info = -1;
|
|
static int hf_sprt_payload_msg_jminfo_unk_category_info = -1;
|
|
static int hf_sprt_payload_msg_jminfo_category_leftover_bits = -1;
|
|
static int hf_sprt_payload_msg_jminfo_call_function = -1;
|
|
static int hf_sprt_payload_msg_jminfo_mod_v34_duplex = -1;
|
|
static int hf_sprt_payload_msg_jminfo_mod_v34_half_duplex = -1;
|
|
static int hf_sprt_payload_msg_jminfo_mod_v32bis_v32 = -1;
|
|
static int hf_sprt_payload_msg_jminfo_mod_v22bis_v22 = -1;
|
|
static int hf_sprt_payload_msg_jminfo_mod_v17 = -1;
|
|
static int hf_sprt_payload_msg_jminfo_mod_v29_half_duplex = -1;
|
|
static int hf_sprt_payload_msg_jminfo_mod_v27ter = -1;
|
|
static int hf_sprt_payload_msg_jminfo_mod_v26ter = -1;
|
|
static int hf_sprt_payload_msg_jminfo_mod_v26bis = -1;
|
|
static int hf_sprt_payload_msg_jminfo_mod_v23_duplex = -1;
|
|
static int hf_sprt_payload_msg_jminfo_mod_v23_half_duplex = -1;
|
|
static int hf_sprt_payload_msg_jminfo_mod_v21 = -1;
|
|
static int hf_sprt_payload_msg_jminfo_protocols = -1;
|
|
static int hf_sprt_payload_msg_jminfo_pstn_access_call_dce_cell = -1;
|
|
static int hf_sprt_payload_msg_jminfo_pstn_access_answ_dce_cell = -1;
|
|
static int hf_sprt_payload_msg_jminfo_pstn_access_dce_on_digital_net = -1;
|
|
static int hf_sprt_payload_msg_jminfo_pcm_modem_avail_v90_v92_analog = -1;
|
|
static int hf_sprt_payload_msg_jminfo_pcm_modem_avail_v90_v92_digital = -1;
|
|
static int hf_sprt_payload_msg_jminfo_pcm_modem_avail_v91 = -1;
|
|
/* CONNECT msg: */
|
|
static int hf_sprt_payload_msg_connect_selmod = -1;
|
|
static int hf_sprt_payload_msg_connect_compr_dir = -1;
|
|
static int hf_sprt_payload_msg_connect_selected_compr = -1;
|
|
static int hf_sprt_payload_msg_connect_selected_err_corr = -1;
|
|
static int hf_sprt_payload_msg_connect_tdsr = -1;
|
|
static int hf_sprt_payload_msg_connect_rdsr = -1;
|
|
static int hf_sprt_payload_msg_connect_dlci_enabled = -1;
|
|
static int hf_sprt_payload_msg_connect_avail_data_types = -1;
|
|
static int hf_sprt_payload_msg_connect_adt_octet_no_format_no_dlci = -1;
|
|
static int hf_sprt_payload_msg_connect_adt_i_raw_bit = -1;
|
|
static int hf_sprt_payload_msg_connect_adt_i_frame = -1;
|
|
static int hf_sprt_payload_msg_connect_adt_i_char_stat = -1;
|
|
static int hf_sprt_payload_msg_connect_adt_i_char_dyn = -1;
|
|
static int hf_sprt_payload_msg_connect_adt_i_octet_cs = -1;
|
|
static int hf_sprt_payload_msg_connect_adt_i_char_stat_cs = -1;
|
|
static int hf_sprt_payload_msg_connect_adt_i_char_dyn_cs = -1;
|
|
static int hf_sprt_payload_msg_connect_adt_reserved = -1;
|
|
static int hf_sprt_payload_msg_connect_compr_trans_dict_sz = -1;
|
|
static int hf_sprt_payload_msg_connect_compr_recv_dict_sz = -1;
|
|
static int hf_sprt_payload_msg_connect_compr_trans_str_len = -1;
|
|
static int hf_sprt_payload_msg_connect_compr_recv_str_len = -1;
|
|
static int hf_sprt_payload_msg_connect_compr_trans_hist_sz = -1;
|
|
static int hf_sprt_payload_msg_connect_compr_recv_hist_sz = -1;
|
|
/* BREAK msg: */
|
|
static int hf_sprt_payload_msg_break_source_proto = -1;
|
|
static int hf_sprt_payload_msg_break_type = -1;
|
|
static int hf_sprt_payload_msg_break_length = -1;
|
|
/* MR_EVENT msg: */
|
|
static int hf_sprt_payload_msg_mr_event_id = -1;
|
|
static int hf_sprt_payload_msg_mr_evt_reason_code = -1;
|
|
static int hf_sprt_payload_msg_mr_evt_selmod = -1;
|
|
static int hf_sprt_payload_msg_mr_evt_txsen = -1;
|
|
static int hf_sprt_payload_msg_mr_evt_rxsen = -1;
|
|
static int hf_sprt_payload_msg_mr_evt_tdsr = -1;
|
|
static int hf_sprt_payload_msg_mr_evt_rdsr = -1;
|
|
static int hf_sprt_payload_msg_mr_evt_txsr = -1;
|
|
static int hf_sprt_payload_msg_mr_evt_rxsr = -1;
|
|
/* CLEARDOWN msg: */
|
|
static int hf_sprt_payload_msg_cleardown_reason_code = -1;
|
|
static int hf_sprt_payload_msg_cleardown_vendor_tag = -1;
|
|
static int hf_sprt_payload_msg_cleardown_vendor_info = -1;
|
|
/* PROF_XCHG msg: */
|
|
static int hf_sprt_payload_msg_profxchg_v42_lapm = -1;
|
|
static int hf_sprt_payload_msg_profxchg_annex_av42 = -1;
|
|
static int hf_sprt_payload_msg_profxchg_v44_compr = -1;
|
|
static int hf_sprt_payload_msg_profxchg_v42bis_compr = -1;
|
|
static int hf_sprt_payload_msg_profxchg_mnp5_compr = -1;
|
|
static int hf_sprt_payload_msg_profxchg_reserved = -1;
|
|
static int hf_sprt_payload_msg_profxchg_xidlr2_v42bis_compr_req = -1;
|
|
static int hf_sprt_payload_msg_profxchg_xidlr3and4_v42bis_num_codewords = -1;
|
|
static int hf_sprt_payload_msg_profxchg_xidlr5_v42bis_max_strlen = -1;
|
|
static int hf_sprt_payload_msg_profxchg_xidlr6_v44_capability = -1;
|
|
static int hf_sprt_payload_msg_profxchg_xidlr7_v44_compr_req = -1;
|
|
static int hf_sprt_payload_msg_profxchg_xidlr8and9_v44_num_codewords_trans = -1;
|
|
static int hf_sprt_payload_msg_profxchg_xidlr10and11_v44_num_codewords_recv = -1;
|
|
static int hf_sprt_payload_msg_profxchg_xidlr12_v44_max_strlen_trans = -1;
|
|
static int hf_sprt_payload_msg_profxchg_xidlr13_v44_max_strlen_recv = -1;
|
|
static int hf_sprt_payload_msg_profxchg_xidlr14and15_v44_history_len_trans = -1;
|
|
static int hf_sprt_payload_msg_profxchg_xidlr16and17_v44_history_len_recv = -1;
|
|
/* I_OCTET */
|
|
static int hf_sprt_payload_i_octet_no_dlci = -1;
|
|
static int hf_sprt_payload_i_octet_dlci_presence_unknown = -1;
|
|
static int hf_sprt_payload_i_octet_dlci1 = -1;
|
|
static int hf_sprt_payload_i_octet_cr = -1;
|
|
static int hf_sprt_payload_i_octet_ea = -1;
|
|
static int hf_sprt_payload_i_octet_dlci2 = -1;
|
|
static int hf_sprt_payload_i_octet_dlci_setup_by_connect_frame = -1;
|
|
|
|
/* I_OCTET_CS, I_CHAR_STAT_CS, I_CHAR_DYN_CS msgs: */
|
|
static int hf_sprt_payload_data_cs = -1;
|
|
static int hf_sprt_payload_data_reserved_bit = -1;
|
|
static int hf_sprt_payload_data_num_data_bits = -1;
|
|
static int hf_sprt_payload_data_parity_type = -1;
|
|
static int hf_sprt_payload_num_stop_bits = -1;
|
|
static int hf_sprt_payload_frame_reserved_bits = -1;
|
|
static int hf_sprt_payload_frame_state = -1;
|
|
static int hf_sprt_payload_rawoctet_n_field_present = -1;
|
|
static int hf_sprt_payload_rawoctet_l = -1;
|
|
static int hf_sprt_payload_rawoctet_n = -1;
|
|
static int hf_sprt_payload_rawbit_included_fields_l = -1;
|
|
static int hf_sprt_payload_rawbit_included_fields_lp = -1;
|
|
static int hf_sprt_payload_rawbit_included_fields_lpn = -1;
|
|
static int hf_sprt_payload_rawbit_len_a = -1;
|
|
static int hf_sprt_payload_rawbit_len_b = -1;
|
|
static int hf_sprt_payload_rawbit_len_c = -1;
|
|
static int hf_sprt_payload_rawbit_p = -1;
|
|
static int hf_sprt_payload_rawbit_n = -1;
|
|
|
|
/* Preferences */
|
|
static gboolean global_sprt_show_setup_info = TRUE; /* show how this SPRT stream got started */
|
|
static gboolean global_sprt_show_dlci_info = TRUE; /* show DLCI in I_OCTET messages, including setup frame (if we can) */
|
|
|
|
|
|
/* dissector handle */
|
|
static dissector_handle_t sprt_handle;
|
|
|
|
|
|
/* initialize the subtree pointers */
|
|
static gint ett_sprt = -1;
|
|
static gint ett_sprt_setup = -1;
|
|
static gint ett_sprt_ack_fields = -1;
|
|
static gint ett_payload = -1;
|
|
static gint ett_init_msg_all_fields = -1;
|
|
static gint ett_jminfo_msg_cat_data = -1;
|
|
static gint ett_connect_msg_adt = -1;
|
|
|
|
static expert_field ei_sprt_sequence_number_0 = EI_INIT;
|
|
|
|
/* value strings & range strings */
|
|
static const value_string sprt_transport_channel_characteristics[] = {
|
|
{ 0, "Unreliable, unsequenced" },
|
|
{ 1, "Reliable, sequenced" },
|
|
{ 2, "Expedited, reliable, sequenced" },
|
|
{ 3, "Unreliable, sequenced" },
|
|
{ 0, NULL}
|
|
};
|
|
|
|
static const range_string sprt_modem_relay_msg_id_name[] = {
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_NULL), "NULL reserved for ITU-T" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_INIT), "INIT" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_XID_XCHG), "XID_XCHG" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_JM_INFO), "JM_INFO" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_START_JM), "START_JM" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_CONNECT), "CONNECT" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_BREAK), "BREAK" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_BREAK_ACK), "BREAK_ACK" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_MR_EVENT), "MR_EVENT" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_CLEARDOWN), "CLEARDOWN" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_PROF_XCHG), "PROF_XCHG" },
|
|
{ SPRT_MODEM_RELAY_MSG_ID_RESERVED1_START, SPRT_MODEM_RELAY_MSG_ID_RESERVED1_END, "Reserved for ITU-T" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_I_RAW_OCTET), "I_RAW-OCTET" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_I_RAW_BIT), "I_RAW-BIT" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_I_OCTET), "I_OCTET" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_I_CHAR_STAT), "I_CHAR-STAT" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_I_CHAR_DYN), "I_CHAR-DYN" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_I_FRAME), "I_FRAME" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_I_OCTET_CS), "I_OCTET-CS" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_I_CHAR_STAT_CS), "I_CHAR-STAT-CS" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MODEM_RELAY_MSG_ID_I_CHAR_DYN_CS), "I_CHAR-DYN-CS" },
|
|
{ SPRT_MODEM_RELAY_MSG_ID_RESERVED2_START, SPRT_MODEM_RELAY_MSG_ID_RESERVED2_END, "Reserved for ITU-T" },
|
|
{ SPRT_MODEM_RELAY_MSG_ID_VENDOR_START, SPRT_MODEM_RELAY_MSG_ID_VENDOR_END, "Vendor-specific message" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const range_string sprt_ecp_name[] = {
|
|
{ SPRT_VALUE_RANGE(SPRT_ECP_NO_LINK_LAYER_PROTO), "No link layer protocol" },
|
|
{ SPRT_VALUE_RANGE(SPRT_ECP_V42_LAPM), "V.42/LAPM" },
|
|
{ SPRT_VALUE_RANGE(SPRT_ECP_ANNEX_AV42_1996), "Annex A/V.42(1996)" },
|
|
{ SPRT_ECP_RESERVED_START, SPRT_ECP_RESERVED_END, "Reserved for ITU-T" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const value_string sprt_jm_info_cat_id_name[] = {
|
|
{ SPRT_JM_INFO_CAT_ID_CALL_FUNCT, "Call function" },
|
|
{ SPRT_JM_INFO_CAT_ID_MOD_MODES, "Modulation modes" },
|
|
{ SPRT_JM_INFO_CAT_ID_PROTOCOLS, "Protocols" },
|
|
{ SPRT_JM_INFO_CAT_ID_PSTN_ACCESS, "PSTN access" },
|
|
{ SPRT_JM_INFO_CAT_ID_PCM_MODEM_AVAIL, "PCM modem availability" },
|
|
{ SPRT_JM_INFO_CAT_ID_CATEGORY_EXTENSION, "Extension of current category" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string sprt_jminfo_tbc_call_funct_name[] = {
|
|
{ SPRT_JMINFO_TBC_CALL_FUNCT_PSTN_MULTIMEDIA_TERM, "PSTN Multimedia terminal (ITU-T Rec. H.324)" },
|
|
{ SPRT_JMINFO_TBC_CALL_FUNCT_TEXTPHONE_ITU_T_REC_V18, "Textphone (ITU-T Rec. V.18)" },
|
|
{ SPRT_JMINFO_TBC_CALL_FUNCT_VIDEOTEXT_ITU_T_REC_T101, "Videotext (ITU-T Rec. T.101)" },
|
|
{ SPRT_JMINFO_TBC_CALL_FUNCT_TRANS_FAX_ITU_T_REC_T30, "Transmit facsimile from call terminal (ITU-T Rec. T.30)" },
|
|
{ SPRT_JMINFO_TBC_CALL_FUNCT_RECV_FAX_ITU_T_REC_T30, "Receive facsimile at call terminal (ITU-T Rec. T.30)" },
|
|
{ SPRT_JMINFO_TBC_CALL_FUNCT_DATA_V_SERIES_MODEM_REC, "Data (V-series modem Recommendations)" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const range_string sprt_jminfo_tbc_protocol_name[] = {
|
|
{ SPRT_VALUE_RANGE(SPRT_JMINFO_TBC_PROTOCOL_LAPM_ITU_T_REC_V42), "LAPM protocol according to ITU-T Rec. V.42" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const range_string sprt_selmod_name[] = {
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_NULL), "NULL" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V92), "V.92" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V91), "V.91" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V90), "V.90" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V34), "V.34" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V32_BIS), "V.32bis" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V32), "V.32" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V22_BIS), "V.22bis" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V22), "V.22" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V17), "V.17" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V29), "V.29" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V27_TER), "V.27ter" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V26_TER), "V.26ter" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V26_BIS), "V.26bis" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V23), "V.23" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_V21), "V.21" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_BELL_212), "Bell 212" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELMOD_BELL_103), "Bell 103" },
|
|
{ SPRT_SELMOD_VENDOR_START, SPRT_SELMOD_VENDOR_END, "Vendor-specific modulation" },
|
|
{ SPRT_SELMOD_RESERVED_START, SPRT_SELMOD_RESERVED_END, "Reserved for ITU-T" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const value_string sprt_comp_direction[] = {
|
|
{ SPRT_COMPR_DIR_NO_COMPRESSION, "None" },
|
|
{ SPRT_COMPR_DIR_TRANSMIT, "Transmit" },
|
|
{ SPRT_COMPR_DIR_RECEIVE, "Receive" },
|
|
{ SPRT_COMPR_DIR_BIDIRECTIONAL, "Bidirectional" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const range_string sprt_selected_compr_name[] = {
|
|
{ SPRT_VALUE_RANGE(SPRT_SELECTED_COMPR_NONE), "None" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELECTED_COMPR_V42_BIS), "V.42bis" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELECTED_COMPR_V44), "V.44" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELECTED_COMPR_MNP5), "MNP5" },
|
|
{ SPRT_SELECTED_COMPR_RESERVED_START, SPRT_SELECTED_COMPR_RESERVED_END, "Reserved by ITU-T" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const range_string sprt_selected_err_corr_name[] = {
|
|
{ SPRT_VALUE_RANGE(SPRT_SELECTED_ERR_CORR_V14_OR_NONE), "V.14 or no error correction protocol" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELECTED_ERR_CORR_V42_LAPM), "V.42/LAPM" },
|
|
{ SPRT_VALUE_RANGE(SPRT_SELECTED_ERR_CORR_ANNEX_AV42), "Annex A/V.42" },
|
|
{ SPRT_SELECTED_ERR_CORR_RESERVED_START, SPRT_SELECTED_ERR_CORR_RESERVED_END, "Reserved for ITU-T" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const range_string sprt_break_src_proto_name[] = {
|
|
{ SPRT_VALUE_RANGE(SPRT_BREAK_SRC_PROTO_V42_LAPM), "V.42/LAPM" },
|
|
{ SPRT_VALUE_RANGE(SPRT_BREAK_SRC_PROTO_ANNEX_AV42_1996), "Annex A/V.42(1996)" },
|
|
{ SPRT_VALUE_RANGE(SPRT_BREAK_SRC_PROTO_V14), "V.14" },
|
|
{ SPRT_BREAK_SRC_PROTO_RESERVED_START, SPRT_BREAK_SRC_PROTO_RESERVED_END, "Reserved for ITU-T" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const range_string sprt_break_type_name[] = {
|
|
{ SPRT_VALUE_RANGE(SPRT_BREAK_TYPE_NOT_APPLICABLE), "Not applicable" },
|
|
{ SPRT_VALUE_RANGE(SPRT_BREAK_TYPE_DESTRUCTIVE_AND_EXPEDITED), "Destructive and expedited" },
|
|
{ SPRT_VALUE_RANGE(SPRT_BREAK_TYPE_NONDESTRUCTIVE_AND_EXPEDITED), "Non-destructive and expedited" },
|
|
{ SPRT_VALUE_RANGE(SPRT_BREAK_TYPE_NONDESTRUCTIVE_AND_NONEXPEDITED), "Non-destructive and non-expedited" },
|
|
{ SPRT_BREAK_TYPE_RESERVED_START, SPRT_BREAK_TYPE_RESERVED_END, "Reserved for ITU-T" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const range_string sprt_mrevent_id_name[] = {
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_EVENT_ID_NULL), "NULL" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_EVENT_ID_RATE_RENEGOTIATION), "Rate renegotiation" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_EVENT_ID_RETRAIN), "Retrain" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_EVENT_ID_PHYSUP), "Physical layer ready" }, /* reason code should be 0 */
|
|
{ SPRT_MREVT_EVENT_ID_RESERVED_START, SPRT_MREVT_EVENT_ID_RESERVED_END, "Reserved for ITU-T" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const range_string sprt_mrevent_reason_code_name[] = {
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_REASON_CODE_NULL), "Null/not applicable" }, /* for eventid = PHYSUP */
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_REASON_CODE_INIT), "Initiation" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_REASON_CODE_RESPONDING), "Responding" },
|
|
{ SPRT_MREVT_REASON_CODE_RESERVED_START, SPRT_MREVT_REASON_CODE_RESERVED_END, "Reserved for ITU-T" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const range_string sprt_mrevent_phys_layer_symbol_rate[] = {
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_NULL), "Null/not applicable" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_600), "600" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_1200), "1200" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_1600), "1600" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_2400), "2400" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_2743), "2743" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_3000), "3000" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_3200), "3200" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_3429), "3249" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_8000), "8000" },
|
|
{ SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_RESERVED_START, SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_RESERVED_END, "Reserved for ITU-T" },
|
|
{ SPRT_VALUE_RANGE(SPRT_MREVT_PHYS_LAYER_SYMBOL_RATE_UNSPECIFIED), "Unspecified" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const value_string sprt_cleardown_reason[] = {
|
|
{ SPRT_CLEARDOWN_RIC_UNKNOWN, "Unknown/unspecified" },
|
|
{ SPRT_CLEARDOWN_RIC_PHYSICAL_LAYER_RELEASE, "Physical layer release" },
|
|
{ SPRT_CLEARDOWN_RIC_LINK_LAYER_DISCONNECT, "Link layer disconnect" },
|
|
{ SPRT_CLEARDOWN_RIC_DATA_COMPRESSION_DISCONNECT, "Data compression disconnect" },
|
|
{ SPRT_CLEARDOWN_RIC_ABORT, "Abort" },
|
|
{ SPRT_CLEARDOWN_RIC_ON_HOOK, "On hook" },
|
|
{ SPRT_CLEARDOWN_RIC_NETWORK_LAYER_TERMINATION, "Network layer termination" },
|
|
{ SPRT_CLEARDOWN_RIC_ADMINISTRATIVE, "Administrative" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string sprt_prof_xchg_support[] = {
|
|
{ SPRT_PROF_XCHG_SUPPORT_NO, "No" },
|
|
{ SPRT_PROF_XCHG_SUPPORT_YES, "Yes" },
|
|
{ SPRT_PROF_XCHG_SUPPORT_UNKNOWN, "Unknown" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const range_string sprt_payload_dlci1[] = {
|
|
{ SPRT_VALUE_RANGE(SPRT_PAYLOAD_DLCI1_DTE2DTE), "DTE-to-DTE (V.24 interfaces) data" },
|
|
{ SPRT_PAYLOAD_DLCI1_RESERVED_START, SPRT_PAYLOAD_DLCI1_RESERVED_END, "Reserved for for ITU-T" },
|
|
{ SPRT_PAYLOAD_DLCI1_NOT_RESERVED_START, SPRT_PAYLOAD_DLCI1_NOT_RESERVED_END, "Not reserved for for ITU-T" },
|
|
{ SPRT_VALUE_RANGE(SPRT_PAYLOAD_DLCI1_CTRLFN2CTRLFN), "Control-function to control-function information" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const true_false_string sprt_payload_ea_bit[] = {
|
|
{ "Last octet of address field", "Another octet of address field follows" }
|
|
};
|
|
|
|
static const range_string sprt_payload_dlci2[] = {
|
|
{ SPRT_PAYLOAD_DLCI2_START, SPRT_PAYLOAD_DLCI2_END, "Reserved by ITU-T for further study" },
|
|
{ 0, 0, NULL }
|
|
};
|
|
|
|
static const value_string sprt_payload_data_bits[] = {
|
|
{ SPRT_PAYLOAD_D_0, "5 bits" },
|
|
{ SPRT_PAYLOAD_D_1, "6 bits" },
|
|
{ SPRT_PAYLOAD_D_2, "7 bits" },
|
|
{ SPRT_PAYLOAD_D_3, "8 bits" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string sprt_payload_parity[] = {
|
|
{ SPRT_PAYLOAD_P_0, "Unknown" },
|
|
{ SPRT_PAYLOAD_P_1, "None" },
|
|
{ SPRT_PAYLOAD_P_2, "Even parity" },
|
|
{ SPRT_PAYLOAD_P_3, "Odd parity" },
|
|
{ SPRT_PAYLOAD_P_4, "Space parity" },
|
|
{ SPRT_PAYLOAD_P_5, "Mark parity" },
|
|
{ SPRT_PAYLOAD_P_6, "Reserved" },
|
|
{ SPRT_PAYLOAD_P_7, "Reserved" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string sprt_payload_stop_bits[] = {
|
|
{ SPRT_PAYLOAD_S_0, "1 stop bit" },
|
|
{ SPRT_PAYLOAD_S_1, "2 stop bits" },
|
|
{ SPRT_PAYLOAD_S_2, "Reserved" },
|
|
{ SPRT_PAYLOAD_S_3, "Reserved" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
static const value_string sprt_payload_frame_state[] = {
|
|
{ SPRT_PAYLOAD_FR_0, "Data frame without termination" },
|
|
{ SPRT_PAYLOAD_FR_1, "Data frame with termination" },
|
|
{ SPRT_PAYLOAD_FR_2, "Data frame with abort termination" },
|
|
{ SPRT_PAYLOAD_FR_3, "Undefined" },
|
|
{ 0, NULL }
|
|
};
|
|
|
|
|
|
|
|
/* look for a conversation & return the associated data */
|
|
static struct _sprt_conversation_info* find_sprt_conversation_data(packet_info *pinfo)
|
|
{
|
|
conversation_t *p_conv = NULL;
|
|
struct _sprt_conversation_info *p_conv_data = NULL;
|
|
/* Use existing packet info if available */
|
|
p_conv = find_conversation(pinfo->num,
|
|
&pinfo->src,
|
|
&pinfo->dst,
|
|
pinfo->ptype,
|
|
pinfo->srcport,
|
|
pinfo->destport,
|
|
NO_ADDR_B|NO_PORT_B);
|
|
if (p_conv)
|
|
{
|
|
p_conv_data = (struct _sprt_conversation_info*)conversation_get_proto_data(p_conv, proto_sprt);
|
|
}
|
|
return p_conv_data;
|
|
}
|
|
|
|
|
|
|
|
/* set up SPRT conversation */
|
|
void sprt_add_address(packet_info *pinfo,
|
|
address *addr, int port,
|
|
int other_port,
|
|
const gchar *setup_method,
|
|
guint32 setup_frame_number)
|
|
{
|
|
address null_addr;
|
|
conversation_t* p_conv;
|
|
struct _sprt_conversation_info *p_conv_data = NULL;
|
|
|
|
/*
|
|
* If this isn't the first time this packet has been processed,
|
|
* we've already done this work, so we don't need to do it
|
|
* again.
|
|
*/
|
|
if (pinfo->fd->flags.visited)
|
|
{
|
|
return;
|
|
}
|
|
|
|
clear_address(&null_addr);
|
|
|
|
/*
|
|
* Check if the ip address and port combination is not
|
|
* already registered as a conversation.
|
|
*/
|
|
p_conv = find_conversation(setup_frame_number, addr, &null_addr, PT_UDP, port, other_port,
|
|
NO_ADDR_B | (!other_port ? NO_PORT_B : 0));
|
|
|
|
/*
|
|
* If not, create a new conversation.
|
|
*/
|
|
if (!p_conv || p_conv->setup_frame != setup_frame_number) {
|
|
p_conv = conversation_new(setup_frame_number, addr, &null_addr, PT_UDP,
|
|
(guint32)port, (guint32)other_port,
|
|
NO_ADDR2 | (!other_port ? NO_PORT2 : 0));
|
|
}
|
|
|
|
/* Set dissector */
|
|
conversation_set_dissector(p_conv, sprt_handle);
|
|
|
|
/*
|
|
* Check if the conversation has data associated with it.
|
|
*/
|
|
p_conv_data = (struct _sprt_conversation_info *)conversation_get_proto_data(p_conv, proto_sprt);
|
|
|
|
/*
|
|
* If not, add a new data item.
|
|
*/
|
|
if (!p_conv_data) {
|
|
/* Create conversation data */
|
|
p_conv_data = wmem_new(wmem_file_scope(), struct _sprt_conversation_info);
|
|
p_conv_data->stream_started = FALSE;
|
|
p_conv_data->seqnum[0] = 0;
|
|
p_conv_data->seqnum[1] = 0;
|
|
p_conv_data->seqnum[2] = 0;
|
|
p_conv_data->seqnum[3] = 0;
|
|
p_conv_data->i_octet_dlci_status = DLCI_UNKNOWN;
|
|
p_conv_data->connect_frame_number = 0;
|
|
conversation_add_proto_data(p_conv, proto_sprt, p_conv_data);
|
|
}
|
|
|
|
/* Update the conversation data. */
|
|
g_strlcpy(p_conv_data->method, setup_method, SPRT_CONV_MAX_SETUP_METHOD_SIZE);
|
|
p_conv_data->frame_number = setup_frame_number;
|
|
}
|
|
|
|
|
|
|
|
/* Display setup info */
|
|
static void show_setup_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|
{
|
|
struct _sprt_conversation_info *p_conv_data;
|
|
proto_tree *sprt_setup_tree;
|
|
proto_item *ti;
|
|
|
|
/* look up the conversation & get the data */
|
|
p_conv_data = find_sprt_conversation_data(pinfo);
|
|
|
|
if (!p_conv_data)
|
|
{
|
|
proto_tree_add_string_format(tree, hf_sprt_setup, tvb, 0, 0, "", "No setup info found");
|
|
return;
|
|
}
|
|
|
|
/* Create setup info subtree with summary info. */
|
|
ti = proto_tree_add_string_format(tree, hf_sprt_setup, tvb, 0, 0,
|
|
"",
|
|
"Stream setup by %s (frame %u)",
|
|
p_conv_data->method,
|
|
p_conv_data->frame_number);
|
|
PROTO_ITEM_SET_GENERATED(ti);
|
|
sprt_setup_tree = proto_item_add_subtree(ti, ett_sprt_setup);
|
|
if (sprt_setup_tree)
|
|
{
|
|
/* Add details into subtree */
|
|
proto_item* item = proto_tree_add_uint(sprt_setup_tree, hf_sprt_setup_frame,
|
|
tvb, 0, 0, p_conv_data->frame_number);
|
|
PROTO_ITEM_SET_GENERATED(item);
|
|
item = proto_tree_add_string(sprt_setup_tree, hf_sprt_setup_method,
|
|
tvb, 0, 0, p_conv_data->method);
|
|
PROTO_ITEM_SET_GENERATED(item);
|
|
}
|
|
}
|
|
|
|
|
|
/* code to actually dissect the packet payload data */
|
|
static int
|
|
dissect_sprt_data(tvbuff_t *tvb,
|
|
packet_info *pinfo,
|
|
struct _sprt_conversation_info *p_conv_data,
|
|
proto_tree *sprt_tree,
|
|
unsigned int offset,
|
|
guint payload_length)
|
|
{
|
|
proto_item *ti;
|
|
proto_tree *sprt_payload_tree, *field_subtree;
|
|
guint8 octet, payload_msgid, category_id;
|
|
guint8 selcompr, mr_event_id;
|
|
guint16 word, category_count;
|
|
|
|
if (payload_length > 0)
|
|
{
|
|
ti = proto_tree_add_uint(sprt_tree, hf_sprt_payload_length, tvb, offset, 1, payload_length);
|
|
proto_item_set_len(ti, payload_length);
|
|
|
|
sprt_payload_tree = proto_item_add_subtree(ti, ett_payload);
|
|
|
|
payload_msgid = tvb_get_guint8(tvb, offset) & 0x7F;
|
|
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_reserved_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_message_id, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
payload_length--;
|
|
|
|
/* what kind of message is this? */
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, ", %s(%d)", rval_to_str(payload_msgid, sprt_modem_relay_msg_id_name, "Unknown"), payload_msgid);
|
|
|
|
/* now parse payload stuff after ext. bit & msgid */
|
|
switch(payload_msgid)
|
|
{
|
|
case SPRT_MODEM_RELAY_MSG_ID_INIT:
|
|
/* make subtree */
|
|
ti = proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_init_all_fields, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
field_subtree = proto_item_add_subtree(ti, ett_init_msg_all_fields);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_init_necrxch, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_init_ecrxch, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_init_xid_prof_exch, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_init_assym_data_types, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_init_opt_moip_types_i_raw_bit, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_init_opt_moip_types_i_frame, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_init_opt_moip_types_i_char_stat, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_init_opt_moip_types_i_char_dyn, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
/* from V.150.1 amendment 2 (5-2006): */
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_init_opt_moip_types_i_octet_cs, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_init_opt_moip_types_i_char_stat_cs, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_init_opt_moip_types_i_char_dyn_cs, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_init_opt_moip_types_reserved, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_XID_XCHG:
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_ecp, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr1_v42bis, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr1_v44, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr1_mnp5, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr1_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr2_v42bis_compr_req, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr3and4_v42bis_num_codewords, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr5_v42bis_max_strlen, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr6_v44_capability, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr7_v44_compr_req, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr8and9_v44_num_codewords_trans, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr10and11_v44_num_codewords_recv, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr12_v44_max_strlen_trans, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr13_v44_max_strlen_recv, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr14and15_v44_history_len_trans, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_xidxchg_xidlr16and17_v44_history_len_recv, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_JM_INFO:
|
|
category_count = 1;
|
|
do /* there may be multiple categories */
|
|
{
|
|
word = tvb_get_ntohs(tvb, offset);
|
|
category_id = (word >> 12);
|
|
|
|
ti = proto_tree_add_uint_format_value(sprt_payload_tree, hf_sprt_payload_msg_jminfo_category_data, tvb, offset, 2, word,
|
|
"Item #%d: %s (0x%04x)", category_count, val_to_str_const(category_id, sprt_jm_info_cat_id_name, "Unknown"), category_id);
|
|
category_count++;
|
|
field_subtree = proto_item_add_subtree(ti, ett_jminfo_msg_cat_data);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_category_id, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
|
|
switch(category_id)
|
|
{
|
|
case SPRT_JM_INFO_CAT_ID_CALL_FUNCT: /* 0x8 */
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_call_function, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_category_leftover_bits, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
break;
|
|
case SPRT_JM_INFO_CAT_ID_MOD_MODES: /* 0xA */
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_mod_v34_duplex, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_mod_v34_half_duplex, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_mod_v32bis_v32, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_mod_v22bis_v22, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_mod_v17, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_mod_v29_half_duplex, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_mod_v27ter, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_mod_v26ter, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_mod_v26bis, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_mod_v23_duplex, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_mod_v23_half_duplex, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_mod_v21, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
break;
|
|
case SPRT_JM_INFO_CAT_ID_PROTOCOLS: /* 0x5 */
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_protocols, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_category_leftover_bits, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
break;
|
|
case SPRT_JM_INFO_CAT_ID_PSTN_ACCESS: /* 0xB */
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_pstn_access_call_dce_cell, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_pstn_access_answ_dce_cell, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_pstn_access_dce_on_digital_net, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_category_leftover_bits, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
break;
|
|
case SPRT_JM_INFO_CAT_ID_PCM_MODEM_AVAIL: /* 0xE */
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_pcm_modem_avail_v90_v92_analog, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_pcm_modem_avail_v90_v92_digital, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_pcm_modem_avail_v91, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_category_leftover_bits, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
break;
|
|
case SPRT_JM_INFO_CAT_ID_CATEGORY_EXTENSION: /* 0x0 */
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_category_ext_info, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
break;
|
|
default: /* unknown category ID */
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_jminfo_unk_category_info, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
break;
|
|
}
|
|
offset += 2;
|
|
} while (tvb_reported_length_remaining(tvb, offset) >= 2);
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_START_JM:
|
|
/* No additional content */
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_CONNECT: /***/
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_selmod, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_compr_dir, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
selcompr = (tvb_get_guint8(tvb, offset) & 0xF0) >> 4;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_selected_compr, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_selected_err_corr, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_tdsr, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_rdsr, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
word = tvb_get_ntohs(tvb, offset);
|
|
/* is DLCI enabled (used w/I_OCTET messages)? */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_dlci_enabled, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
/* have we previously seen a CONNECT msg in this conversation (i.e., do we know if DLCI is used w/I_OCTET?) */
|
|
if (p_conv_data->connect_frame_number == 0)
|
|
{
|
|
p_conv_data->connect_frame_number = pinfo->num;
|
|
if (word & 0x8000)
|
|
{
|
|
p_conv_data->i_octet_dlci_status = DLCI_PRESENT;
|
|
} else {
|
|
p_conv_data->i_octet_dlci_status = DLCI_ABSENT;
|
|
}
|
|
}
|
|
|
|
/* do subtree for available data types */
|
|
ti = proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_avail_data_types, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
field_subtree = proto_item_add_subtree(ti, ett_connect_msg_adt);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_connect_adt_octet_no_format_no_dlci, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_connect_adt_i_raw_bit, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_connect_adt_i_frame, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_connect_adt_i_char_stat, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_connect_adt_i_char_dyn, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
/* from V.150.1 amendment 2 (5-2006): */
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_connect_adt_i_octet_cs, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_connect_adt_i_char_stat_cs, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_connect_adt_i_char_dyn_cs, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(field_subtree, hf_sprt_payload_msg_connect_adt_reserved, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
if (selcompr != SPRT_SELECTED_COMPR_NONE &&
|
|
selcompr != SPRT_SELECTED_COMPR_MNP5)
|
|
{
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_compr_trans_dict_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_compr_recv_dict_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_compr_trans_str_len, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_compr_recv_str_len, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
}
|
|
if (selcompr != SPRT_SELECTED_COMPR_NONE &&
|
|
selcompr != SPRT_SELECTED_COMPR_MNP5 &&
|
|
selcompr != SPRT_SELECTED_COMPR_V42_BIS)
|
|
{
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_compr_trans_hist_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_connect_compr_recv_hist_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
}
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_BREAK: /* no additional info */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_break_source_proto, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_break_type, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_break_length, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_BREAK_ACK:
|
|
/* No additional content */
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_MR_EVENT:
|
|
mr_event_id = tvb_get_guint8(tvb, offset);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_mr_event_id, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_mr_evt_reason_code, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
if (mr_event_id == SPRT_MREVT_EVENT_ID_PHYSUP)
|
|
{
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_mr_evt_selmod, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_mr_evt_txsen, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_mr_evt_rxsen, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_mr_evt_tdsr, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_mr_evt_rdsr, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
/* The next two fields are "optional"
|
|
* they should only appear w/PHYSUP (MR_EVENT id = 3) messages, when TxSR and RxSR are true
|
|
*/
|
|
if (tvb_reported_length_remaining(tvb, offset) >= 2)
|
|
{
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_mr_evt_txsr, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_mr_evt_rxsr, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
}
|
|
}
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_CLEARDOWN:
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_cleardown_reason_code, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_cleardown_vendor_tag, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_cleardown_vendor_info, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_PROF_XCHG:
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_v42_lapm, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_annex_av42, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_v44_compr, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_v42bis_compr, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_mnp5_compr, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_xidlr2_v42bis_compr_req, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_xidlr3and4_v42bis_num_codewords, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_xidlr5_v42bis_max_strlen, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_xidlr6_v44_capability, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_xidlr7_v44_compr_req, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_xidlr8and9_v44_num_codewords_trans, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_xidlr10and11_v44_num_codewords_recv, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_xidlr12_v44_max_strlen_trans, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_xidlr13_v44_max_strlen_recv, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_xidlr14and15_v44_history_len_trans, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_msg_profxchg_xidlr16and17_v44_history_len_recv, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_I_RAW_OCTET: /* data */
|
|
octet = tvb_get_guint8(tvb, offset);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_rawoctet_n_field_present, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_rawoctet_l, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
if (octet & 0x80) /* is N field present? */
|
|
{
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_rawoctet_n, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
}
|
|
offset++;
|
|
payload_length--;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data, tvb, offset, payload_length, ENC_NA);
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_I_RAW_BIT: /* data */
|
|
/*
|
|
* L, P, N fields need to be parsed
|
|
*/
|
|
switch((tvb_get_guint8(tvb, offset) & 0xC0) >> 6)
|
|
{
|
|
case 0x0: /* 00: get L (6 bits) */
|
|
/* display leading "00" bits, followed by L */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_rawbit_included_fields_l, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_rawbit_len_a, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
payload_length--;
|
|
break;
|
|
case 0x1: /* 01: get L (3 bits) & P (3 bits) */
|
|
/* display leading "01" bits, followed by L,P */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_rawbit_included_fields_lp, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_rawbit_len_b, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_rawbit_p, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
payload_length--;
|
|
break;
|
|
default: /* 10, 11: get L (4 bits), P (3 bits), N (8 bits) */
|
|
/* display leading "1" bit, followed by L,P,N */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_rawbit_included_fields_lpn, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_rawbit_len_c, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_rawbit_p, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
payload_length--;
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_rawbit_n, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
payload_length--;
|
|
break;
|
|
}
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data, tvb, offset, payload_length, ENC_NA);
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_I_OCTET: /* data */
|
|
if (global_sprt_show_dlci_info)
|
|
{
|
|
/* DLCI field may be 0, 1, or 2 bytes, depending on CONNECT message (see "DLCI enabled")...
|
|
* or UNKNOWN if we don't see the CONNECT message
|
|
*/
|
|
switch(p_conv_data->i_octet_dlci_status)
|
|
{
|
|
case DLCI_PRESENT:
|
|
octet = tvb_get_guint8(tvb, offset);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_i_octet_dlci1, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_i_octet_cr, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_i_octet_ea, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
payload_length--;
|
|
/* check address extension... if ea bit == 0, then DLCI has another octet (see ITU-T V42 spec for more info) */
|
|
if (!(octet & 0x01))
|
|
{
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_i_octet_dlci2, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_i_octet_ea, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
payload_length--;
|
|
}
|
|
ti = proto_tree_add_uint(sprt_payload_tree, hf_sprt_payload_i_octet_dlci_setup_by_connect_frame, tvb, 0, 0, p_conv_data->connect_frame_number);
|
|
PROTO_ITEM_SET_GENERATED(ti);
|
|
break;
|
|
case DLCI_ABSENT:
|
|
ti = proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_i_octet_no_dlci, tvb, 0, 0, ENC_NA);
|
|
PROTO_ITEM_SET_GENERATED(ti);
|
|
ti = proto_tree_add_uint(sprt_payload_tree, hf_sprt_payload_i_octet_dlci_setup_by_connect_frame, tvb, 0, 0, p_conv_data->connect_frame_number);
|
|
PROTO_ITEM_SET_GENERATED(ti);
|
|
break;
|
|
case DLCI_UNKNOWN: /* e.g., we didn't see the CONNECT msg so we don't know if there is a DLCI */
|
|
default:
|
|
ti = proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_i_octet_dlci_presence_unknown, tvb, 0, 0, ENC_NA);
|
|
PROTO_ITEM_SET_GENERATED(ti);
|
|
break;
|
|
}
|
|
}
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data, tvb, offset, payload_length, ENC_NA);
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_I_CHAR_STAT: /* data */
|
|
/* r: 1-bit reserved */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_reserved_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* D: 2-bit field indicating # of data bits */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_num_data_bits, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* P: 3-bit field for parity type */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_parity_type, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* S: 2-bit field indicating # of stop bits */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_num_stop_bits, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
payload_length--;
|
|
/* octets */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data, tvb, offset, payload_length, ENC_NA);
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_I_CHAR_DYN: /* data */
|
|
/* r: 1-bit reserved */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_reserved_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* D: 2-bit field indicating # of data bits */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_num_data_bits, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* P: 3-bit field for parity type */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_parity_type, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* S: 2-bit field indicating # of stop bits */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_num_stop_bits, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
payload_length--;
|
|
/* octets */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data, tvb, offset, payload_length, ENC_NA);
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_I_FRAME: /* data */
|
|
/* R: 6 reserved bits */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_frame_reserved_bits, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* Fr: data frame state */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_frame_state, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
payload_length--;
|
|
/* octets */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data, tvb, offset, payload_length, ENC_NA);
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_I_OCTET_CS: /* data */
|
|
/* CS: 2-byte character sequence number */
|
|
/* TODO - does this msg type ever have a DLCI? */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_cs, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
payload_length -= 2;
|
|
/* octets */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data, tvb, offset, payload_length, ENC_NA);
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_I_CHAR_STAT_CS: /* data */
|
|
/* r: 1-bit reserved */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_reserved_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* D: 2-bit field indicating # of data bits */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_num_data_bits, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* P: 3-bit field for parity type */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_parity_type, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* S: 2-bit field indicating # of stop bits */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_num_stop_bits, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
payload_length--;
|
|
/* CS: 2-byte character sequence number */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_cs, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
payload_length -= 2;
|
|
/* octets */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data, tvb, offset, payload_length, ENC_NA);
|
|
break;
|
|
case SPRT_MODEM_RELAY_MSG_ID_I_CHAR_DYN_CS: /* data */
|
|
/* r: 1-bit reserved */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_reserved_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* D: 2-bit field indicating # of data bits */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_num_data_bits, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* P: 3-bit field for parity type */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_parity_type, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
/* S: 2-bit field indicating # of stop bits */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_num_stop_bits, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
payload_length--;
|
|
/* CS: 2-byte character sequence number */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data_cs, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
payload_length -= 2;
|
|
/* octets */
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data, tvb, offset, payload_length, ENC_NA);
|
|
break;
|
|
default:
|
|
proto_tree_add_item(sprt_payload_tree, hf_sprt_payload_data, tvb, offset, payload_length, ENC_NA);
|
|
break;
|
|
}
|
|
} else {
|
|
proto_tree_add_item(sprt_tree, hf_sprt_payload_no_data, tvb, offset, 0, ENC_NA);
|
|
col_append_str(pinfo->cinfo, COL_INFO, ", No Payload");
|
|
}
|
|
|
|
return offset;
|
|
}
|
|
|
|
static int
|
|
dissect_sprt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
|
|
{
|
|
/* Set up structures needed to add the protocol subtree and manage it */
|
|
proto_item *ti;
|
|
proto_tree *sprt_tree = NULL;
|
|
proto_tree *sprt_ack_field_tree;
|
|
guint16 word1;
|
|
unsigned int offset = 0;
|
|
guint payload_length;
|
|
struct _sprt_conversation_info *p_conv_data = NULL;
|
|
int i;
|
|
|
|
guint16 tc;
|
|
guint16 seqnum; /* 0 if TC = 0 or if no payload */
|
|
guint16 noa;
|
|
/* ack fields */
|
|
/*guint16 tcn;*/
|
|
/*guint16 sqn;*/
|
|
|
|
/* Make entries in Protocol column and Info column on summary display */
|
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "SPRT");
|
|
col_clear(pinfo->cinfo, COL_INFO);
|
|
|
|
if (tree)
|
|
{
|
|
/* create the trees */
|
|
ti = proto_tree_add_item(tree, proto_sprt, tvb, 0, -1, ENC_NA);
|
|
sprt_tree = proto_item_add_subtree(ti, ett_sprt);
|
|
|
|
/* show conversation setup info */
|
|
if (global_sprt_show_setup_info)
|
|
{
|
|
show_setup_info(tvb, pinfo, sprt_tree);
|
|
}
|
|
}
|
|
|
|
/*SPRT header packet format
|
|
+------+-------+-------+-------+-------+-------+---------+-------+
|
|
|0 |1 |2 |3 |4 |5 |6 |7 |
|
|
+------+-------+-------+-------+-------+-------+---------+-------+
|
|
| X | SSID |
|
|
+----------------------------------------------------------------+
|
|
| R | PT |
|
|
+--------------+-------------------------------------------------+
|
|
| TC | Sequence Number |
|
|
+--------------+-------------------------------------------------+
|
|
| Sequence Number |
|
|
+----------------------------------------------------------------+
|
|
| NOA | Base Sequence Number |
|
|
+--------------+-------------------------------------------------+
|
|
| Base Sequence Number |
|
|
+----------------------------------------------------------------+
|
|
| TCN | SQN |
|
|
+--------------+-------------------------------------------------+
|
|
| SQN |
|
|
+----------------------------------------------------------------+
|
|
| TCN | SQN |
|
|
+--------------+-------------------------------------------------+
|
|
| SQN |
|
|
+----------------------------------------------------------------+
|
|
| TCN | SQN |
|
|
+--------------+-------------------------------------------------+
|
|
| SQN |
|
|
+----------------------------------------------------------------+
|
|
*/
|
|
|
|
/* Get fields needed for further dissection */
|
|
word1 = tvb_get_ntohs(tvb, offset + 2);
|
|
tc = (word1 & 0xC000) >> 14;
|
|
seqnum = word1 & 0x3FFF;
|
|
|
|
noa = (tvb_get_ntohs(tvb, offset + 4) & 0xC000) >> 14;
|
|
|
|
/* Get conversation data, or create it if not found */
|
|
p_conv_data = find_sprt_conversation_data(pinfo);
|
|
if (!p_conv_data)
|
|
{
|
|
sprt_add_address(pinfo,
|
|
&pinfo->src, pinfo->srcport,
|
|
0,
|
|
"SPRT stream",
|
|
pinfo->num);
|
|
p_conv_data = find_sprt_conversation_data(pinfo);
|
|
}
|
|
|
|
proto_tree_add_item(sprt_tree, hf_sprt_header_extension_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_tree, hf_sprt_subsession_id, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
|
|
proto_tree_add_item(sprt_tree, hf_sprt_reserved_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_tree, hf_sprt_payload_type, tvb, offset, 1, ENC_BIG_ENDIAN);
|
|
offset++;
|
|
|
|
proto_tree_add_item(sprt_tree, hf_sprt_transport_channel_id, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
ti = proto_tree_add_item(sprt_tree, hf_sprt_sequence_number, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
if (tc == 0 && seqnum != 0)
|
|
expert_add_info(pinfo, ti, &ei_sprt_sequence_number_0);
|
|
|
|
p_conv_data->seqnum[tc] = seqnum; /* keep track of seqnum values */
|
|
offset+=2;
|
|
|
|
proto_tree_add_item(sprt_tree, hf_sprt_number_of_ack_fields, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_tree, hf_sprt_base_sequence_number, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset+=2;
|
|
|
|
if (noa) /* parse ack fields? There can be 0 - 3 */
|
|
{
|
|
ti = proto_tree_add_item(sprt_tree, hf_sprt_ack_field_items, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
sprt_ack_field_tree = proto_item_add_subtree(ti, ett_sprt_ack_fields);
|
|
|
|
for(i = 0; i < noa; i++)
|
|
{
|
|
proto_tree_add_item(sprt_ack_field_tree, hf_sprt_transport_channel_item, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
proto_tree_add_item(sprt_ack_field_tree, hf_sprt_sequence_item, tvb, offset, 2, ENC_BIG_ENDIAN);
|
|
offset += 2;
|
|
}
|
|
}
|
|
|
|
/* put details in the info column */
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, "TC=%u", tc);
|
|
if (tc != 0)
|
|
col_append_fstr(pinfo->cinfo, COL_INFO, ", Seq=%u", seqnum);
|
|
|
|
/* dissect the payload, if any */
|
|
payload_length = tvb_captured_length(tvb) - (6 + noa * 2); /* total sprt length - header stuff */
|
|
dissect_sprt_data(tvb, pinfo, p_conv_data, sprt_tree, offset, payload_length);
|
|
|
|
if (noa)
|
|
col_append_str(pinfo->cinfo, COL_INFO, " (ACK fields present)");
|
|
|
|
return tvb_captured_length(tvb);
|
|
}
|
|
|
|
/* heuristic dissector */
|
|
static gboolean
|
|
dissect_sprt_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
|
|
{
|
|
guint8 octet, extension_bit, reserved_bit, payload_type;
|
|
guint16 word, tc, seqnum;
|
|
unsigned int offset = 0;
|
|
|
|
/* This is a heuristic dissector, which means we get all the UDP
|
|
* traffic not sent to a known dissector and not claimed by
|
|
* a heuristic dissector called before us!
|
|
*/
|
|
|
|
if (tvb_captured_length(tvb) < 6)
|
|
return FALSE; /* packet is waay to short */
|
|
|
|
/* Get the fields in the first two octets */
|
|
extension_bit = tvb_get_guint8(tvb, offset) & 0x7F;
|
|
if (extension_bit != 0) /* must be 0 */
|
|
return FALSE;
|
|
|
|
octet = tvb_get_guint8(tvb, offset + 1);
|
|
reserved_bit = octet & 80;
|
|
payload_type = octet & 0x7F;
|
|
if (reserved_bit != 0) /* must be 0 */
|
|
return FALSE;
|
|
if (payload_type < 96 || payload_type > 128) /* value within RTP dynamic payload type range */
|
|
return FALSE;
|
|
|
|
word = tvb_get_ntohs(tvb, offset + 2);
|
|
tc = word >> 14;
|
|
seqnum = word & 0x3F;
|
|
if ((tc == 0 || tc == 3) && (seqnum != 0)) /* seqnum only applies if tc is 1 or 2 */
|
|
return FALSE;
|
|
|
|
dissect_sprt(tvb, pinfo, tree, NULL);
|
|
return TRUE;
|
|
}
|
|
|
|
/* register the protocol with Wireshark */
|
|
void
|
|
proto_register_sprt(void)
|
|
{
|
|
module_t *sprt_module;
|
|
expert_module_t* expert_sprt;
|
|
|
|
static hf_register_info hf[] =
|
|
{
|
|
/* set up fields */
|
|
{
|
|
&hf_sprt_setup,
|
|
{
|
|
"Stream setup",
|
|
"sprt.setup",
|
|
FT_STRING,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
"Stream setup, method and frame number", HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_setup_frame,
|
|
{
|
|
"Setup frame",
|
|
"sprt.setup-frame",
|
|
FT_FRAMENUM,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
"Frame that set up this stream", HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_setup_method,
|
|
{
|
|
"Setup Method",
|
|
"sprt.setup-method",
|
|
FT_STRING,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
"Method used to set up this stream", HFILL
|
|
}
|
|
},
|
|
/* SPRT header fields: */
|
|
{
|
|
&hf_sprt_header_extension_bit,
|
|
{
|
|
"Header extension bit",
|
|
"sprt.x",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&tfs_set_notset),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_subsession_id,
|
|
{
|
|
"Sub session ID",
|
|
"sprt.ssid",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7F,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_reserved_bit,
|
|
{
|
|
"Reserved bit",
|
|
"sprt.reserved",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&tfs_set_notset),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_type,
|
|
{
|
|
"Payload type",
|
|
"sprt.pt",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7F,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_transport_channel_id,
|
|
{
|
|
"Transport channel ID",
|
|
"sprt.tc",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
VALS(sprt_transport_channel_characteristics),
|
|
0xC000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_sequence_number,
|
|
{
|
|
"Sequence number",
|
|
"sprt.seq",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x3FFF,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_number_of_ack_fields,
|
|
{
|
|
"Number of ACK fields",
|
|
"sprt.noa",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0xC000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_base_sequence_number,
|
|
{
|
|
"Base sequence number",
|
|
"sprt.bsqn",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x3FFF,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* ACK fields, if any: */
|
|
{
|
|
&hf_sprt_ack_field_items, /* 0 to 3 items (TCN + SQN) */
|
|
{
|
|
"ACK fields",
|
|
"sprt.ack.field",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0xC000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_transport_channel_item,
|
|
{
|
|
"Transport control channel",
|
|
"sprt.tcn",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0xC000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_sequence_item,
|
|
{
|
|
"Sequence number",
|
|
"sprt.sqn",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x3FFF,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* SPRT payload, if any: */
|
|
{
|
|
&hf_sprt_payload_length,
|
|
{
|
|
"Payload (in bytes)",
|
|
"sprt.payload.length",
|
|
FT_UINT32,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_no_data,
|
|
{
|
|
"No payload",
|
|
"sprt.payload",
|
|
FT_NONE,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_reserved_bit,
|
|
{
|
|
"Reserved bit",
|
|
"sprt.payload.reserved_bit",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&tfs_set_notset),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_message_id,
|
|
{
|
|
"Payload message ID",
|
|
"sprt.payload.msgid",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_modem_relay_msg_id_name),
|
|
0x7F,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* SPRT payload fields, if any (depend on payload msgid): */
|
|
/* INIT message */
|
|
{
|
|
&hf_sprt_payload_msg_init_all_fields,
|
|
{
|
|
"Init message fields",
|
|
"sprt.payload.msg_init.all_fields",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0xFFFF, /* 0x0 */
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_init_necrxch,
|
|
{
|
|
"NECRxCH",
|
|
"sprt.payload.msg_init.NECRxCH",
|
|
FT_BOOLEAN,
|
|
16,
|
|
NULL,
|
|
0x8000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_init_ecrxch,
|
|
{
|
|
"ECRxCH",
|
|
"sprt.payload.msg_init.ECRxCH",
|
|
FT_BOOLEAN,
|
|
16,
|
|
NULL,
|
|
0x4000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_init_xid_prof_exch,
|
|
{
|
|
"XID profile exchange",
|
|
"sprt.payload.msg_init.XID_profile_exch",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_supported_not_supported),
|
|
0x2000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_init_assym_data_types,
|
|
{
|
|
"Asymmetrical data types",
|
|
"sprt.payload.msg_init.assym_data_types",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_supported_not_supported),
|
|
0x1000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_init_opt_moip_types_i_raw_bit,
|
|
{
|
|
"I_RAW-BIT",
|
|
"sprt.payload.msg_init.opt_moip_types_i_raw_bit",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_supported_not_supported),
|
|
0x0800,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_init_opt_moip_types_i_frame,
|
|
{
|
|
"I_FRAME",
|
|
"sprt.payload.msg_init.opt_moip_types_i_frame",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_supported_not_supported),
|
|
0x0400,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_init_opt_moip_types_i_char_stat,
|
|
{
|
|
"I_CHAR-STAT",
|
|
"sprt.payload.msg_init.opt_moip_types_i_char_stat",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_supported_not_supported),
|
|
0x0200,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_init_opt_moip_types_i_char_dyn,
|
|
{
|
|
"I_CHAR-DYN",
|
|
"sprt.payload.msg_init.opt_moip_types_i_char_dyn",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_supported_not_supported),
|
|
0x0100,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_init_opt_moip_types_i_octet_cs,
|
|
{
|
|
"I_OCTET-CS",
|
|
"sprt.payload.msg_init.opt_moip_types_i_octet_cs",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_supported_not_supported),
|
|
0x0080,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_init_opt_moip_types_i_char_stat_cs,
|
|
{
|
|
"I_CHAR-STAT-CS",
|
|
"sprt.payload.msg_init.opt_moip_types_i_char_stat_cs",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_supported_not_supported),
|
|
0x0040,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_init_opt_moip_types_i_char_dyn_cs,
|
|
{
|
|
"I_CHAR-DYN-CS",
|
|
"sprt.payload.msg_init.opt_moip_types_i_char_dyn_cs",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_supported_not_supported),
|
|
0x0020,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_init_opt_moip_types_reserved,
|
|
{
|
|
"Reserved for ITU-T",
|
|
"sprt.payload.msg_init.opt_moip_types_reserved",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x001F,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* XID_XCHG message */
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_ecp,
|
|
{
|
|
"Error correcting protocol",
|
|
"sprt.payload.msg_xidxchg.ecp",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_ecp_name),
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr1_v42bis,
|
|
{
|
|
"V.42 bis",
|
|
"sprt.payload.msg_xidxchg.xidlr1_v42bis",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&tfs_supported_not_supported),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr1_v44,
|
|
{
|
|
"V.44",
|
|
"sprt.payload.msg_xidxchg.xidlr1_v44",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&tfs_supported_not_supported),
|
|
0x40,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr1_mnp5,
|
|
{
|
|
"MNP5",
|
|
"sprt.payload.msg_xidxchg.xidlr1_mnp5",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&tfs_supported_not_supported),
|
|
0x20,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr1_reserved,
|
|
{
|
|
"Reserved for ITU-T",
|
|
"sprt.payload.msg_xidxchg.xidlr1_reserved",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x1F,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr2_v42bis_compr_req,
|
|
{
|
|
"V.42bis data compression request",
|
|
"sprt.payload.msg_xidxchg.xidlr2_v42bis_compr_req",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr3and4_v42bis_num_codewords,
|
|
{
|
|
"V.42bis number of codewords",
|
|
"sprt.payload.msg_xidxchg.xidlr3and4_v42bis_num_codewords",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr5_v42bis_max_strlen,
|
|
{
|
|
"V.42bis maximum string length",
|
|
"sprt.payload.msg_xidxchg.xidlr5_v42bis_max_strlen",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr6_v44_capability,
|
|
{
|
|
"V.44 capability",
|
|
"sprt.payload.msg_xidxchg.xidlr6_v44_capability",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr7_v44_compr_req,
|
|
{
|
|
"V.44 data compression request",
|
|
"sprt.payload.msg_xidxchg.xidlr7_v44_compr_req",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr8and9_v44_num_codewords_trans,
|
|
{
|
|
"V.44 number of codewords in transmit direction",
|
|
"sprt.payload.msg_xidxchg.xidlr8and9_v44_num_codewords_trans",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr10and11_v44_num_codewords_recv,
|
|
{
|
|
"V.44 number of codewords in receive direction",
|
|
"sprt.payload.msg_xidxchg.xidlr10and11_v44_num_codewords_recv",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr12_v44_max_strlen_trans,
|
|
{
|
|
"V.44 maximum string length in transmit direction",
|
|
"sprt.payload.msg_xidxchg.xidlr12_v44_max_strlen_trans",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr13_v44_max_strlen_recv,
|
|
{
|
|
"V.44 maximum string length in receive direction",
|
|
"sprt.payload.msg_xidxchg.xidlr13_v44_max_strlen_recv",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr14and15_v44_history_len_trans,
|
|
{
|
|
"V.44 length of history in transmit direction",
|
|
"sprt.payload.msg_xidxchg.xidlr14and15_v44_history_len_trans",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_xidxchg_xidlr16and17_v44_history_len_recv,
|
|
{
|
|
"V.44 length of history in receive direction",
|
|
"sprt.payload.msg_xidxchg.xidlr16and17_v44_history_len_recv",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* JM_INFO message */
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_category_data,
|
|
{
|
|
"Category data",
|
|
"sprt.payload.msg_jminfo.category_data",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0xFFFF,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_category_id,
|
|
{
|
|
"Category ID",
|
|
"sprt.payload.msg_jminfo.category_id",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
VALS(sprt_jm_info_cat_id_name),
|
|
0xF000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_category_ext_info,
|
|
{
|
|
"Unrecognized category data",
|
|
"sprt.payload.msg_jminfo.category_ext_info",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0FFF,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_unk_category_info,
|
|
{
|
|
"Category extension data",
|
|
"sprt.payload.msg_jminfo.unk_category_info",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0FFF,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_category_leftover_bits,
|
|
{
|
|
"Leftover bits", /* "Category info leftover bits", */
|
|
"sprt.payload.msg_jminfo.category_leftover_bits",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x01FF,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_call_function,
|
|
{
|
|
"Call function",
|
|
"sprt.payload.msg_jminfo.call_function",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
VALS(sprt_jminfo_tbc_call_funct_name),
|
|
0x0E00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_mod_v34_duplex,
|
|
{
|
|
"V.34 duplex",
|
|
"sprt.payload.msg_jminfo.mod_v34_duplex",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0800,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_mod_v34_half_duplex,
|
|
{
|
|
"V.34 half-duplex",
|
|
"sprt.payload.msg_jminfo.mod_v34_half_duplex",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0400,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_mod_v32bis_v32,
|
|
{
|
|
"V.32bis/V.32",
|
|
"sprt.payload.msg_jminfo.mod_v32bis_v32",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0200,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_mod_v22bis_v22,
|
|
{
|
|
"V.22bis/V.22",
|
|
"sprt.payload.msg_jminfo.mod_v22bis_v22",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0100,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_mod_v17,
|
|
{
|
|
"V.17",
|
|
"sprt.payload.msg_jminfo.mod_v17",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0080,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_mod_v29_half_duplex,
|
|
{
|
|
"V.29 half-duplex",
|
|
"sprt.payload.msg_jminfo.mod_v29_half_duplex",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0040,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_mod_v27ter,
|
|
{
|
|
"V.27ter",
|
|
"sprt.payload.msg_jminfo.mod_v27ter",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0020,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_mod_v26ter,
|
|
{
|
|
"V.26ter",
|
|
"sprt.payload.msg_jminfo.mod_v26ter",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0010,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_mod_v26bis,
|
|
{
|
|
"V.26bis",
|
|
"sprt.payload.msg_jminfo.mod_v16bis",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0008,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_mod_v23_duplex,
|
|
{
|
|
"V.23 duplex",
|
|
"sprt.payload.msg_jminfo.mod_v23_duplex",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0004,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_mod_v23_half_duplex,
|
|
{
|
|
"V.23 half-duplex",
|
|
"sprt.payload.msg_jminfo.mod_v23_half_duplex",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0002,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_mod_v21,
|
|
{
|
|
"V.21",
|
|
"sprt.payload.msg_jminfo.mod_v21",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0001,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_protocols,
|
|
{
|
|
"Protocols",
|
|
"sprt.payload.msg_jminfo.protocols",
|
|
FT_UINT16,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_jminfo_tbc_protocol_name),
|
|
0x0E00,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_pstn_access_call_dce_cell,
|
|
{
|
|
"Call DCE is on a cellular connection",
|
|
"sprt.payload.msg_jminfo.pstn_access_call_dce_cell",
|
|
FT_BOOLEAN,
|
|
16,
|
|
NULL,
|
|
0x0800,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_pstn_access_answ_dce_cell,
|
|
{
|
|
"Answer DCE is on a cellular connection",
|
|
"sprt.payload.msg_jminfo.pstn_access_answ_dce_cell",
|
|
FT_BOOLEAN,
|
|
16,
|
|
NULL,
|
|
0x0400,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_pstn_access_dce_on_digital_net,
|
|
{
|
|
"DCE is on a digital network connection",
|
|
"sprt.payload.msg_jminfo.pstn_access_dce_on_digital_net",
|
|
FT_BOOLEAN,
|
|
16,
|
|
NULL,
|
|
0x0200,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_pcm_modem_avail_v90_v92_analog,
|
|
{
|
|
"V.90 or V.92 analog modem availability",
|
|
"sprt.payload.msg_jminfo.pcm_modem_avail_v90_v92_analog",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0800,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_pcm_modem_avail_v90_v92_digital,
|
|
{
|
|
"V.90 or V.92 digital modem availability",
|
|
"sprt.payload.msg_jminfo.pcm_modem_avail_v90_v92_digital",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0400,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_jminfo_pcm_modem_avail_v91,
|
|
{
|
|
"V.91 modem availability",
|
|
"sprt.payload.msg_jminfo.pcm_modem_avail_v91",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0200,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* START_JM message has no additional fields */
|
|
/* CONNECT message */
|
|
{
|
|
&hf_sprt_payload_msg_connect_selmod,
|
|
{
|
|
"Selected modulation",
|
|
"sprt.payload.msg_connect.selmod",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_selmod_name),
|
|
0xFC,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_compr_dir,
|
|
{
|
|
"Compression direction",
|
|
"sprt.payload.msg_connect.compr_dir",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(sprt_comp_direction),
|
|
0x03,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_selected_compr,
|
|
{
|
|
"Selected compression",
|
|
"sprt.payload.msg_connect.selected_compr",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_selected_compr_name),
|
|
0xF0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_selected_err_corr,
|
|
{
|
|
"Selected error correction",
|
|
"sprt.payload.msg_connect.selected_err_corr",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_selected_err_corr_name),
|
|
0x0F,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_tdsr,
|
|
{
|
|
"Transmit data signalling rate (bits/sec)",
|
|
"sprt.payload.msg_connect.tdsr",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_rdsr,
|
|
{
|
|
"Receive data signalling rate (bits/sec)",
|
|
"sprt.payload.msg_connect.rdsr",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_dlci_enabled,
|
|
{
|
|
"DLCI",
|
|
"sprt.payload.msg_connect.dlci_enabled",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_enabled_disabled),
|
|
0x8000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_avail_data_types,
|
|
{
|
|
"Available data types",
|
|
"sprt.payload.msg_connect.avail_data_types",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x7FFF,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_adt_octet_no_format_no_dlci,
|
|
{
|
|
"Octet w/o formatting with no DLCI",
|
|
"sprt.payload.msg_connect.adt_octet_no_format_no_dlci",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x4000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_adt_i_raw_bit,
|
|
{
|
|
"I_RAW-BIT",
|
|
"sprt.payload.msg_connect.adt_i_raw_bit",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x2000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_adt_i_frame,
|
|
{
|
|
"I_FRAME",
|
|
"sprt.payload.msg_connect.adt_i_frame",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x1000,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_adt_i_char_stat,
|
|
{
|
|
"I_CHAR-STAT",
|
|
"sprt.payload.msg_connect.adt_i_char_stat",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0800,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_adt_i_char_dyn,
|
|
{
|
|
"I_CHAR-DYN",
|
|
"sprt.payload.msg_connect.adt_i_char_dyn",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0400,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{ /* from V.150.1 amendment 2 (5-2006): */
|
|
&hf_sprt_payload_msg_connect_adt_i_octet_cs,
|
|
{
|
|
"I_OCTET-CS",
|
|
"sprt.payload.msg_connect.adt_i_octet_cs",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0200,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{ /* from V.150.1 amendment 2 (5-2006): */
|
|
&hf_sprt_payload_msg_connect_adt_i_char_stat_cs,
|
|
{
|
|
"I_CHAR-STAT-CS",
|
|
"sprt.payload.msg_connect.adt_i_char_stat_cs",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0100,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{ /* from V.150.1 amendment 2 (5-2006): */
|
|
&hf_sprt_payload_msg_connect_adt_i_char_dyn_cs,
|
|
{
|
|
"I_CHAR-DYN-CS",
|
|
"sprt.payload.msg_connect.adt_i_char_dyn_cs",
|
|
FT_BOOLEAN,
|
|
16,
|
|
TFS(&tfs_available_not_available),
|
|
0x0080,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_adt_reserved,
|
|
{
|
|
"Reserved for ITU-T",
|
|
"sprt.payload.msg_connect.adt_reserved",
|
|
FT_UINT16,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x007F,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_compr_trans_dict_sz,
|
|
{
|
|
"Compression transmit dictionary size",
|
|
"sprt.payload.msg_connect.compr_trans_dict_sz",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_compr_recv_dict_sz,
|
|
{
|
|
"Compression receive dictionary size",
|
|
"sprt.payload.msg_connect.compr_recv_dict_sz",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_compr_trans_str_len,
|
|
{
|
|
"Compression transmit string length",
|
|
"sprt.payload.msg_connect.compr_trans_str_len",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_compr_recv_str_len,
|
|
{
|
|
"Compression receive string length",
|
|
"sprt.payload.msg_connect.compr_recv_str_len",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_compr_trans_hist_sz,
|
|
{
|
|
"Compression transmit history size",
|
|
"sprt.payload.msg_connect.compr_trans_hist_sz",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_connect_compr_recv_hist_sz,
|
|
{
|
|
"Compression receive history size",
|
|
"sprt.payload.msg_connect.compr_recv_hist_sz",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* BREAK message */
|
|
{
|
|
&hf_sprt_payload_msg_break_source_proto,
|
|
{
|
|
"Break source protocol",
|
|
"sprt.payload.msg_break.source_proto",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_break_src_proto_name),
|
|
0xF0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_break_type,
|
|
{
|
|
"Break type",
|
|
"sprt.payload.msg_break.type",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_break_type_name),
|
|
0x0F,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_break_length,
|
|
{
|
|
"Break length (x10 msec)",
|
|
"sprt.payload.msg_break.length",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* BREAK_ACK message has no additional fields */
|
|
/* MR_EVENT message */
|
|
{
|
|
&hf_sprt_payload_msg_mr_event_id,
|
|
{
|
|
"Modem relay event ID",
|
|
"sprt.payload.msg_mr_event.id",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_mrevent_id_name),
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_mr_evt_reason_code,
|
|
{
|
|
"Reason code",
|
|
"sprt.payload.msg_mr_event.reason_code",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_mrevent_reason_code_name),
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_mr_evt_selmod,
|
|
{
|
|
"Selected modulation",
|
|
"sprt.payload.msg_mr_event.selmod",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_selmod_name),
|
|
0xFC,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_mr_evt_txsen,
|
|
{
|
|
"TxSEN",
|
|
"sprt.payload.msg_mr_event.txsen",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&tfs_enabled_disabled),
|
|
0x02,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_mr_evt_rxsen,
|
|
{
|
|
"RxSEN",
|
|
"sprt.payload.msg_mr_event.rxsen",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&tfs_enabled_disabled),
|
|
0x01,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_mr_evt_tdsr,
|
|
{
|
|
"Transmit data signalling rate (bits/sec)",
|
|
"sprt.payload.msg_mr_event.tdsr",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_mr_evt_rdsr,
|
|
{
|
|
"Receive data signalling rate (bits/sec)",
|
|
"sprt.payload.msg_mr_event.rdsr",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_mr_evt_txsr,
|
|
{
|
|
"Physical layer transmitter symbol rate (TxSR)",
|
|
"sprt.payload.msg_mr_event.txsr",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_mrevent_phys_layer_symbol_rate),
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_mr_evt_rxsr,
|
|
{
|
|
"Physical layer receiver symbol rate (RxSR)",
|
|
"sprt.payload.msg_mr_event.rxsr",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_mrevent_phys_layer_symbol_rate),
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* CLEARDOWN message */
|
|
{
|
|
&hf_sprt_payload_msg_cleardown_reason_code,
|
|
{
|
|
"Reason code",
|
|
"sprt.payload.msg_cleardown.reason_code",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(sprt_cleardown_reason),
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_cleardown_vendor_tag,
|
|
{
|
|
"Vendor tag",
|
|
"sprt.payload.msg_cleardown.vendor_tag",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_cleardown_vendor_info,
|
|
{
|
|
"Vendor info",
|
|
"sprt.payload.msg_cleardown.vendor_info",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* PROF_XCHG message */
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_v42_lapm,
|
|
{
|
|
"V.42/LAPM protocol support",
|
|
"sprt.payload.msg_profxchg.v42_lapm",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(sprt_prof_xchg_support),
|
|
0xC0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_annex_av42,
|
|
{
|
|
"Annex A/V.42(1996) protocol support",
|
|
"sprt.payload.msg_profxchg.annex_av42",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(sprt_prof_xchg_support),
|
|
0x30,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_v44_compr,
|
|
{
|
|
"V.44 compression support",
|
|
"sprt.payload.msg_profxchg.v44_compr",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(sprt_prof_xchg_support),
|
|
0x0C,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_v42bis_compr,
|
|
{
|
|
"V.42bis compression support",
|
|
"sprt.payload.msg_profxchg.v42bis_compr",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(sprt_prof_xchg_support),
|
|
0x03,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_mnp5_compr,
|
|
{
|
|
"MNP5 compression support",
|
|
"sprt.payload.msg_profxchg.mnp5_compr",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(sprt_prof_xchg_support),
|
|
0xC0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_reserved,
|
|
{
|
|
"Reserved for ITU-T",
|
|
"sprt.payload.msg_profxchg.reserved",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0x3F,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_xidlr2_v42bis_compr_req,
|
|
{
|
|
"V.42bis data compression request",
|
|
"sprt.payload.msg_profxchg.xidlr2_v42bis_compr_req",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_xidlr3and4_v42bis_num_codewords,
|
|
{
|
|
"V.42bis number of codewords",
|
|
"sprt.payload.msg_profxchg.xidlr3and4_v42bis_num_codewords",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_xidlr5_v42bis_max_strlen,
|
|
{
|
|
"V.42bis maximum string length",
|
|
"sprt.payload.msg_profxchg.xidlr5_v42bis_max_strlen",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_xidlr6_v44_capability,
|
|
{
|
|
"V.44 capability",
|
|
"sprt.payload.msg_profxchg.xidlr6_v44_capability",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_xidlr7_v44_compr_req,
|
|
{
|
|
"V.44 data compression request",
|
|
"sprt.payload.msg_profxchg.xidlr7_v44_compr_req",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_xidlr8and9_v44_num_codewords_trans,
|
|
{
|
|
"V.44 number of codewords in transmit direction",
|
|
"sprt.payload.msg_profxchg.xidlr8and9_v44_num_codewords_trans",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_xidlr10and11_v44_num_codewords_recv,
|
|
{
|
|
"V.44 number of codewords in receive direction",
|
|
"sprt.payload.msg_profxchg.xidlr10and11_v44_num_codewords_recv",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_xidlr12_v44_max_strlen_trans,
|
|
{
|
|
"V.44 maximum string length in transmit direction",
|
|
"sprt.payload.msg_profxchg.xidlr12_v44_max_strlen_trans",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_xidlr13_v44_max_strlen_recv,
|
|
{
|
|
"V.44 maximum string length in receive direction",
|
|
"sprt.payload.msg_profxchg.xidlr13_v44_max_strlen_recv",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_xidlr14and15_v44_history_len_trans,
|
|
{
|
|
"V.44 length of history in transmit direction",
|
|
"sprt.payload.msg_profxchg.xidlr14and15_v44_history_len_trans",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_msg_profxchg_xidlr16and17_v44_history_len_recv,
|
|
{
|
|
"V.44 length of history in receive direction",
|
|
"sprt.payload.msg_profxchg.xidlr16and17_v44_history_len_recv",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* User data messages... */
|
|
/* I_OCTET message: need to use DLCI field (8 or 16 bits) if indicated by CONNECT message */
|
|
{
|
|
&hf_sprt_payload_i_octet_no_dlci,
|
|
{
|
|
"No DLCI field",
|
|
"sprt.payload.i_octet_no_dlci",
|
|
FT_NONE,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_i_octet_dlci_presence_unknown,
|
|
{
|
|
"Not known if DLCI field is present",
|
|
"sprt.payload.i_octet_dlci_presence_unknown",
|
|
FT_NONE,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_i_octet_dlci1,
|
|
{
|
|
"DLCI #1",
|
|
"sprt.payload.i_octet_dlci1",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_payload_dlci1),
|
|
0xFC,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_i_octet_cr,
|
|
{
|
|
"Command/response bit",
|
|
"sprt.payload.i_octet_cr",
|
|
FT_BOOLEAN,
|
|
8,
|
|
NULL,
|
|
0x02,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_i_octet_ea,
|
|
{
|
|
"Address field extension bit",
|
|
"sprt.payload.i_octet_ea",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&sprt_payload_ea_bit),
|
|
0x01,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_i_octet_dlci2,
|
|
{
|
|
"DLCI #2",
|
|
"sprt.payload.i_octet_dlci2",
|
|
FT_UINT8,
|
|
BASE_DEC | BASE_RANGE_STRING,
|
|
RVALS(sprt_payload_dlci2),
|
|
0xFE,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_i_octet_dlci_setup_by_connect_frame,
|
|
{
|
|
"DLCI setup by CONNECT message at frame",
|
|
"sprt.payload.i_octet_dlci_setup_by_connect_frame",
|
|
FT_FRAMENUM,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* fields for I_RAW_OCTET message (L; L,N) */
|
|
{
|
|
&hf_sprt_payload_rawoctet_n_field_present,
|
|
{
|
|
"N field",
|
|
"sprt.payload.rawoctet_n_field_present",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&tfs_present_absent),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_rawoctet_l,
|
|
{
|
|
"L: # of octets in segment minus one",
|
|
"sprt.payload.rawoctet_l",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7F,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_rawoctet_n,
|
|
{
|
|
"N: # of times octets appear in data minus 2",
|
|
"sprt.payload.rawoctet_n",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0xFF,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* fields for I_RAW_BIT (L; L,P; L,P,N) */
|
|
{
|
|
&hf_sprt_payload_rawbit_included_fields_l,
|
|
{
|
|
"Include field L only",
|
|
"sprt.payload.rawbit_included_fields_l",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0xC0, /* top two bits: 00 */
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_rawbit_included_fields_lp,
|
|
{
|
|
"Include fields L, P",
|
|
"sprt.payload.rawbit_field_format_lp",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0xC0, /* top two bits: 01 */
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_rawbit_included_fields_lpn,
|
|
{
|
|
"Include fields L, P, N",
|
|
"sprt.payload.rawbit_included_fields_lpn",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x80, /* top bit: 1 */
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_rawbit_len_a,
|
|
{
|
|
"L: # of octets in segment",
|
|
"sprt.payload.rawbit_len_a",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x3F, /* six bits */
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_rawbit_len_b,
|
|
{
|
|
"L: # of octets in segment",
|
|
"sprt.payload.rawbit_len_b",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x38, /* three bits */
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_rawbit_len_c,
|
|
{
|
|
"L: # of octets in segment",
|
|
"sprt.payload.rawbit_len_c",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x78, /* four bits */
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_rawbit_p,
|
|
{
|
|
"P: # of low-order bits in last octet that are not in segment",
|
|
"sprt.payload.rawbit_p",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x7, /* three bits */
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_rawbit_n,
|
|
{
|
|
"N: # of times octets appear in data minus 2",
|
|
"sprt.payload.rawbit_n",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
NULL,
|
|
0xFF, /* eight bits */
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* fields in I_CHAR_STAT & I_CHAR_DYN messages */
|
|
{
|
|
&hf_sprt_payload_data_reserved_bit,
|
|
{
|
|
"Reserved bit",
|
|
"sprt.payload.reserved_bit",
|
|
FT_BOOLEAN,
|
|
8,
|
|
TFS(&tfs_set_notset),
|
|
0x80,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_data_num_data_bits,
|
|
{
|
|
"D: Number of data bits",
|
|
"sprt.payload.num_data_bits",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(sprt_payload_data_bits),
|
|
0x60,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_data_parity_type,
|
|
{
|
|
"P: Parity type",
|
|
"sprt.payload.parity_type",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(sprt_payload_parity),
|
|
0x1C,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_num_stop_bits,
|
|
{
|
|
"S: Number stop bits",
|
|
"sprt.payload.num_stop_bits",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(sprt_payload_stop_bits),
|
|
0x03,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* sequence field in I_OCTET_CS, I_CHAR_STAT_CS, & I_CHAR_DYN_CS messages */
|
|
{
|
|
&hf_sprt_payload_data_cs,
|
|
{
|
|
"Character sequence number",
|
|
"sprt.payload.cs",
|
|
FT_UINT16,
|
|
BASE_DEC,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* fields for I_FRAME: */
|
|
{
|
|
&hf_sprt_payload_frame_reserved_bits,
|
|
{
|
|
"Reserved bits",
|
|
"sprt.payload.frame_reserved_bits",
|
|
FT_UINT8,
|
|
BASE_HEX,
|
|
NULL,
|
|
0xFC,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
{
|
|
&hf_sprt_payload_frame_state,
|
|
{
|
|
"Frame state",
|
|
"sprt.payload.frame_state",
|
|
FT_UINT8,
|
|
BASE_DEC,
|
|
VALS(sprt_payload_frame_state),
|
|
0x03,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
/* just dump remaining payload data: */
|
|
{
|
|
&hf_sprt_payload_data,
|
|
{
|
|
"Payload data",
|
|
"sprt.payload.data",
|
|
FT_BYTES,
|
|
BASE_NONE,
|
|
NULL,
|
|
0x0,
|
|
NULL, HFILL
|
|
}
|
|
},
|
|
}; /* hf_register_info hf[] */
|
|
|
|
/* setup protocol subtree array */
|
|
static gint *ett[] = {
|
|
&ett_sprt,
|
|
&ett_sprt_setup,
|
|
&ett_sprt_ack_fields,
|
|
&ett_payload,
|
|
&ett_init_msg_all_fields,
|
|
&ett_jminfo_msg_cat_data,
|
|
&ett_connect_msg_adt
|
|
};
|
|
|
|
static ei_register_info ei[] = {
|
|
{ &ei_sprt_sequence_number_0, { "sprt.sequence_number_0", PI_PROTOCOL, PI_WARN, "Should be 0 for transport channel 0", EXPFILL }},
|
|
};
|
|
|
|
/* register protocol name & description */
|
|
proto_sprt = proto_register_protocol("Simple Packet Relay Transport", "SPRT", "sprt");
|
|
|
|
/* required function calls to register the header fields and subtrees used */
|
|
proto_register_field_array(proto_sprt, hf, array_length(hf));
|
|
proto_register_subtree_array(ett, array_length(ett));
|
|
expert_sprt = expert_register_protocol(proto_sprt);
|
|
expert_register_field_array(expert_sprt, ei, array_length(ei));
|
|
|
|
/* register the dissector */
|
|
sprt_handle = register_dissector("sprt", dissect_sprt, proto_sprt);
|
|
|
|
sprt_module = prefs_register_protocol(proto_sprt, NULL);
|
|
|
|
/* preferences */
|
|
prefs_register_bool_preference(sprt_module, "show_setup_info",
|
|
"Show stream setup information",
|
|
"Where available, show which protocol and frame caused "
|
|
"this SPRT stream to be created",
|
|
&global_sprt_show_setup_info);
|
|
prefs_register_bool_preference(sprt_module, "show_dlci_info",
|
|
"Show DLCI in I_OCTET messages",
|
|
"Show the DLCI field in I_OCTET messages as well as the frame that "
|
|
"enabled/disabled the DLCI",
|
|
&global_sprt_show_dlci_info);
|
|
|
|
}
|
|
|
|
void
|
|
proto_reg_handoff_sprt(void)
|
|
{
|
|
dissector_add_for_decode_as_with_preference("udp.port", sprt_handle);
|
|
|
|
heur_dissector_add( "udp", dissect_sprt_heur, "SPRT over UDP", "sprt_udp", proto_sprt, HEURISTIC_ENABLE);
|
|
}
|
|
|
|
/*
|
|
* Editor modelines - http://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:
|
|
*/
|