1/*
2 * Copyright (C) 2003-2008 Takahiro Hirofuchi
3 *
4 * This is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
17 * USA.
18 */
19
20#ifndef __USBIP_COMMON_H
21#define __USBIP_COMMON_H
22
23#include <linux/compiler.h>
24#include <linux/device.h>
25#include <linux/interrupt.h>
26#include <linux/net.h>
27#include <linux/printk.h>
28#include <linux/spinlock.h>
29#include <linux/types.h>
30#include <linux/usb.h>
31#include <linux/wait.h>
32
33#define USBIP_VERSION "1.0.0"
34
35#undef pr_fmt
36
37#ifdef DEBUG
38#define pr_fmt(fmt)     KBUILD_MODNAME ": %s:%d: " fmt, __func__, __LINE__
39#else
40#define pr_fmt(fmt)     KBUILD_MODNAME ": " fmt
41#endif
42
43enum {
44	usbip_debug_xmit	= (1 << 0),
45	usbip_debug_sysfs	= (1 << 1),
46	usbip_debug_urb		= (1 << 2),
47	usbip_debug_eh		= (1 << 3),
48
49	usbip_debug_stub_cmp	= (1 << 8),
50	usbip_debug_stub_dev	= (1 << 9),
51	usbip_debug_stub_rx	= (1 << 10),
52	usbip_debug_stub_tx	= (1 << 11),
53
54	usbip_debug_vhci_rh	= (1 << 8),
55	usbip_debug_vhci_hc	= (1 << 9),
56	usbip_debug_vhci_rx	= (1 << 10),
57	usbip_debug_vhci_tx	= (1 << 11),
58	usbip_debug_vhci_sysfs  = (1 << 12)
59};
60
61#define usbip_dbg_flag_xmit	(usbip_debug_flag & usbip_debug_xmit)
62#define usbip_dbg_flag_vhci_rh	(usbip_debug_flag & usbip_debug_vhci_rh)
63#define usbip_dbg_flag_vhci_hc	(usbip_debug_flag & usbip_debug_vhci_hc)
64#define usbip_dbg_flag_vhci_rx	(usbip_debug_flag & usbip_debug_vhci_rx)
65#define usbip_dbg_flag_vhci_tx	(usbip_debug_flag & usbip_debug_vhci_tx)
66#define usbip_dbg_flag_stub_rx	(usbip_debug_flag & usbip_debug_stub_rx)
67#define usbip_dbg_flag_stub_tx	(usbip_debug_flag & usbip_debug_stub_tx)
68#define usbip_dbg_flag_vhci_sysfs  (usbip_debug_flag & usbip_debug_vhci_sysfs)
69
70extern unsigned long usbip_debug_flag;
71extern struct device_attribute dev_attr_usbip_debug;
72
73#define usbip_dbg_with_flag(flag, fmt, args...)		\
74	do {						\
75		if (flag & usbip_debug_flag)		\
76			pr_debug(fmt, ##args);		\
77	} while (0)
78
79#define usbip_dbg_sysfs(fmt, args...) \
80	usbip_dbg_with_flag(usbip_debug_sysfs, fmt , ##args)
81#define usbip_dbg_xmit(fmt, args...) \
82	usbip_dbg_with_flag(usbip_debug_xmit, fmt , ##args)
83#define usbip_dbg_urb(fmt, args...) \
84	usbip_dbg_with_flag(usbip_debug_urb, fmt , ##args)
85#define usbip_dbg_eh(fmt, args...) \
86	usbip_dbg_with_flag(usbip_debug_eh, fmt , ##args)
87
88#define usbip_dbg_vhci_rh(fmt, args...)	\
89	usbip_dbg_with_flag(usbip_debug_vhci_rh, fmt , ##args)
90#define usbip_dbg_vhci_hc(fmt, args...)	\
91	usbip_dbg_with_flag(usbip_debug_vhci_hc, fmt , ##args)
92#define usbip_dbg_vhci_rx(fmt, args...)	\
93	usbip_dbg_with_flag(usbip_debug_vhci_rx, fmt , ##args)
94#define usbip_dbg_vhci_tx(fmt, args...)	\
95	usbip_dbg_with_flag(usbip_debug_vhci_tx, fmt , ##args)
96#define usbip_dbg_vhci_sysfs(fmt, args...) \
97	usbip_dbg_with_flag(usbip_debug_vhci_sysfs, fmt , ##args)
98
99#define usbip_dbg_stub_cmp(fmt, args...) \
100	usbip_dbg_with_flag(usbip_debug_stub_cmp, fmt , ##args)
101#define usbip_dbg_stub_rx(fmt, args...) \
102	usbip_dbg_with_flag(usbip_debug_stub_rx, fmt , ##args)
103#define usbip_dbg_stub_tx(fmt, args...) \
104	usbip_dbg_with_flag(usbip_debug_stub_tx, fmt , ##args)
105
106/*
107 * USB/IP request headers
108 *
109 * Each request is transferred across the network to its counterpart, which
110 * facilitates the normal USB communication. The values contained in the headers
111 * are basically the same as in a URB. Currently, four request types are
112 * defined:
113 *
114 *  - USBIP_CMD_SUBMIT: a USB request block, corresponds to usb_submit_urb()
115 *    (client to server)
116 *
117 *  - USBIP_RET_SUBMIT: the result of USBIP_CMD_SUBMIT
118 *    (server to client)
119 *
120 *  - USBIP_CMD_UNLINK: an unlink request of a pending USBIP_CMD_SUBMIT,
121 *    corresponds to usb_unlink_urb()
122 *    (client to server)
123 *
124 *  - USBIP_RET_UNLINK: the result of USBIP_CMD_UNLINK
125 *    (server to client)
126 *
127 */
128#define USBIP_CMD_SUBMIT	0x0001
129#define USBIP_CMD_UNLINK	0x0002
130#define USBIP_RET_SUBMIT	0x0003
131#define USBIP_RET_UNLINK	0x0004
132
133#define USBIP_DIR_OUT	0x00
134#define USBIP_DIR_IN	0x01
135
136/**
137 * struct usbip_header_basic - data pertinent to every request
138 * @command: the usbip request type
139 * @seqnum: sequential number that identifies requests; incremented per
140 *	    connection
141 * @devid: specifies a remote USB device uniquely instead of busnum and devnum;
142 *	   in the stub driver, this value is ((busnum << 16) | devnum)
143 * @direction: direction of the transfer
144 * @ep: endpoint number
145 */
146struct usbip_header_basic {
147	__u32 command;
148	__u32 seqnum;
149	__u32 devid;
150	__u32 direction;
151	__u32 ep;
152} __packed;
153
154/**
155 * struct usbip_header_cmd_submit - USBIP_CMD_SUBMIT packet header
156 * @transfer_flags: URB flags
157 * @transfer_buffer_length: the data size for (in) or (out) transfer
158 * @start_frame: initial frame for isochronous or interrupt transfers
159 * @number_of_packets: number of isochronous packets
160 * @interval: maximum time for the request on the server-side host controller
161 * @setup: setup data for a control request
162 */
163struct usbip_header_cmd_submit {
164	__u32 transfer_flags;
165	__s32 transfer_buffer_length;
166
167	/* it is difficult for usbip to sync frames (reserved only?) */
168	__s32 start_frame;
169	__s32 number_of_packets;
170	__s32 interval;
171
172	unsigned char setup[8];
173} __packed;
174
175/**
176 * struct usbip_header_ret_submit - USBIP_RET_SUBMIT packet header
177 * @status: return status of a non-iso request
178 * @actual_length: number of bytes transferred
179 * @start_frame: initial frame for isochronous or interrupt transfers
180 * @number_of_packets: number of isochronous packets
181 * @error_count: number of errors for isochronous transfers
182 */
183struct usbip_header_ret_submit {
184	__s32 status;
185	__s32 actual_length;
186	__s32 start_frame;
187	__s32 number_of_packets;
188	__s32 error_count;
189} __packed;
190
191/**
192 * struct usbip_header_cmd_unlink - USBIP_CMD_UNLINK packet header
193 * @seqnum: the URB seqnum to unlink
194 */
195struct usbip_header_cmd_unlink {
196	__u32 seqnum;
197} __packed;
198
199/**
200 * struct usbip_header_ret_unlink - USBIP_RET_UNLINK packet header
201 * @status: return status of the request
202 */
203struct usbip_header_ret_unlink {
204	__s32 status;
205} __packed;
206
207/**
208 * struct usbip_header - common header for all usbip packets
209 * @base: the basic header
210 * @u: packet type dependent header
211 */
212struct usbip_header {
213	struct usbip_header_basic base;
214
215	union {
216		struct usbip_header_cmd_submit	cmd_submit;
217		struct usbip_header_ret_submit	ret_submit;
218		struct usbip_header_cmd_unlink	cmd_unlink;
219		struct usbip_header_ret_unlink	ret_unlink;
220	} u;
221} __packed;
222
223/*
224 * This is the same as usb_iso_packet_descriptor but packed for pdu.
225 */
226struct usbip_iso_packet_descriptor {
227	__u32 offset;
228	__u32 length;			/* expected length */
229	__u32 actual_length;
230	__u32 status;
231} __packed;
232
233enum usbip_side {
234	USBIP_VHCI,
235	USBIP_STUB,
236};
237
238enum usbip_status {
239	/* sdev is available. */
240	SDEV_ST_AVAILABLE = 0x01,
241	/* sdev is now used. */
242	SDEV_ST_USED,
243	/* sdev is unusable because of a fatal error. */
244	SDEV_ST_ERROR,
245
246	/* vdev does not connect a remote device. */
247	VDEV_ST_NULL,
248	/* vdev is used, but the USB address is not assigned yet */
249	VDEV_ST_NOTASSIGNED,
250	VDEV_ST_USED,
251	VDEV_ST_ERROR
252};
253
254/* event handler */
255#define USBIP_EH_SHUTDOWN	(1 << 0)
256#define USBIP_EH_BYE		(1 << 1)
257#define USBIP_EH_RESET		(1 << 2)
258#define USBIP_EH_UNUSABLE	(1 << 3)
259
260#define SDEV_EVENT_REMOVED   (USBIP_EH_SHUTDOWN | USBIP_EH_RESET | USBIP_EH_BYE)
261#define	SDEV_EVENT_DOWN		(USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
262#define	SDEV_EVENT_ERROR_TCP	(USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
263#define	SDEV_EVENT_ERROR_SUBMIT	(USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
264#define	SDEV_EVENT_ERROR_MALLOC	(USBIP_EH_SHUTDOWN | USBIP_EH_UNUSABLE)
265
266#define	VDEV_EVENT_REMOVED	(USBIP_EH_SHUTDOWN | USBIP_EH_BYE)
267#define	VDEV_EVENT_DOWN		(USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
268#define	VDEV_EVENT_ERROR_TCP	(USBIP_EH_SHUTDOWN | USBIP_EH_RESET)
269#define	VDEV_EVENT_ERROR_MALLOC	(USBIP_EH_SHUTDOWN | USBIP_EH_UNUSABLE)
270
271/* a common structure for stub_device and vhci_device */
272struct usbip_device {
273	enum usbip_side side;
274	enum usbip_status status;
275
276	/* lock for status */
277	spinlock_t lock;
278
279	struct socket *tcp_socket;
280
281	struct task_struct *tcp_rx;
282	struct task_struct *tcp_tx;
283
284	unsigned long event;
285	struct task_struct *eh;
286	wait_queue_head_t eh_waitq;
287
288	struct eh_ops {
289		void (*shutdown)(struct usbip_device *);
290		void (*reset)(struct usbip_device *);
291		void (*unusable)(struct usbip_device *);
292	} eh_ops;
293};
294
295/* usbip_common.c */
296void usbip_dump_urb(struct urb *purb);
297void usbip_dump_header(struct usbip_header *pdu);
298
299int usbip_recv(struct socket *sock, void *buf, int size);
300struct socket *sockfd_to_socket(unsigned int sockfd);
301
302void usbip_pack_pdu(struct usbip_header *pdu, struct urb *urb, int cmd,
303		    int pack);
304void usbip_header_correct_endian(struct usbip_header *pdu, int send);
305
306void *usbip_alloc_iso_desc_pdu(struct urb *urb, ssize_t *bufflen);
307/* some members of urb must be substituted before. */
308int usbip_recv_iso(struct usbip_device *ud, struct urb *urb);
309void usbip_pad_iso(struct usbip_device *ud, struct urb *urb);
310int usbip_recv_xbuff(struct usbip_device *ud, struct urb *urb);
311
312/* usbip_event.c */
313int usbip_start_eh(struct usbip_device *ud);
314void usbip_stop_eh(struct usbip_device *ud);
315void usbip_event_add(struct usbip_device *ud, unsigned long event);
316int usbip_event_happened(struct usbip_device *ud);
317
318static inline int interface_to_busnum(struct usb_interface *interface)
319{
320	struct usb_device *udev = interface_to_usbdev(interface);
321	return udev->bus->busnum;
322}
323
324static inline int interface_to_devnum(struct usb_interface *interface)
325{
326	struct usb_device *udev = interface_to_usbdev(interface);
327	return udev->devnum;
328}
329
330#endif /* __USBIP_COMMON_H */
331