home *** CD-ROM | disk | FTP | other *** search
/ PCNET 2006 September - Disc 1 / PCNET_CD_2006_09.iso / surpriz / MSRMesh-VirtualWIFI.MSI / vwifi.h < prev    next >
Encoding:
C/C++ Source or Header  |  2005-06-24  |  35.7 KB  |  1,160 lines

  1. /*
  2.  * Author    : Ranveer Chandra
  3.  * Directory : VirtualWiFi_Root\driver
  4.  * File Name : vwifi.h
  5.  * Purpose   : Define data structures and functions
  6.  */
  7.  
  8. #ifdef NDIS51_MINIPORT
  9. #define MUX_MAJOR_NDIS_VERSION         5
  10. #define MUX_MINOR_NDIS_VERSION         1
  11. #else
  12. #define MUX_MAJOR_NDIS_VERSION         4
  13. #define MUX_MINOR_NDIS_VERSION         0
  14. #endif
  15.  
  16. #ifdef NDIS51
  17. #define MUX_PROT_MAJOR_NDIS_VERSION    5
  18. #define MUX_PROT_MINOR_NDIS_VERSION    0
  19. #else
  20. #define MUX_PROT_MAJOR_NDIS_VERSION    4
  21. #define MUX_PROT_MINOR_NDIS_VERSION    0
  22. #endif
  23.  
  24. #define TAG 'SxuM'
  25. #define WAIT_INFINITE 0
  26.  
  27. #define MAX_NETWORK_CONNECTIONS        20
  28.  
  29. #define SWITCHING_PERIOD               700 // milliseconds
  30. #define SENDING_PERIOD                 600 // milliseconds
  31.  
  32. #define DEBUG                               1
  33.  
  34. #if DEBUG
  35. //
  36. // Debug levels: lower values indicate higher urgency
  37. //
  38. #define MUX_EXTRA_LOUD       20
  39. #define MUX_VERY_LOUD        10
  40. #define MUX_LOUD             8
  41. #define MUX_INFO             6
  42. #define MUX_WARN             4
  43. #define MUX_ERROR            2
  44. #define MUX_FATAL            0
  45.  
  46. extern INT                muxDebugLevel;
  47.  
  48.  
  49. #define DBGPRINT(lev, Fmt)                                   \
  50.     {                                                        \
  51.         if ((lev) <= muxDebugLevel)                          \
  52.         {                                                    \
  53.             DbgPrint("VirtualWiFi: ");                            \
  54.             DbgPrint Fmt;                                    \
  55.         }                                                    \
  56.     }
  57. #else
  58.  
  59. #define DBGPRINT(lev, Fmt)
  60.  
  61. #endif //DBG
  62.  
  63. //--------------------------------------
  64. // Queue structure and macros
  65. //--------------------------------------
  66. typedef struct _QUEUE_ENTRY
  67. {
  68.     struct _QUEUE_ENTRY *Next;
  69. } QUEUE_ENTRY, *PQUEUE_ENTRY;
  70.  
  71. typedef struct _QUEUE_HEADER
  72. {
  73.     PQUEUE_ENTRY Head;
  74.     PQUEUE_ENTRY Tail;
  75. } QUEUE_HEADER, *PQUEUE_HEADER;
  76.  
  77. #define InitializeQueueHeader(QueueHeader)                 \
  78.     {                                                      \
  79.         (QueueHeader)->Head = (QueueHeader)->Tail = NULL;  \
  80.     }
  81.  
  82. #define IsQueueEmpty(QueueHeader) ((QueueHeader)->Head == NULL)
  83.  
  84. #define RemoveHeadQueue(QueueHeader)                  \
  85.     (QueueHeader)->Head;                              \
  86.     {                                                 \
  87.         PQUEUE_ENTRY pNext;                           \
  88.         ASSERT((QueueHeader)->Head);                  \
  89.         pNext = (QueueHeader)->Head->Next;            \
  90.         (QueueHeader)->Head = pNext;                  \
  91.         if (pNext == NULL)                            \
  92.             (QueueHeader)->Tail = NULL;               \
  93.     }
  94.  
  95. #define InsertHeadQueue(QueueHeader, QueueEntry)                \
  96.     {                                                           \
  97.         ((PQUEUE_ENTRY)QueueEntry)->Next = (QueueHeader)->Head; \
  98.         (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry);       \
  99.         if ((QueueHeader)->Tail == NULL)                        \
  100.             (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry);   \
  101.     }
  102.  
  103. #define InsertTailQueue(QueueHeader, QueueEntry)                     \
  104.     {                                                                \
  105.         ((PQUEUE_ENTRY)QueueEntry)->Next = NULL;                     \
  106.         if ((QueueHeader)->Tail)                                     \
  107.             (QueueHeader)->Tail->Next = (PQUEUE_ENTRY)(QueueEntry);  \
  108.         else                                                         \
  109.             (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry);        \
  110.         (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry);            \
  111.     }
  112.  
  113. #define MP_GET_PACKET_MR(_p)         (&(_p)->MiniportReserved[0]) 
  114.  
  115. // forward declarations
  116. typedef struct _ADAPT ADAPT, *PADAPT;
  117. typedef struct _VELAN VELAN, *PVELAN;
  118. typedef struct _MUX_NDIS_REQUEST MUX_NDIS_REQUEST, *PMUX_NDIS_REQUEST;
  119.  
  120.  
  121. typedef
  122. VOID
  123. (*PMUX_REQ_COMPLETE_HANDLER) (
  124.     IN PADAPT                           pAdapt,
  125.     IN struct _MUX_NDIS_REQUEST *       pMuxRequest,
  126.     IN NDIS_STATUS                      Status
  127.     );
  128.  
  129. // This OID specifies the NDIS version in use by the
  130. // virtual miniport driver. The high byte is the major version.
  131. // The low byte is the minor version.
  132. #define VELAN_DRIVER_VERSION            ((MUX_MAJOR_NDIS_VERSION << 8) + \
  133.                                          (MUX_MINOR_NDIS_VERSION))
  134.  
  135. // media type, we use ethernet, change if necessary
  136. #define VELAN_MEDIA_TYPE                NdisMedium802_3
  137.  
  138. // change to your company name instead of using Microsoft
  139. #define VELAN_VENDOR_DESC               "Microsoft"
  140.  
  141. // Highest byte is the NIC byte plus three vendor bytes, they are normally
  142. // obtained from the NIC
  143. #define VELAN_VENDOR_ID                 0x00FFFFFF
  144.  
  145. #define VELAN_MAX_MCAST_LIST            32
  146. #define VELAN_MAX_SEND_PKTS             5
  147.  
  148. #define ETH_MAX_PACKET_SIZE             1514
  149. #define ETH_MIN_PACKET_SIZE             60
  150. #define ETH_HEADER_SIZE                 14
  151.  
  152.  
  153. #define VELAN_SUPPORTED_FILTERS ( \
  154.             NDIS_PACKET_TYPE_DIRECTED      | \
  155.             NDIS_PACKET_TYPE_MULTICAST     | \
  156.             NDIS_PACKET_TYPE_BROADCAST     | \
  157.             NDIS_PACKET_TYPE_PROMISCUOUS   | \
  158.             NDIS_PACKET_TYPE_ALL_MULTICAST)
  159.  
  160. #define MUX_ADAPTER_PACKET_FILTER           \
  161.             NDIS_PACKET_TYPE_PROMISCUOUS
  162.  
  163. //
  164. // Define flag bits we set on send packets to prevent
  165. // loopback from occurring on the lower binding.
  166. //
  167. #ifdef NDIS51
  168.  
  169. #define MUX_SEND_PACKET_FLAGS           NDIS_FLAGS_DONT_LOOPBACK
  170.  
  171. #else
  172.  
  173. #define NDIS_FLAGS_SKIP_LOOPBACK_WIN2K  0x400
  174. #define MUX_SEND_PACKET_FLAGS           (NDIS_FLAGS_DONT_LOOPBACK |  \
  175.                                          NDIS_FLAGS_SKIP_LOOPBACK_WIN2K)
  176. #endif
  177.                                          
  178.  
  179. #define MIN_PACKET_POOL_SIZE            255
  180. #define MAX_PACKET_POOL_SIZE            4096
  181.  
  182. typedef UCHAR   MUX_MAC_ADDRESS[6];
  183.  
  184. //
  185. // Our context stored in packets sent down to the
  186. // lower binding. Note that this sample driver only forwards
  187. // sends down; it does not originate sends itself.
  188. // These packets are allocated from the SendPacketPool.
  189. //
  190. typedef struct _MUX_SEND_RSVD
  191. {
  192.     PVELAN              pVElan;             // originating ELAN
  193.     PNDIS_PACKET        pOriginalPacket;    // original packet
  194.  
  195. } MUX_SEND_RSVD, *PMUX_SEND_RSVD;
  196.  
  197. #define MUX_RSVD_FROM_SEND_PACKET(_pPkt)            \
  198.         ((PMUX_SEND_RSVD)(_pPkt)->ProtocolReserved)
  199.  
  200. //
  201. // Our context stored in each packet forwarded up to an
  202. // ELAN from a lower binding. The original packet refers to
  203. // a packet indicated up to us that should be returned via
  204. // NdisReturnPackets when our packet is returned to us. This
  205. // is set to NULL there isn't such a packet.
  206. // These packets are allocated from the RecvPacketPool.
  207. //
  208. typedef struct _MUX_RECV_RSVD
  209. {
  210.     PNDIS_PACKET        pOriginalPacket;
  211.  
  212. } MUX_RECV_RSVD, *PMUX_RECV_RSVD;
  213.  
  214. #define MUX_RSVD_FROM_RECV_PACKET(_pPkt)            \
  215.         ((PMUX_RECV_RSVD)(_pPkt)->MiniportReserved)
  216.  
  217. //
  218. // Make sure we don't attempt to use more than the allowed
  219. // room in MiniportReserved on received packets.
  220. //
  221. C_ASSERT(sizeof(MUX_RECV_RSVD) <= sizeof(((PNDIS_PACKET)0)->MiniportReserved));
  222.  
  223.  
  224. //
  225. // Out context stored in each packet that we use to forward
  226. // a TransferData request to the lower binding.
  227. // These packets are allocated from the RecvPacketPool.
  228. //
  229. typedef struct _MUX_TD_RSVD
  230. {
  231.     PVELAN              pVElan;
  232.     PNDIS_PACKET        pOriginalPacket;
  233. } MUX_TD_RSVD, *PMUX_TD_RSVD;
  234.  
  235. #define MUX_RSVD_FROM_TD_PACKET(_pPkt)              \
  236.         ((PMUX_TD_RSVD)(_pPkt)->ProtocolReserved)
  237.  
  238.  
  239. //
  240. // Default values:
  241. //
  242. #define MUX_DEFAULT_LINK_SPEED          100000  // in 100s of bits/sec
  243. #define MUX_DEFAULT_LOOKAHEAD_SIZE      512
  244.  
  245.  
  246. NTSTATUS
  247. DriverEntry(
  248.     IN PDRIVER_OBJECT            DriverObject,
  249.     IN PUNICODE_STRING           RegistryPath
  250.     );
  251.  
  252. NTSTATUS
  253. PtDispatch(
  254.     IN PDEVICE_OBJECT            DeviceObject,
  255.     IN PIRP                      Irp
  256.     );
  257.  
  258. NDIS_STATUS
  259. PtRegisterDevice(
  260.     VOID
  261.     );
  262.  
  263. NDIS_STATUS
  264. PtDeregisterDevice(
  265.     VOID
  266.    );
  267. //
  268. // Protocol proto-types
  269. //
  270.  
  271. VOID
  272. PtOpenAdapterComplete(
  273.     IN    NDIS_HANDLE               ProtocolBindingContext,
  274.     IN    NDIS_STATUS               Status,
  275.     IN    NDIS_STATUS               OpenErrorStatus
  276.     );
  277.  
  278.  
  279. VOID
  280. PtQueryAdapterInfo(
  281.     IN  PADAPT                      pAdapt
  282.     );
  283.  
  284.  
  285. VOID
  286. PtQueryAdapterSync(
  287.     IN  PADAPT                      pAdapt,
  288.     IN  NDIS_OID                    Oid,
  289.     IN  PVOID                       InformationBuffer,
  290.     IN  ULONG                       InformationBufferLength
  291.     );
  292.  
  293.  
  294. VOID
  295. PtRequestAdapterAsync(
  296.     IN  PADAPT                      pAdapt,
  297.     IN  NDIS_REQUEST_TYPE           RequestType,
  298.     IN  NDIS_OID                    Oid,
  299.     IN  PVOID                       InformationBuffer,
  300.     IN  ULONG                       InformationBufferLength,
  301.     IN  PMUX_REQ_COMPLETE_HANDLER   pCallback
  302.     );
  303.  
  304. VOID
  305. PtCloseAdapterComplete(
  306.     IN    NDIS_HANDLE               ProtocolBindingContext,
  307.     IN    NDIS_STATUS               Status
  308.     );
  309.  
  310.  
  311. VOID
  312. PtResetComplete(
  313.     IN    NDIS_HANDLE               ProtocolBindingContext,
  314.     IN    NDIS_STATUS               Status
  315.     );
  316.  
  317.  
  318. VOID
  319. PtRequestComplete(
  320.     IN    NDIS_HANDLE               ProtocolBindingContext,
  321.     IN    PNDIS_REQUEST             NdisRequest,
  322.     IN    NDIS_STATUS               Status
  323.     );
  324.  
  325.  
  326. VOID
  327. PtCompleteForwardedRequest(
  328.     IN PADAPT                       pAdapt,
  329.     IN PMUX_NDIS_REQUEST            pMuxNdisRequest,
  330.     IN NDIS_STATUS                  Status
  331.     );
  332.  
  333. VOID
  334. PtPostProcessPnPCapabilities(
  335.     IN PVELAN                       pVElan,
  336.     IN PVOID                        InformationBuffer,
  337.     IN ULONG                        InformationBufferLength
  338.     );
  339.  
  340. VOID
  341. PtCompleteBlockingRequest(
  342.     IN PADAPT                       pAdapt,
  343.     IN PMUX_NDIS_REQUEST            pMuxNdisRequest,
  344.     IN NDIS_STATUS                  Status
  345.     );
  346.  
  347. VOID
  348. PtDiscardCompletedRequest(
  349.     IN PADAPT                       pAdapt,
  350.     IN PMUX_NDIS_REQUEST            pMuxNdisRequest,
  351.     IN NDIS_STATUS                  Status
  352.     );
  353.  
  354.  
  355. VOID
  356. PtStatus(
  357.     IN    NDIS_HANDLE               ProtocolBindingContext,
  358.     IN    NDIS_STATUS               GeneralStatus,
  359.     IN    PVOID                     StatusBuffer,
  360.     IN    UINT                      StatusBufferSize
  361.     );
  362.  
  363.  
  364. VOID
  365. PtStatusComplete(
  366.     IN    NDIS_HANDLE               ProtocolBindingContext
  367.     );
  368.  
  369.  
  370. VOID
  371. PtSendComplete(
  372.     IN    NDIS_HANDLE               ProtocolBindingContext,
  373.     IN    PNDIS_PACKET              Packet,
  374.     IN    NDIS_STATUS               Status
  375.     );
  376.  
  377.  
  378. VOID
  379. PtTransferDataComplete(
  380.     IN    NDIS_HANDLE               ProtocolBindingContext,
  381.     IN    PNDIS_PACKET              Packet,
  382.     IN    NDIS_STATUS               Status,
  383.     IN    UINT                      BytesTransferred
  384.     );
  385.  
  386.  
  387. NDIS_STATUS
  388. PtReceive(
  389.     IN    NDIS_HANDLE               ProtocolBindingContext,
  390.     IN    NDIS_HANDLE               MacReceiveContext,
  391.     IN    PVOID                     HeaderBuffer,
  392.     IN    UINT                      HeaderBufferSize,
  393.     IN    PVOID                     LookAheadBuffer,
  394.     IN    UINT                      LookaheadBufferSize,
  395.     IN    UINT                      PacketSize
  396.     );
  397.  
  398.  
  399. VOID
  400. PtReceiveComplete(
  401.     IN    NDIS_HANDLE               ProtocolBindingContext
  402.     );
  403.  
  404.  
  405. INT
  406. PtReceivePacket(
  407.     IN    NDIS_HANDLE               ProtocolBindingContext,
  408.     IN    PNDIS_PACKET              Packet
  409.     );
  410.  
  411.  
  412. VOID
  413. PtBindAdapter(
  414.     OUT   PNDIS_STATUS              Status,
  415.     IN    NDIS_HANDLE               BindContext,
  416.     IN    PNDIS_STRING              DeviceName,
  417.     IN    PVOID                     SystemSpecific1,
  418.     IN    PVOID                     SystemSpecific2
  419.     );
  420.  
  421.  
  422. VOID
  423. PtUnbindAdapter(
  424.     OUT   PNDIS_STATUS              Status,
  425.     IN    NDIS_HANDLE               ProtocolBindingContext,
  426.     IN    NDIS_HANDLE               UnbindContext
  427.     );
  428.  
  429.  
  430.  
  431. NDIS_STATUS
  432. PtPNPHandler(
  433.     IN    NDIS_HANDLE               ProtocolBindingContext,
  434.     IN    PNET_PNP_EVENT            pNetPnPEvent
  435.     );
  436.  
  437.  
  438. NDIS_STATUS
  439. PtCreateAndStartVElan(
  440.     IN  PADAPT                      pAdapt,
  441.     IN  PNDIS_STRING                pVElanKey
  442. );
  443.  
  444. PVELAN
  445. PtAllocateAndInitializeVElan(
  446.     IN PADAPT                       pAdapt,
  447.     IN PNDIS_STRING                 pVElanKey,
  448.     IN ULONG                        NetworkConnection
  449.     );
  450.  
  451. VOID
  452. PtDeallocateVElan(
  453.     IN PVELAN                   pVElan
  454.     );
  455.  
  456. VOID
  457. PtStopVElan(
  458.     IN  PVELAN                      pVElan
  459. );
  460.  
  461. VOID
  462. PtUnlinkVElanFromAdapter(
  463.     IN PVELAN                       pVElan
  464. );
  465.  
  466. PVELAN
  467. PtFindVElan(
  468.     IN    PADAPT                    pAdapt,
  469.     IN    PNDIS_STRING              pElanKey
  470. );
  471.  
  472. ULONG
  473. PtFindVElanSSID(
  474.     IN    PADAPT                pAdapt,
  475.     IN    PNDIS_STRING          pVElanKey
  476. );
  477.  
  478. VOID
  479. PtBootStrapVElans(
  480.     IN  PADAPT                      pAdapt
  481. );
  482.  
  483. VOID
  484. PtReferenceVElan(
  485.     IN    PVELAN                    pVElan,
  486.     IN    PUCHAR                    String
  487.     );
  488.  
  489. ULONG
  490. PtDereferenceVElan(
  491.     IN    PVELAN                    pVElan,
  492.     IN    PUCHAR                    String
  493.     );
  494.  
  495. BOOLEAN
  496. PtReferenceAdapter(
  497.     IN    PADAPT                    pAdapt,
  498.     IN    PUCHAR                    String
  499.     );
  500.  
  501. ULONG
  502. PtDereferenceAdapter(
  503.     IN    PADAPT                    pAdapt,
  504.     IN    PUCHAR                    String
  505.     );
  506.  
  507. //
  508. // Miniport proto-types
  509. //
  510. NDIS_STATUS
  511. MPInitialize(
  512.     OUT   PNDIS_STATUS              OpenErrorStatus,
  513.     OUT   PUINT                     SelectedMediumIndex,
  514.     IN    PNDIS_MEDIUM              MediumArray,
  515.     IN    UINT                      MediumArraySize,
  516.     IN    NDIS_HANDLE               MiniportAdapterHandle,
  517.     IN    NDIS_HANDLE               WrapperConfigurationContext
  518.     );
  519.  
  520. VOID
  521. MPSendPackets(
  522.     IN    NDIS_HANDLE               MiniportAdapterContext,
  523.     IN    PPNDIS_PACKET             PacketArray,
  524.     IN    UINT                      NumberOfPackets
  525.     );
  526.  
  527. NDIS_STATUS
  528. MPQueryInformation(
  529.     IN    NDIS_HANDLE               MiniportAdapterContext,
  530.     IN    NDIS_OID                  Oid,
  531.     IN    PVOID                     InformationBuffer,
  532.     IN    ULONG                     InformationBufferLength,
  533.     OUT   PULONG                    BytesWritten,
  534.     OUT   PULONG                    BytesNeeded
  535.     );
  536.  
  537. NDIS_STATUS
  538. MPSetInformation(
  539.     IN    NDIS_HANDLE               MiniportAdapterContext,
  540.     IN    NDIS_OID                  Oid,
  541.     IN    PVOID                     InformationBuffer,
  542.     IN    ULONG                     InformationBufferLength,
  543.     OUT   PULONG                    BytesRead,
  544.     OUT   PULONG                    BytesNeeded
  545.     );
  546.  
  547. VOID
  548. MPCancelPacketsFromVElan(
  549.     IN PVELAN              pVElan
  550.     );
  551.  
  552. VOID
  553. MPReturnPacket(
  554.     IN    NDIS_HANDLE               MiniportAdapterContext,
  555.     IN    PNDIS_PACKET              Packet
  556.     );
  557.  
  558. NDIS_STATUS
  559. MPTransferData(
  560.     OUT PNDIS_PACKET                Packet,
  561.     OUT PUINT                       BytesTransferred,
  562.     IN  NDIS_HANDLE                 MiniportAdapterContext,
  563.     IN  NDIS_HANDLE                 MiniportReceiveContext,
  564.     IN  UINT                        ByteOffset,
  565.     IN  UINT                        BytesToTransfer
  566.     );
  567.  
  568. VOID
  569. MPHalt(
  570.     IN    NDIS_HANDLE               MiniportAdapterContext
  571.     );
  572.  
  573.  
  574. NDIS_STATUS
  575. MPSetPacketFilter(
  576.     IN    PVELAN                    pVElan,
  577.     IN    ULONG                     PacketFilter
  578.     );
  579.  
  580. NDIS_STATUS
  581. MPSetMulticastList(
  582.     IN PVELAN                       pVElan,
  583.     IN PVOID                        InformationBuffer,
  584.     IN ULONG                        InformationBufferLength,
  585.     OUT PULONG                      pBytesRead,
  586.     OUT PULONG                      pBytesNeeded
  587.     );
  588.  
  589. PUCHAR
  590. MacAddrToString(PVOID In
  591.     );
  592.  
  593. VOID
  594. MPGenerateMacAddr(
  595.     PVELAN                          pVElan
  596. );
  597.  
  598. #ifdef NDIS51_MINIPORT
  599.  
  600. VOID
  601. MPCancelSendPackets(
  602.     IN    NDIS_HANDLE              MiniportAdapterContext,
  603.     IN    PVOID                    CancelId
  604.     );
  605.  
  606. VOID
  607. MPDevicePnPEvent(
  608.     IN NDIS_HANDLE                 MiniportAdapterContext,
  609.     IN NDIS_DEVICE_PNP_EVENT       DevicePnPEvent,
  610.     IN PVOID                        InformationBuffer,
  611.     IN ULONG                        InformationBufferLength
  612.     );
  613.  
  614.  
  615. VOID
  616. MPAdapterShutdown(
  617.     IN NDIS_HANDLE                  MiniportAdapterContext
  618.     );
  619.  
  620. #endif //NDIS51_MINIPORT
  621.  
  622. VOID
  623. MPUnload(
  624.     IN    PDRIVER_OBJECT            DriverObject
  625.     );
  626.  
  627. NDIS_STATUS
  628. MPForwardRequest(
  629.     IN PVELAN                       pVElan,
  630.     IN NDIS_REQUEST_TYPE            RequestType,
  631.     IN NDIS_OID                     Oid,
  632.     IN PVOID                        InformationBuffer,
  633.     IN ULONG                        InformationBufferLength,
  634.     OUT PULONG                      BytesReadOrWritten,
  635.     OUT PULONG                      BytesNeeded
  636.     );
  637.  
  638. /*
  639. VOID PtSwitchTimerFunction(
  640.     IN  PVOID                      SystemSpecific1,  // not used
  641.     IN  PVOID                       FunctionContext,  // adapter
  642.     IN  PVOID                      SystemSpecific2,  // not used
  643.     IN  PVOID                      SystemSpecific3   // not used
  644.     );
  645. */
  646.  
  647. VOID PtIoctlSetAdapterSSID(
  648.     IN PADAPT pAdapt
  649. );
  650.  
  651. VOID PtIoctlSendBufferedPackets(
  652.     IN PADAPT pAdapt
  653. );
  654.  
  655. VOID PtIoctlStartBufferingPackets(
  656.     IN PADAPT pAdapt
  657. );
  658.  
  659. BOOLEAN SetNextActiveConnection(
  660.      IN PADAPT pAdapt
  661.      );
  662.  
  663. ULONG NumActiveConnections(
  664.     IN PADAPT pAdapt
  665.     );
  666.  
  667. VOID SetSSIDAndClearSendPackets( 
  668.     IN PADAPT pAdapt
  669.     );
  670.  
  671. //
  672. // Super-structure for NDIS_REQUEST, to allow us to keep context
  673. // about requests sent down to a lower binding.
  674. //
  675. typedef struct _MUX_NDIS_REQUEST
  676. {
  677.     PVELAN                      pVElan;     // Set iff this is a forwarded
  678.                                             // request from a VELAN.
  679.     NDIS_STATUS                 Status;     // Completion status
  680.     NDIS_EVENT                  Event;      // Used to block for completion.
  681.     PMUX_REQ_COMPLETE_HANDLER   pCallback;  // Called on completion of request
  682.     NDIS_REQUEST                Request;
  683.  
  684. } MUX_NDIS_REQUEST, *PMUX_NDIS_REQUEST;
  685. /*
  686. ULONG g_SwitchingTimeInfra; // switching time for the infra network
  687. ULONG g_SwitchingTimeAdhoc; // switching time for AH network
  688. ULONG g_WaitingTimeInfra;   // time to wait on infra network
  689. ULONG g_WaitingTimeAdhoc;   // time to wait on AH network
  690. */
  691.  
  692. typedef struct _VElanSSIDs
  693. {
  694.     LIST_ENTRY  Link;
  695.     ULONG        ssidNumber;
  696.     NDIS_STRING VElanKey;
  697. } VElanSSID, *PVElanSSID;
  698.  
  699. //
  700. // The ADAPT object represents a binding to a lower adapter by
  701. // the protocol edge of this driver. Based on the configured
  702. // Upper bindings, zero or more virtual miniport devices (VELANs)
  703. // are created above this binding.
  704. //
  705. typedef struct _ADAPT
  706. {
  707.     // Chain adapters. Access to this is protected by the global lock.
  708.     LIST_ENTRY                  Link;
  709.  
  710.     // References to this adapter.
  711.     ULONG                       RefCount;
  712.  
  713.     // Handle to the lower adapter, used in NDIS calls referring
  714.     // to this adapter.
  715.     NDIS_HANDLE                 BindingHandle;
  716.  
  717.     // List of all the virtual ELANs created on this lower binding
  718.     LIST_ENTRY                  VElanList;
  719.  
  720.     // Length of above list.
  721.     ULONG                       VElanCount;
  722.  
  723.     // String used to access configuration for this binding.
  724.     NDIS_STRING                 ConfigString;
  725.  
  726.     // Open Status. Used by bind/halt for Open/Close Adapter status.
  727.     NDIS_STATUS                 Status;
  728.  
  729.     NDIS_EVENT                  Event;
  730.  
  731.     //
  732.     // Packet filter set to the underlying adapter. This is
  733.     // a combination (union) of filter bits set on all
  734.     // attached VELAN miniports.
  735.     //
  736.     ULONG                       PacketFilter;
  737.  
  738.     // Medium of the underlying Adapter.
  739.     NDIS_MEDIUM                 Medium;
  740.  
  741.     // The Physical Medium supported by the underlying NIC
  742.     NDIS_PHYSICAL_MEDIUM        PhysicalMedium;
  743.  
  744.     // Whether the adapter should start switching
  745.     BOOLEAN  StartSwitching;
  746.  
  747.     // The SSID of the wireless network
  748.     NDIS_802_11_SSID                    networkSSID[MAX_NETWORK_CONNECTIONS];                // Network SSID
  749.     NDIS_802_11_NETWORK_INFRASTRUCTURE  networkMode[MAX_NETWORK_CONNECTIONS];                // Mode, IS or AH
  750.     ULONG                                switchingTime[MAX_NETWORK_CONNECTIONS];              // time it takes to switch to each network
  751.     ULONG                                waitingTime[MAX_NETWORK_CONNECTIONS];                // time to stay on each network
  752.     BOOLEAN                             NumActiveConnectionsOnSSID[MAX_NETWORK_CONNECTIONS]; // Number of VELans on each SSID
  753.     BOOLEAN                             isSSIDActive[MAX_NETWORK_CONNECTIONS];               // This variable is used by the VirtualWiFi Server
  754.     ULONG                               numConnections;                                      // Total number of SSIDs
  755.     ULONG                               CurrentActiveConnection;                             // The current active SSID
  756.     ULONG                                 isAdaptiveScheduling;                                 // used by the service
  757.     LIST_ENTRY                          VElanSSIDList;                                         // VELAN GUID entry and their SSID
  758.     ULONGLONG                           cardSwitchTime;                                      // Time for a card to switch SSIDs
  759.     ULONGLONG                           switchStartTime;                                     // Used for measurements only
  760.     // Timer object for switching the Adapter between ssids - WE REMOVED THIS IMPLEMENTATION
  761.     // Timers are now implemented as sleep in the user level service
  762.     NDIS_TIMER                  SwitchingTimer;
  763.     //BOOLEAN                     isTimerFired;
  764.     //BOOLEAN                     LastActionSwitched;
  765.  
  766.     // Send Buffer Data Structures, one for each SSID
  767.     QUEUE_HEADER                SendWaitQueue[MAX_NETWORK_CONNECTIONS];
  768.     ULONG                       nWaitSend[MAX_NETWORK_CONNECTIONS];
  769.     QUEUE_HEADER                SendCancelQueue;
  770.     ULONG                       nCancelSend;
  771.     ULONG                       nTotalPacketsSeen[MAX_NETWORK_CONNECTIONS];
  772.  
  773.     // Link speed of the underlying adapter.
  774.     ULONG                       LinkSpeed;
  775.  
  776.     // Max lookahead size for the underlying adapter.
  777.     ULONG                       MaxLookAhead;
  778.  
  779.     // Power state of the underlying adapter
  780.     NDIS_DEVICE_POWER_STATE     PtDevicePowerState;
  781.  
  782.     // Ethernet address of the underlying adapter.
  783.     UCHAR                       CurrentAddress[ETH_LENGTH_OF_ADDRESS];
  784.  
  785. #ifndef WIN9X
  786.     //
  787.     // Read/Write lock: allows multiple readers but only a single
  788.     // writer. Used to protect the VELAN list and fields (e.g. packet
  789.     // filter) shared on an ADAPT by multiple VELANs. Code that
  790.     // needs to traverse the VELAN list safely acquires a READ lock.
  791.     // Code that needs to safely modify the VELAN list or shared
  792.     // fields acquires a WRITE lock (which also excludes READers).
  793.     //
  794.     // See macros MUX_ACQUIRE_ADAPT_xxx/MUX_RELEASE_ADAPT_xxx below.
  795.     //
  796.     // TBD - if we want to support this on Win9X, reimplement this!
  797.     //
  798.     NDIS_RW_LOCK                ReadWriteLock;
  799. #endif // WIN9X
  800.  
  801. } ADAPT, *PADAPT;
  802.  
  803.  
  804. //
  805. // VELAN object represents a virtual ELAN instance and its
  806. // corresponding virtual miniport adapter.
  807. //
  808. typedef struct _VELAN
  809. {
  810.     // Link into parent adapter's VELAN list.
  811.     LIST_ENTRY                  Link;
  812.  
  813.     // References to this VELAN.
  814.     ULONG                       RefCount;
  815.  
  816.     // Parent ADAPT.
  817.     PADAPT                      pAdapt;
  818.  
  819.     // Copy of BindingHandle from ADAPT.
  820.     NDIS_HANDLE                 BindingHandle;
  821.  
  822.     // Adapter handle for NDIS up-calls related to this virtual miniport.
  823.     NDIS_HANDLE                 MiniportAdapterHandle;
  824.  
  825.     // Virtual miniport's power state.
  826.     NDIS_DEVICE_POWER_STATE     MPDevicePowerState;
  827.  
  828.     // Pointer to the adapter network connections structure
  829.     ULONG                       NetworkConnection;
  830.  
  831.     // Has our Halt entry point been called?
  832.     BOOLEAN                     MiniportHalting;
  833.  
  834.     // Do we need to indicate receive complete?
  835.     BOOLEAN                     IndicateRcvComplete;
  836.  
  837.     // Do we need to indicate status complete?
  838.     BOOLEAN                     IndicateStatusComplete;
  839.  
  840.     // Synchronization fields
  841.     BOOLEAN                     MiniportInitPending;
  842.     NDIS_EVENT                  MiniportInitEvent;
  843.  
  844.     // Uncompleted Sends/Requests to the adapter below.
  845.     ULONG                       OutstandingSends;
  846.  
  847.     // Count outstanding indications, including received
  848.     // packets, passed up to protocols on this VELAN.
  849.     ULONG                       OutstandingReceives;
  850.  
  851.     // Packet pool for send packets
  852.     NDIS_HANDLE                 SendPacketPoolHandle;
  853.  
  854.     // Packet pool for receive packets
  855.     NDIS_HANDLE                 RecvPacketPoolHandle;
  856.  
  857.     // A request block that is used to forward a request presented
  858.     // to the virtual miniport, to the lower binding. Since NDIS
  859.     // serializes requests to a miniport, we only need one of these
  860.     // per VELAN.
  861.     //
  862.     MUX_NDIS_REQUEST            Request;        
  863.     PULONG                      BytesNeeded;
  864.     PULONG                      BytesReadOrWritten;
  865.     // Have we queued a request because the lower binding is
  866.     // at a low power state?
  867.     BOOLEAN                     QueuedRequest;
  868.  
  869.     // Have we started to deinitialize this VELAN?
  870.     BOOLEAN                     DeInitializing;
  871.  
  872.     // configuration
  873.     UCHAR                       PermanentAddress[ETH_LENGTH_OF_ADDRESS];
  874.     UCHAR                       CurrentAddress[ETH_LENGTH_OF_ADDRESS];
  875.  
  876.     NDIS_STRING                 CfgDeviceName;  // used as the unique
  877.                                                 // ID for the VELAN
  878.     ULONG                       VElanNumber;    // logical Elan number
  879.  
  880.  
  881.     //
  882.     //  ----- Buffer Management: Header buffers and Protocol buffers ----
  883.     //
  884.  
  885.     // Some standard miniport parameters (OID values).
  886.     ULONG                       PacketFilter;
  887.     ULONG                       LookAhead;
  888.     ULONG                       LinkSpeed;
  889.  
  890.     ULONG                       MaxBusySends;
  891.     ULONG                       MaxBusyRecvs;
  892.  
  893.     // Packet counts
  894.     ULONG64                     GoodTransmits;
  895.     ULONG64                     GoodReceives;
  896.     ULONG                       NumTxSinceLastAdjust;
  897.  
  898.     // Count of transmit errors
  899.     ULONG                       TxAbortExcessCollisions;
  900.     ULONG                       TxLateCollisions;
  901.     ULONG                       TxDmaUnderrun;
  902.     ULONG                       TxLostCRS;
  903.     ULONG                       TxOKButDeferred;
  904.     ULONG                       OneRetry;
  905.     ULONG                       MoreThanOneRetry;
  906.     ULONG                       TotalRetries;
  907.     ULONG                       TransmitFailuresOther;
  908.  
  909.     // Count of receive errors
  910.     ULONG                       RcvCrcErrors;
  911.     ULONG                       RcvAlignmentErrors;
  912.     ULONG                       RcvResourceErrors;
  913.     ULONG                       RcvDmaOverrunErrors;
  914.     ULONG                       RcvCdtFrames;
  915.     ULONG                       RcvRuntErrors;
  916. #if IEEE_VLAN_SUPPORT    
  917.     ULONG                       RcvFormatErrors;
  918.     ULONG                       RcvVlanIdErrors;
  919. #endif    
  920.     ULONG                       RegNumTcb;
  921.  
  922.     // Multicast list
  923.     MUX_MAC_ADDRESS             McastAddrs[VELAN_MAX_MCAST_LIST];
  924.     ULONG                       McastAddrCount;
  925. #if IEEE_VLAN_SUPPORT
  926.     ULONG                       VlanId;
  927.     NDIS_HANDLE                 BufferPoolHandle;
  928.     NPAGED_LOOKASIDE_LIST       TagLookaside;
  929. #endif
  930.     NDIS_STATUS                 LastIndicatedStatus;
  931.     NDIS_STATUS                 LatestUnIndicateStatus;
  932.  
  933.  
  934. } VELAN, *PVELAN;
  935.  
  936. #if IEEE_VLAN_SUPPORT
  937.  
  938. #define TPID                            0x0081    
  939. //
  940. // Define tag_header structure
  941. //
  942. typedef struct _VLAN_TAG_HEADER
  943. {
  944.     UCHAR       TagInfo[2];    
  945. } VLAN_TAG_HEADER, *PVLAN_TAG_HEADER;
  946.  
  947. //
  948. // Define context struct that used when the lower driver
  949. // uses non-packet indication. It contains the original
  950. // context, the tagging information and the tag-header
  951. // length
  952. // 
  953. typedef struct _MUX_RCV_CONTEXT
  954. {
  955.     ULONG                   TagHeaderLen;
  956.     NDIS_PACKET_8021Q_INFO  NdisPacket8021QInfo;
  957.     PVOID                   MacRcvContext;
  958. }MUX_RCV_CONTEXT, *PMUX_RCV_CONTEXT;
  959.  
  960. //
  961. // Macro definitions for VLAN support
  962. // 
  963. #define VLAN_TAG_HEADER_SIZE        4 
  964.  
  965. #define VLANID_DEFAULT              0 
  966. #define VLAN_ID_MAX                 0xfff
  967. #define VLAN_ID_MIN                 0x0
  968.  
  969. #define USER_PRIORITY_MASK          0xe0
  970. #define CANONICAL_FORMAT_ID_MASK    0x10
  971. #define HIGH_VLAN_ID_MASK           0x0F
  972.  
  973. //
  974. // Get information for tag headre
  975. // 
  976. #define GET_CANONICAL_FORMAT_ID_FROM_TAG(_pTagHeader)  \
  977.     ( _pTagHeader->TagInfo[0] & CANONICAL_FORMAT_ID_MASK)   
  978.     
  979. #define GET_USER_PRIORITY_FROM_TAG(_pTagHeader)  \
  980.     ( _pTagHeader->TagInfo[0] & USER_PRIORITY_MASK)
  981.     
  982. #define GET_VLAN_ID_FROM_TAG(_pTagHeader)   \
  983.     (((USHORT)(_pTagHeader->TagInfo[0] & HIGH_VLAN_ID_MASK) << 8) | (USHORT)(_pTagHeader->TagInfo[1]))
  984.      
  985. //
  986. // Clear the tag header struct
  987. // 
  988. #define INITIALIZE_TAG_HEADER_TO_ZERO(_pTagHeader) \
  989. {                                                  \
  990.      _pTagHeader->TagInfo[0] = 0;                  \
  991.      _pTagHeader->TagInfo[1] = 0;                  \
  992. }
  993.      
  994. //
  995. // Set VLAN information to tag header 
  996. // Before we called all the set macro, first we need to initialize pTagHeader  to be 0
  997. // 
  998. #define SET_CANONICAL_FORMAT_ID_TO_TAG(_pTagHeader, CanonicalFormatId)  \
  999.      _pTagHeader->TagInfo[0] |= ((UCHAR)CanonicalFormatId << 4)
  1000.  
  1001. #define SET_USER_PRIORITY_TO_TAG(_pTagHeader, UserPriority)  \
  1002.      _pTagHeader->TagInfo[0] |= ((UCHAR)UserPriority << 5)
  1003.  
  1004. #define SET_VLAN_ID_TO_TAG(_pTagHeader, VlanId)                 \
  1005. {                                                               \
  1006.     _pTagHeader->TagInfo[0] |= (((UCHAR)VlanId >> 8) & 0x0f);   \
  1007.      _pTagHeader->TagInfo[1] |= (UCHAR)VlanId;\
  1008. }
  1009.  
  1010. //
  1011. // Copy tagging information in the indicated frame to per packet info
  1012. // 
  1013. #define COPY_TAG_INFO_FROM_HEADER_TO_PACKET_INFO(_Ieee8021qInfo, _pTagHeader)                                   \
  1014. {                                                                                                               \
  1015.     (_Ieee8021qInfo).TagHeader.UserPriority = ((_pTagHeader->TagInfo[0] & USER_PRIORITY_MASK) >> 5);              \
  1016.     (_Ieee8021qInfo).TagHeader.CanonicalFormatId = ((_pTagHeader->TagInfo[0] & CANONICAL_FORMAT_ID_MASK) >> 4);   \
  1017.     (_Ieee8021qInfo).TagHeader.VlanId = (((USHORT)(_pTagHeader->TagInfo[0] & HIGH_VLAN_ID_MASK) << 8)| (USHORT)(_pTagHeader->TagInfo[1]));                                                                \
  1018. }
  1019.  
  1020. //
  1021. // Function to handle tagging on sending side
  1022. // 
  1023. NDIS_STATUS
  1024. MPHandleSendTagging(
  1025.     IN  PVELAN              pVElan,
  1026.     IN  PNDIS_PACKET        Packet,
  1027.     IN  OUT PNDIS_PACKET    MyPacket
  1028.     );
  1029.  
  1030. //
  1031. // Functions to handle tagging on receiving side with packet indication
  1032. //
  1033. NDIS_STATUS
  1034. PtHandleRcvTagging(
  1035.     IN  PVELAN              pVElan,
  1036.     IN  PNDIS_PACKET        Packet,
  1037.     IN  OUT PNDIS_PACKET    MyPacket
  1038.     );
  1039.  
  1040. #endif //IEEE_VLAN_SUPPORT
  1041.  
  1042. //
  1043. // Macro definitions for others.
  1044. //
  1045.  
  1046. //
  1047. // Is a given power state a low-power state?
  1048. //
  1049. #define MUX_IS_LOW_POWER_STATE(_PwrState)                       \
  1050.             ((_PwrState) > NdisDeviceStateD0)
  1051.  
  1052. #define MUX_INIT_ADAPT_RW_LOCK(_pAdapt) \
  1053.             NdisInitializeReadWriteLock(&(_pAdapt)->ReadWriteLock)
  1054.  
  1055.  
  1056. #define MUX_ACQUIRE_ADAPT_READ_LOCK(_pAdapt, _pLockState)       \
  1057.             NdisAcquireReadWriteLock(&(_pAdapt)->ReadWriteLock, \
  1058.                                      FALSE,                     \
  1059.                                      _pLockState)
  1060.  
  1061. #define MUX_RELEASE_ADAPT_READ_LOCK(_pAdapt, _pLockState)       \
  1062.             NdisReleaseReadWriteLock(&(_pAdapt)->ReadWriteLock, \
  1063.                                      _pLockState)
  1064.  
  1065. #define MUX_ACQUIRE_ADAPT_WRITE_LOCK(_pAdapt, _pLockState)      \
  1066.             NdisAcquireReadWriteLock(&(_pAdapt)->ReadWriteLock, \
  1067.                                      TRUE,                      \
  1068.                                      _pLockState)
  1069.  
  1070. #define MUX_RELEASE_ADAPT_WRITE_LOCK(_pAdapt, _pLockState)      \
  1071.             NdisReleaseReadWriteLock(&(_pAdapt)->ReadWriteLock, \
  1072.                                      _pLockState)
  1073.  
  1074. #define MUX_INCR_PENDING_RECEIVES(_pVElan)                      \
  1075.             NdisInterlockedIncrement(&pVElan->OutstandingReceives)
  1076.  
  1077. #define MUX_DECR_PENDING_RECEIVES(_pVElan)                      \
  1078.             NdisInterlockedDecrement(&pVElan->OutstandingReceives)
  1079.  
  1080. #define MUX_INCR_PENDING_SENDS(_pVElan)                         \
  1081.             NdisInterlockedIncrement(&pVElan->OutstandingSends)
  1082.  
  1083. #define MUX_DECR_PENDING_SENDS(_pVElan)                         \
  1084.             NdisInterlockedDecrement(&pVElan->OutstandingSends)
  1085.  
  1086.  
  1087.  
  1088.  
  1089. #define MUX_INCR_STATISTICS(_pUlongVal)                         \
  1090.             NdisInterlockedIncrement(_pUlongVal)
  1091.  
  1092. #define MUX_INCR_STATISTICS64(_pUlong64Val)                     \
  1093. {                                                               \
  1094.     PLARGE_INTEGER      _pLargeInt = (PLARGE_INTEGER)_pUlong64Val;\
  1095.     if (NdisInterlockedIncrement(&_pLargeInt->LowPart) == 0)    \
  1096.     {                                                           \
  1097.         NdisInterlockedIncrement(&_pLargeInt->HighPart);        \
  1098.     }                                                           \
  1099. }
  1100.  
  1101. #define ASSERT_AT_PASSIVE()                                     \
  1102.     ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL)
  1103.  
  1104.  
  1105.  
  1106. //
  1107. // Simple Mutual Exclusion constructs used in preference to
  1108. // using KeXXX calls since we don't have Mutex calls in NDIS.
  1109. // These can only be called at passive IRQL.
  1110. //
  1111.  
  1112. typedef struct _MUX_MUTEX
  1113. {
  1114.     ULONG                   Counter;
  1115.     ULONG                   ModuleAndLine;  // useful for debugging
  1116.  
  1117. } MUX_MUTEX, *PMUX_MUTEX;
  1118.  
  1119. #define MUX_INIT_MUTEX(_pMutex)                                 \
  1120. {                                                               \
  1121.     (_pMutex)->Counter = 0;                                     \
  1122.     (_pMutex)->ModuleAndLine = 0;                               \
  1123. }
  1124.  
  1125. #define MUX_ACQUIRE_MUTEX(_pMutex)                              \
  1126. {                                                               \
  1127.     while (NdisInterlockedIncrement(&((_pMutex)->Counter)) != 1)\
  1128.     {                                                           \
  1129.         NdisInterlockedDecrement(&((_pMutex)->Counter));        \
  1130.         NdisMSleep(10000);                                      \
  1131.     }                                                           \
  1132.     (_pMutex)->ModuleAndLine = (MODULE_NUMBER << 16) | __LINE__;\
  1133. }
  1134.  
  1135. #define MUX_RELEASE_MUTEX(_pMutex)                              \
  1136. {                                                               \
  1137.     (_pMutex)->ModuleAndLine = 0;                               \
  1138.     NdisInterlockedDecrement(&(_pMutex)->Counter);              \
  1139. }
  1140.  
  1141.  
  1142. //
  1143. // Global variables
  1144. //
  1145. extern NDIS_HANDLE           ProtHandle, DriverHandle;
  1146. extern NDIS_MEDIUM           MediumArray[1];
  1147. extern NDIS_SPIN_LOCK        GlobalLock;
  1148. extern MUX_MUTEX             GlobalMutex;
  1149. extern LIST_ENTRY            AdapterList;
  1150. extern ULONG                 NextVElanNumber;
  1151.  
  1152.  
  1153. //
  1154. // Module numbers for debugging
  1155. //
  1156. #define MODULE_MUX          'X'
  1157. #define MODULE_PROT         'P'
  1158. #define MODULE_MINI         'M'
  1159.  
  1160.