1 /***************************************************************************
2  * Copyright (c) 2024 Microsoft Corporation
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the MIT License which is available at
6  * https://opensource.org/licenses/MIT.
7  *
8  * SPDX-License-Identifier: MIT
9  **************************************************************************/
10 
11 /**************************************************************************/
12 /**************************************************************************/
13 /**                                                                       */
14 /** USBX Component                                                        */
15 /**                                                                       */
16 /**   RNDIS Class                                                         */
17 /**                                                                       */
18 /**************************************************************************/
19 /**************************************************************************/
20 
21 /**************************************************************************/
22 /*                                                                        */
23 /*  COMPONENT DEFINITION                                   RELEASE        */
24 /*                                                                        */
25 /*    ux_device_class_rndis.h                             PORTABLE C      */
26 /*                                                           6.3.0        */
27 /*  AUTHOR                                                                */
28 /*                                                                        */
29 /*    Chaoqiong Xiao, Microsoft Corporation                               */
30 /*                                                                        */
31 /*  DESCRIPTION                                                           */
32 /*                                                                        */
33 /*    This file defines the equivalences for the USBX Device Class RNDIS  */
34 /*    component.                                                          */
35 /*                                                                        */
36 /*  RELEASE HISTORY                                                       */
37 /*                                                                        */
38 /*    DATE              NAME                      DESCRIPTION             */
39 /*                                                                        */
40 /*  05-19-2020     Chaoqiong Xiao           Initial Version 6.0           */
41 /*  09-30-2020     Chaoqiong Xiao           Modified comment(s),          */
42 /*                                            used UX prefix to refer to  */
43 /*                                            TX symbols instead of using */
44 /*                                            them directly,              */
45 /*                                            resulting in version 6.1    */
46 /*  08-02-2021     Wen Wang                 Modified comment(s),          */
47 /*                                            fixed spelling error,       */
48 /*                                            added extern "C" keyword    */
49 /*                                            for compatibility with C++, */
50 /*                                            resulting in version 6.1.8  */
51 /*  04-25-2022     Chaoqiong Xiao           Modified comment(s),          */
52 /*                                            fixed standalone compile,   */
53 /*                                            resulting in version 6.1.11 */
54 /*  10-31-2022     Chaoqiong Xiao           Modified comment(s),          */
55 /*                                            added wait and length DEFs, */
56 /*                                            resulting in version 6.2.0  */
57 /*  10-31-2023     Chaoqiong Xiao           Modified comment(s),          */
58 /*                                            added zero copy support,    */
59 /*                                            added a new mode to manage  */
60 /*                                            endpoint buffer in classes, */
61 /*                                            improved error checking,    */
62 /*                                            resulting in version 6.3.0  */
63 /*                                                                        */
64 /**************************************************************************/
65 
66 #ifndef UX_DEVICE_CLASS_RNDIS_H
67 #define UX_DEVICE_CLASS_RNDIS_H
68 
69 /* Determine if a C++ compiler is being used.  If so, ensure that standard
70    C is used to process the API information.  */
71 
72 #ifdef   __cplusplus
73 
74 /* Yes, C++ compiler is present.  Use standard C.  */
75 extern   "C" {
76 
77 #endif
78 
79 
80 /* Option: defined, it enables zero copy support (works if HID owns endpoint buffer).
81     Enabled, it requires that the NX packet pool is in cache safe area, and buffer max size is
82     larger than UX_DEVICE_CLASS_RNDIS_MAX_PACKET_TRANSFER_SIZE (1600).
83  */
84 /* #define UX_DEVICE_CLASS_RNDIS_ZERO_COPY  */
85 
86 
87 /* Bulk out endpoint buffer size (UX_DEVICE_CLASS_RNDIS_MAX_PACKET_TRANSFER_SIZE).  */
88 #if (UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1) && defined(UX_DEVICE_CLASS_RNDIS_ZERO_COPY)
89 #define UX_DEVICE_CLASS_RNDIS_BULKOUT_BUFFER_SIZE                       0
90 #else
91 #define UX_DEVICE_CLASS_RNDIS_BULKOUT_BUFFER_SIZE                       UX_DEVICE_CLASS_RNDIS_MAX_PACKET_TRANSFER_SIZE
92 #endif
93 
94 /* Bulk in endpoint buffer size (UX_DEVICE_CLASS_RNDIS_MAX_PACKET_TRANSFER_SIZE).  */
95 #if (UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1) && defined(UX_DEVICE_CLASS_RNDIS_ZERO_COPY)
96 #define UX_DEVICE_CLASS_RNDIS_BULKIN_BUFFER_SIZE                        0
97 #else
98 #define UX_DEVICE_CLASS_RNDIS_BULKIN_BUFFER_SIZE                        UX_DEVICE_CLASS_RNDIS_MAX_PACKET_TRANSFER_SIZE
99 #endif
100 
101 /* Interrupt in endpoint buffer size (UX_DEVICE_CLASS_RNDIS_INTERRUPT_RESPONSE_LENGTH).  */
102 #define UX_DEVICE_CLASS_RNDIS_INTERRUPTIN_BUFFER_SIZE                   UX_DEVICE_CLASS_RNDIS_INTERRUPT_RESPONSE_LENGTH
103 
104 
105 #if !defined(UX_DEVICE_STANDALONE)
106 #include "nx_api.h"
107 #include "ux_network_driver.h"
108 #else
109 
110 /* Assume NX definitions for compiling.  */
111 #define NX_PACKET                                               VOID*
112 #define NX_IP                                                   VOID*
113 /*
114 UINT  _ux_network_driver_deactivate(VOID *ux_instance, VOID *ux_network_handle);
115 VOID  _ux_network_driver_link_up(VOID *ux_network_handle);
116 VOID  _ux_network_driver_link_down(VOID *ux_network_handle);
117 */
118 #ifndef _ux_network_driver_deactivate
119 #define _ux_network_driver_deactivate(a,b)                      do {} while(0)
120 #endif
121 #ifndef _ux_network_driver_link_up
122 #define _ux_network_driver_link_up(a)                           do {} while(0)
123 #endif
124 #ifndef _ux_network_driver_link_down
125 #define _ux_network_driver_link_down(a)                         do {} while(0)
126 #endif
127 #endif
128 
129 /* Define generic RNDIS equivalences.  */
130 #define UX_DEVICE_CLASS_RNDIS_CLASS_COMMUNICATION_CONTROL                       0x02
131 #define UX_DEVICE_CLASS_RNDIS_CLASS_COMMUNICATION_DATA                          0x0A
132 #define UX_DEVICE_CLASS_RNDIS_NEW_INTERRUPT_EVENT                               1
133 #define UX_DEVICE_CLASS_RNDIS_NEW_BULKOUT_EVENT                                 2
134 #define UX_DEVICE_CLASS_RNDIS_NEW_BULKIN_EVENT                                  4
135 #define UX_DEVICE_CLASS_RNDIS_NEW_DEVICE_STATE_CHANGE_EVENT                     8
136 #define UX_DEVICE_CLASS_RNDIS_INTERRUPT_RESPONSE_LENGTH                         8
137 #define UX_DEVICE_CLASS_RNDIS_INTERRUPT_RESPONSE_AVAILABLE_FLAG                 1
138 #define UX_DEVICE_CLASS_RNDIS_BASE_IP_ADDRESS                                   0xC0A80001
139 #define UX_DEVICE_CLASS_RNDIS_BASE_IP_MASK                                      0xFFFFFF00
140 #define UX_DEVICE_CLASS_RNDIS_MAX_MTU                                           1518
141 #define UX_DEVICE_CLASS_RNDIS_ETHERNET_IP                                       0x0800
142 #define UX_DEVICE_CLASS_RNDIS_ETHERNET_ARP                                      0x0806
143 #define UX_DEVICE_CLASS_RNDIS_ETHERNET_RARP                                     0x8035
144 #define UX_DEVICE_CLASS_RNDIS_ETHERNET_PACKET_SIZE                              1536
145 #define UX_DEVICE_CLASS_RNDIS_NX_ALIGN_PADDING                                  2
146 #define UX_DEVICE_CLASS_RNDIS_NX_PKPOOL_ENTRIES                                 8
147 
148 #define UX_DEVICE_CLASS_RNDIS_NX_PACKET_SIZE                                    sizeof(NX_PACKET)
149 
150 #define UX_DEVICE_CLASS_RNDIS_NX_PAYLOAD_SIZE_ASSERT                            UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_ADD_ULONG(UX_DEVICE_CLASS_RNDIS_ETHERNET_PACKET_SIZE, UX_DEVICE_CLASS_RNDIS_NX_ALIGN_PADDING), UX_DEVICE_CLASS_RNDIS_NX_PAYLOAD_SIZE_calc_ovf)
151 #define UX_DEVICE_CLASS_RNDIS_NX_PAYLOAD_SIZE                                   (UX_DEVICE_CLASS_RNDIS_ETHERNET_PACKET_SIZE + UX_DEVICE_CLASS_RNDIS_NX_ALIGN_PADDING)
152 
153 #define UX_DEVICE_CLASS_RNDIS_NX_BUFF_SIZE_ASSERT                           \
154     UX_DEVICE_CLASS_RNDIS_NX_PAYLOAD_SIZE_ASSERT                            \
155     UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_ADD_ULONG(                    \
156         UX_DEVICE_CLASS_RNDIS_NX_PAYLOAD_SIZE,                              \
157         UX_DEVICE_CLASS_RNDIS_NX_PACKET_SIZE),                              \
158         UX_DEVICE_CLASS_RNDIS_NX_BUFF_SIZE_calc_ovf)
159 #define UX_DEVICE_CLASS_RNDIS_NX_BUFF_SIZE                                      (UX_DEVICE_CLASS_RNDIS_NX_PAYLOAD_SIZE + UX_DEVICE_CLASS_RNDIS_NX_PACKET_SIZE)
160 
161 #define UX_DEVICE_CLASS_RNDIS_NX_ETHERNET_POOL_ALLOCSIZE_ASSERT             \
162     UX_DEVICE_CLASS_RNDIS_NX_BUFF_SIZE_ASSERT                               \
163     UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_MULC_ULONG(                   \
164         UX_DEVICE_CLASS_RNDIS_NX_PKPOOL_ENTRIES,                            \
165         UX_DEVICE_CLASS_RNDIS_NX_BUFF_SIZE),                                \
166         UX_DEVICE_CLASS_RNDIS_NX_ETHERNET_POOL_ALLOCSIZE_calc1_ovf)         \
167     UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_ADD_ULONG(                    \
168         UX_DEVICE_CLASS_RNDIS_NX_PKPOOL_ENTRIES *                           \
169             UX_DEVICE_CLASS_RNDIS_NX_BUFF_SIZE,                             \
170         32), UX_DEVICE_CLASS_RNDIS_NX_ETHERNET_POOL_ALLOCSIZE_calc2_ovf)
171 #define UX_DEVICE_CLASS_RNDIS_NX_ETHERNET_POOL_ALLOCSIZE                        (UX_DEVICE_CLASS_RNDIS_NX_PKPOOL_ENTRIES * UX_DEVICE_CLASS_RNDIS_NX_BUFF_SIZE + 32)
172 
173 #define UX_DEVICE_CLASS_RNDIS_ETHERNET_SIZE                                     14
174 #define UX_DEVICE_CLASS_RNDIS_NODE_ID_LENGTH                                    6
175 #define UX_DEVICE_CLASS_RNDIS_VENDOR_DESCRIPTION_MAX_LENGTH                     64
176 #define UX_DEVICE_CLASS_RNDIS_MAC_OPTIONS                                       8
177 #define UX_DEVICE_CLASS_RNDIS_PACKET_HEADER_MSG                                 1
178 
179 #define UX_DEVICE_CLASS_RNDIS_OID_SUPPORTED_LIST_LENGTH                         30
180 
181 /* Device RNDIS Requests */
182 #define UX_DEVICE_CLASS_RNDIS_SEND_ENCAPSULATED_COMMAND                         0x00
183 #define UX_DEVICE_CLASS_RNDIS_GET_ENCAPSULATED_RESPONSE                         0x01
184 
185 /* Define RNDIS Versions.  Set to 1.0 here.  */
186 #define UX_DEVICE_CLASS_RNDIS_VERSION_MAJOR                                     0x00000001
187 #define UX_DEVICE_CLASS_RNDIS_VERSION_MINOR                                     0x00000000
188 
189 /* Define RNDIS Connection type supported. Set to conectionless.  */
190 #define UX_DEVICE_CLASS_RNDIS_DF_CONNECTIONLESS                                 0x00000001
191 #define UX_DEVICE_CLASS_RNDIS_DF_CONNECTION_ORIENTED                            0x00000002
192 #define UX_DEVICE_CLASS_RNDIS_DF_CONNECTION_SUPPORTED                           UX_DEVICE_CLASS_RNDIS_DF_CONNECTIONLESS
193 
194 /* Define RNDIS Medium supported by the device. */
195 #define UX_DEVICE_CLASS_RNDIS_MEDIUM_SUPPORTED                                  0x00000000
196 
197 /* Define RNDIS Packet size and types supported.  */
198 #define UX_DEVICE_CLASS_RNDIS_MAX_PACKET_PER_TRANSFER                           0x00000001
199 #define UX_DEVICE_CLASS_RNDIS_MAX_PACKET_TRANSFER_SIZE                          0x00000640
200 #define UX_DEVICE_CLASS_RNDIS_PACKET_ALIGNEMENT_FACTOR                          0x00000003
201 #define UX_DEVICE_CLASS_RNDIS_MAX_FRAME_SIZE                                    0x000005DC
202 #define UX_DEVICE_CLASS_RNDIS_MAX_PACKET_LENGTH                                 0x000005EA
203 
204 /* Define LINK speeds.  */
205 #define UX_DEVICE_CLASS_RNDIS_LINK_SPEED_FS                                     0x0001D4C0
206 
207 /* Define LINK statess.  */
208 #define UX_DEVICE_CLASS_RNDIS_LINK_STATE_DOWN                                   0
209 #define UX_DEVICE_CLASS_RNDIS_LINK_STATE_UP                                     1
210 #define UX_DEVICE_CLASS_RNDIS_LINK_STATE_PENDING_UP                             2
211 #define UX_DEVICE_CLASS_RNDIS_LINK_STATE_PENDING_DOWN                           3
212 
213 /* Define media connection values.  */
214 #define UX_DEVICE_CLASS_RNDIS_MEDIA_CONNECTED                                   0x00000000
215 #define UX_DEVICE_CLASS_RNDIS_MEDIA_DISCONNECTED                                0x00000001
216 
217 /* Define media supported values.  */
218 #define UX_DEVICE_CLASS_RNDIS_MEDIA_802_3                                       0x00000000
219 #define UX_DEVICE_CLASS_RNDIS_MEDIA_802_5                                       0x00000001
220 #define UX_DEVICE_CLASS_RNDIS_MEDIA_FDDI                                        0x00000002
221 #define UX_DEVICE_CLASS_RNDIS_MEDIA_WAN                                         0x00000003
222 #define UX_DEVICE_CLASS_RNDIS_MEDIA_LOCAL_TALK                                  0x00000004
223 #define UX_DEVICE_CLASS_RNDIS_MEDIA_DIX                                         0x00000005
224 #define UX_DEVICE_CLASS_RNDIS_MEDIA_ARCNET_RAW                                  0x00000006
225 #define UX_DEVICE_CLASS_RNDIS_MEDIA_ARCNET_878_2                                0x00000007
226 #define UX_DEVICE_CLASS_RNDIS_MEDIA_ATM                                         0x00000008
227 #define UX_DEVICE_CLASS_RNDIS_MEDIA_WIRELESS_WAN                                0x00000009
228 #define UX_DEVICE_CLASS_RNDIS_MEDIA_IRDA                                        0x0000000A
229 
230 /* Define RNDIS status values.  */
231 #define UX_DEVICE_CLASS_RNDIS_STATUS_SUCCESS                                    0x00000000
232 #define UX_DEVICE_CLASS_RNDIS_STATUS_FAILURE                                    0xC0000001
233 #define UX_DEVICE_CLASS_RNDIS_STATUS_INVALID_DATA                               0xC0010015
234 #define UX_DEVICE_CLASS_RNDIS_STATUS_NOT_SUPPORTED                              0xC00000BB
235 #define UX_DEVICE_CLASS_RNDIS_STATUS_MEDIA_CONNECTED                            0x4001000B
236 #define UX_DEVICE_CLASS_RNDIS_STATUS_MEDIA_DISCONNECT                           0x4001000C
237 
238 /* Define RNDIS Control Messages values.  */
239 #define UX_DEVICE_CLASS_RNDIS_MSG_INITIALIZE                                    0x00000002
240 #define UX_DEVICE_CLASS_RNDIS_MSG_HALT                                          0x00000003
241 #define UX_DEVICE_CLASS_RNDIS_MSG_QUERY                                         0x00000004
242 #define UX_DEVICE_CLASS_RNDIS_MSG_SET                                           0x00000005
243 #define UX_DEVICE_CLASS_RNDIS_MSG_RESET                                         0x00000006
244 #define UX_DEVICE_CLASS_RNDIS_MSG_INDICATE_STATUS                               0x00000007
245 #define UX_DEVICE_CLASS_RNDIS_MSG_KEEP_ALIVE                                    0x00000008
246 
247 /* Define RNDIS Control Completion values.  */
248 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE                                  0x80000002
249 #define UX_DEVICE_CLASS_RNDIS_CMPLT_QUERY                                       0x80000004
250 #define UX_DEVICE_CLASS_RNDIS_CMPLT_SET                                         0x80000005
251 #define UX_DEVICE_CLASS_RNDIS_CMPLT_RESET                                       0x80000006
252 #define UX_DEVICE_CLASS_RNDIS_CMPLT_KEEP_ALIVE                                  0x80000008
253 
254 /* Define RNDIS Control Messages : MSG_INITIALIZE offsets.  */
255 #define UX_DEVICE_CLASS_RNDIS_MSG_INITIALIZE_MESSAGE_TYPE                       0x00000000
256 #define UX_DEVICE_CLASS_RNDIS_MSG_INITIALIZE_MESSAGE_LENGTH                     0x00000004
257 #define UX_DEVICE_CLASS_RNDIS_MSG_INITIALIZE_REQUEST_ID                         0x00000008
258 #define UX_DEVICE_CLASS_RNDIS_MSG_INITIALIZE_MAJOR_VERSION                      0x0000000C
259 #define UX_DEVICE_CLASS_RNDIS_MSG_INITIALIZE_MINOR_VERSION                      0x00000010
260 #define UX_DEVICE_CLASS_RNDIS_MSG_INITIALIZE_MAX_TRANSFER_SIZE                  0x00000014
261 
262 /* Define RNDIS Control Messages : CMPLT_INITIALIZE offsets.  */
263 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_MESSAGE_TYPE                     0x00000000
264 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_MESSAGE_LENGTH                   0x00000004
265 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_REQUEST_ID                       0x00000008
266 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_STATUS                           0x0000000C
267 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_MAJOR_VERSION                    0x00000010
268 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_MINOR_VERSION                    0x00000014
269 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_DEVICE_FLAGS                     0x00000018
270 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_MEDIUM                           0x0000001C
271 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_MAX_PACKETS_PER_TRANSFER         0x00000020
272 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_MAX_TRANSFER_SIZE                0x00000024
273 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_PACKET_ALIGNMENT                 0x00000028
274 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_AFL_LIST_OFFSET                  0x0000002C
275 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_AFL_LIST_SIZE                    0x00000030
276 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_RESPONSE_LENGTH                  0x00000034
277 
278 /* Define RNDIS Control Messages : MSG_HALT offsets.  */
279 #define UX_DEVICE_CLASS_RNDIS_MSG_HALT_MESSAGE_TYPE                             0x00000000
280 #define UX_DEVICE_CLASS_RNDIS_MSG_HALT_MESSAGE_LENGTH                           0x00000004
281 #define UX_DEVICE_CLASS_RNDIS_MSG_HALT_REQUEST_ID                               0x00000008
282 
283 /* Define RNDIS Control Messages : MSG_QUERY offsets.  */
284 #define UX_DEVICE_CLASS_RNDIS_MSG_QUERY_MESSAGE_TYPE                            0x00000000
285 #define UX_DEVICE_CLASS_RNDIS_MSG_QUERY_MESSAGE_LENGTH                          0x00000004
286 #define UX_DEVICE_CLASS_RNDIS_MSG_QUERY_REQUEST_ID                              0x00000008
287 #define UX_DEVICE_CLASS_RNDIS_MSG_QUERY_OID                                     0x0000000C
288 #define UX_DEVICE_CLASS_RNDIS_MSG_QUERY_INFO_BUFFER_LENGTH                      0x00000010
289 #define UX_DEVICE_CLASS_RNDIS_MSG_QUERY_INFO_BUFFER_OFFSET                      0x00000014
290 #define UX_DEVICE_CLASS_RNDIS_MSG_QUERY_DEVICE_VC_HANDLE                        0x00000018
291 
292 #define UX_DEVICE_CLASS_RNDIS_CMPLT_QUERY_MESSAGE_TYPE                          0x00000000
293 #define UX_DEVICE_CLASS_RNDIS_CMPLT_QUERY_MESSAGE_LENGTH                        0x00000004
294 #define UX_DEVICE_CLASS_RNDIS_CMPLT_QUERY_REQUEST_ID                            0x00000008
295 #define UX_DEVICE_CLASS_RNDIS_CMPLT_QUERY_STATUS                                0x0000000C
296 #define UX_DEVICE_CLASS_RNDIS_CMPLT_QUERY_INFO_BUFFER_LENGTH                    0x00000010
297 #define UX_DEVICE_CLASS_RNDIS_CMPLT_QUERY_INFO_BUFFER_OFFSET                    0x00000014
298 #define UX_DEVICE_CLASS_RNDIS_CMPLT_QUERY_INFO_BUFFER                           0x00000018
299 
300 /* Define RNDIS Control Messages : MSG_SET offsets.  */
301 #define UX_DEVICE_CLASS_RNDIS_MSG_SET_MESSAGE_TYPE                              0x00000000
302 #define UX_DEVICE_CLASS_RNDIS_MSG_SET_MESSAGE_LENGTH                            0x00000004
303 #define UX_DEVICE_CLASS_RNDIS_MSG_SET_REQUEST_ID                                0x00000008
304 #define UX_DEVICE_CLASS_RNDIS_MSG_SET_OID                                       0x0000000C
305 #define UX_DEVICE_CLASS_RNDIS_MSG_SET_INFO_BUFFER_LENGTH                        0x00000010
306 #define UX_DEVICE_CLASS_RNDIS_MSG_SET_INFO_BUFFER_OFFSET                        0x00000014
307 #define UX_DEVICE_CLASS_RNDIS_MSG_SET_DEVICE_VC_HANDLE                          0x00000018
308 #define UX_DEVICE_CLASS_RNDIS_CMPLT_SET_MESSAGE_TYPE                            0x00000000
309 #define UX_DEVICE_CLASS_RNDIS_CMPLT_SET_MESSAGE_LENGTH                          0x00000004
310 #define UX_DEVICE_CLASS_RNDIS_CMPLT_SET_REQUEST_ID                              0x00000008
311 #define UX_DEVICE_CLASS_RNDIS_CMPLT_SET_STATUS                                  0x0000000C
312 #define UX_DEVICE_CLASS_RNDIS_CMPLT_SET_RESPONSE_LENGTH                         0x00000010
313 
314 /* Define RNDIS Control Messages : MSG_RESET offsets.  */
315 #define UX_DEVICE_CLASS_RNDIS_MSG_RESET_MESSAGE_TYPE                            0x00000000
316 #define UX_DEVICE_CLASS_RNDIS_MSG_RESET_MESSAGE_LENGTH                          0x00000004
317 #define UX_DEVICE_CLASS_RNDIS_MSG_RESET_RESERVED                                0x00000008
318 #define UX_DEVICE_CLASS_RNDIS_CMPLT_RESET_MESSAGE_TYPE                          0x00000000
319 #define UX_DEVICE_CLASS_RNDIS_CMPLT_RESET_MESSAGE_LENGTH                        0x00000004
320 #define UX_DEVICE_CLASS_RNDIS_CMPLT_RESET_STATUS                                0x00000008
321 #define UX_DEVICE_CLASS_RNDIS_CMPLT_RESET_ADDRESSING_RESET                      0x0000000C
322 #define UX_DEVICE_CLASS_RNDIS_CMPLT_RESET_RESPONSE_LENGTH                       0x00000010
323 
324 /* Define RNDIS Control Messages : MSG_INDICATE_STATUS offsets.  */
325 #define UX_DEVICE_CLASS_RNDIS_MSG_INDICATE_STATUS_MESSAGE_TYPE                  0x00000000
326 #define UX_DEVICE_CLASS_RNDIS_MSG_INDICATE_STATUS_MESSAGE_LENGTH                0x00000004
327 #define UX_DEVICE_CLASS_RNDIS_MSG_INDICATE_STATUS_STATUS                        0x00000008
328 #define UX_DEVICE_CLASS_RNDIS_MSG_INDICATE_STATUS_STATUS_BUFFER_LENGTH          0x0000000C
329 #define UX_DEVICE_CLASS_RNDIS_MSG_INDICATE_STATUS_STATUS_BUFFER_OFFSET          0x00000010
330 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INDICATE_STATUS_DIAG                        0x00000000
331 #define UX_DEVICE_CLASS_RNDIS_CMPLT_INDICATE_STATUS_ERROR_OFFSET                0x00000004
332 
333 /* Define RNDIS Control Messages : MSG_KEEP_ALIVE offsets.  */
334 #define UX_DEVICE_CLASS_RNDIS_MSG_KEEP_ALIVE_MESSAGE_TYPE                       0x00000000
335 #define UX_DEVICE_CLASS_RNDIS_MSG_KEEP_ALIVE_MESSAGE_LENGTH                     0x00000004
336 #define UX_DEVICE_CLASS_RNDIS_MSG_KEEP_ALIVE_REQUEST_ID                         0x00000008
337 #define UX_DEVICE_CLASS_RNDIS_CMPLT_KEEP_ALIVE_MESSAGE_TYPE                     0x00000000
338 #define UX_DEVICE_CLASS_RNDIS_CMPLT_KEEP_ALIVE_MESSAGE_LENGTH                   0x00000004
339 #define UX_DEVICE_CLASS_RNDIS_CMPLT_KEEP_ALIVE_REQUEST_ID                       0x00000008
340 #define UX_DEVICE_CLASS_RNDIS_CMPLT_KEEP_ALIVE_STATUS                           0x0000000C
341 #define UX_DEVICE_CLASS_RNDIS_CMPLT_KEEP_ALIVE_RESPONSE_LENGTH                  0x00000010
342 
343 /* Define RNDIS State machine.  */
344 #define UX_DEVICE_CLASS_RNDIS_STATE_UNINITIALIZED                               0x00000000
345 #define UX_DEVICE_CLASS_RNDIS_STATE_INITIALIZED                                 0x00000001
346 #define UX_DEVICE_CLASS_RNDIS_STATE_DATA_INITIALIZED                            0x00000002
347 
348 /* Define Required Object IDs (OIDs) */
349 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_SUPPORTED_LIST                            0x00010101
350 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_HARDWARE_STATUS                           0x00010102
351 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MEDIA_SUPPORTED                           0x00010103
352 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MEDIA_IN_USE                              0x00010104
353 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MAXIMUM_LOOKAHEAD                         0x00010105
354 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE                        0x00010106
355 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_LINK_SPEED                                0x00010107
356 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_TRANSMIT_BUFFER_SPACE                     0x00010108
357 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_RECEIVE_BUFFER_SPACE                      0x00010109
358 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE                       0x0001010A
359 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE                        0x0001010B
360 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_VENDOR_ID                                 0x0001010C
361 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_VENDOR_DESCRIPTION                        0x0001010D
362 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_CURRENT_PACKET_FILTER                     0x0001010E
363 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_CURRENT_LOOKAHEAD                         0x0001010F
364 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_DRIVER_VERSION                            0x00010110
365 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE                        0x00010111
366 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_PROTOCOL_OPTIONS                          0x00010112
367 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MAC_OPTIONS                               0x00010113
368 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MEDIA_CONNECT_STATUS                      0x00010114
369 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MAXIMUM_SEND_PACKETS                      0x00010115
370 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_VENDOR_DRIVER_VERSION                     0x00010116
371 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_SUPPORTED_GUIDS                           0x00010117
372 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_NETWORK_LAYER_ADDRESSES                   0x00010118
373 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_TRANSPORT_HEADER_OFFSET                   0x00010119
374 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MACHINE_NAME                              0x0001021A
375 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER                    0x0001021B
376 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_VLAN_ID                                   0x0001021C
377 
378 /* Define Optional OIDs */
379 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MEDIA_CAPABILITIES                        0x00010201
380 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_PHYSICAL_MEDIUM                           0x00010202
381 
382 /* Define Required statistics OIDs */
383 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_XMIT_OK                                   0x00020101
384 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_RCV_OK                                    0x00020102
385 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_XMIT_ERROR                                0x00020103
386 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_RCV_ERROR                                 0x00020104
387 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_RCV_NO_BUFFER                             0x00020105
388 
389 /* Define Optional statistics OIDs */
390 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_DIRECTED_BYTES_XMIT                       0x00020201
391 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_DIRECTED_FRAMES_XMIT                      0x00020202
392 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MULTICAST_BYTES_XMIT                      0x00020203
393 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MULTICAST_FRAMES_XMIT                     0x00020204
394 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_BROADCAST_BYTES_XMIT                      0x00020205
395 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_BROADCAST_FRAMES_XMIT                     0x00020206
396 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_DIRECTED_BYTES_RCV                        0x00020207
397 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_DIRECTED_FRAMES_RCV                       0x00020208
398 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MULTICAST_BYTES_RCV                       0x00020209
399 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MULTICAST_FRAMES_RCV                      0x0002020A
400 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_BROADCAST_BYTES_RCV                       0x0002020B
401 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_BROADCAST_FRAMES_RCV                      0x0002020C
402 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_RCV_CRC_ERROR                             0x0002020D
403 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_TRANSMIT_QUEUE_LENGTH                     0x0002020E
404 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_GET_TIME_CAPS                             0x0002020F
405 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_GET_NETCARD_TIME                          0x00020210
406 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_NETCARD_LOAD                              0x00020211
407 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_DEVICE_PROFILE                            0x00020212
408 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_INIT_TIME_MS                              0x00020213
409 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_RESET_COUNTS                              0x00020214
410 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MEDIA_SENSE_COUNTS                        0x00020215
411 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_FRIENDLY_NAME                             0x00020216
412 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_MINIPORT_INFO                             0x00020217
413 #define UX_DEVICE_CLASS_RNDIS_OID_GEN_RESET_VERIFY_PARAMETERS                   0x00020218
414 
415 /* Define IEEE 802.3 (Ethernet) OIDs */
416 
417 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_PERMANENT_ADDRESS                       0x01010101
418 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_CURRENT_ADDRESS                         0x01010102
419 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_MULTICAST_LIST                          0x01010103
420 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_MAXIMUM_LIST_SIZE                       0x01010104
421 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_MAC_OPTIONS                             0x01010105
422 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT                     0x01020101
423 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_XMIT_ONE_COLLISION                      0x01020102
424 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_XMIT_MORE_COLLISIONS                    0x01020103
425 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_XMIT_DEFERRED                           0x01020201
426 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_XMIT_MAX_COLLISIONS                     0x01020202
427 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_RCV_OVERRUN                             0x01020203
428 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_XMIT_UNDERRUN                           0x01020204
429 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_XMIT_HEARTBEAT_FAILURE                  0x01020205
430 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_XMIT_TIMES_CRS_LOST                     0x01020206
431 #define UX_DEVICE_CLASS_RNDIS_OID_802_3_XMIT_LATE_COLLISIONS                    0x01020207
432 
433 /* Define Hardware status code.  */
434 #define UX_DEVICE_CLASS_RNDIS_OID_HW_STATUS_READY                               0x00000000
435 #define UX_DEVICE_CLASS_RNDIS_OID_HW_STATUS_INITIALIZING                        0x00000001
436 #define UX_DEVICE_CLASS_RNDIS_OID_HW_STATUS_RESET                               0x00000002
437 #define UX_DEVICE_CLASS_RNDIS_OID_HW_STATUS_CLOSING                             0x00000003
438 #define UX_DEVICE_CLASS_RNDIS_OID_HW_STATUS_NOT_READY                           0x00000004
439 
440 /* Define RNDIS Packet Header format.  */
441 #define UX_DEVICE_CLASS_RNDIS_PACKET_MESSAGE_TYPE                               0x00000000
442 #define UX_DEVICE_CLASS_RNDIS_PACKET_MESSAGE_LENGTH                             0x00000004
443 #define UX_DEVICE_CLASS_RNDIS_PACKET_DATA_OFFSET                                0x00000008
444 #define UX_DEVICE_CLASS_RNDIS_PACKET_DATA_LENGTH                                0x0000000C
445 #define UX_DEVICE_CLASS_RNDIS_PACKET_OOB_DATA_OFFSET                            0x00000010
446 #define UX_DEVICE_CLASS_RNDIS_PACKET_OOB_DATA_LENGTH                            0x00000014
447 #define UX_DEVICE_CLASS_RNDIS_PACKET_NUM_OOB_DATA_ELEMENTS                      0x00000018
448 #define UX_DEVICE_CLASS_RNDIS_PACKET_INFO_OFFSET                                0x0000001C
449 #define UX_DEVICE_CLASS_RNDIS_PACKET_INFO_LENGTH                                0x00000020
450 #define UX_DEVICE_CLASS_RNDIS_PACKET_VC_HANDLE                                  0x00000024
451 #define UX_DEVICE_CLASS_RNDIS_PACKET_RESERVED                                   0x00000028
452 #define UX_DEVICE_CLASS_RNDIS_PACKET_BUFFER                                     0x0000002C
453 #define UX_DEVICE_CLASS_RNDIS_PACKET_HEADER_LENGTH                              0x0000002C
454 
455 /* Define NetX errors inside the RNDIS class.  */
456 #define UX_DEVICE_CLASS_RNDIS_NX_SUCCESS                                        0x00
457 #define UX_DEVICE_CLASS_RNDIS_NX_NO_PACKET                                      0x01
458 #define UX_DEVICE_CLASS_RNDIS_NX_UNDERFLOW                                      0x02
459 #define UX_DEVICE_CLASS_RNDIS_NX_OVERFLOW                                       0x03
460 #define UX_DEVICE_CLASS_RNDIS_NX_NO_MAPPING                                     0x04
461 #define UX_DEVICE_CLASS_RNDIS_NX_DELETED                                        0x05
462 #define UX_DEVICE_CLASS_RNDIS_NX_POOL_ERROR                                     0x06
463 #define UX_DEVICE_CLASS_RNDIS_NX_PTR_ERROR                                      0x07
464 #define UX_DEVICE_CLASS_RNDIS_NX_WAIT_ERROR                                     0x08
465 #define UX_DEVICE_CLASS_RNDIS_NX_SIZE_ERROR                                     0x09
466 #define UX_DEVICE_CLASS_RNDIS_NX_OPTION_ERROR                                   0x0a
467 #define UX_DEVICE_CLASS_RNDIS_NX_DELETE_ERROR                                   0x10
468 #define UX_DEVICE_CLASS_RNDIS_NX_CALLER_ERROR                                   0x11
469 #define UX_DEVICE_CLASS_RNDIS_NX_INVALID_PACKET                                 0x12
470 #define UX_DEVICE_CLASS_RNDIS_NX_INVALID_SOCKET                                 0x13
471 #define UX_DEVICE_CLASS_RNDIS_NX_NOT_ENABLED                                    0x14
472 #define UX_DEVICE_CLASS_RNDIS_NX_ALREADY_ENABLED                                0x15
473 #define UX_DEVICE_CLASS_RNDIS_NX_ENTRY_NOT_FOUND                                0x16
474 #define UX_DEVICE_CLASS_RNDIS_NX_NO_MORE_ENTRIES                                0x17
475 #define UX_DEVICE_CLASS_RNDIS_NX_ARP_TIMER_ERROR                                0x18
476 #define UX_DEVICE_CLASS_RNDIS_NX_RESERVED_CODE0                                 0x19
477 #define UX_DEVICE_CLASS_RNDIS_NX_WAIT_ABORTED                                   0x1A
478 #define UX_DEVICE_CLASS_RNDIS_NX_IP_INTERNAL_ERROR                              0x20
479 #define UX_DEVICE_CLASS_RNDIS_NX_IP_ADDRESS_ERROR                               0x21
480 #define UX_DEVICE_CLASS_RNDIS_NX_ALREADY_BOUND                                  0x22
481 #define UX_DEVICE_CLASS_RNDIS_NX_PORT_UNAVAILABLE                               0x23
482 #define UX_DEVICE_CLASS_RNDIS_NX_NOT_BOUND                                      0x24
483 #define UX_DEVICE_CLASS_RNDIS_NX_RESERVED_CODE1                                 0x25
484 #define UX_DEVICE_CLASS_RNDIS_NX_SOCKET_UNBOUND                                 0x26
485 #define UX_DEVICE_CLASS_RNDIS_NX_NOT_CREATED                                    0x27
486 #define UX_DEVICE_CLASS_RNDIS_NX_SOCKETS_BOUND                                  0x28
487 #define UX_DEVICE_CLASS_RNDIS_NX_NO_RESPONSE                                    0x29
488 #define UX_DEVICE_CLASS_RNDIS_NX_POOL_DELETED                                   0x30
489 #define UX_DEVICE_CLASS_RNDIS_NX_ALREADY_RELEASED                               0x31
490 #define UX_DEVICE_CLASS_RNDIS_NX_RESERVED_CODE2                                 0x32
491 #define UX_DEVICE_CLASS_RNDIS_NX_MAX_LISTEN                                     0x33
492 #define UX_DEVICE_CLASS_RNDIS_NX_DUPLICATE_LISTEN                               0x34
493 #define UX_DEVICE_CLASS_RNDIS_NX_NOT_CLOSED                                     0x35
494 #define UX_DEVICE_CLASS_RNDIS_NX_NOT_LISTEN_STATE                               0x36
495 #define UX_DEVICE_CLASS_RNDIS_NX_IN_PROGRESS                                    0x37
496 #define UX_DEVICE_CLASS_RNDIS_NX_NOT_CONNECTED                                  0x38
497 #define UX_DEVICE_CLASS_RNDIS_NX_WINDOW_OVERFLOW                                0x39
498 #define UX_DEVICE_CLASS_RNDIS_NX_ALREADY_SUSPENDED                              0x40
499 #define UX_DEVICE_CLASS_RNDIS_NX_DISCONNECT_FAILED                              0x41
500 #define UX_DEVICE_CLASS_RNDIS_NX_STILL_BOUND                                    0x42
501 #define UX_DEVICE_CLASS_RNDIS_NX_NOT_SUCCESSFUL                                 0x43
502 #define UX_DEVICE_CLASS_RNDIS_NX_UNHANDLED_COMMAND                              0x44
503 #define UX_DEVICE_CLASS_RNDIS_NX_NO_FREE_PORTS                                  0x45
504 #define UX_DEVICE_CLASS_RNDIS_NX_INVALID_PORT                                   0x46
505 #define UX_DEVICE_CLASS_RNDIS_NX_INVALID_RELISTEN                               0x47
506 #define UX_DEVICE_CLASS_RNDIS_NX_CONNECTION_PENDING                             0x48
507 #define UX_DEVICE_CLASS_RNDIS_NX_TX_QUEUE_DEPTH                                 0x49
508 #define UX_DEVICE_CLASS_RNDIS_NX_NOT_IMPLEMENTED                                0x80
509 
510 /* Define timeout packet allocation value.  */
511 #ifndef UX_DEVICE_CLASS_RNDIS_PACKET_POOL_WAIT
512 #define UX_DEVICE_CLASS_RNDIS_PACKET_POOL_WAIT                                  10
513 #endif
514 
515 #ifndef UX_DEVICE_CLASS_RNDIS_PACKET_POOL_INST_WAIT
516 #define UX_DEVICE_CLASS_RNDIS_PACKET_POOL_INST_WAIT                             100
517 #endif
518 
519 /* Calculate response buffer length.  */
520 #define UX_DEVICE_CLASS_RNDIS_OID_SUPPORTED_RESPONSE_LENGTH             (UX_DEVICE_CLASS_RNDIS_CMPLT_QUERY_INFO_BUFFER + UX_DEVICE_CLASS_RNDIS_OID_SUPPORTED_LIST_LENGTH * 4)
521 #define UX_DEVICE_CLASS_RNDIS_VENDOR_DESCRIPTION_MAX_RESPONSE_LENGTH    (UX_DEVICE_CLASS_RNDIS_CMPLT_QUERY_INFO_BUFFER + UX_DEVICE_CLASS_RNDIS_VENDOR_DESCRIPTION_MAX_LENGTH)
522 #define UX_DEVICE_CLASS_RNDIS_NODE_ID_RESPONSE_LENGTH                   (UX_DEVICE_CLASS_RNDIS_CMPLT_QUERY_INFO_BUFFER + UX_DEVICE_CLASS_RNDIS_NODE_ID_LENGTH)
523 
524 /* Decide maximum size of RNDIS response buffer (with 1 ~ 4 bytes as padding and aligned to 4 bytes).  */
525 #define UX_DEVICE_CLASS_RNDIS_MAX(a, b) (((a) > (b)) ? (a) : (b))
526 #define UX_DEVICE_CLASS_RNDIS_MAX_CONTROL_RESPONSE_LENGTH               (((                         \
527         UX_DEVICE_CLASS_RNDIS_MAX(UX_DEVICE_CLASS_RNDIS_CMPLT_INITIALIZE_RESPONSE_LENGTH,           \
528         UX_DEVICE_CLASS_RNDIS_MAX(UX_DEVICE_CLASS_RNDIS_CMPLT_KEEP_ALIVE_RESPONSE_LENGTH,           \
529         UX_DEVICE_CLASS_RNDIS_MAX(UX_DEVICE_CLASS_RNDIS_CMPLT_RESET_RESPONSE_LENGTH,                \
530         UX_DEVICE_CLASS_RNDIS_MAX(UX_DEVICE_CLASS_RNDIS_CMPLT_SET_RESPONSE_LENGTH,                  \
531         UX_DEVICE_CLASS_RNDIS_MAX(UX_DEVICE_CLASS_RNDIS_OID_SUPPORTED_RESPONSE_LENGTH,              \
532         UX_DEVICE_CLASS_RNDIS_MAX(UX_DEVICE_CLASS_RNDIS_VENDOR_DESCRIPTION_MAX_RESPONSE_LENGTH,     \
533         UX_DEVICE_CLASS_RNDIS_NODE_ID_RESPONSE_LENGTH))))))) & (~0x3)) + 0x4)
534 
535 /* Ensure maximum-sized RNDIS response can fit in the control endpoint's transfer buffer.  */
536 #if UX_DEVICE_CLASS_RNDIS_MAX_CONTROL_RESPONSE_LENGTH > UX_SLAVE_REQUEST_CONTROL_MAX_LENGTH
537 /* Checked in _initialize().  */
538 #endif
539 
540 /* Define Slave RNDIS Class Calling Parameter structure */
541 
542 typedef struct UX_SLAVE_CLASS_RNDIS_PARAMETER_STRUCT
543 {
544     VOID                    (*ux_slave_class_rndis_instance_activate)(VOID *);
545     VOID                    (*ux_slave_class_rndis_instance_deactivate)(VOID *);
546     ULONG                   ux_slave_class_rndis_parameter_media;
547     ULONG                   ux_slave_class_rndis_parameter_vendor_id;
548     ULONG                   ux_slave_class_rndis_parameter_driver_version;
549     UCHAR                   ux_slave_class_rndis_parameter_vendor_description[UX_DEVICE_CLASS_RNDIS_VENDOR_DESCRIPTION_MAX_LENGTH];
550     UCHAR                   ux_slave_class_rndis_parameter_local_node_id[UX_DEVICE_CLASS_RNDIS_NODE_ID_LENGTH];
551     UCHAR                   ux_slave_class_rndis_parameter_remote_node_id[UX_DEVICE_CLASS_RNDIS_NODE_ID_LENGTH];
552     NX_IP                   *ux_slave_class_rndis_parameter_nx_ip;
553     ULONG                   ux_slave_class_rndis_parameter_nx_ip_address;
554     ULONG                   ux_slave_class_rndis_parameter_nx_ip_network_mask;
555 
556 } UX_SLAVE_CLASS_RNDIS_PARAMETER;
557 
558 /* Define RNDIS Class structure.  */
559 
560 typedef struct UX_SLAVE_CLASS_RNDIS_STRUCT
561 {
562     UX_SLAVE_INTERFACE                      *ux_slave_class_rndis_interface;
563     UX_SLAVE_CLASS_RNDIS_PARAMETER          ux_slave_class_rndis_parameter;
564     UX_SEMAPHORE                            ux_slave_class_rndis_semaphore;
565     UX_SLAVE_ENDPOINT                       *ux_slave_class_rndis_interrupt_endpoint;
566     UX_SLAVE_ENDPOINT                       *ux_slave_class_rndis_bulkin_endpoint;
567     UX_SLAVE_ENDPOINT                       *ux_slave_class_rndis_bulkout_endpoint;
568 #if UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1
569     UCHAR                                   *ux_device_class_rndis_endpoint_buffer;
570 #endif
571     UCHAR                                   ux_slave_class_rndis_response[UX_DEVICE_CLASS_RNDIS_MAX_CONTROL_RESPONSE_LENGTH];
572     ULONG                                   ux_slave_class_rndis_response_length;
573     ULONG                                   ux_slave_class_rndis_state;
574     ULONG                                   ux_slave_class_rndis_major_version;
575     ULONG                                   ux_slave_class_rndis_minor_version;
576     ULONG                                   ux_slave_class_rndis_max_transfer_size;
577     ULONG                                   ux_slave_class_rndis_request_id;
578     ULONG                                   ux_slave_class_rndis_statistics_xmit_ok;
579     ULONG                                   ux_slave_class_rndis_statistics_rcv_ok;
580     ULONG                                   ux_slave_class_rndis_statistics_xmit_error;
581     ULONG                                   ux_slave_class_rndis_statistics_rcv_error;
582     ULONG                                   ux_slave_class_rndis_statistics_rcv_no_buffer;
583     ULONG                                   ux_slave_class_rndis_statistics_rcv_error_alignment;
584     ULONG                                   ux_slave_class_rndis_statistics_xmit_one_collision;
585     ULONG                                   ux_slave_class_rndis_statistics_xmit_more_collisions;
586     UCHAR                                   ux_slave_class_rndis_local_node_id[UX_DEVICE_CLASS_RNDIS_NODE_ID_LENGTH];
587     UCHAR                                   ux_slave_class_rndis_remote_node_id[UX_DEVICE_CLASS_RNDIS_NODE_ID_LENGTH];
588     ULONG                                   ux_slave_class_rndis_nx_ip_address;
589     ULONG                                   ux_slave_class_rndis_nx_ip_network_mask;
590 
591 #if !defined(UX_DEVICE_STANDALONE)
592     NX_IP                                   *ux_slave_class_rndis_nx_ip;
593     NX_INTERFACE                            *ux_slave_class_rndis_nx_interface;
594     NX_PACKET                               *ux_slave_class_rndis_xmit_queue;
595     NX_PACKET                               *ux_slave_class_rndis_receive_queue;
596     NX_PACKET_POOL                          *ux_slave_class_rndis_packet_pool;
597 #endif
598 
599 #if !defined(UX_DEVICE_STANDALONE)
600     UX_EVENT_FLAGS_GROUP                    ux_slave_class_rndis_event_flags_group;
601     UX_THREAD                               ux_slave_class_rndis_interrupt_thread;
602     UX_THREAD                               ux_slave_class_rndis_bulkin_thread;
603     UX_THREAD                               ux_slave_class_rndis_bulkout_thread;
604     UX_MUTEX                                ux_slave_class_rndis_mutex;
605     UCHAR                                   *ux_slave_class_rndis_interrupt_thread_stack;
606     UCHAR                                   *ux_slave_class_rndis_bulkin_thread_stack;
607     UCHAR                                   *ux_slave_class_rndis_bulkout_thread_stack;
608 #endif
609 
610     ULONG                                   ux_slave_class_rndis_link_state;
611     VOID                                    *ux_slave_class_rndis_network_handle;
612 
613 } UX_SLAVE_CLASS_RNDIS;
614 
615 /* Define RNDIS endpoint buffer settings (when RNDIS owns buffer).  */
616 #if (UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1) && defined(UX_DEVICE_CLASS_RNDIS_ZERO_COPY)
617 #define UX_DEVICE_CLASS_RNDIS_ENDPOINT_BUFFER_SIZE_CALC_OVERFLOW 0 /* only one buffer, no calculation  */
618 #else
619 #define UX_DEVICE_CLASS_RNDIS_ENDPOINT_BUFFER_SIZE_CALC_OVERFLOW \
620     (UX_OVERFLOW_CHECK_ADD_ULONG(UX_DEVICE_CLASS_RNDIS_BULKOUT_BUFFER_SIZE,     \
621                                  UX_DEVICE_CLASS_RNDIS_BULKIN_BUFFER_SIZE) ||   \
622      UX_OVERFLOW_CHECK_ADD_ULONG(UX_DEVICE_CLASS_RNDIS_BULKOUT_BUFFER_SIZE +    \
623                                  UX_DEVICE_CLASS_RNDIS_BULKIN_BUFFER_SIZE,      \
624                                  UX_DEVICE_CLASS_RNDIS_INTERRUPTIN_BUFFER_SIZE))
625 #endif
626 #define UX_DEVICE_CLASS_RNDIS_ENDPOINT_BUFFER_SIZE          (UX_DEVICE_CLASS_RNDIS_BULKOUT_BUFFER_SIZE + UX_DEVICE_CLASS_RNDIS_BULKIN_BUFFER_SIZE + UX_DEVICE_CLASS_RNDIS_INTERRUPTIN_BUFFER_SIZE)
627 #define UX_DEVICE_CLASS_RNDIS_BULKOUT_BUFFER(rndis)         ((rndis)->ux_device_class_rndis_endpoint_buffer)
628 #define UX_DEVICE_CLASS_RNDIS_BULKIN_BUFFER(rndis)          (UX_DEVICE_CLASS_RNDIS_BULKOUT_BUFFER(rndis) + UX_DEVICE_CLASS_RNDIS_BULKOUT_BUFFER_SIZE)
629 #define UX_DEVICE_CLASS_RNDIS_INTERRUPTIN_BUFFER(rndis)     (UX_DEVICE_CLASS_RNDIS_BULKIN_BUFFER(rndis)  + UX_DEVICE_CLASS_RNDIS_BULKIN_BUFFER_SIZE)
630 
631 
632 /* Requests - Ethernet Networking Control Model */
633 
634 #define UX_DEVICE_CLASS_RNDIS_SEND_ENCAPSULATED_COMMAND                        0x00
635                                         /* Issues a command in the format of the supported control
636                                            protocol. The intent of this mechanism is to support
637                                            networking devices (e.g., host-based cable modems)
638                                            that require an additional vendor-defined interface for
639                                            media specific hardware configuration and
640                                            management.  */
641 #define UX_DEVICE_CLASS_RNDIS_GET_ENCAPSULATED_RESPONSE                        0x01
642                                         /* Requests a response in the format of the supported
643                                            control protocol.  */
644 
645 
646 /* Define buffer length for IN/OUT pipes.  */
647 
648 #define UX_DEVICE_CLASS_RNDIS_BUFFER_SIZE                                       4096
649 
650 
651 /* Define Device RNDIS Class prototypes.  */
652 
653 UINT  _ux_device_class_rndis_activate(UX_SLAVE_CLASS_COMMAND *command);
654 UINT  _ux_device_class_rndis_control_request(UX_SLAVE_CLASS_COMMAND *command);
655 UINT  _ux_device_class_rndis_deactivate(UX_SLAVE_CLASS_COMMAND *command);
656 UINT  _ux_device_class_rndis_entry(UX_SLAVE_CLASS_COMMAND *command);
657 UINT  _ux_device_class_rndis_initialize(UX_SLAVE_CLASS_COMMAND *command);
658 UINT  _ux_device_class_rndis_write(VOID *rndis_class, NX_PACKET *packet);
659 UINT  _ux_device_class_rndis_msg_query(UX_SLAVE_CLASS_RNDIS *rndis, UX_SLAVE_TRANSFER *transfer_request);
660 UINT  _ux_device_class_rndis_msg_reset(UX_SLAVE_CLASS_RNDIS *rndis, UX_SLAVE_TRANSFER *transfer_request);
661 UINT  _ux_device_class_rndis_msg_set(UX_SLAVE_CLASS_RNDIS *rndis, UX_SLAVE_TRANSFER *transfer_request);
662 UINT  _ux_device_class_rndis_msg_initialize(UX_SLAVE_CLASS_RNDIS *rndis, UX_SLAVE_TRANSFER *transfer_request);
663 UINT  _ux_device_class_rndis_msg_keep_alive(UX_SLAVE_CLASS_RNDIS *rndis, UX_SLAVE_TRANSFER *transfer_request);
664 VOID  _ux_device_class_rndis_interrupt_thread(ULONG rndis_class);
665 VOID  _ux_device_class_rndis_bulkin_thread(ULONG rndis_class);
666 VOID  _ux_device_class_rndis_bulkout_thread(ULONG rndis_class);
667 
668 
669 /* Define Device RNDIS Class API prototypes.  */
670 
671 #define ux_device_class_rndis_entry        _ux_device_class_rndis_entry
672 
673 
674 /* Define OID supported List.  */
675 extern ULONG ux_device_class_rndis_oid_supported_list[];
676 
677 /* Determine if a C++ compiler is being used.  If so, complete the standard
678    C conditional started above.  */
679 #ifdef __cplusplus
680 }
681 #endif
682 
683 #endif /* UX_DEVICE_CLASS_RNDIS_H */
684