xref: /linux/drivers/usb/gadget/function/rndis.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
12e759738SNishad Kamdar /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * RNDIS	Definitions for Remote NDIS
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Authors:	Benedikt Spranger, Pengutronix
61da177e4SLinus Torvalds  *		Robert Schwebel, Pengutronix
71da177e4SLinus Torvalds  *
81da177e4SLinus Torvalds  *		This software was originally developed in conformance with
91da177e4SLinus Torvalds  *		Microsoft's Remote NDIS Specification License Agreement.
101da177e4SLinus Torvalds  */
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds #ifndef _LINUX_RNDIS_H
131da177e4SLinus Torvalds #define _LINUX_RNDIS_H
141da177e4SLinus Torvalds 
157591157eSLinus Walleij #include <linux/rndis.h>
16cbbd14a9SAndrzej Pietrasiewicz #include "u_ether.h"
171da177e4SLinus Torvalds #include "ndis.h"
181da177e4SLinus Torvalds 
191da177e4SLinus Torvalds #define RNDIS_MAXIMUM_FRAME_SIZE	1518
201da177e4SLinus Torvalds #define RNDIS_MAX_TOTAL_SIZE		1558
211da177e4SLinus Torvalds 
2297f0117bSAnson Jacob typedef struct rndis_init_msg_type {
231da177e4SLinus Torvalds 	__le32	MessageType;
241da177e4SLinus Torvalds 	__le32	MessageLength;
251da177e4SLinus Torvalds 	__le32	RequestID;
261da177e4SLinus Torvalds 	__le32	MajorVersion;
271da177e4SLinus Torvalds 	__le32	MinorVersion;
281da177e4SLinus Torvalds 	__le32	MaxTransferSize;
291da177e4SLinus Torvalds } rndis_init_msg_type;
301da177e4SLinus Torvalds 
3197f0117bSAnson Jacob typedef struct rndis_init_cmplt_type {
321da177e4SLinus Torvalds 	__le32	MessageType;
331da177e4SLinus Torvalds 	__le32	MessageLength;
341da177e4SLinus Torvalds 	__le32	RequestID;
351da177e4SLinus Torvalds 	__le32	Status;
361da177e4SLinus Torvalds 	__le32	MajorVersion;
371da177e4SLinus Torvalds 	__le32	MinorVersion;
381da177e4SLinus Torvalds 	__le32	DeviceFlags;
391da177e4SLinus Torvalds 	__le32	Medium;
401da177e4SLinus Torvalds 	__le32	MaxPacketsPerTransfer;
411da177e4SLinus Torvalds 	__le32	MaxTransferSize;
421da177e4SLinus Torvalds 	__le32	PacketAlignmentFactor;
431da177e4SLinus Torvalds 	__le32	AFListOffset;
441da177e4SLinus Torvalds 	__le32	AFListSize;
451da177e4SLinus Torvalds } rndis_init_cmplt_type;
461da177e4SLinus Torvalds 
4797f0117bSAnson Jacob typedef struct rndis_halt_msg_type {
481da177e4SLinus Torvalds 	__le32	MessageType;
491da177e4SLinus Torvalds 	__le32	MessageLength;
501da177e4SLinus Torvalds 	__le32	RequestID;
511da177e4SLinus Torvalds } rndis_halt_msg_type;
521da177e4SLinus Torvalds 
5397f0117bSAnson Jacob typedef struct rndis_query_msg_type {
541da177e4SLinus Torvalds 	__le32	MessageType;
551da177e4SLinus Torvalds 	__le32	MessageLength;
561da177e4SLinus Torvalds 	__le32	RequestID;
571da177e4SLinus Torvalds 	__le32	OID;
581da177e4SLinus Torvalds 	__le32	InformationBufferLength;
591da177e4SLinus Torvalds 	__le32	InformationBufferOffset;
601da177e4SLinus Torvalds 	__le32	DeviceVcHandle;
611da177e4SLinus Torvalds } rndis_query_msg_type;
621da177e4SLinus Torvalds 
6397f0117bSAnson Jacob typedef struct rndis_query_cmplt_type {
641da177e4SLinus Torvalds 	__le32	MessageType;
651da177e4SLinus Torvalds 	__le32	MessageLength;
661da177e4SLinus Torvalds 	__le32	RequestID;
671da177e4SLinus Torvalds 	__le32	Status;
681da177e4SLinus Torvalds 	__le32	InformationBufferLength;
691da177e4SLinus Torvalds 	__le32	InformationBufferOffset;
701da177e4SLinus Torvalds } rndis_query_cmplt_type;
711da177e4SLinus Torvalds 
7297f0117bSAnson Jacob typedef struct rndis_set_msg_type {
731da177e4SLinus Torvalds 	__le32	MessageType;
741da177e4SLinus Torvalds 	__le32	MessageLength;
751da177e4SLinus Torvalds 	__le32	RequestID;
761da177e4SLinus Torvalds 	__le32	OID;
771da177e4SLinus Torvalds 	__le32	InformationBufferLength;
781da177e4SLinus Torvalds 	__le32	InformationBufferOffset;
791da177e4SLinus Torvalds 	__le32	DeviceVcHandle;
801da177e4SLinus Torvalds } rndis_set_msg_type;
811da177e4SLinus Torvalds 
8297f0117bSAnson Jacob typedef struct rndis_set_cmplt_type {
831da177e4SLinus Torvalds 	__le32	MessageType;
841da177e4SLinus Torvalds 	__le32	MessageLength;
851da177e4SLinus Torvalds 	__le32	RequestID;
861da177e4SLinus Torvalds 	__le32	Status;
871da177e4SLinus Torvalds } rndis_set_cmplt_type;
881da177e4SLinus Torvalds 
8997f0117bSAnson Jacob typedef struct rndis_reset_msg_type {
901da177e4SLinus Torvalds 	__le32	MessageType;
911da177e4SLinus Torvalds 	__le32	MessageLength;
921da177e4SLinus Torvalds 	__le32	Reserved;
931da177e4SLinus Torvalds } rndis_reset_msg_type;
941da177e4SLinus Torvalds 
9597f0117bSAnson Jacob typedef struct rndis_reset_cmplt_type {
961da177e4SLinus Torvalds 	__le32	MessageType;
971da177e4SLinus Torvalds 	__le32	MessageLength;
981da177e4SLinus Torvalds 	__le32	Status;
991da177e4SLinus Torvalds 	__le32	AddressingReset;
1001da177e4SLinus Torvalds } rndis_reset_cmplt_type;
1011da177e4SLinus Torvalds 
10297f0117bSAnson Jacob typedef struct rndis_indicate_status_msg_type {
1031da177e4SLinus Torvalds 	__le32	MessageType;
1041da177e4SLinus Torvalds 	__le32	MessageLength;
1051da177e4SLinus Torvalds 	__le32	Status;
1061da177e4SLinus Torvalds 	__le32	StatusBufferLength;
1071da177e4SLinus Torvalds 	__le32	StatusBufferOffset;
1081da177e4SLinus Torvalds } rndis_indicate_status_msg_type;
1091da177e4SLinus Torvalds 
11097f0117bSAnson Jacob typedef struct rndis_keepalive_msg_type {
1111da177e4SLinus Torvalds 	__le32	MessageType;
1121da177e4SLinus Torvalds 	__le32	MessageLength;
1131da177e4SLinus Torvalds 	__le32	RequestID;
1141da177e4SLinus Torvalds } rndis_keepalive_msg_type;
1151da177e4SLinus Torvalds 
11697f0117bSAnson Jacob typedef struct rndis_keepalive_cmplt_type {
1171da177e4SLinus Torvalds 	__le32	MessageType;
1181da177e4SLinus Torvalds 	__le32	MessageLength;
1191da177e4SLinus Torvalds 	__le32	RequestID;
1201da177e4SLinus Torvalds 	__le32	Status;
1211da177e4SLinus Torvalds } rndis_keepalive_cmplt_type;
1221da177e4SLinus Torvalds 
12397f0117bSAnson Jacob struct rndis_packet_msg_type {
1241da177e4SLinus Torvalds 	__le32	MessageType;
1251da177e4SLinus Torvalds 	__le32	MessageLength;
1261da177e4SLinus Torvalds 	__le32	DataOffset;
1271da177e4SLinus Torvalds 	__le32	DataLength;
1281da177e4SLinus Torvalds 	__le32	OOBDataOffset;
1291da177e4SLinus Torvalds 	__le32	OOBDataLength;
1301da177e4SLinus Torvalds 	__le32	NumOOBDataElements;
1311da177e4SLinus Torvalds 	__le32	PerPacketInfoOffset;
1321da177e4SLinus Torvalds 	__le32	PerPacketInfoLength;
1331da177e4SLinus Torvalds 	__le32	VcHandle;
1341da177e4SLinus Torvalds 	__le32	Reserved;
135178398dcSWu, Bryan } __attribute__ ((packed));
1361da177e4SLinus Torvalds 
13797f0117bSAnson Jacob struct rndis_config_parameter {
1381da177e4SLinus Torvalds 	__le32	ParameterNameOffset;
1391da177e4SLinus Torvalds 	__le32	ParameterNameLength;
1401da177e4SLinus Torvalds 	__le32	ParameterType;
1411da177e4SLinus Torvalds 	__le32	ParameterValueOffset;
1421da177e4SLinus Torvalds 	__le32	ParameterValueLength;
1431da177e4SLinus Torvalds };
1441da177e4SLinus Torvalds 
1451da177e4SLinus Torvalds /* implementation specific */
14697f0117bSAnson Jacob enum rndis_state {
1471da177e4SLinus Torvalds 	RNDIS_UNINITIALIZED,
1481da177e4SLinus Torvalds 	RNDIS_INITIALIZED,
1491da177e4SLinus Torvalds 	RNDIS_DATA_INITIALIZED,
1501da177e4SLinus Torvalds };
1511da177e4SLinus Torvalds 
15297f0117bSAnson Jacob typedef struct rndis_resp_t {
1531da177e4SLinus Torvalds 	struct list_head	list;
1541da177e4SLinus Torvalds 	u8			*buf;
1551da177e4SLinus Torvalds 	u32			length;
1561da177e4SLinus Torvalds 	int			send;
1571da177e4SLinus Torvalds } rndis_resp_t;
1581da177e4SLinus Torvalds 
15997f0117bSAnson Jacob typedef struct rndis_params {
16081dff869SAndrzej Pietrasiewicz 	int			confignr;
161340600abSDavid Brownell 	u8			used;
162340600abSDavid Brownell 	u16			saved_filter;
1631da177e4SLinus Torvalds 	enum rndis_state	state;
1641da177e4SLinus Torvalds 	u32			medium;
1651da177e4SLinus Torvalds 	u32			speed;
1661da177e4SLinus Torvalds 	u32			media_state;
167340600abSDavid Brownell 
1681da177e4SLinus Torvalds 	const u8		*host_mac;
169340600abSDavid Brownell 	u16			*filter;
1701da177e4SLinus Torvalds 	struct net_device	*dev;
171340600abSDavid Brownell 
1721da177e4SLinus Torvalds 	u32			vendorID;
1731da177e4SLinus Torvalds 	const char		*vendorDescr;
17415b2d2b5SDavid Brownell 	void			(*resp_avail)(void *v);
17515b2d2b5SDavid Brownell 	void			*v;
1761da177e4SLinus Torvalds 	struct list_head	resp_queue;
177*aaaba1c8SDaehwan Jung 	spinlock_t		resp_lock;
1781da177e4SLinus Torvalds } rndis_params;
1791da177e4SLinus Torvalds 
1801da177e4SLinus Torvalds /* RNDIS Message parser and other useless functions */
18183210e59SAndrzej Pietrasiewicz int  rndis_msg_parser(struct rndis_params *params, u8 *buf);
18283210e59SAndrzej Pietrasiewicz struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v);
18383210e59SAndrzej Pietrasiewicz void rndis_deregister(struct rndis_params *params);
18483210e59SAndrzej Pietrasiewicz int  rndis_set_param_dev(struct rndis_params *params, struct net_device *dev,
185340600abSDavid Brownell 			 u16 *cdc_filter);
18683210e59SAndrzej Pietrasiewicz int  rndis_set_param_vendor(struct rndis_params *params, u32 vendorID,
1871da177e4SLinus Torvalds 			    const char *vendorDescr);
18883210e59SAndrzej Pietrasiewicz int  rndis_set_param_medium(struct rndis_params *params, u32 medium,
18983210e59SAndrzej Pietrasiewicz 			     u32 speed);
1901da177e4SLinus Torvalds void rndis_add_hdr(struct sk_buff *skb);
1919b39e9ddSBrian Niebuhr int rndis_rm_hdr(struct gether *port, struct sk_buff *skb,
1929b39e9ddSBrian Niebuhr 			struct sk_buff_head *list);
19383210e59SAndrzej Pietrasiewicz u8   *rndis_get_next_response(struct rndis_params *params, u32 *length);
19483210e59SAndrzej Pietrasiewicz void rndis_free_response(struct rndis_params *params, u8 *buf);
1951da177e4SLinus Torvalds 
19683210e59SAndrzej Pietrasiewicz void rndis_uninit(struct rndis_params *params);
19783210e59SAndrzej Pietrasiewicz int  rndis_signal_connect(struct rndis_params *params);
19883210e59SAndrzej Pietrasiewicz int  rndis_signal_disconnect(struct rndis_params *params);
19983210e59SAndrzej Pietrasiewicz int  rndis_state(struct rndis_params *params);
20083210e59SAndrzej Pietrasiewicz extern void rndis_set_host_mac(struct rndis_params *params, const u8 *addr);
2011da177e4SLinus Torvalds 
2021da177e4SLinus Torvalds #endif  /* _LINUX_RNDIS_H */
203