* USB basic dissector
* By Paolo Abeni <paolo.abeni@email.it>
* Ronnie Sahlberg 2006
- * Chris Maynard 2010 <chris[dot]maynard[at]gtech[dot]com>
*
* http://www.usb.org/developers/docs/usb_20_122909-2.zip
*
static dissector_table_t usb_bulk_dissector_table;
static dissector_table_t usb_control_dissector_table;
-static heur_dissector_list_t heur_subdissector_list;
+static heur_dissector_list_t heur_bulk_subdissector_list;
+static heur_dissector_list_t heur_control_subdissector_list;
/* http://www.usb.org/developers/docs/USB_LANGIDs.pdf */
static const value_string usb_langid_vals[] = {
pinfo->usb_conv_info=usb_conv_info;
next_tvb=tvb_new_subset_remaining(tvb, offset);
- if (try_heuristics && dissector_try_heuristic(heur_subdissector_list, next_tvb, pinfo, parent)) {
+ if (try_heuristics && dissector_try_heuristic(heur_bulk_subdissector_list, next_tvb, pinfo, parent)) {
return;
}
else if(dissector_try_uint(usb_bulk_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent)){
case RQT_SETUP_TYPE_CLASS:
/* Try to find a class specific dissector */
next_tvb=tvb_new_subset_remaining(tvb, offset);
+ if (try_heuristics && dissector_try_heuristic(heur_control_subdissector_list, next_tvb, pinfo, tree)) {
+ return;
+ }
if(dissector_try_uint(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, tree)){
return;
}
*/
if (header_len_64_bytes)
offset = dissect_linux_usb_pseudo_header_ext(tvb, offset, pinfo, tree);
+
+ if (tvb_reported_length_remaining(tvb, offset) != 0) {
+ tvbuff_t *next_tvb;
+
+ next_tvb = tvb_new_subset_remaining(tvb, offset);
+ if (try_heuristics && dissector_try_heuristic(heur_control_subdissector_list, next_tvb, pinfo, tree)) {
+ return;
+ }
+ if(dissector_try_uint(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, tree)){
+ return;
+ }
+ }
} else {
tvbuff_t *next_tvb;
if(usb_trans_info){
/* Try to find a class specific dissector */
next_tvb=tvb_new_subset_remaining(tvb, offset);
+ if (try_heuristics && dissector_try_heuristic(heur_control_subdissector_list, next_tvb, pinfo, tree)) {
+ return;
+ }
if(dissector_try_uint(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, tree)){
return;
}
usb_bulk_dissector_table = register_dissector_table("usb.bulk",
"USB bulk endpoint", FT_UINT8, BASE_DEC);
- register_heur_dissector_list("usb.bulk", &heur_subdissector_list);
+ register_heur_dissector_list("usb.bulk", &heur_bulk_subdissector_list);
usb_control_dissector_table = register_dissector_table("usb.control",
"USB control endpoint", FT_UINT8, BASE_DEC);
+ register_heur_dissector_list("usb.control", &heur_control_subdissector_list);
usb_module = prefs_register_protocol(proto_usb, NULL);
prefs_register_bool_preference(usb_module, "try_heuristics",
"Try heuristic sub-dissectors",
"Try to decode a packet using a heuristic sub-dissector before "
- "attempting to dissect the packet using the \"usb.bulk\" dissector "
- "table.", &try_heuristics);
+ "attempting to dissect the packet using the \"usb.bulk\" or "
+ "\"usb.control\" dissector tables.", &try_heuristics);
usb_tap=register_tap("usb");
}