From 88581a68e74ede6235c98f8d616c0fca5cd3a2e2 Mon Sep 17 00:00:00 2001 From: "Sean O. Stalley" Date: Tue, 3 Jun 2014 14:46:47 -0700 Subject: Added usb_set_addr helper function Added a helper function used to set the address fields for an urb. The code functions the same as before, but is now more modular. This change makes it easier for other dissectors to reuse the usb addressing code (ex: MAUSB). Change-Id: Idef3156a0fc9a9eda77ec7b2bbf3797b7a59e264 Reviewed-on: https://code.wireshark.org/review/1942 Reviewed-by: Evan Huus --- epan/dissectors/packet-usb.c | 52 ++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/epan/dissectors/packet-usb.c b/epan/dissectors/packet-usb.c index 4ace02bdc9..572179bf23 100644 --- a/epan/dissectors/packet-usb.c +++ b/epan/dissectors/packet-usb.c @@ -2653,6 +2653,35 @@ dissect_win32_usb_pseudo_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t } } +/* Set the usb_address_t fields based on the direction of the urb */ +static void +usb_set_addr(packet_info *pinfo, usb_address_t *src_addr, + usb_address_t *dst_addr, guint16 device_address, int endpoint, + gboolean req) +{ + if (req) { + /* request */ + src_addr->device = 0xffffffff; + src_addr->endpoint = NO_ENDPOINT; + dst_addr->device = GUINT16_TO_LE(device_address); + dst_addr->endpoint = GUINT32_TO_LE(endpoint); + } else { + /* response */ + src_addr->device = GUINT16_TO_LE(device_address); + src_addr->endpoint = GUINT32_TO_LE(endpoint); + dst_addr->device = 0xffffffff; + dst_addr->endpoint = NO_ENDPOINT; + } + + SET_ADDRESS(&pinfo->net_src, AT_USB, USB_ADDR_LEN, (char *)src_addr); + SET_ADDRESS(&pinfo->src, AT_USB, USB_ADDR_LEN, (char *)src_addr); + SET_ADDRESS(&pinfo->net_dst, AT_USB, USB_ADDR_LEN, (char *)dst_addr); + SET_ADDRESS(&pinfo->dst, AT_USB, USB_ADDR_LEN, (char *)dst_addr); + pinfo->ptype = PT_USB; + pinfo->srcport = src_addr->endpoint; + pinfo->destport = dst_addr->endpoint; +} + static void dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, guint8 header_info) @@ -2702,27 +2731,8 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, else return; /* invalid USB pseudo header */ - if (urb_type == URB_SUBMIT) { - /* request */ - src_addr.device = 0xffffffff; - src_addr.endpoint = NO_ENDPOINT; - dst_addr.device = GUINT16_TO_LE(device_address); - dst_addr.endpoint = GUINT32_TO_LE(endpoint); - } else { - /* response */ - src_addr.device = GUINT16_TO_LE(device_address); - src_addr.endpoint = GUINT32_TO_LE(endpoint); - dst_addr.device = 0xffffffff; - dst_addr.endpoint = NO_ENDPOINT; - } - - SET_ADDRESS(&pinfo->net_src, AT_USB, USB_ADDR_LEN, (char *)&src_addr); - SET_ADDRESS(&pinfo->src, AT_USB, USB_ADDR_LEN, (char *)&src_addr); - SET_ADDRESS(&pinfo->net_dst, AT_USB, USB_ADDR_LEN, (char *)&dst_addr); - SET_ADDRESS(&pinfo->dst, AT_USB, USB_ADDR_LEN, (char *)&dst_addr); - pinfo->ptype = PT_USB; - pinfo->srcport = src_addr.endpoint; - pinfo->destport = dst_addr.endpoint; + usb_set_addr(pinfo, &src_addr, &dst_addr, device_address, endpoint, + (urb_type == URB_SUBMIT)); conversation = get_usb_conversation(pinfo, &pinfo->src, &pinfo->dst, pinfo->srcport, pinfo->destport); usb_conv_info = get_usb_conv_info(conversation); -- cgit v1.2.3