Skip to content

Commit e639dd3

Browse files
committed
[PATCH] USB: add more snooping hooks in devio.c
Now we can log the urbs travelling through usbfs Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent d6e5bcf commit e639dd3

File tree

1 file changed

+50
-5
lines changed

1 file changed

+50
-5
lines changed

drivers/usb/core/devio.c

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,28 @@ static inline struct async *async_getpending(struct dev_state *ps, void __user *
279279
return NULL;
280280
}
281281

282+
static void snoop_urb(struct urb *urb, void __user *userurb)
283+
{
284+
int j;
285+
unsigned char *data = urb->transfer_buffer;
286+
287+
if (!usbfs_snoop)
288+
return;
289+
290+
if (urb->pipe & USB_DIR_IN)
291+
dev_info(&urb->dev->dev, "direction=IN\n");
292+
else
293+
dev_info(&urb->dev->dev, "direction=OUT\n");
294+
dev_info(&urb->dev->dev, "userurb=%p\n", userurb);
295+
dev_info(&urb->dev->dev, "transfer_buffer_length=%d\n",
296+
urb->transfer_buffer_length);
297+
dev_info(&urb->dev->dev, "actual_length=%d\n", urb->actual_length);
298+
dev_info(&urb->dev->dev, "data: ");
299+
for (j = 0; j < urb->transfer_buffer_length; ++j)
300+
printk ("%02x ", data[j]);
301+
printk("\n");
302+
}
303+
282304
static void async_completed(struct urb *urb, struct pt_regs *regs)
283305
{
284306
struct async *as = (struct async *)urb->context;
@@ -296,7 +318,9 @@ static void async_completed(struct urb *urb, struct pt_regs *regs)
296318
kill_proc_info_as_uid(as->signr, &sinfo, as->pid, as->uid,
297319
as->euid);
298320
}
299-
wake_up(&ps->wait);
321+
snoop(&urb->dev->dev, "urb complete\n");
322+
snoop_urb(urb, as->userurb);
323+
wake_up(&ps->wait);
300324
}
301325

302326
static void destroy_async (struct dev_state *ps, struct list_head *list)
@@ -601,7 +625,7 @@ static int proc_control(struct dev_state *ps, void __user *arg)
601625
if (usbfs_snoop) {
602626
dev_info(&dev->dev, "control read: data ");
603627
for (j = 0; j < i; ++j)
604-
printk ("%02x ", (unsigned char)(tbuf)[j]);
628+
printk("%02x ", (unsigned char)(tbuf)[j]);
605629
printk("\n");
606630
}
607631
if (copy_to_user(ctrl.data, tbuf, i)) {
@@ -624,7 +648,7 @@ static int proc_control(struct dev_state *ps, void __user *arg)
624648
if (usbfs_snoop) {
625649
dev_info(&dev->dev, "control write: data: ");
626650
for (j = 0; j < ctrl.wLength; ++j)
627-
printk ("%02x ", (unsigned char)(tbuf)[j]);
651+
printk("%02x ", (unsigned char)(tbuf)[j]);
628652
printk("\n");
629653
}
630654
usb_unlock_device(dev);
@@ -649,7 +673,7 @@ static int proc_bulk(struct dev_state *ps, void __user *arg)
649673
unsigned int tmo, len1, pipe;
650674
int len2;
651675
unsigned char *tbuf;
652-
int i, ret;
676+
int i, j, ret;
653677

654678
if (copy_from_user(&bulk, arg, sizeof(bulk)))
655679
return -EFAULT;
@@ -674,10 +698,18 @@ static int proc_bulk(struct dev_state *ps, void __user *arg)
674698
kfree(tbuf);
675699
return -EINVAL;
676700
}
701+
snoop(&dev->dev, "bulk read: len=0x%02x timeout=%04d\n",
702+
bulk.len, bulk.timeout);
677703
usb_unlock_device(dev);
678704
i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo);
679705
usb_lock_device(dev);
680706
if (!i && len2) {
707+
if (usbfs_snoop) {
708+
dev_info(&dev->dev, "bulk read: data ");
709+
for (j = 0; j < len2; ++j)
710+
printk("%02x ", (unsigned char)(tbuf)[j]);
711+
printk("\n");
712+
}
681713
if (copy_to_user(bulk.data, tbuf, len2)) {
682714
kfree(tbuf);
683715
return -EFAULT;
@@ -690,6 +722,14 @@ static int proc_bulk(struct dev_state *ps, void __user *arg)
690722
return -EFAULT;
691723
}
692724
}
725+
snoop(&dev->dev, "bulk write: len=0x%02x timeout=%04d\n",
726+
bulk.len, bulk.timeout);
727+
if (usbfs_snoop) {
728+
dev_info(&dev->dev, "bulk write: data: ");
729+
for (j = 0; j < len1; ++j)
730+
printk("%02x ", (unsigned char)(tbuf)[j]);
731+
printk("\n");
732+
}
693733
usb_unlock_device(dev);
694734
i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo);
695735
usb_lock_device(dev);
@@ -835,7 +875,6 @@ static int proc_setconfig(struct dev_state *ps, void __user *arg)
835875
return status;
836876
}
837877

838-
839878
static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
840879
struct usbdevfs_iso_packet_desc __user *iso_frame_desc,
841880
void __user *arg)
@@ -896,6 +935,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
896935
kfree(dr);
897936
return -EFAULT;
898937
}
938+
snoop(&ps->dev->dev, "control urb\n");
899939
break;
900940

901941
case USBDEVFS_URB_TYPE_BULK:
@@ -910,6 +950,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
910950
return -EINVAL;
911951
if (!access_ok((uurb->endpoint & USB_DIR_IN) ? VERIFY_WRITE : VERIFY_READ, uurb->buffer, uurb->buffer_length))
912952
return -EFAULT;
953+
snoop(&ps->dev->dev, "bulk urb\n");
913954
break;
914955

915956
case USBDEVFS_URB_TYPE_ISO:
@@ -939,6 +980,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
939980
return -EINVAL;
940981
}
941982
uurb->buffer_length = totlen;
983+
snoop(&ps->dev->dev, "iso urb\n");
942984
break;
943985

944986
case USBDEVFS_URB_TYPE_INTERRUPT:
@@ -954,6 +996,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
954996
return -EINVAL;
955997
if (!access_ok((uurb->endpoint & USB_DIR_IN) ? VERIFY_WRITE : VERIFY_READ, uurb->buffer, uurb->buffer_length))
956998
return -EFAULT;
999+
snoop(&ps->dev->dev, "interrupt urb\n");
9571000
break;
9581001

9591002
default:
@@ -1003,6 +1046,8 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
10031046
return -EFAULT;
10041047
}
10051048
}
1049+
snoop(&as->urb->dev->dev, "submit urb\n");
1050+
snoop_urb(as->urb, as->userurb);
10061051
async_newpending(as);
10071052
if ((ret = usb_submit_urb(as->urb, GFP_KERNEL))) {
10081053
dev_printk(KERN_DEBUG, &ps->dev->dev, "usbfs: usb_submit_urb returned %d\n", ret);

0 commit comments

Comments
 (0)