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