00001
00046 #ifndef IXUSBRNDIS_H
00047 #define IXUSBRNDIS_H
00048
00049 #include <IxTypes.h>
00050 #include <usb.h>
00051 #include <stdio.h>
00052 #include <stdarg.h>
00053
00107 #ifndef __doxygen_HIDE
00108
00109 #define USB_COMMUCATION_DEVICE (0x02)
00110 #define USB_COMMUNICATION_INTERFACE (0x02)
00111 #define USB_ABSTRACT_CONTROL_MODEL (0x02)
00112 #define USB_VENDOR_SPECIFIC_PROTOCOL (0xff)
00113 #define USB_DATA_INTERFACE (0x0a)
00114
00115 #define RNDIS_SEND_ENCAPSULATED_COMMAND (0x00)
00116 #define RNDIS_GET_ENCAPSULATED_RESPONSE (0x01)
00117
00118 #define RNDIS_RESPONSE_AVAILABLE (0x01)
00119 #define RNDIS_RESPONSE_AVAILABLE_NOTIFICATION_SIZE (2)
00120
00121
00122 #define RNDIS_NOTIFICATION_ENDPOINT (ENDPOINT_5)
00123 #define RNDIS_DATA_IN_ENDPOINT (ENDPOINT_1)
00124 #define RNDIS_DATA_OUT_ENDPOINT (ENDPOINT_2)
00125 #define RNDIS_CONTROL_ENDPOINT (ENDPOINT_0)
00126
00127
00128 #define RNDIS_INITIALIZE (0x2)
00129 #define RNDIS_HALT (0x3)
00130 #define RNDIS_QUERY (0x4)
00131 #define RNDIS_SET (0x5)
00132 #define RNDIS_RESET (0x6)
00133 #define RNDIS_INDICATE_STATUS (0x7)
00134 #define RNDIS_KEEPALIVE (0x8)
00135 #define RNDIS_COMPLETED (0x80000000)
00136
00137
00138 #define RNDIS_MESSAGE_TYPE_OFFSET (0)
00139 #define RNDIS_REQUEST_ID_OFFSET (2)
00140 #define RNDIS_OID_OFFSET (3)
00141 #define RNDIS_BUFFER_LENGTH_OFFSET (4)
00142 #define RNDIS_BUFFER_OFFSET_OFFSET (5)
00143
00144
00145 #define RNDIS_DATA_OFFSET_OFFSET (2)
00146 #define RNDIS_DATA_LENGTH_OFFSET (3)
00147 #define RNDIS_DATA_PAYLOAD_BYTE_OFFSET(UINT32_pPacket) (44)
00148 #define RNDIS_DATA_PAYLOAD_BYTE_LENGTH(UINT32_pPacket) ((UINT32_pPacket)[RNDIS_DATA_LENGTH_OFFSET])
00149 #define RNDIS_DATA_PACKET_HEADER_SIZE (44)
00150 #define RNDIS_PACKET_MSG (0x1)
00151 #define RNDIS_PAYLOAD_OFFSET (36)
00152
00153
00154 #define RNDIS_INITIALIZE_COMPLETE_SIZE (52)
00155 #define RNDIS_QUERY_COMPLETE_HEADER_SIZE (24)
00156 #define RNDIS_GENERIC_MSG_COMPLETE_SIZE (16)
00157
00158
00159 #define RNDIS_NUMBER_OF_SUPPORTED_OIDS (26)
00160 #define RNDIS_MAXIMUM_FRAME_SIZE (1520)
00161 #define RNDIS_MAXIMUM_TOTAL_SIZE (1558)
00162 #define RNDIS_USB_SPEED (12000000)
00163 #define RNDIS_LINK_SPEED (RNDIS_USB_SPEED / 100)
00164 #define RNDIS_RECEIVE_BLOCK_SIZE (1514)
00165 #define RNDIS_TRANSMIT_BLOCK_SIZE (64)
00166 #define RNDIS_MAX_PACKETS_PER_TRANSFER (1)
00167 #define RNDIS_MAX_HOST_PACKET_SIZE (2048)
00168 #define RNDIS_PACKET_ALIGNMENT (1)
00169
00170
00171 #define RNDIS_STATUS_SUCCESS (0)
00172 #define RNDIS_STATUS_FAILURE (0xc0000001)
00173 #define RNDIS_STATUS_MEDIA_CONNECT (0x4001000b)
00174 #define RNDIS_STATUS_MEDIA_DISCONNECT (0x4001000c)
00175
00176
00177 #define RNDIS_MAJOR_VERSION (1)
00178 #define RNDIS_MINOR_VERSION (0)
00179
00180
00181 #define RNDIS_DF_CONNECTIONLESS (1)
00182 #define RNDIS_DF_CONNECTION_ORIENTED (2)
00183
00184
00185 #define RNDIS_MEDIUM_802_3 (0)
00186
00187
00188
00189
00190
00191 #define OID_GEN_SUPPORTED_LIST 0x00010101
00192 #define OID_GEN_HARDWARE_STATUS 0x00010102
00193 #define OID_GEN_MEDIA_SUPPORTED 0x00010103
00194 #define OID_GEN_MEDIA_IN_USE 0x00010104
00195 #define OID_GEN_MAXIMUM_LOOKAHEAD 0x00010105
00196 #define OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106
00197 #define OID_GEN_LINK_SPEED 0x00010107
00198 #define OID_GEN_TRANSMIT_BUFFER_SPACE 0x00010108
00199 #define OID_GEN_RECEIVE_BUFFER_SPACE 0x00010109
00200 #define OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010A
00201 #define OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010B
00202 #define OID_GEN_VENDOR_ID 0x0001010C
00203 #define OID_GEN_VENDOR_DESCRIPTION 0x0001010D
00204 #define OID_GEN_CURRENT_PACKET_FILTER 0x0001010E
00205 #define OID_GEN_CURRENT_LOOKAHEAD 0x0001010F
00206 #define OID_GEN_DRIVER_VERSION 0x00010110
00207 #define OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111
00208 #define OID_GEN_PROTOCOL_OPTIONS 0x00010112
00209 #define OID_GEN_MAC_OPTIONS 0x00010113
00210 #define OID_GEN_MEDIA_CONNECT_STATUS 0x00010114
00211 #define OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115
00212 #define OID_GEN_VENDOR_DRIVER_VERSION 0x00010116
00213 #define OID_GEN_SUPPORTED_GUIDS 0x00010117
00214 #define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118 // Set only
00215 #define OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119 // Set only
00216
00217
00218 #define OID_GEN_MEDIA_CAPABILITIES 0x00010201
00219 #define OID_GEN_PHYSICAL_MEDIUM 0x00010202
00220
00221
00222 #define OID_GEN_XMIT_OK 0x00020101
00223 #define OID_GEN_RCV_OK 0x00020102
00224 #define OID_GEN_XMIT_ERROR 0x00020103
00225 #define OID_GEN_RCV_ERROR 0x00020104
00226 #define OID_GEN_RCV_NO_BUFFER 0x00020105
00227
00228
00229 #define OID_802_3_PERMANENT_ADDRESS 0x01010101
00230 #define OID_802_3_CURRENT_ADDRESS 0x01010102
00231 #define OID_802_3_MULTICAST_LIST 0x01010103
00232 #define OID_802_3_MAXIMUM_LIST_SIZE 0x01010104
00233 #define OID_802_3_MAC_OPTIONS 0x01010105
00234
00235 #define NDIS_802_3_MAC_OPTION_PRIORITY 0x00000001
00236
00237 #define OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101
00238 #define OID_802_3_XMIT_ONE_COLLISION 0x01020102
00239 #define OID_802_3_XMIT_MORE_COLLISIONS 0x01020103
00240
00241 #define OID_802_3_XMIT_DEFERRED 0x01020201
00242 #define OID_802_3_XMIT_MAX_COLLISIONS 0x01020202
00243 #define OID_802_3_RCV_OVERRUN 0x01020203
00244 #define OID_802_3_XMIT_UNDERRUN 0x01020204
00245 #define OID_802_3_XMIT_HEARTBEAT_FAILURE 0x01020205
00246 #define OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206
00247 #define OID_802_3_XMIT_LATE_COLLISIONS 0x01020207
00248
00249 typedef enum _NDIS_HARDWARE_STATUS
00250 {
00251 NdisHardwareStatusReady,
00252 NdisHardwareStatusInitializing,
00253 NdisHardwareStatusReset,
00254 NdisHardwareStatusClosing,
00255 NdisHardwareStatusNotReady
00256 } NDIS_HARDWARE_STATUS, *PNDIS_HARDWARE_STATUS;
00257
00258 typedef enum _NDIS_MEDIA_STATE
00259 {
00260 NdisMediaStateConnected,
00261 NdisMediaStateDisconnected
00262 } NDIS_MEDIA_STATE, *PNDIS_MEDIA_STATE;
00263
00264
00265 typedef enum _NDIS_MEDIUM
00266 {
00267 NdisMedium802_3,
00268 NdisMedium802_5,
00269 NdisMediumFddi,
00270 NdisMediumWan,
00271 NdisMediumLocalTalk,
00272 NdisMediumDix,
00273 NdisMediumArcnetRaw,
00274 NdisMediumArcnet878_2,
00275 NdisMediumAtm,
00276 NdisMediumWirelessWan,
00277 NdisMediumIrda,
00278 NdisMediumBpc,
00279 NdisMediumCoWan,
00280 NdisMedium1394,
00281 NdisMediumMax
00282 } NDIS_MEDIUM, *PNDIS_MEDIUM;
00283
00284
00285
00286 typedef enum _NDIS_PHYSICAL_MEDIUM
00287 {
00288 NdisPhysicalMediumReserved0,
00289 NdisPhysicalMediumWirelessLan,
00290 NdisPhysicalMediumCableModem,
00291 NdisPhysicalMediumPhoneLine,
00292 NdisPhysicalMediumPowerLine,
00293 NdisPhysicalMediumDSL,
00294 NdisPhysicalMediumMax
00295 } NDIS_PHYSICAL_MEDIUM, *PNDIS_PHYSICAL_MEDIUM;
00296
00297
00298
00299
00300
00301 typedef enum
00302 {
00303 RNDIS_HALTED = 0,
00304 RNDIS_INITIALIZED,
00305 RNDIS_DATA_INITIALIZED
00306 } RndisLayerState;
00307
00308
00309
00310
00311 typedef struct
00312 {
00313 UINT32 Rx;
00314 UINT32 Tx;
00315 UINT32 RxNoBuf;
00316 } RndisLayerStats;
00317
00318
00319
00320
00321 typedef struct
00322 {
00323 UINT32 currentPacketFilter;
00324 RndisLayerStats stats;
00325 } RndisLayerData;
00326
00327
00328
00329
00330
00331 #define NDIS_PROTOCOL_ID_DEFAULT 0x00
00332 #define NDIS_PROTOCOL_ID_TCP_IP 0x02
00333 #define NDIS_PROTOCOL_ID_IPX 0x06
00334 #define NDIS_PROTOCOL_ID_NBF 0x07
00335 #define NDIS_PROTOCOL_ID_MAX 0x0F
00336 #define NDIS_PROTOCOL_ID_MASK 0x0F
00337
00338
00339
00340 #define NDIS_PACKET_TYPE_DIRECTED 0x0001
00341
00342 #define NDIS_PACKET_TYPE_MULTICAST 0x0002
00343
00344 #define NDIS_PACKET_TYPE_ALL_MULTICAST 0x0004
00345
00346 #define NDIS_PACKET_TYPE_BROADCAST 0x0008
00347
00348 #define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x0010
00349
00350 #define NDIS_PACKET_TYPE_PROMISCUOUS 0x0020
00351
00352 #define NDIS_PACKET_TYPE_SMT 0x0040
00353
00354 #define NDIS_PACKET_TYPE_ALL_LOCAL 0x0080
00355
00356 #define NDIS_PACKET_TYPE_MAC_FRAME 0x8000
00357
00358 #define NDIS_PACKET_TYPE_FUNCTIONAL 0x4000
00359
00360 #define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x2000
00361
00362 #define NDIS_PACKET_TYPE_GROUP 0x1000
00363
00364
00365
00366
00367
00368 #define WORD_COUNT(packet) (sizeof(packet) / sizeof((packet)[0]))
00369
00370 #define MIN(a, b) ((a) < (b) ? (a) : (b))
00371
00372 #define NUM_ELEM(vector) (sizeof (vector) / sizeof ((vector)[0]))
00373
00374
00375
00376
00377 #if 0
00378 #ifdef __vxworks
00379 #define ENUM_VERBOSE_TRACE(_fmt_,vargs...) \
00380 { \
00381 char _buf_[1024]; \
00382 if (sprintf(_buf_,(const char *)_fmt_,##vargs) > 0) { \
00383 logMsg(_buf_,0,0,0,0,0,0); \
00384 } \
00385 }
00386 #else
00387 #define ENUM_VERBOSE_TRACE(_fmt_,vargs...) \
00388 { \
00389 char _buf_[1024]; \
00390 if (printf(_buf_,(const char *)_fmt_,##vargs) > 0) { \
00391 } \
00392 }
00393 #endif
00394
00395 #define RNDIS_VERBOSE_TRACE(_fmt_,vargs...) \
00396 ENUM_VERBOSE_TRACE(_fmt_,##vargs)
00397 #define ENUM_TRACE(_fmt_,vargs...) \
00398 ENUM_VERBOSE_TRACE(_fmt_,##vargs)
00399 #define RNDIS_TRACE(_fmt_,vargs...) \
00400 ENUM_VERBOSE_TRACE(_fmt_,##vargs)
00401
00402 #endif
00403
00404
00405
00406
00407 #if 0
00408 static __inline__ int
00409 ENUM_VERBOSE_TRACE(char *_fmt_,...);
00410
00411 static __inline__ int
00412 ENUM_VERBOSE_TRACE(char *_fmt_,...)
00413 {
00414 char _buf_[1024];
00415 int retStatus = 0;
00416 va_list vap;
00417
00418 va_start(vap, _fmt_);
00419 retStatus = vsprintf(_buf_,_fmt_,vap);
00420 if (retStatus > 0) {
00421 #ifdef __vxworks
00422 logMsg(_buf_,0,0,0,0,0,0);
00423 #else
00424 printf(_buf_);
00425 #endif
00426 }
00427 va_end(vap);
00428 return retStatus;
00429 }
00430 #endif
00431
00432
00433
00434
00435 #if 0
00436 static int
00437 ENUM_VERBOSE_TRACE(char *_fmt_,...);
00438
00439 static int
00440 ENUM_VERBOSE_TRACE(char *_fmt_,...)
00441 {
00442 char _buf_[1024];
00443 int retStatus = 0;
00444 va_list vap;
00445
00446 va_start(vap, _fmt_);
00447 retStatus = vsprintf(_buf_,_fmt_,vap);
00448 if (retStatus > 0) {
00449 #ifdef __vxworks
00450 logMsg(_buf_,0,0,0,0,0,0);
00451 #else
00452 printf(_buf_);
00453 #endif
00454 }
00455 va_end(vap);
00456 return retStatus;
00457 }
00458 #endif
00459
00460
00461
00462
00463 extern int
00464 enum_verbose_log_trace(char *_fmt_,...);
00465
00466 #define ENUM_VERBOSE_TRACE\
00467 if(rndisEnumVerboseTrace) enum_verbose_log_trace
00468 #define RNDIS_VERBOSE_TRACE \
00469 if(rndisEnumVerboseTrace) ENUM_VERBOSE_TRACE
00470 #define ENUM_TRACE \
00471 if (rndisEnumTrace) ENUM_VERBOSE_TRACE
00472 #define RNDIS_TRACE \
00473 if (rndisEnumTrace) ENUM_VERBOSE_TRACE
00474
00475
00476 #ifndef __vxworks
00477 #undef logMsg
00478 #define logMsg if(0) printf
00479 #endif
00480
00481 #define ERROR_TRACE logMsg
00482
00483 #if 0
00484 #define ENUM_TRACE if (rndisEnumTrace) logMsg
00485 #define ENUM_VERBOSE_TRACE if (rndisEnumVerboseTrace) logMsg
00486 #endif
00487
00488 #if 0
00489 #define ENUM_TRACE logMsg
00490 #define ENUM_VERBOSE_TRACE if (0) logMsg
00491 #define RNDIS_TRACE logMsg
00492 #define RNDIS_VERBOSE_TRACE if (0) logMsg
00493 #endif
00494
00495
00496 #if 0
00497 #define DUMP_ETHERNET_FRAME(mblk) { BOOL ipPacket; ixUSBRNDISEthernetHdrDump(IX_USB_MBLK_DATA(mblk), &ipPacket); }
00498 #define DUMP_IP_FRAME(mblk) { ixUSBRNDISIpHdrDump(IX_USB_MBLK_DATA(mblk); }
00499 #else
00500 #define DUMP_ETHERNET_FRAME(mblk) { }
00501 #define DUMP_IP_FRAME(mblk) { }
00502 #endif
00503
00504
00505 #ifdef __vxworks
00506 #include <IxOsBuffMgt.h>
00507 #include <IxOsBuffPoolMgt.h>
00508
00509
00510 #define RNDIS_BUF IX_USB_MBLK
00511 #define RNDIS_BUF_LEN(buf) IX_USB_MBLK_LEN(buf)
00512 #define RNDIS_BUF_DATA(buf) IX_USB_MBLK_DATA(buf)
00513 #define RNDIS_SYS_ALIGN_BUF(buf, alignment) { IX_USB_MBLK_DATA(buf) += alignment; }
00514 #define RNDIS_SYS_ALLOC_BUF(len) ixUSBBufferAlloc((size_t) len)
00515 #define RNDIS_SYS_SET_BUF_LEN(buf, len) { IX_USB_MBLK_LEN(buf) = IX_USB_MBLK_PKT_LEN(buf) = len; buf->mBlkHdr.mFlags |= M_PKTHDR; }
00516 #define RNDIS_SYS_FREE(buf) { IX_USB_MBLK_FREE(buf); }
00517 #else
00518 #define RNDIS_BUF struct sk_buff
00519 #define RNDIS_BUF_LEN(buf) buf->len
00520 #define RNDIS_BUF_DATA(buf) buf->data
00521 #define RNDIS_SYS_ALIGN_BUF(buf, alignment) { skb_reserve(buf, alignment); }
00522 #define RNDIS_SYS_ALLOC_BUF(len) dev_alloc_skb(len)
00523 #define RNDIS_SYS_SET_BUF_LEN(buf, len) { skb_put(buf, len); }
00524 #define RNDIS_SYS_FREE(buf)
00525 #endif
00526
00527 #define RNDIS_FREE(buf) { IX_USB_MBLK_FREE(buf); }
00528
00529 #endif
00530
00531
00532
00546 PUBLIC IX_STATUS ixUSBRNDISSignalEncapsulatedCommand(void);
00547
00561 PUBLIC IX_STATUS ixUSBRNDISProcessEncapsulatedCommand(IX_USB_MBLK *);
00562
00575 PUBLIC IX_STATUS ixUSBRNDISProcessDataPacket(IX_USB_MBLK *);
00576
00589 PUBLIC IX_STATUS ixUSBRNDISLayerInit(void *pDrvCtrl);
00590
00603 PUBLIC IX_STATUS ixUSBRNDISInit(void);
00604
00616 PUBLIC void ixUSBRNDISUnload(void);
00617
00631 PUBLIC IX_USB_MBLK* ixUSBRNDISCreateMBuf(UINT8 *buffer, UINT32 len);
00632
00646 PUBLIC IX_STATUS ixUSBRNDISSendDataPacket(RNDIS_BUF *packet);
00647
00648
00649
00650
00651
00652
00653 void ixUSBRNDISIpHdrDump(const char * const mData);
00654
00655 const char *ixUSBRNDISIpProtoStrGet (const UINT8 ipProto);
00656
00657 const char *ixUSBRNDISEthernetTypeStrGet (const UINT16 etherType);
00658
00659
00660
00661
00662 void ixUSBRNDISEthernetHdrDump(const char * const mData, BOOL *nonIpHdrDetected);
00663
00668 #endif