mirror of https://gitee.com/openkylin/linux.git
USB: usbfs_snoop: add data logging back in
Uses the new snoop function from commit 4c6e8971cb
,
but includes the buffer data where appropriate, as before.
Signed-off-by: Chris Frey <cdfrey@foursquare.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
0978f8c55c
commit
0880aef49e
|
@ -310,7 +310,8 @@ static struct async *async_getpending(struct dev_state *ps,
|
||||||
|
|
||||||
static void snoop_urb(struct usb_device *udev,
|
static void snoop_urb(struct usb_device *udev,
|
||||||
void __user *userurb, int pipe, unsigned length,
|
void __user *userurb, int pipe, unsigned length,
|
||||||
int timeout_or_status, enum snoop_when when)
|
int timeout_or_status, enum snoop_when when,
|
||||||
|
unsigned char *data, unsigned data_len)
|
||||||
{
|
{
|
||||||
static const char *types[] = {"isoc", "int", "ctrl", "bulk"};
|
static const char *types[] = {"isoc", "int", "ctrl", "bulk"};
|
||||||
static const char *dirs[] = {"out", "in"};
|
static const char *dirs[] = {"out", "in"};
|
||||||
|
@ -344,6 +345,11 @@ static void snoop_urb(struct usb_device *udev,
|
||||||
"status %d\n",
|
"status %d\n",
|
||||||
ep, t, d, length, timeout_or_status);
|
ep, t, d, length, timeout_or_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data && data_len > 0) {
|
||||||
|
print_hex_dump(KERN_DEBUG, "data: ", DUMP_PREFIX_NONE, 32, 1,
|
||||||
|
data, data_len, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define AS_CONTINUATION 1
|
#define AS_CONTINUATION 1
|
||||||
|
@ -410,7 +416,9 @@ static void async_completed(struct urb *urb)
|
||||||
}
|
}
|
||||||
snoop(&urb->dev->dev, "urb complete\n");
|
snoop(&urb->dev->dev, "urb complete\n");
|
||||||
snoop_urb(urb->dev, as->userurb, urb->pipe, urb->actual_length,
|
snoop_urb(urb->dev, as->userurb, urb->pipe, urb->actual_length,
|
||||||
as->status, COMPLETE);
|
as->status, COMPLETE,
|
||||||
|
((urb->transfer_flags & URB_DIR_MASK) == USB_DIR_OUT) ?
|
||||||
|
NULL : urb->transfer_buffer, urb->actual_length);
|
||||||
if (as->status < 0 && as->bulk_addr && as->status != -ECONNRESET &&
|
if (as->status < 0 && as->bulk_addr && as->status != -ECONNRESET &&
|
||||||
as->status != -ENOENT)
|
as->status != -ENOENT)
|
||||||
cancel_bulk_urbs(ps, as->bulk_addr);
|
cancel_bulk_urbs(ps, as->bulk_addr);
|
||||||
|
@ -774,6 +782,13 @@ static int proc_control(struct dev_state *ps, void __user *arg)
|
||||||
if (!tbuf)
|
if (!tbuf)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
tmo = ctrl.timeout;
|
tmo = ctrl.timeout;
|
||||||
|
snoop(&dev->dev, "control urb: bRequestType=%02x "
|
||||||
|
"bRequest=%02x wValue=%04x "
|
||||||
|
"wIndex=%04x wLength=%04x\n",
|
||||||
|
ctrl.bRequestType, ctrl.bRequest,
|
||||||
|
__le16_to_cpup(&ctrl.wValue),
|
||||||
|
__le16_to_cpup(&ctrl.wIndex),
|
||||||
|
__le16_to_cpup(&ctrl.wLength));
|
||||||
if (ctrl.bRequestType & 0x80) {
|
if (ctrl.bRequestType & 0x80) {
|
||||||
if (ctrl.wLength && !access_ok(VERIFY_WRITE, ctrl.data,
|
if (ctrl.wLength && !access_ok(VERIFY_WRITE, ctrl.data,
|
||||||
ctrl.wLength)) {
|
ctrl.wLength)) {
|
||||||
|
@ -781,15 +796,15 @@ static int proc_control(struct dev_state *ps, void __user *arg)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
pipe = usb_rcvctrlpipe(dev, 0);
|
pipe = usb_rcvctrlpipe(dev, 0);
|
||||||
snoop_urb(dev, NULL, pipe, ctrl.wLength, tmo, SUBMIT);
|
snoop_urb(dev, NULL, pipe, ctrl.wLength, tmo, SUBMIT, NULL, 0);
|
||||||
|
|
||||||
usb_unlock_device(dev);
|
usb_unlock_device(dev);
|
||||||
i = usb_control_msg(dev, pipe, ctrl.bRequest,
|
i = usb_control_msg(dev, pipe, ctrl.bRequest,
|
||||||
ctrl.bRequestType, ctrl.wValue, ctrl.wIndex,
|
ctrl.bRequestType, ctrl.wValue, ctrl.wIndex,
|
||||||
tbuf, ctrl.wLength, tmo);
|
tbuf, ctrl.wLength, tmo);
|
||||||
usb_lock_device(dev);
|
usb_lock_device(dev);
|
||||||
snoop_urb(dev, NULL, pipe, max(i, 0), min(i, 0), COMPLETE);
|
snoop_urb(dev, NULL, pipe, max(i, 0), min(i, 0), COMPLETE,
|
||||||
|
tbuf, i);
|
||||||
if ((i > 0) && ctrl.wLength) {
|
if ((i > 0) && ctrl.wLength) {
|
||||||
if (copy_to_user(ctrl.data, tbuf, i)) {
|
if (copy_to_user(ctrl.data, tbuf, i)) {
|
||||||
free_page((unsigned long)tbuf);
|
free_page((unsigned long)tbuf);
|
||||||
|
@ -804,14 +819,15 @@ static int proc_control(struct dev_state *ps, void __user *arg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pipe = usb_sndctrlpipe(dev, 0);
|
pipe = usb_sndctrlpipe(dev, 0);
|
||||||
snoop_urb(dev, NULL, pipe, ctrl.wLength, tmo, SUBMIT);
|
snoop_urb(dev, NULL, pipe, ctrl.wLength, tmo, SUBMIT,
|
||||||
|
tbuf, ctrl.wLength);
|
||||||
|
|
||||||
usb_unlock_device(dev);
|
usb_unlock_device(dev);
|
||||||
i = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), ctrl.bRequest,
|
i = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), ctrl.bRequest,
|
||||||
ctrl.bRequestType, ctrl.wValue, ctrl.wIndex,
|
ctrl.bRequestType, ctrl.wValue, ctrl.wIndex,
|
||||||
tbuf, ctrl.wLength, tmo);
|
tbuf, ctrl.wLength, tmo);
|
||||||
usb_lock_device(dev);
|
usb_lock_device(dev);
|
||||||
snoop_urb(dev, NULL, pipe, max(i, 0), min(i, 0), COMPLETE);
|
snoop_urb(dev, NULL, pipe, max(i, 0), min(i, 0), COMPLETE, NULL, 0);
|
||||||
}
|
}
|
||||||
free_page((unsigned long)tbuf);
|
free_page((unsigned long)tbuf);
|
||||||
if (i < 0 && i != -EPIPE) {
|
if (i < 0 && i != -EPIPE) {
|
||||||
|
@ -857,12 +873,12 @@ static int proc_bulk(struct dev_state *ps, void __user *arg)
|
||||||
kfree(tbuf);
|
kfree(tbuf);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
snoop_urb(dev, NULL, pipe, len1, tmo, SUBMIT);
|
snoop_urb(dev, NULL, pipe, len1, tmo, SUBMIT, NULL, 0);
|
||||||
|
|
||||||
usb_unlock_device(dev);
|
usb_unlock_device(dev);
|
||||||
i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo);
|
i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo);
|
||||||
usb_lock_device(dev);
|
usb_lock_device(dev);
|
||||||
snoop_urb(dev, NULL, pipe, len2, i, COMPLETE);
|
snoop_urb(dev, NULL, pipe, len2, i, COMPLETE, tbuf, len2);
|
||||||
|
|
||||||
if (!i && len2) {
|
if (!i && len2) {
|
||||||
if (copy_to_user(bulk.data, tbuf, len2)) {
|
if (copy_to_user(bulk.data, tbuf, len2)) {
|
||||||
|
@ -877,12 +893,12 @@ static int proc_bulk(struct dev_state *ps, void __user *arg)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
snoop_urb(dev, NULL, pipe, len1, tmo, SUBMIT);
|
snoop_urb(dev, NULL, pipe, len1, tmo, SUBMIT, tbuf, len1);
|
||||||
|
|
||||||
usb_unlock_device(dev);
|
usb_unlock_device(dev);
|
||||||
i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo);
|
i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo);
|
||||||
usb_lock_device(dev);
|
usb_lock_device(dev);
|
||||||
snoop_urb(dev, NULL, pipe, len2, i, COMPLETE);
|
snoop_urb(dev, NULL, pipe, len2, i, COMPLETE, NULL, 0);
|
||||||
}
|
}
|
||||||
kfree(tbuf);
|
kfree(tbuf);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
|
@ -1101,6 +1117,13 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
|
||||||
is_in = 0;
|
is_in = 0;
|
||||||
uurb->endpoint &= ~USB_DIR_IN;
|
uurb->endpoint &= ~USB_DIR_IN;
|
||||||
}
|
}
|
||||||
|
snoop(&ps->dev->dev, "control urb: bRequestType=%02x "
|
||||||
|
"bRequest=%02x wValue=%04x "
|
||||||
|
"wIndex=%04x wLength=%04x\n",
|
||||||
|
dr->bRequestType, dr->bRequest,
|
||||||
|
__le16_to_cpup(&dr->wValue),
|
||||||
|
__le16_to_cpup(&dr->wIndex),
|
||||||
|
__le16_to_cpup(&dr->wLength));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case USBDEVFS_URB_TYPE_BULK:
|
case USBDEVFS_URB_TYPE_BULK:
|
||||||
|
@ -1244,7 +1267,9 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
snoop_urb(ps->dev, as->userurb, as->urb->pipe,
|
snoop_urb(ps->dev, as->userurb, as->urb->pipe,
|
||||||
as->urb->transfer_buffer_length, 0, SUBMIT);
|
as->urb->transfer_buffer_length, 0, SUBMIT,
|
||||||
|
is_in ? NULL : as->urb->transfer_buffer,
|
||||||
|
uurb->buffer_length);
|
||||||
async_newpending(as);
|
async_newpending(as);
|
||||||
|
|
||||||
if (usb_endpoint_xfer_bulk(&ep->desc)) {
|
if (usb_endpoint_xfer_bulk(&ep->desc)) {
|
||||||
|
@ -1282,7 +1307,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
|
||||||
dev_printk(KERN_DEBUG, &ps->dev->dev,
|
dev_printk(KERN_DEBUG, &ps->dev->dev,
|
||||||
"usbfs: usb_submit_urb returned %d\n", ret);
|
"usbfs: usb_submit_urb returned %d\n", ret);
|
||||||
snoop_urb(ps->dev, as->userurb, as->urb->pipe,
|
snoop_urb(ps->dev, as->userurb, as->urb->pipe,
|
||||||
0, ret, COMPLETE);
|
0, ret, COMPLETE, NULL, 0);
|
||||||
async_removepending(as);
|
async_removepending(as);
|
||||||
free_async(as);
|
free_async(as);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue