Main Page   Modules   Alphabetical List   Data Structures   File List   Data Fields   Globals  

IxUSBRNDIS.h

Go to the documentation of this file.
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) /* words */
00120 
00121 /* endpoint definitions for RNDIS usage */
00122 #define RNDIS_NOTIFICATION_ENDPOINT (ENDPOINT_5) /* Interrupt IN */
00123 #define RNDIS_DATA_IN_ENDPOINT      (ENDPOINT_1) /* Bulk IN */
00124 #define RNDIS_DATA_OUT_ENDPOINT     (ENDPOINT_2) /* Bulk OUT */
00125 #define RNDIS_CONTROL_ENDPOINT      (ENDPOINT_0) /* Control */
00126 
00127 /* RNDIS messages */
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) /* this flag is ORed with the message ID to indicate completion */
00136 
00137 /* RNDIS message component offsets (in word units!) */
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 /* RNDIS data packets */
00145 #define RNDIS_DATA_OFFSET_OFFSET                        (2) /* entry offset */
00146 #define RNDIS_DATA_LENGTH_OFFSET                        (3) /* entry offset */
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) /* size of the RNDIS packet header, in bytes */
00150 #define RNDIS_PACKET_MSG                                (0x1)
00151 #define RNDIS_PAYLOAD_OFFSET                            (36)
00152 
00153 /* RNDIS message response packet sizes */
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 /* RNDIS responses */
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) /* link speed in units of 100bps - USB speed is 12Mbps */
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) /* aligment, in powers of 2 - unused for 1 packet transfers */
00169 
00170 /* RNDIS status values */
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 /* RNDIS versions */
00177 #define RNDIS_MAJOR_VERSION (1)
00178 #define RNDIS_MINOR_VERSION (0)
00179 
00180 /* RNDIS device flags */
00181 #define RNDIS_DF_CONNECTIONLESS      (1)
00182 #define RNDIS_DF_CONNECTION_ORIENTED (2)
00183 
00184 /* RNDIS medium definitions */
00185 #define RNDIS_MEDIUM_802_3 (0)
00186 
00187 
00188 /* -------------------- Imported MS RNDIS Constants --------------------- */
00189 
00190 /*  Required OIDs */
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 /*  Optional OIDs */
00218 #define OID_GEN_MEDIA_CAPABILITIES              0x00010201
00219 #define OID_GEN_PHYSICAL_MEDIUM                 0x00010202
00220 
00221 /*  Required statistics */
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 /* 802.3 Objects (Ethernet) */
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 /* Medium the Ndis Driver is running on (OID_GEN_MEDIA_SUPPORTED/ OID_GEN_MEDIA_IN_USE). */
00265 typedef enum _NDIS_MEDIUM
00266 {
00267     NdisMedium802_3,
00268     NdisMedium802_5,
00269     NdisMediumFddi,
00270     NdisMediumWan,
00271     NdisMediumLocalTalk,
00272     NdisMediumDix,              /* defined for convenience, not a real medium */
00273     NdisMediumArcnetRaw,
00274     NdisMediumArcnet878_2,
00275     NdisMediumAtm,
00276     NdisMediumWirelessWan,
00277     NdisMediumIrda,
00278     NdisMediumBpc,
00279     NdisMediumCoWan,
00280     NdisMedium1394,
00281     NdisMediumMax               /* Not a real medium, defined as an upper-bound */
00282 } NDIS_MEDIUM, *PNDIS_MEDIUM;
00283 
00284 
00285 /* Physical Medium Type definitions. Used with OID_GEN_PHYSICAL_MEDIUM. */
00286 typedef enum _NDIS_PHYSICAL_MEDIUM
00287 {
00288     NdisPhysicalMediumReserved0,
00289     NdisPhysicalMediumWirelessLan,
00290     NdisPhysicalMediumCableModem,
00291     NdisPhysicalMediumPhoneLine,
00292     NdisPhysicalMediumPowerLine,
00293     NdisPhysicalMediumDSL,      /* includes ADSL and UADSL (G.Lite) */
00294     NdisPhysicalMediumMax       /* Not a real physical type, defined as an upper-bound */
00295 } NDIS_PHYSICAL_MEDIUM, *PNDIS_PHYSICAL_MEDIUM;
00296 
00297 
00298 /*
00299  * RNDIS layer state
00300  */
00301 typedef enum
00302 {
00303     RNDIS_HALTED = 0,       /* RNDIS layer state - Halted */
00304     RNDIS_INITIALIZED,      /* RNDIS layer state - Initialized */
00305     RNDIS_DATA_INITIALIZED  /* RNDIS layer state - Data Initialized */
00306 } RndisLayerState;
00307 
00308 /*
00309  * Structure to maintain RNDIS layer statistics
00310  */
00311 typedef struct
00312 {
00313     UINT32 Rx;          /* Number of packets recieved */
00314     UINT32 Tx;          /* Number of packets transmitted */
00315     UINT32 RxNoBuf;     /* Number of packets recieved but no buffer */
00316 } RndisLayerStats;
00317 
00318 /*
00319  * Structure to maintain RNDIS layer data information
00320  */
00321 typedef struct
00322 {
00323     UINT32 currentPacketFilter;     /* Current packet filter */
00324     RndisLayerStats stats;      /* RNDIS layer state statistics */
00325 } RndisLayerData;
00326 /* Protocol types supported by ndis. These values need to be consistent 
00327  * with ADDRESS_TYPE_XXX defined in TDI.H 
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 /* Ndis Packet Filter Bits (OID_GEN_CURRENT_PACKET_FILTER). */
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 /* macros */
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  * Ansi Incompatible; otherwise works fine
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 /* #if 0 */
00403 
00404 /*
00405  * This block of code fails to inline due to variable # of arguments
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  * This block of code results in declared but not used warning
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  * This function is implemented in IxUSBRNDISEnumerator.c
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 /* debug logging */
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 /* buffer abstraction */
00505 #ifdef __vxworks
00506 #include <IxOsBuffMgt.h>
00507 #include <IxOsBuffPoolMgt.h>
00508 
00509 /* RNDIS buffer abstraction layer */
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 /* linux */
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)                 /* Linux END de-allocates */
00525 #endif
00526 
00527 #define RNDIS_FREE(buf)                     { IX_USB_MBLK_FREE(buf); }
00528 
00529 #endif /* ndef __doxygen_HIDE */
00530 
00531 /* prototypes */
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 /* debug */
00649 
00650 /*
00651  * Function prototype for debuging purpose for dumping IP Header
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  * Function prototype for debuging purpose for dumping Ethernet Header
00661  */
00662 void ixUSBRNDISEthernetHdrDump(const char * const mData, BOOL *nonIpHdrDetected);
00663 
00668 #endif /* IxUSBRNDIS_H */
Automatically generated from sources. © Intel Corp. 2003