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.

1576 lines
54 KiB

  1. /*++
  2. Copyright (c) 2000-2000 Microsoft Corporation
  3. Module Name:
  4. Types.h
  5. Abstract:
  6. This file contains the typedefs and constants for PGM.
  7. Author:
  8. Mohammad Shabbir Alam (MAlam) 3-30-2000
  9. Revision History:
  10. --*/
  11. #ifndef _TYPES_H
  12. #define _TYPES_H
  13. #if(WINVER > 0x0500)
  14. #if DBG
  15. // #define FILE_LOGGING 1
  16. #else
  17. #define FILE_LOGGING 1
  18. #endif // DBG
  19. #endif // WINVER
  20. // #define FEC_DBG 1
  21. #ifdef DROP_DBG
  22. extern ULONG DropCount;
  23. #endif // DROP_DBG
  24. //----------------------------------------------------------------------------
  25. #define MAX_BUFF_DBG 1 // To debug Watermarks!
  26. // #define IP_FIX 1
  27. //----------------------------------------------------------------------------
  28. #define ROUTER_ALERT_SIZE 4 // from Ipdef.h
  29. #define TL_INSTANCE 0
  30. //----------------------------------------------------------------------------
  31. //
  32. // To be set sometime:
  33. //
  34. #define MAX_RECEIVE_SIZE 0xffff
  35. //----------------------------------------------------------------------------
  36. extern HANDLE TdiClientHandle;
  37. //----------------------------------------------------------------------------
  38. #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || ((defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_FULL_VER > 13009175))
  39. #define htons(x) _byteswap_ushort((USHORT)(x))
  40. #define htonl(x) _byteswap_ulong((ULONG)(x))
  41. #else
  42. #define htons(x) ((((x) >> 8) & 0x00FF) | (((x) << 8) & 0xFF00))
  43. __inline long
  44. htonl(long x)
  45. {
  46. return((((x) >> 24) & 0x000000FFL) |
  47. (((x) >> 8) & 0x0000FF00L) |
  48. (((x) << 8) & 0x00FF0000L) |
  49. (((x) << 24) & 0xFF000000L));
  50. }
  51. #endif
  52. #define ntohs(x) htons(x)
  53. #define ntohl(x) htonl(x)
  54. //
  55. // Sequence NumberType
  56. //
  57. typedef ULONG SEQ_TYPE;
  58. typedef LONG SIGNED_SEQ_TYPE;
  59. #define SOURCE_ID_LENGTH 6
  60. #ifndef FILE_LOGGING
  61. #if DBG
  62. extern enum eLOGGING_LEVEL PgmLoggingLevel;
  63. #endif // DBG
  64. #endif // !FILE_LOGGING
  65. #ifdef OLD_LOGGING
  66. extern ULONG PgmDebuggerPath;
  67. extern enum eSEVERITY_LEVEL PgmDebuggerSeverity;
  68. extern ULONG PgmLogFilePath;
  69. extern enum eSEVERITY_LEVEL PgmLogFileSeverity;
  70. #endif // OLD_LOGGING
  71. //
  72. // Lock structure and locking order info
  73. //
  74. #define DCONFIG_LOCK 0x0001
  75. #define DEVICE_LOCK 0x0002
  76. #define ADDRESS_LOCK 0x0004
  77. #define CONTROL_LOCK 0x0008
  78. #define SESSION_LOCK 0x0010
  79. //
  80. // FEC Global Info
  81. //
  82. #define GF_BITS 8 // code over GF(2**GF_BITS) - change to suit
  83. #define GF_SIZE ((1 << GF_BITS) - 1) /* powers of \alpha */
  84. #define FEC_MAX_GROUP_BITS GF_BITS
  85. #define FEC_MAX_GROUP_SIZE (1 << (FEC_MAX_GROUP_BITS-1))
  86. #define FEC_MAX_BLOCK_SIZE ((1 << FEC_MAX_GROUP_BITS)-1)
  87. extern UCHAR gFECLog2 [];
  88. //
  89. // Enumerate all the different stages of cleanup of the driver
  90. //
  91. enum eCLEANUP_STAGE
  92. {
  93. E_CLEANUP_STATIC_CONFIG = 1,
  94. E_CLEANUP_DYNAMIC_CONFIG,
  95. E_CLEANUP_REGISTRY_PARAMETERS,
  96. E_CLEANUP_STRUCTURES,
  97. E_CLEANUP_DEVICE,
  98. E_CLEANUP_PNP,
  99. E_CLEANUP_UNLOAD
  100. };
  101. typedef struct
  102. {
  103. DEFINE_LOCK_STRUCTURE(SpinLock) // to lock access on an MP machine
  104. #if DBG
  105. ULONG LastLockLine;
  106. ULONG LastUnlockLine;
  107. ULONG LockNumber; // spin lock number for this struct
  108. #endif // DBG
  109. } tPGM_LOCK_INFO;
  110. typedef struct _tPGM_TIMER
  111. {
  112. KTIMER t_timer;
  113. KDPC t_dpc;
  114. } tPGM_TIMER;
  115. //
  116. // Structure used for TDI_QUERY_ADDRESS request
  117. //
  118. typedef struct
  119. {
  120. ULONG ActivityCount;
  121. TA_IP_ADDRESS IpAddress;
  122. } tTDI_QUERY_ADDRESS_INFO;
  123. // ----------------------------------------------------
  124. #define TDI_LOOKASIDE_DEPTH 100
  125. #define SENDER_BUFFER_LOOKASIDE_DEPTH 100
  126. #define SEND_CONTEXT_LOOKASIDE_DEPTH 100
  127. #define NON_PARITY_CONTEXT_LOOKASIDE_DEPTH 200
  128. #define PARITY_CONTEXT_LOOKASIDE_DEPTH 200
  129. #define DEBUG_MESSAGES_LOOKASIDE_DEPTH 20
  130. #define RDATA_REQUESTS_MIN_LOOKASIDE_DEPTH 1000
  131. typedef struct
  132. {
  133. PEPROCESS FspProcess;
  134. PDRIVER_OBJECT DriverObject;
  135. UNICODE_STRING RegistryPath; // Ptr to registry Location
  136. PFILE_OBJECT FipsFileObject;
  137. FIPS_FUNCTION_TABLE FipsFunctionTable;
  138. BOOLEAN FipsInitialized;
  139. NPAGED_LOOKASIDE_LIST TdiLookasideList;
  140. #ifdef OLD_LOGGING
  141. NPAGED_LOOKASIDE_LIST DebugMessagesLookasideList;
  142. #endif // OLD_LOGGING
  143. } tPGM_STATIC_CONFIG;
  144. #define PGM_CONFIG_FLAG_UNLOADING 0x00000001
  145. #define PGM_CONFIG_FLAG_RECEIVE_TIMER_RUNNING 0x00000002
  146. typedef struct
  147. {
  148. // Line # 1
  149. LIST_ENTRY SenderAddressHead;
  150. LIST_ENTRY ReceiverAddressHead;
  151. // Line # 2
  152. LIST_ENTRY DestroyedAddresses;
  153. LIST_ENTRY ClosedAddresses;
  154. // Line # 3
  155. LIST_ENTRY ClosedConnections;
  156. LIST_ENTRY ConnectionsCreated;
  157. // Line # 4
  158. LIST_ENTRY CleanedUpConnections;
  159. LIST_ENTRY CurrentReceivers;
  160. // Line # 5
  161. LIST_ENTRY LocalInterfacesList;
  162. LIST_ENTRY WorkerQList;
  163. // Line # 6
  164. LARGE_INTEGER TimeoutGranularity;
  165. LARGE_INTEGER LastReceiverTimeout;
  166. // Line # 7
  167. ULONGLONG ReceiversTimerTickCount;
  168. ULONG GlobalFlags;
  169. ULONG NumWorkerThreadsQueued;
  170. // Line # 8
  171. UCHAR gSourceId[SOURCE_ID_LENGTH];
  172. USHORT SourcePort;
  173. ULONG MaxMTU;
  174. ULONG DoNotBreakOnAssert;
  175. // Line # 9
  176. tPGM_TIMER SessionTimer;
  177. KEVENT LastWorkerItemEvent;
  178. tPGM_LOCK_INFO LockInfo; // spin lock info for this struct
  179. #if DBG
  180. ULONG CurrentLockNumber[MAXIMUM_PROCESSORS];
  181. #endif // DBG
  182. } tPGM_DYNAMIC_CONFIG;
  183. //
  184. // Flags for Registry configurations
  185. //
  186. #define PGM_REGISTRY_SENDER_FILE_SPECIFIED 0x00000001
  187. typedef struct
  188. {
  189. ULONG RefCount;
  190. ULONG Flags;
  191. UNICODE_STRING ucSenderFileLocation;
  192. } tPGM_REGISTRY_CONFIG;
  193. extern tPGM_STATIC_CONFIG PgmStaticConfig;
  194. extern tPGM_DYNAMIC_CONFIG PgmDynamicConfig;
  195. extern tPGM_REGISTRY_CONFIG *pPgmRegistryConfig;
  196. //
  197. // Registry configurable parameter names
  198. //
  199. #define PARAM_SENDER_FILE_LOCATION L"SenderFileLocation"
  200. //
  201. // Handle Verifiers
  202. //
  203. #define PGM_VERIFY_DEVICE 0x43564544 // DEVC
  204. #define PGM_VERIFY_CONTROL 0x544E4F43 // CONT
  205. #define PGM_VERIFY_ADDRESS 0x52444441 // ADDR
  206. #define PGM_VERIFY_ADDRESS_DOWN 0x32444441 // ADD2
  207. #define PGM_VERIFY_SESSION_UNASSOCIATED 0x30534553 // SES0
  208. #define PGM_VERIFY_SESSION_DOWN 0x32534553 // SES2
  209. #define PGM_VERIFY_SESSION_SEND 0x53534553 // SESS
  210. #define PGM_VERIFY_SESSION_RECEIVE 0x52534553 // SESR
  211. //
  212. // Enumerate all the different places the device can be referenced to
  213. // keep track of RefCounts
  214. //
  215. enum eREF_DEVICE
  216. {
  217. REF_DEV_CREATE,
  218. REF_DEV_ADDRESS_NOTIFICATION,
  219. REF_DEV_MAX
  220. };
  221. #define WC_PGM_CLIENT_NAME L"Pgm"
  222. #define WC_PGM_DEVICE_EXPORT_NAME L"\\Device\\Pgm"
  223. #define WS_DEFAULT_SENDER_FILE_LOCATION L"\\SystemRoot\\System32"
  224. typedef struct
  225. {
  226. DEVICE_OBJECT *pPgmDeviceObject;
  227. ULONG State;
  228. ULONG Verify;
  229. ULONG RefCount;
  230. UNICODE_STRING ucBindName; // name exported by this device
  231. // these are handles to the transport control object, so we can do things
  232. // like query provider info...
  233. HANDLE hControl;
  234. PDEVICE_OBJECT pControlDeviceObject;
  235. PFILE_OBJECT pControlFileObject;
  236. KEVENT DeviceCleanedupEvent;
  237. tPGM_LOCK_INFO LockInfo; // spin lock info for this struct
  238. // #if DBG
  239. ULONG ReferenceContexts[REF_DEV_MAX];
  240. // #endif // DBG
  241. UCHAR BindNameBuffer[1];
  242. } tPGM_DEVICE;
  243. extern tPGM_DEVICE *pgPgmDevice;
  244. extern DEVICE_OBJECT *pPgmDeviceObject;
  245. typedef struct
  246. {
  247. UCHAR Address[6];
  248. }tMAC_ADDRESS;
  249. typedef struct
  250. {
  251. LIST_ENTRY Linkage;
  252. tIPADDRESS IpAddress;
  253. tIPADDRESS SubnetMask;
  254. } tADDRESS_ON_INTERFACE;
  255. typedef struct
  256. {
  257. LIST_ENTRY Linkage;
  258. LIST_ENTRY Addresses;
  259. ULONG IpInterfaceIndex;
  260. ULONG MTU;
  261. tIPADDRESS SubnetMask;
  262. ULONG Flags;
  263. tMAC_ADDRESS MacAddress;
  264. } tLOCAL_INTERFACE;
  265. // **********************************************************************
  266. // * File System Contexts *
  267. // **********************************************************************
  268. //
  269. // Control FileSystemContext
  270. //
  271. //
  272. // Enumerate all the different places the device can be referenced to
  273. // keep track of RefCounts
  274. //
  275. enum eREF_CONTROL
  276. {
  277. REF_CONTROL_CREATE,
  278. REF_CONTROL_MAX
  279. };
  280. typedef struct _tCONTROL_CONTEXT
  281. {
  282. // Line # 1
  283. LIST_ENTRY Linkage; // link to next item in list
  284. ULONG Verify; // set to a known value to verify block
  285. LONG RefCount;
  286. tPGM_LOCK_INFO LockInfo; // spin lock info for this struct
  287. // #if DBG
  288. ULONG ReferenceContexts[REF_CONTROL_MAX];
  289. // #endif // DBG
  290. } tCONTROL_CONTEXT;
  291. typedef struct _FEC_CONTEXT
  292. {
  293. LONG k; // Max Transmission Group Size
  294. LONG n; // Block size
  295. UCHAR *pEncodeMatrix;
  296. UCHAR *pDecodeMatrix;
  297. ULONG *pInvertMatrixInfo;
  298. } tFEC_CONTEXT, *PFEC_CONTEXT;
  299. typedef struct _BUILD_PARITY_CONTEXT
  300. {
  301. UCHAR NextFECPacketIndex;
  302. UCHAR NumPacketsInThisGroup;
  303. USHORT Pad;
  304. ULONG OptionsFlags;
  305. PUCHAR pDataBuffers[1];
  306. } tBUILD_PARITY_CONTEXT;
  307. //
  308. // This is the client-procedure to be called on completing a send
  309. //
  310. typedef VOID
  311. (*pCLIENT_COMPLETION_ROUTINE) (PVOID pSendContext1,
  312. PVOID pSendContext2,
  313. NTSTATUS status);
  314. //
  315. // Address FileSystemContext
  316. //
  317. //
  318. // Enumerate all the different places the device can be referenced to
  319. // keep track of RefCounts
  320. //
  321. enum eREF_ADDRESS
  322. {
  323. REF_ADDRESS_CREATE,
  324. REF_ADDRESS_VERIFY_USER,
  325. REF_ADDRESS_ASSOCIATED,
  326. REF_ADDRESS_CONNECT,
  327. REF_ADDRESS_SET_INFO,
  328. REF_ADDRESS_SEND_DIRECT,
  329. REF_ADDRESS_TDI_RCV_HANDLER,
  330. REF_ADDRESS_SEND_IN_PROGRESS,
  331. REF_ADDRESS_RECEIVE_ACTIVE,
  332. REF_ADDRESS_CLIENT_RECEIVE,
  333. REF_ADDRESS_DISCONNECT,
  334. REF_ADDRESS_STOP_LISTENING,
  335. REF_ADDRESS_MAX
  336. };
  337. #define MAX_STREAMS_PER_NONADMIN_RECEIVER 2
  338. #define MAX_RECEIVE_INTERFACES 20
  339. #define PGM_ADDRESS_FLAG_INVALID_OUT_IF 0x00000001
  340. #define PGM_ADDRESS_USE_WINDOW_AS_DATA_CACHE 0x00000002
  341. #define PGM_ADDRESS_LISTEN_ON_ALL_INTERFACES 0x00000004
  342. #define PGM_ADDRESS_WAITING_FOR_NEW_INTERFACE 0x00000008
  343. #define PGM_ADDRESS_HIGH_SPEED_OPTIMIZED 0x00000010
  344. typedef struct _tADDRESS_CONTEXT
  345. {
  346. //
  347. // *** Common ***
  348. //
  349. // Line # 1
  350. LIST_ENTRY Linkage; // link to next item in list
  351. ULONG Verify; // set to a known value to verify block
  352. LONG RefCount;
  353. // Line # 2
  354. LIST_ENTRY AssociatedConnections;
  355. PEPROCESS Process;
  356. // Line # 3
  357. PIRP pIrpClose;
  358. ULONG Flags;
  359. HANDLE FileHandle;
  360. PFILE_OBJECT pFileObject;
  361. // Line # 4
  362. PDEVICE_OBJECT pDeviceObject;
  363. HANDLE RAlertFileHandle;
  364. PFILE_OBJECT pRAlertFileObject;
  365. PDEVICE_OBJECT pRAlertDeviceObject;
  366. // Line # 5
  367. PTDI_IND_CONNECT evConnect; // Client Event to call
  368. PVOID ConEvContext; // EVENT Context to pass to client
  369. PTDI_IND_RECEIVE evReceive;
  370. PVOID RcvEvContext;
  371. // Line # 6
  372. PTDI_IND_DISCONNECT evDisconnect;
  373. PVOID DiscEvContext;
  374. PTDI_IND_ERROR evError;
  375. PVOID ErrorEvContext;
  376. // Line # 7
  377. PTDI_IND_RECEIVE_DATAGRAM evRcvDgram;
  378. PVOID RcvDgramEvContext;
  379. PTDI_IND_RECEIVE_EXPEDITED evRcvExpedited;
  380. PVOID RcvExpedEvContext;
  381. // Line # 8
  382. PTDI_IND_SEND_POSSIBLE evSendPossible;
  383. PVOID SendPossEvContext;
  384. TOKEN_USER *pUserId;
  385. //
  386. // *** Sender -specific ***
  387. //
  388. tMAC_ADDRESS OutIfMacAddress;
  389. USHORT SenderMCastPort;
  390. // Line # 9
  391. tIPADDRESS SenderMCastOutIf;
  392. ULONG OutIfFlags;
  393. ULONG OutIfMTU;
  394. ULONG LateJoinerPercentage; // Percentage of window that late joiner can request
  395. // Line # 10
  396. ULONG MCastPacketTtl;
  397. // -- send window settings
  398. ULONGLONG MaxWindowSizeBytes;
  399. ULONGLONG RateKbitsPerSec;
  400. ULONGLONG WindowSizeInBytes;
  401. ULONGLONG WindowSizeInMSecs;
  402. ULONG WindowAdvancePercentage;
  403. // Line # -- FEC settings
  404. USHORT FECBlockSize;
  405. USHORT FECProActivePackets;
  406. UCHAR FECGroupSize;
  407. UCHAR FECOptions;
  408. //
  409. // *** Receiver -specific ***
  410. //
  411. LIST_ENTRY ListenHead; // List of Clients listening
  412. tIPADDRESS ReceiverMCastAddr; // For receiving MCast packets (host format)
  413. USHORT ReceiverMCastPort;
  414. USHORT NumReceiveInterfaces;
  415. ULONG ReceiverInterfaceList[MAX_RECEIVE_INTERFACES+1];
  416. tIPADDRESS LastSpmSource;
  417. //
  418. // *** Common, including Debug ***
  419. //
  420. tPGM_LOCK_INFO LockInfo; // spin lock info for this struct
  421. // #if DBG
  422. ULONG ReferenceContexts[REF_ADDRESS_MAX];
  423. // #endif // DBG
  424. } tADDRESS_CONTEXT, *PADDRESS_CONTEXT;
  425. typedef struct _tTDI_SEND_CONTEXT
  426. {
  427. TDI_CONNECTION_INFORMATION TdiConnectionInfo;
  428. TA_IP_ADDRESS TransportAddress;
  429. pCLIENT_COMPLETION_ROUTINE pClientCompletionRoutine;
  430. PVOID ClientCompletionContext1;
  431. PVOID ClientCompletionContext2;
  432. BOOLEAN fPagedBuffer;
  433. } tTDI_SEND_CONTEXT;
  434. typedef struct _RCV_COMPLETE_CONTEXT
  435. {
  436. tADDRESS_CONTEXT *pAddress;
  437. ULONG SrcAddressLength;
  438. ULONG BytesAvailable;
  439. PVOID pSrcAddress;
  440. UCHAR BufferData[4];
  441. } tRCV_COMPLETE_CONTEXT;
  442. //
  443. // Connect FileSystemContext
  444. //
  445. //
  446. // Enumerate all the different places the Connection can be referenced to
  447. // keep track of RefCounts
  448. //
  449. enum eREF_CONNECT
  450. {
  451. REF_SESSION_CREATE,
  452. REF_SESSION_ASSOCIATED,
  453. REF_SESSION_TIMER_RUNNING,
  454. REF_SESSION_SEND_CONNECT,
  455. REF_SESSION_SEND_RDATA,
  456. REF_SESSION_SEND_SPM,
  457. REF_SESSION_SEND_NAK,
  458. REF_SESSION_SEND_NCF,
  459. REF_SESSION_SEND_IN_WINDOW,
  460. REF_SESSION_TDI_RCV_HANDLER,
  461. REF_SESSION_CLIENT_RECEIVE,
  462. REF_SESSION_CLEANUP_NAKS,
  463. REF_SESSION_DISCONNECT,
  464. REF_SESSION_MAX
  465. };
  466. #define FLAG_CONNECT_CLIENT_IS_LISTENING 1
  467. #define MAX_DATA_FILE_NAME_LENGTH 50
  468. #define PGM_SESSION_FLAG_STOP_TIMER 0x00000001
  469. #define PGM_SESSION_FLAG_WORKER_RUNNING 0x00000002
  470. #define PGM_SESSION_FLAG_SEND_AMBIENT_SPM 0x00000004
  471. #define PGM_SESSION_FLAG_FIRST_PACKET 0x00000008
  472. #define PGM_SESSION_FLAG_SENDER 0x00000010
  473. #define PGM_SESSION_FLAG_RECEIVER 0x00000020
  474. #define PGM_SESSION_FLAG_NAK_TIMED_OUT 0x00000040
  475. #define PGM_SESSION_TERMINATED_GRACEFULLY 0x00000080
  476. #define PGM_SESSION_TERMINATED_ABORT 0x00000100
  477. #define PGM_SESSION_ON_TIMER 0x00000200
  478. #define PGM_SESSION_FLAG_IN_INDICATE 0x00000400
  479. #define PGM_SESSION_WAIT_FOR_RECEIVE_IRP 0x00000800
  480. #define PGM_SESSION_SENDER_DISCONNECTED 0x00001000
  481. #define PGM_SESSION_CLIENT_DISCONNECTED 0x00002000
  482. #define PGM_SESSION_SENDS_CANCELLED 0x00004000
  483. #define PGM_SESSION_DATA_FROM_LOOKASIDE 0x00008000
  484. typedef struct _TSI
  485. {
  486. union
  487. {
  488. struct
  489. {
  490. UCHAR GSI[SOURCE_ID_LENGTH];
  491. USHORT hPort; // Out port for Sender, remote port for Reciever
  492. };
  493. ULONGLONG ULLTSI;
  494. };
  495. } tTSI, *PTSI;
  496. #define NUM_INDICES 32
  497. #define NUM_INDICES_BITS 5 /* 5 bits all-set ==> 31 indices + 1 for overflow */
  498. typedef struct _RDATA_INFO
  499. {
  500. LIST_ENTRY PendingRDataRequests;
  501. ULONG EntrySize;
  502. ULONG IndexShift;
  503. ULONG IndexMask;
  504. ULONG MaxIndices;
  505. ULONG TrailIndex;
  506. ULONG NumAllocated;
  507. SEQ_TYPE RepairDataMaxEntries;
  508. SEQ_TYPE RepairDataMask;
  509. SEQ_TYPE RepairDataIndexShift;
  510. LIST_ENTRY *pRepairData;
  511. NPAGED_LOOKASIDE_LIST RDataLookasideList;
  512. PVOID pFirstEntry[NUM_INDICES];
  513. } tRDATA_INFO, *PRDATA_INFO;
  514. typedef struct _tCOMMON_SESSION_CONTEXT
  515. {
  516. // Line # 1
  517. LIST_ENTRY Linkage;
  518. ULONG Verify;
  519. ULONG RefCount;
  520. // Line # 2
  521. tADDRESS_CONTEXT *pAssociatedAddress;
  522. ULONG SessionFlags;
  523. struct _tSEND_CONTEXT *pSender;
  524. struct _tRECEIVE_CONTEXT *pReceiver;
  525. tIPADDRESS TdiIpAddress;
  526. USHORT TdiPort;
  527. tTSI TSI;
  528. PEPROCESS Process;
  529. CONNECTION_CONTEXT ClientSessionContext;
  530. PIRP pIrpCleanup;
  531. PIRP pIrpDisconnect;
  532. PIRP pIrpDisassociate;
  533. // -- FEC settings
  534. tFEC_CONTEXT FECContext;
  535. PUCHAR pFECBuffer;
  536. USHORT MaxMTULength;
  537. USHORT MaxFECPacketLength;
  538. USHORT FECBlockSize;
  539. USHORT FECProActivePackets;
  540. UCHAR FECGroupSize;
  541. UCHAR FECOptions;
  542. ULONG RateCalcTimeout;
  543. ULONGLONG DataBytesAtLastInterval; // # client data bytes sent upto last interval
  544. ULONGLONG TotalBytesAtLastInterval; // SPM, OData and RData bytes upto last interval
  545. ULONGLONG DataBytes; // # client data bytes sent out so far
  546. ULONGLONG TotalBytes; // SPM, OData and RData bytes
  547. ULONGLONG TotalPacketsReceived;
  548. ULONGLONG RateKBitsPerSecLast; // Internally calculated rate in the last INTERNAL_RATE_CALCULATION_FREQUENCY
  549. ULONGLONG MaxRateKBitsPerSec; // Maximum observed rate in any INTERNAL_RATE_CALCULATION_FREQUENCY
  550. ULONGLONG RateKBitsPerSecOverall; // Internally calculated rate from the beginning
  551. tPGM_TIMER SessionTimer;
  552. tPGM_LOCK_INFO LockInfo; // spin lock info for this struct
  553. // #if DBG
  554. ULONG ReferenceContexts[REF_SESSION_MAX];
  555. // #endif // DBG
  556. } tCOMMON_SESSION_CONTEXT, *PCOMMON_SESSION_CONTEXT;
  557. typedef struct _tCOMMON_SESSION_CONTEXT tSEND_SESSION, *PSEND_SESSION;
  558. typedef struct _tCOMMON_SESSION_CONTEXT tRECEIVE_SESSION, *PRECEIVE_SESSION;
  559. typedef struct _tSEND_CONTEXT
  560. {
  561. // Line # 1
  562. LIST_ENTRY Linkage;
  563. UNICODE_STRING DataFileName;
  564. // Line # 2
  565. tADDRESS_CONTEXT *pAddress;
  566. tIPADDRESS DestMCastIpAddress;
  567. tIPADDRESS SenderMCastOutIf;
  568. USHORT DestMCastPort;
  569. //
  570. // DataFile options
  571. //
  572. // Line # 3
  573. HANDLE FileHandle;
  574. HANDLE SectionHandle;
  575. PVOID pSectionObject;
  576. PUCHAR SendDataBufferMapping;
  577. // Line # 4
  578. ULONGLONG MaxDataFileSize;
  579. ULONGLONG MaxPacketsInBuffer;
  580. // Line # 5
  581. ULONG NextSendNumber;
  582. ULONG PacketBufferSize;
  583. ULONG MaxPayloadSize;
  584. //
  585. // Data Packet info
  586. //
  587. ULONG BufferPacketsAvailable;
  588. // Line # 6
  589. ULONGLONG BufferSizeAvailable;
  590. ULONGLONG LeadingWindowOffset;
  591. // Line # 7
  592. ULONGLONG TrailingWindowOffset;
  593. ULONG NumODataRequestsPending;
  594. ULONG NumRDataRequestsPending;
  595. // Line # 8
  596. SEQ_TYPE NextODataSequenceNumber;
  597. SEQ_TYPE LastODataSentSequenceNumber;
  598. SEQ_TYPE TrailingEdgeSequenceNumber;
  599. SEQ_TYPE TrailingGroupSequenceNumber;
  600. // Line # 9
  601. SEQ_TYPE LastMessageFirstSequence;
  602. SEQ_TYPE NextSpmSequenceNumber;
  603. SEQ_TYPE LateJoinSequenceNumbers;
  604. SEQ_TYPE LastVariableTGPacketSequenceNumber; // FEC-specific
  605. // Line # 10
  606. SEQ_TYPE EmptySequencesForLastSend;
  607. ULONG NumPacketsRemaining;
  608. ULONG PacketsSentSinceLastSpm;
  609. ULONG SpmOptions;
  610. // Line # 11
  611. ULONG DataOptions;
  612. ULONG DataOptionsLength;
  613. ULONG ThisSendMessageLength;
  614. ULONG BytesSent;
  615. //
  616. // Current Senders
  617. //
  618. // Line # 14
  619. LIST_ENTRY CompletedSendsInWindow;
  620. LIST_ENTRY PendingPacketizedSends;
  621. // Line # 15
  622. LIST_ENTRY PendingSends;
  623. tRDATA_INFO *pRDataInfo;
  624. PVOID pLastProActiveGroupLeader;
  625. //
  626. // Send Timer variables
  627. //
  628. // Line # 16
  629. LARGE_INTEGER LastTimeout;
  630. LARGE_INTEGER TimeoutGranularity;
  631. // Line # 17
  632. ULONGLONG TimerTickCount;
  633. ULONGLONG SendTimeoutCount;
  634. // Line # 18
  635. ULONGLONG DisconnectTimeInTicks;
  636. ULONGLONG WindowAdvanceDeltaTime;
  637. // Line # 19
  638. ULONGLONG WindowSizeTime;
  639. ULONGLONG RDataLingerTime;
  640. // Line # 20
  641. ULONGLONG NextWindowAdvanceTime;
  642. ULONGLONG TrailingEdgeTime;
  643. // Line # 21
  644. ULONGLONG CurrentTimeoutCount;
  645. ULONGLONG CurrentSPMTimeout;
  646. // Line # 22
  647. ULONGLONG AmbientSPMTimeout;
  648. ULONGLONG HeartbeatSPMTimeout;
  649. // Line # 23
  650. ULONGLONG InitialHeartbeatSPMTimeout;
  651. ULONGLONG MaxHeartbeatSPMTimeout;
  652. ULONG CurrentBytesSendable;
  653. ULONG IncrementBytesOnSendTimeout;
  654. ULONG OriginalIncrementBytes;
  655. ULONG DeltaIncrementBytes;
  656. //
  657. // FEC-specific
  658. //
  659. tBUILD_PARITY_CONTEXT *pProActiveParityContext;
  660. //
  661. // Lookaside list
  662. //
  663. // Line # 25
  664. NPAGED_LOOKASIDE_LIST SenderBufferLookaside;
  665. NPAGED_LOOKASIDE_LIST SendContextLookaside;
  666. //
  667. // Event for sender thread to synchronize on
  668. //
  669. KEVENT SendEvent;
  670. HANDLE SendHandle;
  671. ERESOURCE Resource; // Used to lock access at passive Irqls
  672. ULONGLONG ODataPacketsInLastInterval;
  673. ULONGLONG RDataPacketsInLastInterval;
  674. //
  675. // Sender Statistics
  676. //
  677. ULONGLONG NaksReceived; // # NAKs received so far
  678. ULONGLONG NaksReceivedTooLate; // # NAKs recvd after window advanced
  679. ULONGLONG NumOutstandingNaks; // # NAKs yet to be responded to
  680. ULONGLONG NumNaksAfterRData; // # NAKs yet to be responded to
  681. ULONGLONG TotalODataPacketsSent; // # ODATA sent so far
  682. ULONGLONG TotalRDataPacketsSent; // # Repairs (RDATA) sent so far
  683. } tSEND_CONTEXT;
  684. typedef struct _tRECEIVE_CONTEXT
  685. {
  686. // Line # 1
  687. LIST_ENTRY Linkage;
  688. tCOMMON_SESSION_CONTEXT *pReceive;
  689. tADDRESS_CONTEXT *pAddress;
  690. // Line # 2 -- Addresses
  691. tIPADDRESS SenderIpAddress;
  692. tIPADDRESS LastSpmSource;
  693. tIPADDRESS ListenMCastIpAddress;
  694. USHORT ListenMCastPort;
  695. USHORT SessionNakType;
  696. // Line # 3 -- Sequence # tracking
  697. SEQ_TYPE LastTrailingEdgeSeqNum;
  698. SEQ_TYPE NextODataSequenceNumber;
  699. SEQ_TYPE FirstNakSequenceNumber;
  700. SEQ_TYPE FurthestKnownGroupSequenceNumber;
  701. // Line # 4
  702. SEQ_TYPE FurthestKnownSequenceNumber;
  703. SEQ_TYPE FinDataSequenceNumber;
  704. SEQ_TYPE LastSpmSequenceNumber;
  705. ULONG MaxNakWaitTimeoutMSecs;
  706. // Line # 5
  707. ULONGLONG OutstandingNakTimeout;
  708. ULONGLONG MaxOutstandingNakTimeout;
  709. // Line # 6
  710. ULONGLONG InitialOutstandingNakTimeout;
  711. ULONGLONG LastNakSendTime;
  712. ULONGLONG LastDataConsumedTime;
  713. // Line # 6
  714. LIST_ENTRY BufferedDataList;
  715. LIST_ENTRY NaksForwardDataList;
  716. // Line # 7
  717. LIST_ENTRY PendingNaksList;
  718. LIST_ENTRY ReceiveIrpsList;
  719. // Line # 8
  720. LIST_ENTRY *pReceiveData;
  721. SEQ_TYPE ReceiveDataMask;
  722. USHORT ReceiveDataMaxEntries;
  723. USHORT ReceiveDataIndexShift;
  724. // Line # 8
  725. PIRP pIrpReceive;
  726. ULONG TotalBytesInMdl;
  727. ULONG BytesInMdl;
  728. ULONG RcvBufferLength;
  729. // Line # 9
  730. ULONG CurrentMessageLength;
  731. ULONG CurrentMessageProcessed;
  732. ULONG TotalDataPacketsBuffered;
  733. ULONG DataPacketsPendingIndicate;
  734. // Line # 10
  735. ULONG DataPacketsPendingNaks;
  736. ULONG NumPacketGroupsPendingClient;
  737. ULONG MaxBufferLength;
  738. ULONG DataBufferLookasideLength;
  739. // Line # 11
  740. ULONG NumDataBuffersFromLookaside;
  741. USHORT MaxPacketsBufferedInLookaside;
  742. NPAGED_LOOKASIDE_LIST DataBufferLookaside;
  743. NPAGED_LOOKASIDE_LIST NonParityContextLookaside;
  744. NPAGED_LOOKASIDE_LIST ParityContextLookaside;
  745. ULONG AverageSpmInterval;
  746. ULONG MaxSpmInterval;
  747. ULONG NumSpmIntervalSamples;
  748. ULONGLONG StatSumOfSpmIntervals;
  749. ULONGLONG LastSpmTickCount;
  750. ULONGLONG LastSessionTickCount;
  751. ULONGLONG StartTickCount;
  752. ULONGLONG MinSequencesInWindow;
  753. ULONGLONG MaxSequencesInWindow;
  754. ULONGLONG DataPacketsIndicated;
  755. ULONGLONG AverageSequencesInWindow;
  756. ULONGLONG StatSumOfWindowSeqs;
  757. ULONGLONG NumWindowSamples;
  758. ULONGLONG AverageNcfRDataResponseTC;
  759. ULONGLONG StatSumOfNcfRDataTicks;
  760. ULONGLONG NumNcfRDataTicksSamples;
  761. ULONGLONG MaxRDataResponseTCFromWindow;
  762. ULONGLONG WindowSizeLastInMSecs;
  763. ULONGLONG NumODataPacketsReceived;
  764. ULONGLONG NumRDataPacketsReceived;
  765. ULONGLONG NumDataPacketsDropped;
  766. ULONGLONG NumDupPacketsBuffered;
  767. ULONGLONG NumDupPacketsOlderThanWindow;
  768. ULONGLONG NumPendingNaks;
  769. ULONGLONG NumOutstandingNaks;
  770. ULONGLONG TotalSelectiveNaksSent;
  771. ULONGLONG TotalParityNaksSent;
  772. } tRECEIVE_CONTEXT;
  773. //
  774. // OData context
  775. //
  776. typedef struct _tCLIENT_SEND_REQUEST
  777. {
  778. // Line # 1
  779. LIST_ENTRY Linkage;
  780. // Record-keeping information -- set when send request comes from client
  781. ULONG SendNumber;
  782. PIRP pIrp;
  783. PIRP pIrpToComplete;
  784. tSEND_SESSION *pSend;
  785. ULONGLONG SendStartTime;
  786. ULONG NextDataOffsetInMdl;
  787. ULONG DataOptions;
  788. ULONG DataOptionsLength;
  789. // Message-specific information -- set initially for tracking Message boundaries
  790. ULONG ThisMessageLength;
  791. ULONG LastMessageOffset;
  792. ULONG NumPacketsRemaining;
  793. struct _tCLIENT_SEND_REQUEST *pMessage2Request;
  794. // Static Send information -- set when the send is packetized (may be set more than once)
  795. SEQ_TYPE StartSequenceNumber;
  796. SEQ_TYPE EndSequenceNumber;
  797. SEQ_TYPE MessageFirstSequenceNumber;
  798. ULONG BytesInSend;
  799. ULONG BytesLeftToPacketize;
  800. ULONG DataPacketsPacketized;
  801. ULONG DataBytesInLastPacket;
  802. ULONG DataPayloadSize;
  803. // Dynamic-specific information -- updated on every OData send and completion
  804. ULONGLONG NextPacketOffset;
  805. ULONG NumDataPacketsSent;
  806. ULONG NumDataPacketsSentSuccessfully;
  807. ULONG NumSendsPending;
  808. ULONG NumParityPacketsToSend;
  809. // FEC-specific
  810. PVOID pLastMessageVariableTGPacket;
  811. BOOLEAN bLastSend;
  812. } tCLIENT_SEND_REQUEST, *PCLIENT_SEND_REQUEST;
  813. //
  814. // **************************************
  815. //
  816. // Sender's Data contexts
  817. //
  818. typedef struct _tSEND_RDATA_CONTEXT
  819. {
  820. // Line # 1
  821. LIST_ENTRY Linkage;
  822. SEQ_TYPE RDataSequenceNumber;
  823. // Line # 2
  824. ULONGLONG EarliestRDataSendTime;
  825. ULONGLONG PostRDataHoldTime;
  826. // Line # 3
  827. ULONGLONG CleanupTime;
  828. tSEND_SESSION *pSend;
  829. USHORT NumPacketsInTransport;
  830. USHORT NumParityNaks;
  831. // Line # 4
  832. union
  833. {
  834. UCHAR SelectiveNaksMask[16]; // 16 * 8 = 128 ==> Max packets in group!
  835. ULONGLONG SelectiveNaks[2];
  836. };
  837. // Line # 5
  838. LIST_ENTRY FastFindLinkage;
  839. tBUILD_PARITY_CONTEXT OnDemandParityContext; // Must be last field in struct
  840. } tSEND_RDATA_CONTEXT, *PSEND_RDATA_CONTEXT;
  841. typedef struct
  842. {
  843. ULONG MessageFirstSequence;
  844. ULONG MessageOffset;
  845. ULONG MessageLength;
  846. } tFRAGMENT_OPTIONS;
  847. typedef struct
  848. {
  849. USHORT EncodedTSDULength;
  850. UCHAR FragmentOptSpecific;
  851. UCHAR Pad;
  852. tFRAGMENT_OPTIONS EncodedFragmentOptions;
  853. } tPOST_PACKET_FEC_CONTEXT;
  854. typedef struct
  855. {
  856. UCHAR FECGroupInfo;
  857. UCHAR NumPacketsInThisGroup;
  858. UCHAR FragmentOptSpecific;
  859. union
  860. {
  861. UCHAR ReceiverFECOptions;
  862. UCHAR SenderNextFECPacketIndex;
  863. };
  864. } tFEC_OPTIONS;
  865. typedef struct
  866. {
  867. USHORT TotalPacketLength;
  868. USHORT OptionsLength;
  869. ULONG OptionsFlags;
  870. USHORT LateJoinerOptionOffset;
  871. USHORT FragmentOptionOffset;
  872. ULONG LateJoinerSequence;
  873. ULONG MessageFirstSequence;
  874. ULONG MessageOffset;
  875. ULONG MessageLength;
  876. tFEC_OPTIONS FECContext;
  877. } tPACKET_OPTIONS;
  878. //
  879. // Receiver's NAK + Out-of-order context
  880. //
  881. enum eNAK_TIMEOUT
  882. {
  883. NAK_PENDING_0,
  884. NAK_PENDING_RB,
  885. NAK_PENDING_RPT_RB,
  886. NAK_OUTSTANDING
  887. };
  888. //
  889. // Set flags for the different Nak types
  890. //
  891. #define NAK_TYPE_SELECTIVE 0x01
  892. #define NAK_TYPE_PARITY 0x02
  893. #define MAX_SEQUENCES_PER_NAK_OPTION 62
  894. typedef struct _tNAKS_CONTEXT
  895. {
  896. LIST_ENTRY Linkage;
  897. SEQ_TYPE Sequences[MAX_SEQUENCES_PER_NAK_OPTION+1];
  898. USHORT NumSequences;
  899. USHORT NakType;
  900. } tNAKS_CONTEXT, *PNAKS_CONTEXT;
  901. typedef struct _tNAKS_LIST
  902. {
  903. SEQ_TYPE pNakSequences[MAX_SEQUENCES_PER_NAK_OPTION+1];
  904. USHORT NumSequences;
  905. USHORT NakType;
  906. union
  907. {
  908. USHORT NumParityNaks[MAX_SEQUENCES_PER_NAK_OPTION+1];
  909. USHORT NakIndex[MAX_SEQUENCES_PER_NAK_OPTION+1];
  910. };
  911. } tNAKS_LIST, *PNAKS_LIST;
  912. #define PENDING_DATA_LOOKASIDE_ALLOCATION_FLAG 0x00000001
  913. typedef struct _PENDING_DATA
  914. {
  915. PUCHAR pDataPacket;
  916. PUCHAR DecodeBuffer;
  917. USHORT PacketLength;
  918. USHORT DataOffset;
  919. UCHAR PacketIndex;
  920. UCHAR ActualIndexOfDataPacket;
  921. UCHAR NcfsReceivedForActualIndex;
  922. UCHAR FragmentOptSpecific;
  923. ULONG MessageFirstSequence;
  924. ULONG MessageOffset;
  925. ULONG MessageLength;
  926. ULONG PendingDataFlags;
  927. } tPENDING_DATA;
  928. typedef struct _tNAK_FORWARD_DATA
  929. {
  930. // Line # 1
  931. LIST_ENTRY Linkage;
  932. SEQ_TYPE SequenceNumber;
  933. // Line # 2
  934. ULONGLONG PendingNakTimeout;
  935. ULONGLONG OutstandingNakTimeout;
  936. // Line # 3
  937. ULONGLONG FirstNcfTickCount;
  938. ULONG AllOptionsFlags;
  939. USHORT ParityDataSize;
  940. USHORT MinPacketLength;
  941. // Line # 4
  942. UCHAR WaitingNcfRetries;
  943. UCHAR PacketsInGroup;
  944. UCHAR NumDataPackets;
  945. UCHAR NumParityPackets;
  946. UCHAR WaitingRDataRetries;
  947. UCHAR ThisGroupSize;
  948. UCHAR OriginalGroupSize;
  949. UCHAR NextIndexToIndicate;
  950. LIST_ENTRY LookupLinkage;
  951. LIST_ENTRY SendNakLinkage;
  952. // Line # 4
  953. tPENDING_DATA pPendingData[1];
  954. } tNAK_FORWARD_DATA, *PNAK_FORWARD_DATA;
  955. //
  956. // **************************************
  957. //
  958. // Worker Queue context
  959. //
  960. typedef struct
  961. {
  962. WORK_QUEUE_ITEM Item; // Used by OS to queue these requests
  963. LIST_ENTRY PgmConfigLinkage;
  964. PVOID WorkerRoutine;
  965. PVOID Context1;
  966. PVOID Context2;
  967. PVOID Context3;
  968. } PGM_WORKER_CONTEXT;
  969. // **********************************************************************
  970. // * Timer Definitions *
  971. // **********************************************************************
  972. #define BASIC_TIMER_GRANULARITY_IN_MSECS 20 // 20 millisecs
  973. // Statistics timer
  974. #define INTERNAL_RATE_CALCULATION_FREQUENCY 4096 // ~4 secs
  975. #define LOG2_INTERNAL_RATE_CALCULATION_FREQUENCY 12
  976. // **********************************************************************
  977. // * Sender defaults *
  978. // **********************************************************************
  979. #define NUM_LEAKY_BUCKETS 2
  980. #define SENDER_MAX_WINDOW_SIZE_PACKETS (((SEQ_TYPE)-1) / 2)
  981. #define MIN_RECOMMENDED_WINDOW_MSECS 10*1000 // 10 seconds
  982. #define MID_RECOMMENDED_WINDOW_MSECS 30*1000 // 5 minutes
  983. #define MAX_RECOMMENDED_WINDOW_MSECS 5*60*1000 // 5 minutes
  984. // SPM timer
  985. #define AMBIENT_SPM_TIMEOUT_IN_MSECS 500 // 0.5 Sec
  986. #define INITIAL_HEARTBEAT_SPM_TIMEOUT_IN_MSECS 1000 // 1 Sec
  987. #define MAX_HEARTBEAT_SPM_TIMEOUT_IN_MSECS 15*1000 // 15 Secs
  988. #define MAX_DATA_PACKETS_BEFORE_SPM 50 // Not more than 50 data pkts before SPM
  989. // RData timer
  990. #define RDATA_LINGER_TIME_MSECS 60 // Time before and after sending RData
  991. #define MIN_PREFERRED_REPAIR_PERCENTAGE 7
  992. // **********************************************************************
  993. // * Receiver Settings *
  994. // **********************************************************************
  995. #define MAX_PACKETS_BUFFERED 3*1000 // Limit on # of buffered packets/session
  996. #define MAX_SEQUENCES_IN_RCV_WINDOW 5*1000 // Limit on # of Nak Contexts/session
  997. #define MAX_SPM_INTERVAL_MSECS 5*60*1000 // 5 minutes
  998. #define MAX_DATA_CONSUMPTION_TIME_MSECS 5*60*1000 // 5 minutes
  999. // Nak timer
  1000. #define OUT_OF_ORDER_PACKETS_BEFORE_NAK 2 // Before starting Nak
  1001. #define NAK_WAITING_NCF_MAX_RETRIES 10
  1002. #define NAK_MIN_INITIAL_BACKOFF_TIMEOUT_MS_OPT 2 // 0.002 Secs
  1003. #define NAK_MAX_INITIAL_BACKOFF_TIMEOUT_MS_OPT 20 // 0.02 Secs
  1004. #define NAK_MIN_INITIAL_BACKOFF_TIMEOUT_MSECS 50 // 0.2 Secs
  1005. #define NAK_MAX_INITIAL_BACKOFF_TIMEOUT_MSECS 100 // 0.5 Secs
  1006. #define NAK_RANDOM_BACKOFF_MSECS \
  1007. GetRandomInteger (NAK_MIN_INITIAL_BACKOFF_TIMEOUT_MSECS,NAK_MAX_INITIAL_BACKOFF_TIMEOUT_MSECS)
  1008. #define NAK_RANDOM_BACKOFF_MSECS_OPT \
  1009. GetRandomInteger (NAK_MIN_INITIAL_BACKOFF_TIMEOUT_MS_OPT,NAK_MAX_INITIAL_BACKOFF_TIMEOUT_MS_OPT)
  1010. #define NAK_REPEAT_INTERVAL_MSECS_OPT 50 // 0.05 Secs -- Timeout before retrying
  1011. #define NAK_REPEAT_INTERVAL_MSECS 750 // 0.75 Secs -- Timeout before retrying
  1012. // Ncf timer
  1013. #define INITIAL_NAK_OUTSTANDING_TIMEOUT_MS_OPT 100 // 0.1 Secs -- Waiting for RData after NCF
  1014. #define INITIAL_NAK_OUTSTANDING_TIMEOUT_MSECS 2000 // 2 Secs -- Waiting for RData after NCF
  1015. #define NCF_WAITING_RDATA_MAX_RETRIES 10 // Max NCFs before fatal error
  1016. // **********************************************************************
  1017. // * Packet Definitions *
  1018. // **********************************************************************
  1019. #include <packon.h>
  1020. //
  1021. // IP v4 Header
  1022. //
  1023. typedef struct IPV4Header {
  1024. UCHAR HeaderLength : 4; // Version
  1025. UCHAR Version : 4; // Length
  1026. UCHAR TypeOfService; // Type of service.
  1027. USHORT TotalLength; // Total length of datagram.
  1028. USHORT Identification; // Identification.
  1029. USHORT FlagsAndFragmentOffset; // Flags and fragment offset.
  1030. UCHAR TimeToLive; // Time to live.
  1031. UCHAR Protocol; // Protocol.
  1032. USHORT Checksum; // Header checksum.
  1033. ULONG SourceIp; // Source address.
  1034. ULONG DestinationIp; // Destination address.
  1035. } IPV4Header;
  1036. //
  1037. // Common PGM Header:
  1038. //
  1039. typedef struct
  1040. {
  1041. USHORT SrcPort;
  1042. USHORT DestPort;
  1043. UCHAR Type;
  1044. UCHAR Options;
  1045. USHORT Checksum;
  1046. UCHAR gSourceId[SOURCE_ID_LENGTH];
  1047. USHORT TSDULength;
  1048. } tCOMMON_HEADER;
  1049. #define IPV4_NLA_AFI 1
  1050. typedef struct
  1051. {
  1052. USHORT NLA_AFI;
  1053. USHORT Reserved;
  1054. tIPADDRESS IpAddress;
  1055. } tNLA;
  1056. //
  1057. // SPMs (Session-specific -- Sender only -- periodic) ==> Range: [0, 3]
  1058. //
  1059. #define PACKET_TYPE_SPM 0x00
  1060. #define PACKET_TYPE_POLL 0x01
  1061. #define PACKET_TYPE_POLR 0x02
  1062. typedef struct
  1063. {
  1064. tCOMMON_HEADER CommonHeader;
  1065. ULONG SpmSequenceNumber; // SPM_SQN
  1066. ULONG TrailingEdgeSeqNumber; // SPM_TRAIL == TXW_TRAIL
  1067. ULONG LeadingEdgeSeqNumber; // SPM_LEAD == TXW_LEAD
  1068. tNLA PathNLA;
  1069. } tBASIC_SPM_PACKET_HEADER;
  1070. //
  1071. // Data packets (data and repairs) ==> Range: [4, 7]
  1072. //
  1073. #define PACKET_TYPE_ODATA 0x04
  1074. #define PACKET_TYPE_RDATA 0x05
  1075. typedef struct
  1076. {
  1077. tCOMMON_HEADER CommonHeader;
  1078. ULONG DataSequenceNumber;
  1079. ULONG TrailingEdgeSequenceNumber;
  1080. } tBASIC_DATA_PACKET_HEADER;
  1081. //
  1082. // NAK/NCF Packets (hop-by-hop reliable NAK forwarding) ==> Range: [8, B]
  1083. //
  1084. #define PACKET_TYPE_NAK 0x08
  1085. #define PACKET_TYPE_NNAK 0x09
  1086. #define PACKET_TYPE_NCF 0x0A
  1087. typedef struct
  1088. {
  1089. tCOMMON_HEADER CommonHeader;
  1090. ULONG RequestedSequenceNumber;
  1091. tNLA SourceNLA;
  1092. tNLA MCastGroupNLA;
  1093. } tBASIC_NAK_NCF_PACKET_HEADER;
  1094. typedef struct
  1095. {
  1096. ULONG RefCount;
  1097. ULONG SuccessfulSends;
  1098. tBASIC_NAK_NCF_PACKET_HEADER NakPacket;
  1099. } tNAK_CONTEXT;
  1100. //
  1101. // SPM Request Pkts (session-specific, receiver only) ==> Range: [C, F]
  1102. //
  1103. #define PACKET_TYPE_SPMR 0x0C
  1104. //
  1105. // Options flag values
  1106. //
  1107. #define PACKET_HEADER_OPTIONS_PRESENT 0x01 // bit 7
  1108. #define PACKET_HEADER_OPTIONS_NETWORK_SIGNIFICANT 0x02 // bit 6
  1109. #define PACKET_HEADER_OPTIONS_VAR_PKTLEN 0x40 // bit 1
  1110. #define PACKET_HEADER_OPTIONS_PARITY 0x80 // bit 0
  1111. // **********************************************************************
  1112. // * Packet Options *
  1113. // **********************************************************************
  1114. //
  1115. // We can have a maximum of 16 options per packet
  1116. //
  1117. //
  1118. // Generic Packet Option Format
  1119. //
  1120. typedef struct
  1121. {
  1122. UCHAR E_OptionType;
  1123. UCHAR OptionLength;
  1124. UCHAR Reserved_F_Opx;
  1125. UCHAR U_OptSpecific;
  1126. } tPACKET_OPTION_GENERIC;
  1127. #define PACKET_OPTION_TYPE_END_BIT 0x80
  1128. #define PACKET_OPTION_RES_F_OPX_IGNORE 0x00
  1129. #define PACKET_OPTION_RES_F_OPX_INVALIDATE 0x01
  1130. #define PACKET_OPTION_RES_F_OPX_DISCARD 0x02
  1131. #define PACKET_OPTION_RES_F_OPX_UNSUPPORTED 0x03
  1132. #define PACKET_OPTION_RES_F_OPX_ENCODED_BIT 0x04
  1133. #define PACKET_OPTION_SPECIFIC_ENCODED_NULL_BIT 0x80
  1134. #define PACKET_OPTION_SPECIFIC_FEC_OND_BIT 0x01
  1135. #define PACKET_OPTION_SPECIFIC_FEC_PRO_BIT 0x02
  1136. #define PACKET_OPTION_SPECIFIC_RST_N_BIT 0x80
  1137. //
  1138. // Packet Option format for Length option
  1139. //
  1140. typedef struct
  1141. {
  1142. UCHAR Type;
  1143. UCHAR Length;
  1144. USHORT TotalOptionsLength;
  1145. } tPACKET_OPTION_LENGTH;
  1146. #define PACKET_OPTION_LENGTH 0x00 // All packets
  1147. #define PACKET_OPTION_FRAGMENT 0x01 // ODATA, RDATA only
  1148. #define PACKET_OPTION_NAK_LIST 0x02 // NAKs, NCFs
  1149. #define PACKET_OPTION_JOIN 0x03 // ODATA, RDATA, SPM
  1150. #define PACKET_OPTION_REDIRECT 0x07 // POLR
  1151. #define PACKET_OPTION_SYN 0x0D // ODATA, RDATA
  1152. #define PACKET_OPTION_FIN 0x0E // SPMs, ODATA, RDATA
  1153. #define PACKET_OPTION_RST 0x0F // SPMs only
  1154. #define PACKET_OPTION_PARITY_PRM 0x08 // SPMs only
  1155. #define PACKET_OPTION_PARITY_GRP 0x09 // Parity packets only (parity ODATA, RDATA)
  1156. #define PACKET_OPTION_CURR_TGSIZE 0x0A // ODATA, RDATA, SPMs
  1157. #define PACKET_OPTION_CR 0x10 // NAKs only
  1158. #define PACKET_OPTION_CRQST 0x11 // SPMs only
  1159. #define PACKET_OPTION_NAK_BO_IVL 0x04 // NCFs, SPMs, or POLLs
  1160. #define PACKET_OPTION_NAK_BO_RNG 0x05 // SPMs
  1161. #define PACKET_OPTION_NBR_UNREACH 0x0B // SPMs and NCFs
  1162. #define PACKET_OPTION_PATH_NLA 0x0C // NCFs
  1163. #define PACKET_OPTION_INVALID 0x7F
  1164. //
  1165. // Internal flags used for processing options
  1166. //
  1167. #define PGM_OPTION_FLAG_FRAGMENT 0x00000001
  1168. #define PGM_OPTION_FLAG_NAK_LIST 0x00000004 // Network Significant
  1169. #define PGM_OPTION_FLAG_JOIN 0x00000008
  1170. #define PGM_OPTION_FLAG_REDIRECT 0x00000010 // Network Significant
  1171. #define PGM_OPTION_FLAG_SYN 0x00000020
  1172. #define PGM_OPTION_FLAG_FIN 0x00000040
  1173. #define PGM_OPTION_FLAG_RST 0x00000080
  1174. #define PGM_OPTION_FLAG_RST_N 0x00000100
  1175. // FEC-related options
  1176. #define PGM_OPTION_FLAG_PARITY_PRM 0x00000200 // Network Significant
  1177. #define PGM_OPTION_FLAG_PARITY_GRP 0x00000400
  1178. #define PGM_OPTION_FLAG_PARITY_CUR_TGSIZE 0x00000800 // Network Significant (except on ODATA)
  1179. #define PGM_OPTION_FLAG_CR 0x00001000 // Network Significant
  1180. #define PGM_OPTION_FLAG_CRQST 0x00002000 // Network Significant
  1181. #define PGM_OPTION_FLAG_NAK_BO_IVL 0x00004000
  1182. #define PGM_OPTION_FLAG_NAK_BO_RNG 0x00008000
  1183. #define PGM_OPTION_FLAG_NBR_UNREACH 0x00010000 // Network Significant
  1184. #define PGM_OPTION_FLAG_PATH_NLA 0x00020000 // Network Significant
  1185. #define PGM_OPTION_FLAG_INVALID 0x00040000
  1186. #define PGM_OPTION_FLAG_UNRECOGNIZED 0x80000000
  1187. #define PGM_VALID_DATA_OPTION_FLAGS (PGM_OPTION_FLAG_FRAGMENT | \
  1188. PGM_OPTION_FLAG_JOIN | \
  1189. PGM_OPTION_FLAG_SYN | \
  1190. PGM_OPTION_FLAG_FIN | \
  1191. PGM_OPTION_FLAG_PARITY_GRP | \
  1192. PGM_OPTION_FLAG_PARITY_CUR_TGSIZE)
  1193. #define PGM_VALID_SPM_OPTION_FLAGS (PGM_OPTION_FLAG_JOIN | \
  1194. PGM_OPTION_FLAG_FIN | \
  1195. PGM_OPTION_FLAG_RST | \
  1196. PGM_OPTION_FLAG_RST_N | \
  1197. PGM_OPTION_FLAG_PARITY_PRM | \
  1198. PGM_OPTION_FLAG_PARITY_CUR_TGSIZE |\
  1199. PGM_OPTION_FLAG_CRQST | \
  1200. PGM_OPTION_FLAG_NAK_BO_IVL | \
  1201. PGM_OPTION_FLAG_NAK_BO_RNG | \
  1202. PGM_OPTION_FLAG_NBR_UNREACH)
  1203. #define PGM_VALID_NAK_OPTION_FLAGS (PGM_OPTION_FLAG_NAK_LIST | \
  1204. PGM_OPTION_FLAG_CR)
  1205. #define PGM_VALID_NCF_OPTION_FLAGS (PGM_OPTION_FLAG_NAK_LIST | \
  1206. PGM_OPTION_FLAG_NAK_BO_IVL | \
  1207. PGM_OPTION_FLAG_NBR_UNREACH | \
  1208. PGM_OPTION_FLAG_PATH_NLA)
  1209. #define PGM_VALID_POLR_OPTION_FLAGS (PGM_OPTION_FLAG_REDIRECT)
  1210. #define PGM_VALID_POLL_OPTION_FLAGS (PGM_OPTION_FLAG_NAK_BO_IVL)
  1211. #define NETWORK_SIG_ALL_OPTION_FLAGS (PGM_OPTION_FLAG_NAK_LIST | \
  1212. PGM_OPTION_FLAG_REDIRECT | \
  1213. PGM_OPTION_FLAG_PARITY_PRM | \
  1214. PGM_OPTION_FLAG_PARITY_CUR_TGSIZE |\
  1215. PGM_OPTION_FLAG_CR | \
  1216. PGM_OPTION_FLAG_CRQST | \
  1217. PGM_OPTION_FLAG_NBR_UNREACH | \
  1218. PGM_OPTION_FLAG_PATH_NLA)
  1219. //
  1220. // NETWORK_SIG_ODATA_OPTIONS_FLAGS == 0
  1221. //
  1222. #define NETWORK_SIG_ODATA_OPTIONS_FLAGS (PGM_VALID_DATA_OPTION_FLAGS & \
  1223. NETWORK_SIG_ALL_OPTION_FLAGS & \
  1224. ~PGM_OPTION_FLAG_PARITY_CUR_TGSIZE)
  1225. //
  1226. // NETWORK_SIG_RDATA_OPTIONS_FLAGS == CUR_TGSIZE
  1227. //
  1228. #define NETWORK_SIG_RDATA_OPTIONS_FLAGS (PGM_VALID_DATA_OPTION_FLAGS & \
  1229. NETWORK_SIG_ALL_OPTION_FLAGS)
  1230. //
  1231. // NETWORK_SIG_SPM_OPTIONS_FLAGS == PARITY_PRM | CUR_TGSIZE | CRQST | NBR_UNREACH
  1232. //
  1233. #define NETWORK_SIG_SPM_OPTIONS_FLAGS (PGM_VALID_SPM_OPTION_FLAGS & \
  1234. NETWORK_SIG_ALL_OPTION_FLAGS)
  1235. //
  1236. // NETWORK_SIG_NAK_OPTIONS_FLAGS == NAK_LIST | CR
  1237. //
  1238. #define NETWORK_SIG_NAK_OPTIONS_FLAGS (PGM_VALID_NAK_OPTION_FLAGS & \
  1239. NETWORK_SIG_ALL_OPTION_FLAGS)
  1240. //
  1241. // NETWORK_SIG_NCF_OPTIONS_FLAGS == NAK_LIST | NBR_UNREACH | PATH_NLA
  1242. //
  1243. #define NETWORK_SIG_NCF_OPTIONS_FLAGS (PGM_VALID_NCF_OPTION_FLAGS & \
  1244. NETWORK_SIG_ALL_OPTION_FLAGS)
  1245. //
  1246. // NETWORK_SIG_POLR_OPTIONS_FLAGS == REDIRECT
  1247. //
  1248. #define NETWORK_SIG_POLR_OPTIONS_FLAGS (PGM_VALID_POLR_OPTION_FLAGS & \
  1249. NETWORK_SIG_ALL_OPTION_FLAGS)
  1250. //
  1251. // NETWORK_SIG_POLL_OPTIONS_FLAGS == 0
  1252. //
  1253. #define NETWORK_SIG_POLL_OPTIONS_FLAGS (PGM_VALID_POLL_OPTION_FLAGS & \
  1254. NETWORK_SIG_ALL_OPTION_FLAGS)
  1255. // Based on the above, the maximum lengths (with the addition of the Packet extension option) are:
  1256. #define PGM_PACKET_EXTENSION_LENGTH 4
  1257. #define PGM_PACKET_OPT_FRAGMENT_LENGTH 16
  1258. #define PGM_PACKET_OPT_MIN_NAK_LIST_LENGTH (4 + 4)
  1259. #define PGM_PACKET_OPT_MAX_NAK_LIST_LENGTH (4 + 4*MAX_SEQUENCES_PER_NAK_OPTION)
  1260. #define PGM_PACKET_OPT_JOIN_LENGTH 8
  1261. #define PGM_PACKET_OPT_SYN_LENGTH 4
  1262. #define PGM_PACKET_OPT_FIN_LENGTH 4
  1263. #define PGM_PACKET_OPT_RST_LENGTH 4
  1264. #define PGM_PACKET_OPT_PARITY_PRM_LENGTH 8
  1265. #define PGM_PACKET_OPT_PARITY_GRP_LENGTH 8
  1266. #define PGM_PACKET_OPT_PARITY_CUR_TGSIZE_LENGTH 8
  1267. //
  1268. // The following settings are for the currently used options only.
  1269. // It will need to be modified if new options are used
  1270. //
  1271. #define PGM_MAX_DATA_HEADER_LENGTH (sizeof(tBASIC_DATA_PACKET_HEADER) + \
  1272. PGM_PACKET_EXTENSION_LENGTH + \
  1273. PGM_PACKET_OPT_FRAGMENT_LENGTH + \
  1274. PGM_PACKET_OPT_JOIN_LENGTH + \
  1275. PGM_PACKET_OPT_SYN_LENGTH) /* or FIN or RST */
  1276. #define PGM_MAX_FEC_DATA_HEADER_LENGTH (sizeof(tBASIC_DATA_PACKET_HEADER) + \
  1277. PGM_PACKET_EXTENSION_LENGTH + \
  1278. PGM_PACKET_OPT_FRAGMENT_LENGTH + \
  1279. PGM_PACKET_OPT_PARITY_GRP_LENGTH + \
  1280. PGM_PACKET_OPT_PARITY_CUR_TGSIZE_LENGTH + \
  1281. PGM_PACKET_OPT_SYN_LENGTH + \
  1282. PGM_PACKET_OPT_FIN_LENGTH) /* or RST */
  1283. #define PGM_MAX_SPM_HEADER_LENGTH (sizeof(tBASIC_SPM_PACKET_HEADER) + \
  1284. PGM_PACKET_EXTENSION_LENGTH + \
  1285. PGM_PACKET_OPT_JOIN_LENGTH + \
  1286. PGM_PACKET_OPT_PARITY_PRM_LENGTH + \
  1287. PGM_PACKET_OPT_PARITY_CUR_TGSIZE_LENGTH + \
  1288. PGM_PACKET_OPT_FIN_LENGTH) /* or RST */
  1289. #define PGM_MAX_NAK_NCF_HEADER_LENGTH (sizeof(tBASIC_NAK_NCF_PACKET_HEADER) + \
  1290. PGM_PACKET_EXTENSION_LENGTH + \
  1291. PGM_PACKET_OPT_MAX_NAK_LIST_LENGTH)
  1292. #include <packoff.h>
  1293. //
  1294. // Include the definition for the Data file formatting unit
  1295. //
  1296. typedef struct
  1297. {
  1298. tPACKET_OPTIONS PacketOptions;
  1299. tBASIC_DATA_PACKET_HEADER DataPacket;
  1300. } tPACKET_BUFFER;
  1301. #endif // _TYPES_H