USB Audio: Dissecting Selector Unit and Endpoint Descriptor

Dissection of "Class-specific Audio Control Interface Descriptor:
Selector Unit Descriptor" and "ENDPOINT DESCRIPTOR" for USB Audio
Device added.
The USB Audio class extended Standard USB Endpoint Descriptor 2
bytes further. A condition to check whether the interface class is
CLASS_AUDIO is added and the 2 bytes are dissected.

Change-Id: I63f1334df71b9e8cd92a299d533b732b0a13ace7
Reviewed-on: https://code.wireshark.org/review/36250
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Ameya Deshpande 2020-03-01 15:04:11 +05:30 committed by Anders Broman
parent 340e9b3e84
commit 321de10aad
2 changed files with 76 additions and 0 deletions

View File

@ -129,6 +129,11 @@ static int hf_ac_if_fu_controls_d8 = -1;
static int hf_ac_if_fu_controls_d9 = -1;
static int hf_ac_if_fu_controls_rsv = -1;
static int hf_ac_if_fu_ifeature = -1;
static int hf_ac_if_su_unitid = -1;
static int hf_ac_if_su_nrinpins = -1;
static int hf_ac_if_su_sourceids = -1;
static int hf_ac_if_su_sourceid = -1;
static int hf_ac_if_su_iselector = -1;
static int hf_ac_if_mu_unitid = -1;
static int hf_ac_if_mu_nrinpins = -1;
static int hf_ac_if_mu_sourceid = -1;
@ -309,6 +314,7 @@ static gint ett_ac_if_hdr_controls = -1;
static gint ett_ac_if_fu_controls = -1;
static gint ett_ac_if_fu_controls0 = -1;
static gint ett_ac_if_fu_controls1 = -1;
static gint ett_ac_if_su_sourceids = -1;
static gint ett_ac_if_input_wchannelconfig = -1;
static gint ett_ac_if_input_bmchannelconfig = -1;
static gint ett_ac_if_input_controls = -1;
@ -1146,6 +1152,37 @@ dissect_ac_if_feature_unit(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_,
return offset-offset_start;
}
static gint dissect_ac_if_selector_unit(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_, proto_tree *tree, usb_conv_info_t *usb_conv_info _U_)
{
gint offset_start;
guint32 nrinpins,i;
guint32 source_id;
proto_item *ti;
proto_tree *subtree;
offset_start = offset;
proto_tree_add_item(tree, hf_ac_if_su_unitid, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item_ret_uint(tree, hf_ac_if_su_nrinpins, tvb, offset, 1, ENC_LITTLE_ENDIAN, &nrinpins);
offset += 1;
ti = proto_tree_add_item(tree, hf_ac_if_su_sourceids, tvb, offset, 1, ENC_LITTLE_ENDIAN);
subtree = proto_item_add_subtree(ti, ett_ac_if_su_sourceids);
for(i = 0; i < nrinpins; ++i) {
proto_tree_add_item_ret_uint(subtree, hf_ac_if_su_sourceid, tvb, offset, 1, ENC_LITTLE_ENDIAN, &source_id);
offset +=1;
if (i > 0)
proto_item_append_text(ti,", %d", source_id);
}
proto_tree_add_item(tree, hf_ac_if_su_iselector, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return offset - offset_start;
}
static gint
dissect_ac_if_mixed_unit(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_,
proto_tree *tree, usb_conv_info_t *usb_conv_info _U_)
@ -1823,6 +1860,9 @@ dissect_usb_audio_descriptor(tvbuff_t *tvb, packet_info *pinfo,
case AC_SUBTYPE_MIXER_UNIT:
bytes_dissected += dissect_ac_if_mixed_unit(tvb, offset, pinfo, desc_tree, usb_conv_info);
break;
case AC_SUBTYPE_SELECTOR_UNIT:
bytes_dissected += dissect_ac_if_selector_unit(tvb, offset, pinfo, desc_tree, usb_conv_info);
break;
case AC_SUBTYPE_FEATURE_UNIT:
bytes_dissected += dissect_ac_if_feature_unit(tvb, offset, pinfo, desc_tree, usb_conv_info, desc_len);
break;
@ -2314,6 +2354,21 @@ proto_register_usb_audio(void)
{ &hf_ac_if_fu_ifeature,
{ "Feature", "usbaudio.ac_if_fu.iFeature",
FT_UINT8, BASE_DEC, NULL, 0x00, "iFeature", HFILL }},
{ &hf_ac_if_su_unitid,
{ "Unit ID", "usbaudio.ac_if_su.bUnitID",
FT_UINT8, BASE_DEC, NULL, 0x00, "bUnitID", HFILL }},
{ &hf_ac_if_su_nrinpins,
{ "Input Pins", "usbaudio.ac_if_su.bNrInPins",
FT_UINT8, BASE_DEC, NULL, 0x00, "bNrInPins", HFILL }},
{ &hf_ac_if_su_sourceids,
{ "Source IDs", "usbaudio.ac_if_su_baSourceIDs",
FT_UINT8, BASE_DEC, NULL, 0x00, "baSourceIDs", HFILL }},
{ &hf_ac_if_su_sourceid,
{ "Source ID", "usbaudio.ac_if_su.baSourceID",
FT_UINT8, BASE_DEC, NULL, 0x00, "baSourceID", HFILL}},
{ &hf_ac_if_su_iselector,
{ "Selector Index", "usbaudio.ac_if_su.iSelector",
FT_UINT8, BASE_DEC, NULL, 0x00, "iSelector", HFILL }},
{ &hf_ac_if_mu_unitid,
{ "Unit ID", "usbaudio.ac_if_mu.bUnitID",
FT_UINT8, BASE_DEC, NULL, 0x00, "bUnitID", HFILL }},
@ -2879,6 +2934,7 @@ proto_register_usb_audio(void)
&ett_ac_if_fu_controls,
&ett_ac_if_fu_controls0,
&ett_ac_if_fu_controls1,
&ett_ac_if_su_sourceids,
&ett_ac_if_input_wchannelconfig,
&ett_ac_if_input_bmchannelconfig,
&ett_ac_if_input_controls,

View File

@ -243,6 +243,8 @@ static int hf_usb_wMaxPacketSize_size = -1;
static int hf_usb_wMaxPacketSize_slots = -1;
static int hf_usb_bInterval = -1;
static int hf_usb_bMaxBurst = -1;
static int hf_usb_audio_bRefresh = -1;
static int hf_usb_audio_bSynchAddress = -1;
static int hf_usb_bSSEndpointAttributeBulkMaxStreams = -1;
static int hf_usb_bSSEndpointAttributeIsoMult = -1;
static int hf_usb_wBytesPerInterval = -1;
@ -2557,6 +2559,14 @@ dissect_usb_endpoint_descriptor(packet_info *pinfo, proto_tree *parent_tree,
proto_tree_add_item(tree, hf_usb_bInterval, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
if(usb_conv_info->interfaceClass == IF_CLASS_AUDIO) {
proto_tree_add_item(tree, hf_usb_audio_bRefresh, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_usb_audio_bSynchAddress, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
}
proto_item_set_len(item, len);
if (offset < old_offset+len) {
@ -6295,6 +6305,16 @@ proto_register_usb(void)
FT_UINT8, BASE_DEC, NULL, 0x0,
"Valid values are from 0 to 15. For control endpoints this value shall be 0.", HFILL }},
{ &hf_usb_audio_bRefresh,
{ "bRefresh", "usb.audio.bRefresh",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }},
{ &hf_usb_audio_bSynchAddress,
{ "bSynchAddress", "usb.audio.bSynchAddress",
FT_UINT8, BASE_DEC, NULL, 0x00,
NULL, HFILL }},
{ &hf_usb_bSSEndpointAttributeBulkMaxStreams,
{ "MaxStreams", "usb.bmAttributes.MaxStreams",
FT_UINT8, BASE_DEC, NULL, 0x0F,