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