About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / usb / usbmon.txt




Custom Search

Based on kernel version 2.6.34. Page generated on 2010-05-31 16:03 EST.

1	* Introduction
2	
3	The name "usbmon" in lowercase refers to a facility in kernel which is
4	used to collect traces of I/O on the USB bus. This function is analogous
5	to a packet socket used by network monitoring tools such as tcpdump(1)
6	or Ethereal. Similarly, it is expected that a tool such as usbdump or
7	USBMon (with uppercase letters) is used to examine raw traces produced
8	by usbmon.
9	
10	The usbmon reports requests made by peripheral-specific drivers to Host
11	Controller Drivers (HCD). So, if HCD is buggy, the traces reported by
12	usbmon may not correspond to bus transactions precisely. This is the same
13	situation as with tcpdump.
14	
15	* How to use usbmon to collect raw text traces
16	
17	Unlike the packet socket, usbmon has an interface which provides traces
18	in a text format. This is used for two purposes. First, it serves as a
19	common trace exchange format for tools while more sophisticated formats
20	are finalized. Second, humans can read it in case tools are not available.
21	
22	To collect a raw text trace, execute following steps.
23	
24	1. Prepare
25	
26	Mount debugfs (it has to be enabled in your kernel configuration), and
27	load the usbmon module (if built as module). The second step is skipped
28	if usbmon is built into the kernel.
29	
30	# mount -t debugfs none_debugs /sys/kernel/debug
31	# modprobe usbmon
32	#
33	
34	Verify that bus sockets are present.
35	
36	# ls /sys/kernel/debug/usb/usbmon
37	0s  0u  1s  1t  1u  2s  2t  2u  3s  3t  3u  4s  4t  4u
38	#
39	
40	Now you can choose to either use the socket '0u' (to capture packets on all
41	buses), and skip to step #3, or find the bus used by your device with step #2.
42	This allows to filter away annoying devices that talk continuously.
43	
44	2. Find which bus connects to the desired device
45	
46	Run "cat /proc/bus/usb/devices", and find the T-line which corresponds to
47	the device. Usually you do it by looking for the vendor string. If you have
48	many similar devices, unplug one and compare two /proc/bus/usb/devices outputs.
49	The T-line will have a bus number. Example:
50	
51	T:  Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=12  MxCh= 0
52	D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
53	P:  Vendor=0557 ProdID=2004 Rev= 1.00
54	S:  Manufacturer=ATEN
55	S:  Product=UC100KM V2.00
56	
57	Bus=03 means it's bus 3.
58	
59	3. Start 'cat'
60	
61	# cat /sys/kernel/debug/usb/usbmon/3u > /tmp/1.mon.out
62	
63	to listen on a single bus, otherwise, to listen on all buses, type:
64	
65	# cat /sys/kernel/debug/usb/usbmon/0u > /tmp/1.mon.out
66	
67	This process will be reading until killed. Naturally, the output can be
68	redirected to a desirable location. This is preferred, because it is going
69	to be quite long.
70	
71	4. Perform the desired operation on the USB bus
72	
73	This is where you do something that creates the traffic: plug in a flash key,
74	copy files, control a webcam, etc.
75	
76	5. Kill cat
77	
78	Usually it's done with a keyboard interrupt (Control-C).
79	
80	At this point the output file (/tmp/1.mon.out in this example) can be saved,
81	sent by e-mail, or inspected with a text editor. In the last case make sure
82	that the file size is not excessive for your favourite editor.
83	
84	* Raw text data format
85	
86	Two formats are supported currently: the original, or '1t' format, and
87	the '1u' format. The '1t' format is deprecated in kernel 2.6.21. The '1u'
88	format adds a few fields, such as ISO frame descriptors, interval, etc.
89	It produces slightly longer lines, but otherwise is a perfect superset
90	of '1t' format.
91	
92	If it is desired to recognize one from the other in a program, look at the
93	"address" word (see below), where '1u' format adds a bus number. If 2 colons
94	are present, it's the '1t' format, otherwise '1u'.
95	
96	Any text format data consists of a stream of events, such as URB submission,
97	URB callback, submission error. Every event is a text line, which consists
98	of whitespace separated words. The number or position of words may depend
99	on the event type, but there is a set of words, common for all types.
100	
101	Here is the list of words, from left to right:
102	
103	- URB Tag. This is used to identify URBs, and is normally an in-kernel address
104	  of the URB structure in hexadecimal, but can be a sequence number or any
105	  other unique string, within reason.
106	
107	- Timestamp in microseconds, a decimal number. The timestamp's resolution
108	  depends on available clock, and so it can be much worse than a microsecond
109	  (if the implementation uses jiffies, for example).
110	
111	- Event Type. This type refers to the format of the event, not URB type.
112	  Available types are: S - submission, C - callback, E - submission error.
113	
114	- "Address" word (formerly a "pipe"). It consists of four fields, separated by
115	  colons: URB type and direction, Bus number, Device address, Endpoint number.
116	  Type and direction are encoded with two bytes in the following manner:
117	    Ci Co   Control input and output
118	    Zi Zo   Isochronous input and output
119	    Ii Io   Interrupt input and output
120	    Bi Bo   Bulk input and output
121	  Bus number, Device address, and Endpoint are decimal numbers, but they may
122	  have leading zeros, for the sake of human readers.
123	
124	- URB Status word. This is either a letter, or several numbers separated
125	  by colons: URB status, interval, start frame, and error count. Unlike the
126	  "address" word, all fields save the status are optional. Interval is printed
127	  only for interrupt and isochronous URBs. Start frame is printed only for
128	  isochronous URBs. Error count is printed only for isochronous callback
129	  events.
130	
131	  The status field is a decimal number, sometimes negative, which represents
132	  a "status" field of the URB. This field makes no sense for submissions, but
133	  is present anyway to help scripts with parsing. When an error occurs, the
134	  field contains the error code.
135	
136	  In case of a submission of a Control packet, this field contains a Setup Tag
137	  instead of an group of numbers. It is easy to tell whether the Setup Tag is
138	  present because it is never a number. Thus if scripts find a set of numbers
139	  in this word, they proceed to read Data Length (except for isochronous URBs).
140	  If they find something else, like a letter, they read the setup packet before
141	  reading the Data Length or isochronous descriptors.
142	
143	- Setup packet, if present, consists of 5 words: one of each for bmRequestType,
144	  bRequest, wValue, wIndex, wLength, as specified by the USB Specification 2.0.
145	  These words are safe to decode if Setup Tag was 's'. Otherwise, the setup
146	  packet was present, but not captured, and the fields contain filler.
147	
148	- Number of isochronous frame descriptors and descriptors themselves.
149	  If an Isochronous transfer event has a set of descriptors, a total number
150	  of them in an URB is printed first, then a word per descriptor, up to a
151	  total of 5. The word consists of 3 colon-separated decimal numbers for
152	  status, offset, and length respectively. For submissions, initial length
153	  is reported. For callbacks, actual length is reported.
154	
155	- Data Length. For submissions, this is the requested length. For callbacks,
156	  this is the actual length.
157	
158	- Data tag. The usbmon may not always capture data, even if length is nonzero.
159	  The data words are present only if this tag is '='.
160	
161	- Data words follow, in big endian hexadecimal format. Notice that they are
162	  not machine words, but really just a byte stream split into words to make
163	  it easier to read. Thus, the last word may contain from one to four bytes.
164	  The length of collected data is limited and can be less than the data length
165	  report in Data Length word.
166	
167	Here is an example of code to read the data stream in a well known programming
168	language:
169	
170	class ParsedLine {
171		int data_len;		/* Available length of data */
172		byte data[];
173	
174		void parseData(StringTokenizer st) {
175			int availwords = st.countTokens();
176			data = new byte[availwords * 4];
177			data_len = 0;
178			while (st.hasMoreTokens()) {
179				String data_str = st.nextToken();
180				int len = data_str.length() / 2;
181				int i;
182				int b;	// byte is signed, apparently?! XXX
183				for (i = 0; i < len; i++) {
184					// data[data_len] = Byte.parseByte(
185					//     data_str.substring(i*2, i*2 + 2),
186					//     16);
187					b = Integer.parseInt(
188					     data_str.substring(i*2, i*2 + 2),
189					     16);
190					if (b >= 128)
191						b *= -1;
192					data[data_len] = (byte) b;
193					data_len++;
194				}
195			}
196		}
197	}
198	
199	Examples:
200	
201	An input control transfer to get a port status.
202	
203	d5ea89a0 3575914555 S Ci:1:001:0 s a3 00 0000 0003 0004 4 <
204	d5ea89a0 3575914560 C Ci:1:001:0 0 4 = 01050000
205	
206	An output bulk transfer to send a SCSI command 0x5E in a 31-byte Bulk wrapper
207	to a storage device at address 5:
208	
209	dd65f0e8 4128379752 S Bo:1:005:2 -115 31 = 55534243 5e000000 00000000 00000600 00000000 00000000 00000000 000000
210	dd65f0e8 4128379808 C Bo:1:005:2 0 31 >
211	
212	* Raw binary format and API
213	
214	The overall architecture of the API is about the same as the one above,
215	only the events are delivered in binary format. Each event is sent in
216	the following structure (its name is made up, so that we can refer to it):
217	
218	struct usbmon_packet {
219		u64 id;			/*  0: URB ID - from submission to callback */
220		unsigned char type;	/*  8: Same as text; extensible. */
221		unsigned char xfer_type; /*    ISO (0), Intr, Control, Bulk (3) */
222		unsigned char epnum;	/*     Endpoint number and transfer direction */
223		unsigned char devnum;	/*     Device address */
224		u16 busnum;		/* 12: Bus number */
225		char flag_setup;	/* 14: Same as text */
226		char flag_data;		/* 15: Same as text; Binary zero is OK. */
227		s64 ts_sec;		/* 16: gettimeofday */
228		s32 ts_usec;		/* 24: gettimeofday */
229		int status;		/* 28: */
230		unsigned int length;	/* 32: Length of data (submitted or actual) */
231		unsigned int len_cap;	/* 36: Delivered length */
232		union {			/* 40: */
233			unsigned char setup[SETUP_LEN];	/* Only for Control S-type */
234			struct iso_rec {		/* Only for ISO */
235				int error_count;
236				int numdesc;
237			} iso;
238		} s;
239		int interval;		/* 48: Only for Interrupt and ISO */
240		int start_frame;	/* 52: For ISO */
241		unsigned int xfer_flags; /* 56: copy of URB's transfer_flags */
242		unsigned int ndesc;	/* 60: Actual number of ISO descriptors */
243	};				/* 64 total length */
244	
245	These events can be received from a character device by reading with read(2),
246	with an ioctl(2), or by accessing the buffer with mmap. However, read(2)
247	only returns first 48 bytes for compatibility reasons.
248	
249	The character device is usually called /dev/usbmonN, where N is the USB bus
250	number. Number zero (/dev/usbmon0) is special and means "all buses".
251	Note that specific naming policy is set by your Linux distribution.
252	
253	If you create /dev/usbmon0 by hand, make sure that it is owned by root
254	and has mode 0600. Otherwise, unpriviledged users will be able to snoop
255	keyboard traffic.
256	
257	The following ioctl calls are available, with MON_IOC_MAGIC 0x92:
258	
259	 MON_IOCQ_URB_LEN, defined as _IO(MON_IOC_MAGIC, 1)
260	
261	This call returns the length of data in the next event. Note that majority of
262	events contain no data, so if this call returns zero, it does not mean that
263	no events are available.
264	
265	 MON_IOCG_STATS, defined as _IOR(MON_IOC_MAGIC, 3, struct mon_bin_stats)
266	
267	The argument is a pointer to the following structure:
268	
269	struct mon_bin_stats {
270		u32 queued;
271		u32 dropped;
272	};
273	
274	The member "queued" refers to the number of events currently queued in the
275	buffer (and not to the number of events processed since the last reset).
276	
277	The member "dropped" is the number of events lost since the last call
278	to MON_IOCG_STATS.
279	
280	 MON_IOCT_RING_SIZE, defined as _IO(MON_IOC_MAGIC, 4)
281	
282	This call sets the buffer size. The argument is the size in bytes.
283	The size may be rounded down to the next chunk (or page). If the requested
284	size is out of [unspecified] bounds for this kernel, the call fails with
285	-EINVAL.
286	
287	 MON_IOCQ_RING_SIZE, defined as _IO(MON_IOC_MAGIC, 5)
288	
289	This call returns the current size of the buffer in bytes.
290	
291	 MON_IOCX_GET, defined as _IOW(MON_IOC_MAGIC, 6, struct mon_get_arg)
292	 MON_IOCX_GETX, defined as _IOW(MON_IOC_MAGIC, 10, struct mon_get_arg)
293	
294	These calls wait for events to arrive if none were in the kernel buffer,
295	then return the first event. The argument is a pointer to the following
296	structure:
297	
298	struct mon_get_arg {
299		struct usbmon_packet *hdr;
300		void *data;
301		size_t alloc;		/* Length of data (can be zero) */
302	};
303	
304	Before the call, hdr, data, and alloc should be filled. Upon return, the area
305	pointed by hdr contains the next event structure, and the data buffer contains
306	the data, if any. The event is removed from the kernel buffer.
307	
308	The MON_IOCX_GET copies 48 bytes to hdr area, MON_IOCX_GETX copies 64 bytes.
309	
310	 MON_IOCX_MFETCH, defined as _IOWR(MON_IOC_MAGIC, 7, struct mon_mfetch_arg)
311	
312	This ioctl is primarily used when the application accesses the buffer
313	with mmap(2). Its argument is a pointer to the following structure:
314	
315	struct mon_mfetch_arg {
316		uint32_t *offvec;	/* Vector of events fetched */
317		uint32_t nfetch;	/* Number of events to fetch (out: fetched) */
318		uint32_t nflush;	/* Number of events to flush */
319	};
320	
321	The ioctl operates in 3 stages.
322	
323	First, it removes and discards up to nflush events from the kernel buffer.
324	The actual number of events discarded is returned in nflush.
325	
326	Second, it waits for an event to be present in the buffer, unless the pseudo-
327	device is open with O_NONBLOCK.
328	
329	Third, it extracts up to nfetch offsets into the mmap buffer, and stores
330	them into the offvec. The actual number of event offsets is stored into
331	the nfetch.
332	
333	 MON_IOCH_MFLUSH, defined as _IO(MON_IOC_MAGIC, 8)
334	
335	This call removes a number of events from the kernel buffer. Its argument
336	is the number of events to remove. If the buffer contains fewer events
337	than requested, all events present are removed, and no error is reported.
338	This works when no events are available too.
339	
340	 FIONBIO
341	
342	The ioctl FIONBIO may be implemented in the future, if there's a need.
343	
344	In addition to ioctl(2) and read(2), the special file of binary API can
345	be polled with select(2) and poll(2). But lseek(2) does not work.
346	
347	* Memory-mapped access of the kernel buffer for the binary API
348	
349	The basic idea is simple:
350	
351	To prepare, map the buffer by getting the current size, then using mmap(2).
352	Then, execute a loop similar to the one written in pseudo-code below:
353	
354	   struct mon_mfetch_arg fetch;
355	   struct usbmon_packet *hdr;
356	   int nflush = 0;
357	   for (;;) {
358	      fetch.offvec = vec; // Has N 32-bit words
359	      fetch.nfetch = N;   // Or less than N
360	      fetch.nflush = nflush;
361	      ioctl(fd, MON_IOCX_MFETCH, &fetch);   // Process errors, too
362	      nflush = fetch.nfetch;       // This many packets to flush when done
363	      for (i = 0; i < nflush; i++) {
364	         hdr = (struct ubsmon_packet *) &mmap_area[vec[i]];
365	         if (hdr->type == '@')     // Filler packet
366	            continue;
367	         caddr_t data = &mmap_area[vec[i]] + 64;
368	         process_packet(hdr, data);
369	      }
370	   }
371	
372	Thus, the main idea is to execute only one ioctl per N events.
373	
374	Although the buffer is circular, the returned headers and data do not cross
375	the end of the buffer, so the above pseudo-code does not need any gathering.
Hide Line Numbers
About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Information is copyright its respective author. All material is available from the Linux Kernel Source distributed under a GPL License. This page is provided as a free service by mjmwired.net.