cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rndis_host.h (6166B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Host Side support for RNDIS Networking Links
      4 * Copyright (C) 2005 by David Brownell
      5 *
      6 * This program is free software; you can redistribute it and/or modify
      7 * it under the terms of the GNU General Public License as published by
      8 * the Free Software Foundation; either version 2 of the License, or
      9 * (at your option) any later version.
     10 *
     11 * This program is distributed in the hope that it will be useful,
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 * GNU General Public License for more details.
     15 *
     16 * You should have received a copy of the GNU General Public License
     17 * along with this program; if not, write to the Free Software
     18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     19 */
     20
     21#ifndef	__LINUX_USB_RNDIS_HOST_H
     22#define	__LINUX_USB_RNDIS_HOST_H
     23
     24#include <linux/rndis.h>
     25
     26/*
     27 * CONTROL uses CDC "encapsulated commands" with funky notifications.
     28 *  - control-out:  SEND_ENCAPSULATED
     29 *  - interrupt-in:  RESPONSE_AVAILABLE
     30 *  - control-in:  GET_ENCAPSULATED
     31 *
     32 * We'll try to ignore the RESPONSE_AVAILABLE notifications.
     33 *
     34 * REVISIT some RNDIS implementations seem to have curious issues still
     35 * to be resolved.
     36 */
     37struct rndis_msg_hdr {
     38	__le32	msg_type;			/* RNDIS_MSG_* */
     39	__le32	msg_len;
     40	/* followed by data that varies between messages */
     41	__le32	request_id;
     42	__le32	status;
     43	/* ... and more */
     44} __attribute__ ((packed));
     45
     46/* MS-Windows uses this strange size, but RNDIS spec says 1024 minimum */
     47#define	CONTROL_BUFFER_SIZE		1025
     48
     49/* RNDIS defines an (absurdly huge) 10 second control timeout,
     50 * but ActiveSync seems to use a more usual 5 second timeout
     51 * (which matches the USB 2.0 spec).
     52 */
     53#define	RNDIS_CONTROL_TIMEOUT_MS	(5 * 1000)
     54
     55struct rndis_data_hdr {
     56	__le32	msg_type;		/* RNDIS_MSG_PACKET */
     57	__le32	msg_len;		/* rndis_data_hdr + data_len + pad */
     58	__le32	data_offset;		/* 36 -- right after header */
     59	__le32	data_len;		/* ... real packet size */
     60
     61	__le32	oob_data_offset;	/* zero */
     62	__le32	oob_data_len;		/* zero */
     63	__le32	num_oob;		/* zero */
     64	__le32	packet_data_offset;	/* zero */
     65
     66	__le32	packet_data_len;	/* zero */
     67	__le32	vc_handle;		/* zero */
     68	__le32	reserved;		/* zero */
     69} __attribute__ ((packed));
     70
     71struct rndis_init {		/* OUT */
     72	/* header and: */
     73	__le32	msg_type;			/* RNDIS_MSG_INIT */
     74	__le32	msg_len;			/* 24 */
     75	__le32	request_id;
     76	__le32	major_version;			/* of rndis (1.0) */
     77	__le32	minor_version;
     78	__le32	max_transfer_size;
     79} __attribute__ ((packed));
     80
     81struct rndis_init_c {		/* IN */
     82	/* header and: */
     83	__le32	msg_type;			/* RNDIS_MSG_INIT_C */
     84	__le32	msg_len;
     85	__le32	request_id;
     86	__le32	status;
     87	__le32	major_version;			/* of rndis (1.0) */
     88	__le32	minor_version;
     89	__le32	device_flags;
     90	__le32	medium;				/* zero == 802.3 */
     91	__le32	max_packets_per_message;
     92	__le32	max_transfer_size;
     93	__le32	packet_alignment;		/* max 7; (1<<n) bytes */
     94	__le32	af_list_offset;			/* zero */
     95	__le32	af_list_size;			/* zero */
     96} __attribute__ ((packed));
     97
     98struct rndis_halt {		/* OUT (no reply) */
     99	/* header and: */
    100	__le32	msg_type;			/* RNDIS_MSG_HALT */
    101	__le32	msg_len;
    102	__le32	request_id;
    103} __attribute__ ((packed));
    104
    105struct rndis_query {		/* OUT */
    106	/* header and: */
    107	__le32	msg_type;			/* RNDIS_MSG_QUERY */
    108	__le32	msg_len;
    109	__le32	request_id;
    110	__le32	oid;
    111	__le32	len;
    112	__le32	offset;
    113/*?*/	__le32	handle;				/* zero */
    114} __attribute__ ((packed));
    115
    116struct rndis_query_c {		/* IN */
    117	/* header and: */
    118	__le32	msg_type;			/* RNDIS_MSG_QUERY_C */
    119	__le32	msg_len;
    120	__le32	request_id;
    121	__le32	status;
    122	__le32	len;
    123	__le32	offset;
    124} __attribute__ ((packed));
    125
    126struct rndis_set {		/* OUT */
    127	/* header and: */
    128	__le32	msg_type;			/* RNDIS_MSG_SET */
    129	__le32	msg_len;
    130	__le32	request_id;
    131	__le32	oid;
    132	__le32	len;
    133	__le32	offset;
    134/*?*/	__le32	handle;				/* zero */
    135} __attribute__ ((packed));
    136
    137struct rndis_set_c {		/* IN */
    138	/* header and: */
    139	__le32	msg_type;			/* RNDIS_MSG_SET_C */
    140	__le32	msg_len;
    141	__le32	request_id;
    142	__le32	status;
    143} __attribute__ ((packed));
    144
    145struct rndis_reset {		/* IN */
    146	/* header and: */
    147	__le32	msg_type;			/* RNDIS_MSG_RESET */
    148	__le32	msg_len;
    149	__le32	reserved;
    150} __attribute__ ((packed));
    151
    152struct rndis_reset_c {		/* OUT */
    153	/* header and: */
    154	__le32	msg_type;			/* RNDIS_MSG_RESET_C */
    155	__le32	msg_len;
    156	__le32	status;
    157	__le32	addressing_lost;
    158} __attribute__ ((packed));
    159
    160struct rndis_indicate {		/* IN (unrequested) */
    161	/* header and: */
    162	__le32	msg_type;			/* RNDIS_MSG_INDICATE */
    163	__le32	msg_len;
    164	__le32	status;
    165	__le32	length;
    166	__le32	offset;
    167/**/	__le32	diag_status;
    168	__le32	error_offset;
    169/**/	__le32	message;
    170} __attribute__ ((packed));
    171
    172struct rndis_keepalive {	/* OUT (optionally IN) */
    173	/* header and: */
    174	__le32	msg_type;			/* RNDIS_MSG_KEEPALIVE */
    175	__le32	msg_len;
    176	__le32	request_id;
    177} __attribute__ ((packed));
    178
    179struct rndis_keepalive_c {	/* IN (optionally OUT) */
    180	/* header and: */
    181	__le32	msg_type;			/* RNDIS_MSG_KEEPALIVE_C */
    182	__le32	msg_len;
    183	__le32	request_id;
    184	__le32	status;
    185} __attribute__ ((packed));
    186
    187/* default filter used with RNDIS devices */
    188#define RNDIS_DEFAULT_FILTER ( \
    189	RNDIS_PACKET_TYPE_DIRECTED | \
    190	RNDIS_PACKET_TYPE_BROADCAST | \
    191	RNDIS_PACKET_TYPE_ALL_MULTICAST | \
    192	RNDIS_PACKET_TYPE_PROMISCUOUS)
    193
    194/* Flags to require specific physical medium type for generic_rndis_bind() */
    195#define FLAG_RNDIS_PHYM_NOT_WIRELESS	0x0001
    196#define FLAG_RNDIS_PHYM_WIRELESS	0x0002
    197
    198/* Flags for driver_info::data */
    199#define RNDIS_DRIVER_DATA_POLL_STATUS	1	/* poll status before control */
    200#define RNDIS_DRIVER_DATA_DST_MAC_FIXUP	2	/* device ignores configured MAC address */
    201
    202extern void rndis_status(struct usbnet *dev, struct urb *urb);
    203extern int
    204rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen);
    205extern int
    206generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags);
    207extern void rndis_unbind(struct usbnet *dev, struct usb_interface *intf);
    208extern int rndis_rx_fixup(struct usbnet *dev, struct sk_buff *skb);
    209extern struct sk_buff *
    210rndis_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags);
    211
    212#endif	/* __LINUX_USB_RNDIS_HOST_H */