wireshark/epan/dissectors/packet-v150fw.c

795 lines
30 KiB
C
Raw Normal View History

/* packet-v150fw.c
*
* v150fw = v.150.1 SSE messages, contained in RTP packets
*
* 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
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "config.h"
#include <epan/packet.h>
void proto_register_v150fw(void);
/* Initialize the protocol & registered fields
* Look familiar? This is in the same format as an NTE (named telephone event) from RFC 2833:
*/
static int proto_v150fw = -1;
static int hf_v150fw_event_id = -1; /* 6 bits */
static int hf_v150fw_force_response_bit = -1;
static int hf_v150fw_extension_bit = -1;
static int hf_v150fw_reason_id_code = -1; /* value & string */
static int hf_v150fw_reason_id_code_info = -1; /* 16 bits */
static int hf_v150fw_ric_info_mod_avail = -1; /* ric = 1,2 */
static int hf_v150fw_cm_jm_mod_avail_pcm_mode = -1;
static int hf_v150fw_cm_jm_mod_avail_v34_duplex = -1;
static int hf_v150fw_cm_jm_mod_avail_v34_half_duplex = -1;
static int hf_v150fw_cm_jm_mod_avail_v32_v32bis = -1;
static int hf_v150fw_cm_jm_mod_avail_v22_v22bis = -1;
static int hf_v150fw_cm_jm_mod_avail_v17 = -1;
static int hf_v150fw_cm_jm_mod_avail_v29_half_duplex = -1;
static int hf_v150fw_cm_jm_mod_avail_v27ter = -1;
static int hf_v150fw_cm_jm_mod_avail_v26ter = -1;
static int hf_v150fw_cm_jm_mod_avail_v26bis = -1;
static int hf_v150fw_cm_jm_mod_avail_v23_duplex = -1;
static int hf_v150fw_cm_jm_mod_avail_v23_half_duplex = -1;
static int hf_v150fw_cm_jm_mod_avail_v21 = -1;
static int hf_v150fw_cm_jm_mod_avail_v90_or_v92_analog = -1;
static int hf_v150fw_cm_jm_mod_avail_v90_or_v92_digital = -1;
static int hf_v150fw_cm_jm_mod_avail_v91 = -1;
static int hf_v150fw_ric_info_timeout = -1; /* ric= 18 */
static int hf_v150fw_ric_info_timeout_vendor = -1;
static int hf_v150fw_ric_info_cleardown = -1; /* ric = 20 */
static int hf_v150fw_ric_info_cleardown_reserved = -1;
static int hf_v150fw_ric_info_cleardown_vendor_tag = -1; /* extension fields */
static int hf_v150fw_ric_info_cleardown_vendor_info = -1;
static int hf_v150fw_reserved = -1; /* 5 bits */
static int hf_v150fw_extension_len = -1; /* 11 bits */
static int hf_v150fw_remainder = -1;
/* initialize the subtree pointers */
static gint ett_v150fw = -1;
static gint ett_available_modulations = -1;
/* for some "range_string"s, there's only one value in the range */
#define V150FW_VALUE_RANGE(a) a,a
/* V.150.1 State Signalling Events (SSE): */
#define V150FW_EVENT_RESERVED1 0
#define V150FW_EVENT_INITIAL_AUDIO 1
#define V150FW_EVENT_VOICEBAND_DATA 2
#define V150FW_EVENT_MODEM_RELAY 3
#define V150FW_EVENT_FAX_RELAY 4
#define V150FW_EVENT_TEXT_RELAY 5
#define V150FW_EVENT_TEXT_PROBE 6 /* new in ITU-T Rec. V.150.1 (2003)/Amd.2 (05/2006) */
/* 7 - 31 reserved for future use */
#define V150FW_EVENT_RESERVED2_START 7
#define V150FW_EVENT_RESERVED2_END 31
/* 32 - 63 vendor-defined */
#define V150FW_EVENT_VENDOR_START 32
#define V150FW_EVENT_VENDOR_END 63
/* V.150.1 SSE reason ID codes: */
#define V150FW_RIC_NULL 0
#define V150FW_RIC_CM 1
#define V150FW_RIC_JM 2
#define V150FW_RIC_AA 3
#define V150FW_RIC_AC 4
#define V150FW_RIC_USB1 5
#define V150FW_RIC_SB1 6
#define V150FW_RIC_S1 7
#define V150FW_RIC_V21_CH2 8
#define V150FW_RIC_V21_CH1 9
#define V150FW_RIC_V23_HIGH_CHANNEL 10
#define V150FW_RIC_V23_LOW_CHANNEL 11
#define V150FW_RIC_TONE_2225_HZ 12
#define V150FW_RIC_V21_CH2_HDLC_FLAGS 13
#define V150FW_RIC_INDETERMINATE_SIGNAL 14
#define V150FW_RIC_SILENCE 15
#define V150FW_RIC_CNG 16
#define V150FW_RIC_VOICE 17
#define V150FW_RIC_TIMEOUT 18
#define V150FW_RIC_P_STATE_TRANS 19
#define V150FW_RIC_CLEARDOWN 20
#define V150FW_RIC_ANS_CED_2100_HZ 21
#define V150FW_RIC_ANSAM 22
#define V150FW_RIC_SLASH_ANS 23
#define V150FW_RIC_SLASH_ANSAM 24
#define V150FW_RIC_QC1A 25
#define V150FW_RIC_QC1D 26
#define V150FW_RIC_QC2A 27
#define V150FW_RIC_QC2D 28
#define V150FW_RIC_CRE 29
#define V150FW_RIC_CRD 30
/* new from ITU-T V.150.1 Amendment 1: */
#define V150FW_RIC_TIA_825A_45 31
#define V150FW_RIC_TIA_825A_50 32
#define V150FW_RIC_EDT 33
#define V150FW_RIC_BELL_103_MODEM 34
#define V150FW_RIC_V21_TEXT_PHONE_T50 35
#define V150FW_RIC_V23_TEXT_MINITEL 36
#define V150FW_RIC_V18_TEXT_PHONE_T140 37
#define V150FW_RIC_DTMF_BASED_TEXT_RELAY 38
#define V150FW_RIC_CTM 39
/* 40 - 127 reserved */
#define V150FW_RIC_RESERVED_START 40
#define V150FW_RIC_RESERVED_END 127
/* 128 - 255 for vendor use */
#define V150FW_RIC_VENDOR_START 128
#define V150FW_RIC_VENDOR_END 255
/* Timeout (V150FW_RIC_TIMEOUT) reason info: */
#define V150FW_RIC_INFO_TIMEOUT_NULL 0
#define V150FW_RIC_INFO_TIMEOUT_CALL_DISCRIMINATION_TIMEOUT 1
#define V150FW_RIC_INFO_TIMEOUT_IP_TLP_TIMEOUT 2
#define V150FW_RIC_INFO_TIMEOUT_SSE_EXPLICIT_ACK_TIMEOUT 3
/* Cleardown (V150FW_RIC_CLEARDOWN) reason info: */
#define V150FW_RIC_INFO_CLEARDOWN_UNKNOWN 0
#define V150FW_RIC_INFO_CLEARDOWN_PHYSICAL_LAYER_RELEASE 1
#define V150FW_RIC_INFO_CLEARDOWN_LINK_LAYER_DISCONNECT 2
#define V150FW_RIC_INFO_CLEARDOWN_DATA_COMPRESSION_DISCONNECT 3
#define V150FW_RIC_INFO_CLEARDOWN_ABORT 4
#define V150FW_RIC_INFO_CLEARDOWN_ON_HOOK 5
#define V150FW_RIC_INFO_CLEARDOWN_NETWORK_LAYER_TERMINATION 6
#define V150FW_RIC_INFO_CLEARDOWN_ADMINISTRATIVE 7
/* value strings & range strings */
static const range_string v150fw_event_id_name[] = {
{ V150FW_VALUE_RANGE(V150FW_EVENT_RESERVED1), "Event ID reserved" },
{ V150FW_VALUE_RANGE(V150FW_EVENT_INITIAL_AUDIO), "Initial audio" },
{ V150FW_VALUE_RANGE(V150FW_EVENT_VOICEBAND_DATA), "Voice band data" },
{ V150FW_VALUE_RANGE(V150FW_EVENT_MODEM_RELAY), "Modem relay" },
{ V150FW_VALUE_RANGE(V150FW_EVENT_FAX_RELAY), "Fax relay" },
{ V150FW_VALUE_RANGE(V150FW_EVENT_TEXT_RELAY), "Text relay" },
{ V150FW_VALUE_RANGE(V150FW_EVENT_TEXT_PROBE), "Text probe" },
{ V150FW_EVENT_RESERVED2_START, V150FW_EVENT_RESERVED2_END, "Reserved for ITU_T" },
{ V150FW_EVENT_VENDOR_START, V150FW_EVENT_VENDOR_END, "Vendor-defined event" },
{ 0, 0, NULL }
};
static const range_string v150fw_ric_name[] = {
{ V150FW_VALUE_RANGE(V150FW_RIC_NULL), "None" },
{ V150FW_VALUE_RANGE(V150FW_RIC_CM), "CM" },
{ V150FW_VALUE_RANGE(V150FW_RIC_JM), "JM" },
{ V150FW_VALUE_RANGE(V150FW_RIC_AA), "AA" },
{ V150FW_VALUE_RANGE(V150FW_RIC_AC), "AC" },
{ V150FW_VALUE_RANGE(V150FW_RIC_USB1), "USB1" },
{ V150FW_VALUE_RANGE(V150FW_RIC_SB1), "SB1" },
{ V150FW_VALUE_RANGE(V150FW_RIC_S1), "S1" },
{ V150FW_VALUE_RANGE(V150FW_RIC_V21_CH2), "V.21 Ch2" },
{ V150FW_VALUE_RANGE(V150FW_RIC_V21_CH1), "V.21 Ch1" },
{ V150FW_VALUE_RANGE(V150FW_RIC_V23_HIGH_CHANNEL), "V.23 High Channel" },
{ V150FW_VALUE_RANGE(V150FW_RIC_V23_LOW_CHANNEL), "V.23 Low Channel" },
{ V150FW_VALUE_RANGE(V150FW_RIC_TONE_2225_HZ), "Tone (2225 Hz)" },
{ V150FW_VALUE_RANGE(V150FW_RIC_V21_CH2_HDLC_FLAGS), "V.21 Ch2 HDLC Flags" },
{ V150FW_VALUE_RANGE(V150FW_RIC_INDETERMINATE_SIGNAL), "Indeterminate signal" },
{ V150FW_VALUE_RANGE(V150FW_RIC_SILENCE), "Silence" },
{ V150FW_VALUE_RANGE(V150FW_RIC_CNG), "CNG" },
{ V150FW_VALUE_RANGE(V150FW_RIC_VOICE), "Voice" },
{ V150FW_VALUE_RANGE(V150FW_RIC_TIMEOUT), "Timeout" },
{ V150FW_VALUE_RANGE(V150FW_RIC_P_STATE_TRANS), "p' State Transition" },
{ V150FW_VALUE_RANGE(V150FW_RIC_CLEARDOWN), "Cleardown" },
{ V150FW_VALUE_RANGE(V150FW_RIC_ANS_CED_2100_HZ), "ANS/CED (2100Hz)" },
{ V150FW_VALUE_RANGE(V150FW_RIC_ANSAM), "ANSam" },
{ V150FW_VALUE_RANGE(V150FW_RIC_SLASH_ANS), "/ANS" },
{ V150FW_VALUE_RANGE(V150FW_RIC_SLASH_ANSAM), "/ANSam" },
{ V150FW_VALUE_RANGE(V150FW_RIC_QC1A), "QC1a" },
{ V150FW_VALUE_RANGE(V150FW_RIC_QC1D), "QC1d" },
{ V150FW_VALUE_RANGE(V150FW_RIC_QC2A), "QC2a" },
{ V150FW_VALUE_RANGE(V150FW_RIC_QC2D), "QC2d" },
{ V150FW_VALUE_RANGE(V150FW_RIC_CRE), "Cre" },
{ V150FW_VALUE_RANGE(V150FW_RIC_CRD), "CRd" },
{ V150FW_VALUE_RANGE(V150FW_RIC_TIA_825A_45), "TIA-825A (45.45 bit/s)" },
{ V150FW_VALUE_RANGE(V150FW_RIC_TIA_825A_50), "TIA-825A (50 bit/s)" },
{ V150FW_VALUE_RANGE(V150FW_RIC_EDT), "EDT (European Deaf Telephone)" },
{ V150FW_VALUE_RANGE(V150FW_RIC_BELL_103_MODEM), "Bell 103 Modem" },
{ V150FW_VALUE_RANGE(V150FW_RIC_V21_TEXT_PHONE_T50), "V.21 text telephone, T-50 encoding" },
{ V150FW_VALUE_RANGE(V150FW_RIC_V23_TEXT_MINITEL), "V.23 text (Minitel)" },
{ V150FW_VALUE_RANGE(V150FW_RIC_V18_TEXT_PHONE_T140), "V.18 text telephone, T-140 encoding" },
{ V150FW_VALUE_RANGE(V150FW_RIC_DTMF_BASED_TEXT_RELAY), "DTMF based Text Relay (Annex B/V.18)" },
{ V150FW_VALUE_RANGE(V150FW_RIC_CTM), "CTM" },
{ V150FW_RIC_RESERVED_START, V150FW_RIC_RESERVED_END, "Reserved for use by ITU-T" },
{ V150FW_RIC_VENDOR_START, V150FW_RIC_VENDOR_END, "For use by vendor" },
{ 0, 0, NULL }
};
static const value_string v150fw_ric_info_timeout_type[] = {
{ V150FW_RIC_INFO_TIMEOUT_NULL, "Null" },
{ V150FW_RIC_INFO_TIMEOUT_CALL_DISCRIMINATION_TIMEOUT, "Call discrimination timeout" },
{ V150FW_RIC_INFO_TIMEOUT_IP_TLP_TIMEOUT, "IP TLP timeout" },
{ V150FW_RIC_INFO_TIMEOUT_SSE_EXPLICIT_ACK_TIMEOUT, "Explicit acknowledgement timeout" },
{ 0, NULL }
};
static const value_string v150fw_ric_info_cleardown_type[] = {
{ V150FW_RIC_INFO_CLEARDOWN_UNKNOWN, "Unknown/unspecified" },
{ V150FW_RIC_INFO_CLEARDOWN_PHYSICAL_LAYER_RELEASE, "Physical layer release" },
{ V150FW_RIC_INFO_CLEARDOWN_LINK_LAYER_DISCONNECT, "Link layer disconnect" },
{ V150FW_RIC_INFO_CLEARDOWN_DATA_COMPRESSION_DISCONNECT, "Data compression disconnect" },
{ V150FW_RIC_INFO_CLEARDOWN_ABORT, "Abort" },
{ V150FW_RIC_INFO_CLEARDOWN_ON_HOOK, "On hook" },
{ V150FW_RIC_INFO_CLEARDOWN_NETWORK_LAYER_TERMINATION, "Network layer termination" },
{ V150FW_RIC_INFO_CLEARDOWN_ADMINISTRATIVE, "Administrative" },
{ 0, NULL }
};
#if 0 /* XXX: The following doesn't actually dissect anything. Is dissect_v150fw() supposed to be called ? */
static gboolean
dissect_v150fw_heur(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_)
{
guint8 octet1;
guint8 extb, ric;
guint16 ric_info;
gint payload_length = tvb_captured_length(tvb);
unsigned int offset = 0;
/* see appendix C (State Signalling Events) in ITU-T Rec. V.150.1 for details */
/* Get the fields */
octet1 = tvb_get_guint8(tvb, offset);
extb = octet1 & 0x01;
ric = tvb_get_guint8(tvb, offset + 1) & 0xFF;
ric_info = tvb_get_ntohs(tvb, offset + 2);
/* minimum lengths */
if(!extb && payload_length <= 4) /* extb is not set, so minimum length is 4 bytes */
return FALSE;
if(extb && payload_length <= 6) /* ext bit is set, but no extension found? */
return FALSE;
if(ric == 0 || (ric >= 6 && ric <= 31)) /* values reserved for future use */
return FALSE;
switch(ric)
{
case 0:
if(ric_info != 0) /* ric_info must be NULL if ric is NULL */
return FALSE;
case V150FW_RIC_CM:
case V150FW_RIC_JM:
if(!extb && payload_length > 4) /* payload too long */
return FALSE;
break;
case V150FW_RIC_TIMEOUT:
case V150FW_RIC_CLEARDOWN:
break;
default:
if(ric < 31 && ric_info != 0) /* ric_info is zero unless ric is CM, JM, TIMEOUT ro CLEARDOWN */
return FALSE;
if(ric >= 31 && ric <= 127) /* 31 - 127 are reserved for future use */
return FALSE;
/* 128 - 255 are vendor-specific */
break;
}
return TRUE;
}
#endif
static int
dissect_v150fw(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_)
{
/* Set up structures needed to add the protocol subtree and manage it */
proto_item *ti;
proto_tree *v150fw_tree, *field_tree;
guint8 extb, ric;
gint payload_length;
unsigned int offset = 0;
if(tree)
{
/* create the trees */
ti = proto_tree_add_item(tree, proto_v150fw, tvb, 0, -1, ENC_NA);
v150fw_tree = proto_item_add_subtree(ti, ett_v150fw);
payload_length = tvb_reported_length(tvb);
/* Get fields needed for further dissection */
extb = tvb_get_guint8(tvb, offset) & 0x01; /* extension bit */
ric = tvb_get_guint8(tvb, offset + 1);
proto_tree_add_item(v150fw_tree, hf_v150fw_event_id, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(v150fw_tree, hf_v150fw_force_response_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(v150fw_tree, hf_v150fw_extension_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
offset++;
proto_tree_add_item(v150fw_tree, hf_v150fw_reason_id_code, tvb, offset, 1, ENC_BIG_ENDIAN);
offset++;
/* reason identifier code information */
switch(ric)
{
case V150FW_RIC_CM:
case V150FW_RIC_JM:
ti = proto_tree_add_item(v150fw_tree, hf_v150fw_ric_info_mod_avail, tvb, offset, 2, ENC_BIG_ENDIAN);
field_tree = proto_item_add_subtree(ti, ett_available_modulations);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_pcm_mode, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v34_duplex, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v34_half_duplex, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v32_v32bis, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v22_v22bis, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v17, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v29_half_duplex, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v27ter, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v26ter, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v26bis, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v23_duplex, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v23_half_duplex, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v21, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v90_or_v92_analog, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v90_or_v92_digital, tvb, offset, 2, ENC_BIG_ENDIAN);
proto_tree_add_item(field_tree, hf_v150fw_cm_jm_mod_avail_v91, tvb, offset, 2, ENC_BIG_ENDIAN);
break;
case V150FW_RIC_TIMEOUT:
proto_tree_add_item(v150fw_tree, hf_v150fw_ric_info_timeout, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(v150fw_tree, hf_v150fw_ric_info_timeout_vendor, tvb, offset + 1, 1, ENC_BIG_ENDIAN);
break;
case V150FW_RIC_CLEARDOWN:
proto_tree_add_item(v150fw_tree, hf_v150fw_ric_info_cleardown, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(v150fw_tree, hf_v150fw_ric_info_cleardown_reserved, tvb, offset + 1, 1, ENC_BIG_ENDIAN);
break;
default:
proto_tree_add_item(v150fw_tree, hf_v150fw_reason_id_code_info, tvb, offset, 2, ENC_BIG_ENDIAN);
break;
} /* switch(ric) */
offset += 2;
if(extb && payload_length >= 6) /* display optional extension fields */
{
proto_tree_add_item(v150fw_tree, hf_v150fw_reserved, tvb, offset, 2, ENC_BIG_ENDIAN);
/* TODO ext field len doesn't match actual len (ext_len != (payload_length - 6)),
* that isn't illegal, but is perhaps worth noting */
proto_tree_add_item(v150fw_tree, hf_v150fw_extension_len, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
/* display optional extension fields */
switch(ric) {
case V150FW_RIC_CLEARDOWN: /* show vendor tag & vendor-specific info */
proto_tree_add_item(v150fw_tree, hf_v150fw_ric_info_cleardown_vendor_tag, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(v150fw_tree, hf_v150fw_ric_info_cleardown_vendor_info, tvb, offset+1, 1, ENC_BIG_ENDIAN);
break;
default:
/* just dump the bytes for now */
proto_tree_add_item(v150fw_tree, hf_v150fw_remainder, tvb, offset, (payload_length - 6), ENC_NA);
break;
}
}
}
return tvb_captured_length(tvb);
}
void
proto_register_v150fw(void)
{
/* set up header fields */
static hf_register_info hf[] =
{
{
&hf_v150fw_event_id,
{
"Event ID",
"v150fw.event",
FT_UINT8,
BASE_DEC | BASE_RANGE_STRING,
RVALS(v150fw_event_id_name),
0xFC,
NULL, HFILL
}
},
{
&hf_v150fw_force_response_bit,
{
"Force response",
"v150fw.frb",
FT_BOOLEAN,
8,
TFS(&tfs_yes_no),
0x02,
NULL, HFILL
}
},
{
&hf_v150fw_extension_bit,
{
"Payload extension",
"v150fw.extb",
FT_BOOLEAN,
8,
TFS(&tfs_present_absent),
0x01,
NULL, HFILL
}
},
{
&hf_v150fw_reason_id_code, /* ric value + string */
{
"Reason ID",
"v150fw.ric",
FT_UINT8,
BASE_DEC | BASE_RANGE_STRING,
RVALS(v150fw_ric_name),
0xFF,
NULL, HFILL
}
},
{
&hf_v150fw_reason_id_code_info,
{
"Info",
"v150fw.ricinfo",
FT_UINT16,
BASE_HEX,
NULL,
0xFFFF,
NULL, HFILL
}
},
{
&hf_v150fw_ric_info_timeout,
{
"Timeout type",
"v150fw.ricinfo.timeout",
FT_UINT16,
BASE_HEX,
VALS(v150fw_ric_info_timeout_type),
0xFF00,
NULL, HFILL
}
},
{
&hf_v150fw_ric_info_timeout_vendor,
{
"Vendor-specific timeout info",
"v150fw.ricinfo.timeout_vendor",
FT_UINT16,
BASE_HEX,
NULL,
0x00FF,
NULL, HFILL
}
},
{
&hf_v150fw_ric_info_cleardown,
{
"Cleardown type",
"v150fw.ricinfo.cleardown",
FT_UINT16,
BASE_HEX,
VALS(v150fw_ric_info_cleardown_type),
0xFF00,
NULL, HFILL
}
},
{
&hf_v150fw_ric_info_cleardown_reserved,
{
"Reserved for use by the ITU-T",
"v150fw.ricinfo.cleardown_reserved",
FT_UINT16,
BASE_HEX,
NULL,
0x00FF,
NULL, HFILL
}
},
{
&hf_v150fw_ric_info_cleardown_vendor_tag,
{
"Vendor tag",
"v150fw.cleardown_vendor_tag",
FT_UINT8,
BASE_HEX,
NULL,
0xFF,
NULL, HFILL
}
},
{
&hf_v150fw_ric_info_cleardown_vendor_info,
{
"Vendor-specific info",
"v150fw.cleardown_vendor_info",
FT_UINT8,
BASE_HEX,
NULL,
0xFF,
NULL, HFILL
}
},
{
&hf_v150fw_ric_info_mod_avail,
{
"Modulation availability",
"v150fw.rinfo.mod_avail",
FT_UINT16,
BASE_HEX,
NULL,
0xFFFF,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_pcm_mode,
{
"PCM mode",
"v150fw.rinfo.mod_avail.pcm_mode",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x8000,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v34_duplex,
{
"V.34 duplex",
"v150fw.rinfo.mod_avail.v34_duplex",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x4000,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v34_half_duplex,
{
"V.34 half-duplex",
"v150fw.rinfo.mod_avail.v34_half_duplex",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x2000,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v32_v32bis,
{
"V.32/V.32bis",
"v150fw.rinfo.mod_avail.v32_v32bis",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x1000,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v22_v22bis,
{
"V.22/V.22bis",
"v150fw.rinfo.mod_avail.v22_v22bis",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x0800,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v17,
{
"V.17",
"v150fw.rinfo.mod_avail.v17",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x0400,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v29_half_duplex,
{
"V.29 half-duplex",
"v150fw.rinfo.mod_avail.v29_half_duplex",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x0200,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v27ter,
{
"V.27ter",
"v150fw.rinfo.mod_avail.v27ter",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x0100,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v26ter,
{
"V.26ter",
"v150fw.rinfo.mod_avail.v26ter",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x0080,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v26bis,
{
"V.26bis",
"v150fw.rinfo.mod_avail.v26bis",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x0040,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v23_duplex,
{
"V.23 duplex",
"v150fw.rinfo.mod_avail.v23_duplex",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x0020,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v23_half_duplex,
{
"V.23 half-duplex",
"v150fw.rinfo.mod_avail.half_duplex",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x0010,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v21,
{
"V.21",
"v150fw.rinfo.mod_avail.v21",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x0008,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v90_or_v92_analog,
{
"V.90 or V.92 analog",
"v150fw.rinfo.mod_avail.v90_or_v92_analog",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x0004,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v90_or_v92_digital,
{
"V.90 or V.92 digital",
"v150fw.rinfo.mod_avail.v90_or_v92_digital",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x0002,
NULL, HFILL
}
},
{
&hf_v150fw_cm_jm_mod_avail_v91,
{
"V.91",
"v150fw.rinfo.mod_avail.v91",
FT_BOOLEAN,
16,
TFS(&tfs_available_not_available),
0x0001,
NULL, HFILL
}
},
{
&hf_v150fw_reserved,
{
"Reserved",
"v150fw.reserved",
FT_UINT16,
BASE_HEX,
NULL,
0xF800,
NULL, HFILL
}
},
{
&hf_v150fw_extension_len,
{
"Extension field length",
"v150fw.eflen",
FT_UINT16,
BASE_DEC,
NULL,
0x07FF,
NULL, HFILL
}
},
/* dump remaining bytes: */
{
&hf_v150fw_remainder,
{
"Remaining bytes",
"v150fw.remainder",
FT_BYTES,
BASE_NONE,
NULL,
0x0,
NULL, HFILL
}
}
}; /* hf_register_info hf[] */
/* setup protocol subtree array */
static gint *ett[] = {
&ett_v150fw,
&ett_available_modulations
};
/* register protocol name & description */
RTP: Make Decode As handling consistent across subdissectors RTP has two dissector tables, one directly associated with payload types, and one which is associated with strings that appear in SDP commands. This makes all dissectors that are registered as a dynamic payload type that can be configured by SDP appear as a Decode As option for the RTP PT table. Some protocols were registered in the table for configuration by SDP but had no way to register with the rtp.pt table. These include EVRC, H.223, and v150fw. Other protocols had a long standing preference to set a dynamic payload type, but they still did not appear in the Decode As menu unless that preference was changed from the default, largely because of the way that the preference was not actually registered with the rtp.pt table unless it had a value in the dynamic payload type range. These include EVS, H.263P, H.264, H.265, ISMACryp, IuUP, LAPD, MP4V-ES, RTP-MIDI, and VP8. RFC 3551 says that not just the dynamic payload types, but also the unassigned and even the statically assigned payload types MAY be dynamically reassigned as necessary, so this patch also allows these preferences to be set for payload types less than 96. The only payload type not allowed is 0 (which RFCs 3551 and 7007 say must be μ-law PCM), which is handy anyone for backwards compatibility with preferences that used to be uints (where 0 meant disabled.) All protcols which formerly used a uint preference are all converted to a range preference, and the text is changed to be similar for each. This works in a backwards compatible fashion, and any defaults are maintained. The patch also adds some of the dissector variants as PINOs so that they will show up with distinct names in the Decode As menus, and changes some of the protocol short names so that the entry in Decode As is clearer and matches what is used for other similar protocols. Change-Id: I68627b5c3e495d9fc813d88208f3b62e47e0c4de Reviewed-on: https://code.wireshark.org/review/37396 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
2020-06-07 20:15:49 +00:00
proto_v150fw = proto_register_protocol("V.150.1 State Signaling Event", "V.150.1 SSE", "v150fw");
/* required function calls to register the header fields and subtrees used */
proto_register_field_array(proto_v150fw, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
/* register the dissector */
register_dissector("v150fw", dissect_v150fw, proto_v150fw);
}
/*
* Editor modelines - https://www.wireshark.org/tools/modelines.html
*
* Local variables:
* c-basic-offset: 4
* tab-width: 8
* indent-tabs-mode: nil
* End:
*
* vi: set shiftwidth=4 tabstop=8 expandtab:
* :indentSize=4:tabSize=8:noTabs=true:
*/