xref: /OK3568_Linux_fs/kernel/drivers/usb/gadget/function/rndis.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * RNDIS	Definitions for Remote NDIS
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Authors:	Benedikt Spranger, Pengutronix
6*4882a593Smuzhiyun  *		Robert Schwebel, Pengutronix
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *		This software was originally developed in conformance with
9*4882a593Smuzhiyun  *		Microsoft's Remote NDIS Specification License Agreement.
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef _LINUX_RNDIS_H
13*4882a593Smuzhiyun #define _LINUX_RNDIS_H
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <linux/rndis.h>
16*4882a593Smuzhiyun #include "u_ether.h"
17*4882a593Smuzhiyun #include "ndis.h"
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #define RNDIS_MAXIMUM_FRAME_SIZE	1518
20*4882a593Smuzhiyun #define RNDIS_MAX_TOTAL_SIZE		1558
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun typedef struct rndis_init_msg_type {
23*4882a593Smuzhiyun 	__le32	MessageType;
24*4882a593Smuzhiyun 	__le32	MessageLength;
25*4882a593Smuzhiyun 	__le32	RequestID;
26*4882a593Smuzhiyun 	__le32	MajorVersion;
27*4882a593Smuzhiyun 	__le32	MinorVersion;
28*4882a593Smuzhiyun 	__le32	MaxTransferSize;
29*4882a593Smuzhiyun } rndis_init_msg_type;
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun typedef struct rndis_init_cmplt_type {
32*4882a593Smuzhiyun 	__le32	MessageType;
33*4882a593Smuzhiyun 	__le32	MessageLength;
34*4882a593Smuzhiyun 	__le32	RequestID;
35*4882a593Smuzhiyun 	__le32	Status;
36*4882a593Smuzhiyun 	__le32	MajorVersion;
37*4882a593Smuzhiyun 	__le32	MinorVersion;
38*4882a593Smuzhiyun 	__le32	DeviceFlags;
39*4882a593Smuzhiyun 	__le32	Medium;
40*4882a593Smuzhiyun 	__le32	MaxPacketsPerTransfer;
41*4882a593Smuzhiyun 	__le32	MaxTransferSize;
42*4882a593Smuzhiyun 	__le32	PacketAlignmentFactor;
43*4882a593Smuzhiyun 	__le32	AFListOffset;
44*4882a593Smuzhiyun 	__le32	AFListSize;
45*4882a593Smuzhiyun } rndis_init_cmplt_type;
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun typedef struct rndis_halt_msg_type {
48*4882a593Smuzhiyun 	__le32	MessageType;
49*4882a593Smuzhiyun 	__le32	MessageLength;
50*4882a593Smuzhiyun 	__le32	RequestID;
51*4882a593Smuzhiyun } rndis_halt_msg_type;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun typedef struct rndis_query_msg_type {
54*4882a593Smuzhiyun 	__le32	MessageType;
55*4882a593Smuzhiyun 	__le32	MessageLength;
56*4882a593Smuzhiyun 	__le32	RequestID;
57*4882a593Smuzhiyun 	__le32	OID;
58*4882a593Smuzhiyun 	__le32	InformationBufferLength;
59*4882a593Smuzhiyun 	__le32	InformationBufferOffset;
60*4882a593Smuzhiyun 	__le32	DeviceVcHandle;
61*4882a593Smuzhiyun } rndis_query_msg_type;
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun typedef struct rndis_query_cmplt_type {
64*4882a593Smuzhiyun 	__le32	MessageType;
65*4882a593Smuzhiyun 	__le32	MessageLength;
66*4882a593Smuzhiyun 	__le32	RequestID;
67*4882a593Smuzhiyun 	__le32	Status;
68*4882a593Smuzhiyun 	__le32	InformationBufferLength;
69*4882a593Smuzhiyun 	__le32	InformationBufferOffset;
70*4882a593Smuzhiyun } rndis_query_cmplt_type;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun typedef struct rndis_set_msg_type {
73*4882a593Smuzhiyun 	__le32	MessageType;
74*4882a593Smuzhiyun 	__le32	MessageLength;
75*4882a593Smuzhiyun 	__le32	RequestID;
76*4882a593Smuzhiyun 	__le32	OID;
77*4882a593Smuzhiyun 	__le32	InformationBufferLength;
78*4882a593Smuzhiyun 	__le32	InformationBufferOffset;
79*4882a593Smuzhiyun 	__le32	DeviceVcHandle;
80*4882a593Smuzhiyun } rndis_set_msg_type;
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun typedef struct rndis_set_cmplt_type {
83*4882a593Smuzhiyun 	__le32	MessageType;
84*4882a593Smuzhiyun 	__le32	MessageLength;
85*4882a593Smuzhiyun 	__le32	RequestID;
86*4882a593Smuzhiyun 	__le32	Status;
87*4882a593Smuzhiyun } rndis_set_cmplt_type;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun typedef struct rndis_reset_msg_type {
90*4882a593Smuzhiyun 	__le32	MessageType;
91*4882a593Smuzhiyun 	__le32	MessageLength;
92*4882a593Smuzhiyun 	__le32	Reserved;
93*4882a593Smuzhiyun } rndis_reset_msg_type;
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun typedef struct rndis_reset_cmplt_type {
96*4882a593Smuzhiyun 	__le32	MessageType;
97*4882a593Smuzhiyun 	__le32	MessageLength;
98*4882a593Smuzhiyun 	__le32	Status;
99*4882a593Smuzhiyun 	__le32	AddressingReset;
100*4882a593Smuzhiyun } rndis_reset_cmplt_type;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun typedef struct rndis_indicate_status_msg_type {
103*4882a593Smuzhiyun 	__le32	MessageType;
104*4882a593Smuzhiyun 	__le32	MessageLength;
105*4882a593Smuzhiyun 	__le32	Status;
106*4882a593Smuzhiyun 	__le32	StatusBufferLength;
107*4882a593Smuzhiyun 	__le32	StatusBufferOffset;
108*4882a593Smuzhiyun } rndis_indicate_status_msg_type;
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun typedef struct rndis_keepalive_msg_type {
111*4882a593Smuzhiyun 	__le32	MessageType;
112*4882a593Smuzhiyun 	__le32	MessageLength;
113*4882a593Smuzhiyun 	__le32	RequestID;
114*4882a593Smuzhiyun } rndis_keepalive_msg_type;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun typedef struct rndis_keepalive_cmplt_type {
117*4882a593Smuzhiyun 	__le32	MessageType;
118*4882a593Smuzhiyun 	__le32	MessageLength;
119*4882a593Smuzhiyun 	__le32	RequestID;
120*4882a593Smuzhiyun 	__le32	Status;
121*4882a593Smuzhiyun } rndis_keepalive_cmplt_type;
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun struct rndis_packet_msg_type {
124*4882a593Smuzhiyun 	__le32	MessageType;
125*4882a593Smuzhiyun 	__le32	MessageLength;
126*4882a593Smuzhiyun 	__le32	DataOffset;
127*4882a593Smuzhiyun 	__le32	DataLength;
128*4882a593Smuzhiyun 	__le32	OOBDataOffset;
129*4882a593Smuzhiyun 	__le32	OOBDataLength;
130*4882a593Smuzhiyun 	__le32	NumOOBDataElements;
131*4882a593Smuzhiyun 	__le32	PerPacketInfoOffset;
132*4882a593Smuzhiyun 	__le32	PerPacketInfoLength;
133*4882a593Smuzhiyun 	__le32	VcHandle;
134*4882a593Smuzhiyun 	__le32	Reserved;
135*4882a593Smuzhiyun } __attribute__ ((packed));
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun struct rndis_config_parameter {
138*4882a593Smuzhiyun 	__le32	ParameterNameOffset;
139*4882a593Smuzhiyun 	__le32	ParameterNameLength;
140*4882a593Smuzhiyun 	__le32	ParameterType;
141*4882a593Smuzhiyun 	__le32	ParameterValueOffset;
142*4882a593Smuzhiyun 	__le32	ParameterValueLength;
143*4882a593Smuzhiyun };
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun /* implementation specific */
146*4882a593Smuzhiyun enum rndis_state {
147*4882a593Smuzhiyun 	RNDIS_UNINITIALIZED,
148*4882a593Smuzhiyun 	RNDIS_INITIALIZED,
149*4882a593Smuzhiyun 	RNDIS_DATA_INITIALIZED,
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun typedef struct rndis_resp_t {
153*4882a593Smuzhiyun 	struct list_head	list;
154*4882a593Smuzhiyun 	u8			*buf;
155*4882a593Smuzhiyun 	u32			length;
156*4882a593Smuzhiyun 	int			send;
157*4882a593Smuzhiyun } rndis_resp_t;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun typedef struct rndis_params {
160*4882a593Smuzhiyun 	int			confignr;
161*4882a593Smuzhiyun 	u8			used;
162*4882a593Smuzhiyun 	u16			saved_filter;
163*4882a593Smuzhiyun 	enum rndis_state	state;
164*4882a593Smuzhiyun 	u32			medium;
165*4882a593Smuzhiyun 	u32			speed;
166*4882a593Smuzhiyun 	u32			media_state;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	const u8		*host_mac;
169*4882a593Smuzhiyun 	u16			*filter;
170*4882a593Smuzhiyun 	struct net_device	*dev;
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	u32			vendorID;
173*4882a593Smuzhiyun 	const char		*vendorDescr;
174*4882a593Smuzhiyun 	void			(*resp_avail)(void *v);
175*4882a593Smuzhiyun 	void			*v;
176*4882a593Smuzhiyun 	struct list_head	resp_queue;
177*4882a593Smuzhiyun } rndis_params;
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun /* RNDIS Message parser and other useless functions */
180*4882a593Smuzhiyun int  rndis_msg_parser(struct rndis_params *params, u8 *buf);
181*4882a593Smuzhiyun struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v);
182*4882a593Smuzhiyun void rndis_deregister(struct rndis_params *params);
183*4882a593Smuzhiyun int  rndis_set_param_dev(struct rndis_params *params, struct net_device *dev,
184*4882a593Smuzhiyun 			 u16 *cdc_filter);
185*4882a593Smuzhiyun int  rndis_set_param_vendor(struct rndis_params *params, u32 vendorID,
186*4882a593Smuzhiyun 			    const char *vendorDescr);
187*4882a593Smuzhiyun int  rndis_set_param_medium(struct rndis_params *params, u32 medium,
188*4882a593Smuzhiyun 			     u32 speed);
189*4882a593Smuzhiyun void rndis_add_hdr(struct sk_buff *skb);
190*4882a593Smuzhiyun int rndis_rm_hdr(struct gether *port, struct sk_buff *skb,
191*4882a593Smuzhiyun 			struct sk_buff_head *list);
192*4882a593Smuzhiyun u8   *rndis_get_next_response(struct rndis_params *params, u32 *length);
193*4882a593Smuzhiyun void rndis_free_response(struct rndis_params *params, u8 *buf);
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun void rndis_uninit(struct rndis_params *params);
196*4882a593Smuzhiyun int  rndis_signal_connect(struct rndis_params *params);
197*4882a593Smuzhiyun int  rndis_signal_disconnect(struct rndis_params *params);
198*4882a593Smuzhiyun int  rndis_state(struct rndis_params *params);
199*4882a593Smuzhiyun extern void rndis_set_host_mac(struct rndis_params *params, const u8 *addr);
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun #endif  /* _LINUX_RNDIS_H */
202