Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
3.7 KiB

  1. /*++ BUILD Version: 0009 // Increment this if a change has global effects
  2. Copyright (c) 1987-1993 Microsoft Corporation
  3. Module Name:
  4. midatlas.h
  5. Abstract:
  6. This module defines the data structure used in mapping MIDS to the corresponding requests/
  7. contexts associated with them.
  8. Author:
  9. Balan Sethu Raman (SethuR) 26-Aug-95 Created
  10. Notes:
  11. MID (Multiplex ID) is used at both the server and the client ( redirector ) to distinguish
  12. between the concurrently active requests on any connection. This data structure has been
  13. designed to meet the following criterion.
  14. 1) It should scale well to handle the differing capabilities of a server, e.g., the typical
  15. NT server permits 50 outstanding requests on any connection. The CORE level servers can go as
  16. low as one and on Gateway machines the desired number can be very high ( in the oreder of thousands)
  17. 2) The two primary operations that need to be handled well are
  18. i) mapping a MID to the context associated with it.
  19. -- This routine will be invoked to process every packet received along any connection
  20. at both the server and the client.
  21. ii) generating a new MID for sending requests to the server.
  22. -- This will be used at the client both for max. command enforcement as well as
  23. tagging each concurrent request with a unique id.
  24. The most common case is that of a connection between a NT client and a NT server. All
  25. design decisions have been made in order to ensure that the solutions are optimal
  26. for this case.
  27. The MID data structure must be efficiently able to manage the unique tagging and identification
  28. of a number of mids ( typically 50 ) from a possible combination of 65536 values. In order to
  29. ensure a proper time space tradeoff the lookup is organized as a three level hierarchy.
  30. The 16 bits used to represent a MID are split upinto three bit fields. The length of the
  31. rightmost field ( least signifiant ) is decided by the number of mids that are to be
  32. allocated on creation. The remaining length is split up equally between the next two
  33. fields, e.g., if 50 mids are to be allocated on creation , the length of the first field
  34. is 6 ( 64 ( 2 ** 6 ) is greater than 50 ), 5 and 5.
  35. --*/
  36. #ifndef _MIDATLAX_H_
  37. #define _MIDATLAX_H_
  38. //
  39. // Forward declaration
  40. //
  41. typedef struct _MID_MAP_ *PMID_MAP;
  42. typedef struct _RX_MID_ATLAS {
  43. USHORT MaximumNumberOfMids;
  44. USHORT MidsAllocated;
  45. USHORT NumberOfMidsInUse;
  46. USHORT NumberOfMidsDiscarded;
  47. USHORT MaximumMidFieldWidth;
  48. USHORT Reserved;
  49. USHORT MidQuantum;
  50. UCHAR MidQuantumFieldWidth;
  51. UCHAR NumberOfLevels;
  52. LIST_ENTRY MidMapFreeList;
  53. LIST_ENTRY MidMapExpansionList;
  54. PMID_MAP pRootMidMap;
  55. } RX_MID_ATLAS, *PRX_MID_ATLAS;
  56. typedef
  57. VOID (*PCONTEXT_DESTRUCTOR) (
  58. PVOID Context
  59. );
  60. #define RxGetMaximumNumberOfMids(ATLAS) ((ATLAS)->MaximumNumberOfMids)
  61. #define RxGetNumberOfMidsInUse(ATLAS) ((ATLAS)->NumberOfMidsInUse)
  62. PRX_MID_ATLAS
  63. RxCreateMidAtlas (
  64. USHORT MaximumNumberOfEntries,
  65. USHORT InitialAllocation
  66. );
  67. VOID
  68. RxDestroyMidAtlas (
  69. PRX_MID_ATLAS MidAtlas,
  70. PCONTEXT_DESTRUCTOR ContextDestructor
  71. );
  72. PVOID
  73. RxMapMidToContext (
  74. PRX_MID_ATLAS MidAtlas,
  75. USHORT Mid
  76. );
  77. NTSTATUS
  78. RxAssociateContextWithMid (
  79. PRX_MID_ATLAS MidAtlas,
  80. PVOID Context,
  81. PUSHORT NewMid
  82. );
  83. NTSTATUS
  84. RxMapAndDissociateMidFromContext (
  85. PRX_MID_ATLAS MidAtlas,
  86. USHORT Mid,
  87. PVOID *ContextPointer
  88. );
  89. NTSTATUS
  90. RxReassociateMid (
  91. PRX_MID_ATLAS MidAtlas,
  92. USHORT Mid,
  93. PVOID NewContext
  94. );
  95. #endif
  96.