1 /*
2  * RNDIS	Definitions for Remote NDIS
3  *
4  * Version:	$Id: rndis.h,v 1.15 2004/03/25 21:33:46 robert Exp $
5  *
6  * Authors:	Benedikt Spranger, Pengutronix
7  * 		Robert Schwebel, Pengutronix
8  *
9  * 		This program is free software; you can redistribute it and/or
10  *		modify it under the terms of the GNU General Public License
11  *		version 2, as published by the Free Software Foundation.
12  *
13  *		This software was originally developed in conformance with
14  *		Microsoft's Remote NDIS Specification License Agreement.
15  */
16 
17 #ifndef _LINUX_RNDIS_H
18 #define _LINUX_RNDIS_H
19 
20 #include "ndis.h"
21 
22 #define RNDIS_MAXIMUM_FRAME_SIZE	1518
23 #define RNDIS_MAX_TOTAL_SIZE		1558
24 
25 /* Remote NDIS Versions */
26 #define RNDIS_MAJOR_VERSION		1
27 #define RNDIS_MINOR_VERSION		0
28 
29 /* Status Values */
30 #define RNDIS_STATUS_SUCCESS		0x00000000U	/* Success           */
31 #define RNDIS_STATUS_FAILURE		0xC0000001U	/* Unspecified error */
32 #define RNDIS_STATUS_INVALID_DATA	0xC0010015U	/* Invalid data      */
33 #define RNDIS_STATUS_NOT_SUPPORTED	0xC00000BBU	/* Unsupported request */
34 #define RNDIS_STATUS_MEDIA_CONNECT	0x4001000BU	/* Device connected  */
35 #define RNDIS_STATUS_MEDIA_DISCONNECT	0x4001000CU	/* Device disconnected */
36 /* For all not specified status messages:
37  * RNDIS_STATUS_Xxx -> NDIS_STATUS_Xxx
38  */
39 
40 /* Message Set for Connectionless (802.3) Devices */
41 #define REMOTE_NDIS_INITIALIZE_MSG	0x00000002U	/* Initialize device */
42 #define REMOTE_NDIS_HALT_MSG		0x00000003U
43 #define REMOTE_NDIS_QUERY_MSG		0x00000004U
44 #define REMOTE_NDIS_SET_MSG		0x00000005U
45 #define REMOTE_NDIS_RESET_MSG		0x00000006U
46 #define REMOTE_NDIS_INDICATE_STATUS_MSG	0x00000007U
47 #define REMOTE_NDIS_KEEPALIVE_MSG	0x00000008U
48 
49 /* Message completion */
50 #define REMOTE_NDIS_INITIALIZE_CMPLT	0x80000002U
51 #define REMOTE_NDIS_QUERY_CMPLT		0x80000004U
52 #define REMOTE_NDIS_SET_CMPLT		0x80000005U
53 #define REMOTE_NDIS_RESET_CMPLT		0x80000006U
54 #define REMOTE_NDIS_KEEPALIVE_CMPLT	0x80000008U
55 
56 /* Device Flags */
57 #define RNDIS_DF_CONNECTIONLESS		0x00000001U
58 #define RNDIS_DF_CONNECTION_ORIENTED	0x00000002U
59 
60 #define RNDIS_MEDIUM_802_3		0x00000000U
61 
62 /* from drivers/net/sk98lin/h/skgepnmi.h */
63 #define OID_PNP_CAPABILITIES			0xFD010100
64 #define OID_PNP_SET_POWER			0xFD010101
65 #define OID_PNP_QUERY_POWER			0xFD010102
66 #define OID_PNP_ADD_WAKE_UP_PATTERN		0xFD010103
67 #define OID_PNP_REMOVE_WAKE_UP_PATTERN		0xFD010104
68 #define OID_PNP_ENABLE_WAKE_UP			0xFD010106
69 
70 
71 /* supported OIDs */
72 static const u32 oid_supported_list [] =
73 {
74 	/* the general stuff */
75 	OID_GEN_SUPPORTED_LIST,
76 	OID_GEN_HARDWARE_STATUS,
77 	OID_GEN_MEDIA_SUPPORTED,
78 	OID_GEN_MEDIA_IN_USE,
79 	OID_GEN_MAXIMUM_FRAME_SIZE,
80 	OID_GEN_LINK_SPEED,
81 	OID_GEN_TRANSMIT_BLOCK_SIZE,
82 	OID_GEN_RECEIVE_BLOCK_SIZE,
83 	OID_GEN_VENDOR_ID,
84 	OID_GEN_VENDOR_DESCRIPTION,
85 	OID_GEN_VENDOR_DRIVER_VERSION,
86 	OID_GEN_CURRENT_PACKET_FILTER,
87 	OID_GEN_MAXIMUM_TOTAL_SIZE,
88 	OID_GEN_MEDIA_CONNECT_STATUS,
89 	OID_GEN_PHYSICAL_MEDIUM,
90 #if 0
91 	OID_GEN_RNDIS_CONFIG_PARAMETER,
92 #endif
93 
94 	/* the statistical stuff */
95 	OID_GEN_XMIT_OK,
96 	OID_GEN_RCV_OK,
97 	OID_GEN_XMIT_ERROR,
98 	OID_GEN_RCV_ERROR,
99 	OID_GEN_RCV_NO_BUFFER,
100 #ifdef	RNDIS_OPTIONAL_STATS
101 	OID_GEN_DIRECTED_BYTES_XMIT,
102 	OID_GEN_DIRECTED_FRAMES_XMIT,
103 	OID_GEN_MULTICAST_BYTES_XMIT,
104 	OID_GEN_MULTICAST_FRAMES_XMIT,
105 	OID_GEN_BROADCAST_BYTES_XMIT,
106 	OID_GEN_BROADCAST_FRAMES_XMIT,
107 	OID_GEN_DIRECTED_BYTES_RCV,
108 	OID_GEN_DIRECTED_FRAMES_RCV,
109 	OID_GEN_MULTICAST_BYTES_RCV,
110 	OID_GEN_MULTICAST_FRAMES_RCV,
111 	OID_GEN_BROADCAST_BYTES_RCV,
112 	OID_GEN_BROADCAST_FRAMES_RCV,
113 	OID_GEN_RCV_CRC_ERROR,
114 	OID_GEN_TRANSMIT_QUEUE_LENGTH,
115 #endif	/* RNDIS_OPTIONAL_STATS */
116 
117     	/* mandatory 802.3 */
118 	/* the general stuff */
119 	OID_802_3_PERMANENT_ADDRESS,
120 	OID_802_3_CURRENT_ADDRESS,
121 	OID_802_3_MULTICAST_LIST,
122 	OID_802_3_MAC_OPTIONS,
123 	OID_802_3_MAXIMUM_LIST_SIZE,
124 
125 	/* the statistical stuff */
126 	OID_802_3_RCV_ERROR_ALIGNMENT,
127 	OID_802_3_XMIT_ONE_COLLISION,
128 	OID_802_3_XMIT_MORE_COLLISIONS,
129 #ifdef	RNDIS_OPTIONAL_STATS
130 	OID_802_3_XMIT_DEFERRED,
131 	OID_802_3_XMIT_MAX_COLLISIONS,
132 	OID_802_3_RCV_OVERRUN,
133 	OID_802_3_XMIT_UNDERRUN,
134 	OID_802_3_XMIT_HEARTBEAT_FAILURE,
135 	OID_802_3_XMIT_TIMES_CRS_LOST,
136 	OID_802_3_XMIT_LATE_COLLISIONS,
137 #endif	/* RNDIS_OPTIONAL_STATS */
138 
139 #ifdef	RNDIS_PM
140 	/* PM and wakeup are mandatory for USB: */
141 
142 	/* power management */
143 	OID_PNP_CAPABILITIES,
144 	OID_PNP_QUERY_POWER,
145 	OID_PNP_SET_POWER,
146 
147 	/* wake up host */
148 	OID_PNP_ENABLE_WAKE_UP,
149 	OID_PNP_ADD_WAKE_UP_PATTERN,
150 	OID_PNP_REMOVE_WAKE_UP_PATTERN,
151 #endif
152 };
153 
154 
155 typedef struct rndis_init_msg_type
156 {
157 	u32	MessageType;
158 	u32	MessageLength;
159 	u32	RequestID;
160 	u32	MajorVersion;
161 	u32	MinorVersion;
162 	u32	MaxTransferSize;
163 } rndis_init_msg_type;
164 
165 typedef struct rndis_init_cmplt_type
166 {
167 	u32	MessageType;
168 	u32	MessageLength;
169 	u32	RequestID;
170 	u32	Status;
171 	u32	MajorVersion;
172 	u32	MinorVersion;
173 	u32	DeviceFlags;
174 	u32	Medium;
175 	u32	MaxPacketsPerTransfer;
176 	u32	MaxTransferSize;
177 	u32	PacketAlignmentFactor;
178 	u32	AFListOffset;
179 	u32	AFListSize;
180 } rndis_init_cmplt_type;
181 
182 typedef struct rndis_halt_msg_type
183 {
184 	u32	MessageType;
185 	u32	MessageLength;
186 	u32	RequestID;
187 } rndis_halt_msg_type;
188 
189 typedef struct rndis_query_msg_type
190 {
191 	u32	MessageType;
192 	u32	MessageLength;
193 	u32	RequestID;
194 	u32	OID;
195 	u32	InformationBufferLength;
196 	u32	InformationBufferOffset;
197 	u32	DeviceVcHandle;
198 } rndis_query_msg_type;
199 
200 typedef struct rndis_query_cmplt_type
201 {
202 	u32	MessageType;
203 	u32	MessageLength;
204 	u32	RequestID;
205 	u32	Status;
206 	u32	InformationBufferLength;
207 	u32	InformationBufferOffset;
208 } rndis_query_cmplt_type;
209 
210 typedef struct rndis_set_msg_type
211 {
212 	u32	MessageType;
213 	u32	MessageLength;
214 	u32	RequestID;
215 	u32	OID;
216 	u32	InformationBufferLength;
217 	u32	InformationBufferOffset;
218 	u32	DeviceVcHandle;
219 } rndis_set_msg_type;
220 
221 typedef struct rndis_set_cmplt_type
222 {
223 	u32	MessageType;
224 	u32	MessageLength;
225 	u32	RequestID;
226 	u32	Status;
227 } rndis_set_cmplt_type;
228 
229 typedef struct rndis_reset_msg_type
230 {
231 	u32	MessageType;
232 	u32	MessageLength;
233 	u32	Reserved;
234 } rndis_reset_msg_type;
235 
236 typedef struct rndis_reset_cmplt_type
237 {
238 	u32	MessageType;
239 	u32	MessageLength;
240 	u32	Status;
241 	u32	AddressingReset;
242 } rndis_reset_cmplt_type;
243 
244 typedef struct rndis_indicate_status_msg_type
245 {
246 	u32	MessageType;
247 	u32	MessageLength;
248 	u32	Status;
249 	u32	StatusBufferLength;
250 	u32	StatusBufferOffset;
251 } rndis_indicate_status_msg_type;
252 
253 typedef struct rndis_keepalive_msg_type
254 {
255 	u32	MessageType;
256 	u32	MessageLength;
257 	u32	RequestID;
258 } rndis_keepalive_msg_type;
259 
260 typedef struct rndis_keepalive_cmplt_type
261 {
262 	u32	MessageType;
263 	u32	MessageLength;
264 	u32	RequestID;
265 	u32	Status;
266 } rndis_keepalive_cmplt_type;
267 
268 struct rndis_packet_msg_type
269 {
270 	u32	MessageType;
271 	u32	MessageLength;
272 	u32	DataOffset;
273 	u32	DataLength;
274 	u32	OOBDataOffset;
275 	u32	OOBDataLength;
276 	u32	NumOOBDataElements;
277 	u32	PerPacketInfoOffset;
278 	u32	PerPacketInfoLength;
279 	u32	VcHandle;
280 	u32	Reserved;
281 };
282 
283 struct rndis_config_parameter
284 {
285 	u32	ParameterNameOffset;
286 	u32	ParameterNameLength;
287 	u32	ParameterType;
288 	u32	ParameterValueOffset;
289 	u32	ParameterValueLength;
290 };
291 
292 /* implementation specific */
293 enum rndis_state
294 {
295 	RNDIS_UNINITIALIZED,
296 	RNDIS_INITIALIZED,
297 	RNDIS_DATA_INITIALIZED,
298 };
299 
300 typedef struct rndis_resp_t
301 {
302 	struct list_head	list;
303 	u8			*buf;
304 	u32			length;
305 	int			send;
306 } rndis_resp_t;
307 
308 typedef struct rndis_params
309 {
310 	u8			confignr;
311 	int			used;
312 	enum rndis_state	state;
313 	u32			filter;
314 	u32			medium;
315 	u32			speed;
316 	u32			media_state;
317 	const u8		*host_mac;
318 	struct net_device 	*dev;
319 	struct net_device_stats *stats;
320 	u32			vendorID;
321 	const char		*vendorDescr;
322 	int 			(*ack) (struct net_device *);
323 	struct list_head	resp_queue;
324 } rndis_params;
325 
326 /* RNDIS Message parser and other useless functions */
327 int  rndis_msg_parser (u8 configNr, u8 *buf);
328 int  rndis_register (int (*rndis_control_ack) (struct net_device *));
329 void rndis_deregister (int configNr);
330 int  rndis_set_param_dev (u8 configNr, struct net_device *dev,
331 			 struct net_device_stats *stats);
332 int  rndis_set_param_vendor (u8 configNr, u32 vendorID,
333 			    const char *vendorDescr);
334 int  rndis_set_param_medium (u8 configNr, u32 medium, u32 speed);
335 void rndis_add_hdr (struct sk_buff *skb);
336 int  rndis_rm_hdr (u8 *buf, u32 *length);
337 u8   *rndis_get_next_response (int configNr, u32 *length);
338 void rndis_free_response (int configNr, u8 *buf);
339 
340 int  rndis_signal_connect (int configNr);
341 int  rndis_signal_disconnect (int configNr);
342 int  rndis_state (int configNr);
343 extern void rndis_set_host_mac (int configNr, const u8 *addr);
344 
345 int __init rndis_init (void);
346 void rndis_exit (void);
347 
348 #endif  /* _LINUX_RNDIS_H */
349