/*++ Copyright (c) 2000-2000 Microsoft Corporation Module Name: Types.h Abstract: This file contains the typedefs and constants for PGM. Author: Mohammad Shabbir Alam (MAlam) 3-30-2000 Revision History: --*/ #ifndef _TYPES_H #define _TYPES_H #if(WINVER > 0x0500) #if DBG // #define FILE_LOGGING 1 #else #define FILE_LOGGING 1 #endif // DBG #endif // WINVER // #define FEC_DBG 1 #ifdef DROP_DBG extern ULONG DropCount; #endif // DROP_DBG //---------------------------------------------------------------------------- #define MAX_BUFF_DBG 1 // To debug Watermarks! // #define IP_FIX 1 //---------------------------------------------------------------------------- #define ROUTER_ALERT_SIZE 4 // from Ipdef.h #define TL_INSTANCE 0 //---------------------------------------------------------------------------- // // To be set sometime: // #define MAX_RECEIVE_SIZE 0xffff //---------------------------------------------------------------------------- extern HANDLE TdiClientHandle; //---------------------------------------------------------------------------- #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037)) || ((defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_FULL_VER > 13009175)) #define htons(x) _byteswap_ushort((USHORT)(x)) #define htonl(x) _byteswap_ulong((ULONG)(x)) #else #define htons(x) ((((x) >> 8) & 0x00FF) | (((x) << 8) & 0xFF00)) __inline long htonl(long x) { return((((x) >> 24) & 0x000000FFL) | (((x) >> 8) & 0x0000FF00L) | (((x) << 8) & 0x00FF0000L) | (((x) << 24) & 0xFF000000L)); } #endif #define ntohs(x) htons(x) #define ntohl(x) htonl(x) // // Sequence NumberType // typedef ULONG SEQ_TYPE; typedef LONG SIGNED_SEQ_TYPE; #define SOURCE_ID_LENGTH 6 #ifndef FILE_LOGGING #if DBG extern enum eLOGGING_LEVEL PgmLoggingLevel; #endif // DBG #endif // !FILE_LOGGING #ifdef OLD_LOGGING extern ULONG PgmDebuggerPath; extern enum eSEVERITY_LEVEL PgmDebuggerSeverity; extern ULONG PgmLogFilePath; extern enum eSEVERITY_LEVEL PgmLogFileSeverity; #endif // OLD_LOGGING // // Lock structure and locking order info // #define DCONFIG_LOCK 0x0001 #define DEVICE_LOCK 0x0002 #define ADDRESS_LOCK 0x0004 #define CONTROL_LOCK 0x0008 #define SESSION_LOCK 0x0010 // // FEC Global Info // #define GF_BITS 8 // code over GF(2**GF_BITS) - change to suit #define GF_SIZE ((1 << GF_BITS) - 1) /* powers of \alpha */ #define FEC_MAX_GROUP_BITS GF_BITS #define FEC_MAX_GROUP_SIZE (1 << (FEC_MAX_GROUP_BITS-1)) #define FEC_MAX_BLOCK_SIZE ((1 << FEC_MAX_GROUP_BITS)-1) extern UCHAR gFECLog2 []; // // Enumerate all the different stages of cleanup of the driver // enum eCLEANUP_STAGE { E_CLEANUP_STATIC_CONFIG = 1, E_CLEANUP_DYNAMIC_CONFIG, E_CLEANUP_REGISTRY_PARAMETERS, E_CLEANUP_STRUCTURES, E_CLEANUP_DEVICE, E_CLEANUP_PNP, E_CLEANUP_UNLOAD }; typedef struct { DEFINE_LOCK_STRUCTURE(SpinLock) // to lock access on an MP machine #if DBG ULONG LastLockLine; ULONG LastUnlockLine; ULONG LockNumber; // spin lock number for this struct #endif // DBG } tPGM_LOCK_INFO; typedef struct _tPGM_TIMER { KTIMER t_timer; KDPC t_dpc; } tPGM_TIMER; // // Structure used for TDI_QUERY_ADDRESS request // typedef struct { ULONG ActivityCount; TA_IP_ADDRESS IpAddress; } tTDI_QUERY_ADDRESS_INFO; // ---------------------------------------------------- #define TDI_LOOKASIDE_DEPTH 100 #define SENDER_BUFFER_LOOKASIDE_DEPTH 100 #define SEND_CONTEXT_LOOKASIDE_DEPTH 100 #define NON_PARITY_CONTEXT_LOOKASIDE_DEPTH 200 #define PARITY_CONTEXT_LOOKASIDE_DEPTH 200 #define DEBUG_MESSAGES_LOOKASIDE_DEPTH 20 #define RDATA_REQUESTS_MIN_LOOKASIDE_DEPTH 1000 typedef struct { PEPROCESS FspProcess; PDRIVER_OBJECT DriverObject; UNICODE_STRING RegistryPath; // Ptr to registry Location PFILE_OBJECT FipsFileObject; FIPS_FUNCTION_TABLE FipsFunctionTable; BOOLEAN FipsInitialized; NPAGED_LOOKASIDE_LIST TdiLookasideList; #ifdef OLD_LOGGING NPAGED_LOOKASIDE_LIST DebugMessagesLookasideList; #endif // OLD_LOGGING } tPGM_STATIC_CONFIG; #define PGM_CONFIG_FLAG_UNLOADING 0x00000001 #define PGM_CONFIG_FLAG_RECEIVE_TIMER_RUNNING 0x00000002 typedef struct { // Line # 1 LIST_ENTRY SenderAddressHead; LIST_ENTRY ReceiverAddressHead; // Line # 2 LIST_ENTRY DestroyedAddresses; LIST_ENTRY ClosedAddresses; // Line # 3 LIST_ENTRY ClosedConnections; LIST_ENTRY ConnectionsCreated; // Line # 4 LIST_ENTRY CleanedUpConnections; LIST_ENTRY CurrentReceivers; // Line # 5 LIST_ENTRY LocalInterfacesList; LIST_ENTRY WorkerQList; // Line # 6 LARGE_INTEGER TimeoutGranularity; LARGE_INTEGER LastReceiverTimeout; // Line # 7 ULONGLONG ReceiversTimerTickCount; ULONG GlobalFlags; ULONG NumWorkerThreadsQueued; // Line # 8 UCHAR gSourceId[SOURCE_ID_LENGTH]; USHORT SourcePort; ULONG MaxMTU; ULONG DoNotBreakOnAssert; // Line # 9 tPGM_TIMER SessionTimer; KEVENT LastWorkerItemEvent; tPGM_LOCK_INFO LockInfo; // spin lock info for this struct #if DBG ULONG CurrentLockNumber[MAXIMUM_PROCESSORS]; #endif // DBG } tPGM_DYNAMIC_CONFIG; // // Flags for Registry configurations // #define PGM_REGISTRY_SENDER_FILE_SPECIFIED 0x00000001 typedef struct { ULONG RefCount; ULONG Flags; UNICODE_STRING ucSenderFileLocation; } tPGM_REGISTRY_CONFIG; extern tPGM_STATIC_CONFIG PgmStaticConfig; extern tPGM_DYNAMIC_CONFIG PgmDynamicConfig; extern tPGM_REGISTRY_CONFIG *pPgmRegistryConfig; // // Registry configurable parameter names // #define PARAM_SENDER_FILE_LOCATION L"SenderFileLocation" // // Handle Verifiers // #define PGM_VERIFY_DEVICE 0x43564544 // DEVC #define PGM_VERIFY_CONTROL 0x544E4F43 // CONT #define PGM_VERIFY_ADDRESS 0x52444441 // ADDR #define PGM_VERIFY_ADDRESS_DOWN 0x32444441 // ADD2 #define PGM_VERIFY_SESSION_UNASSOCIATED 0x30534553 // SES0 #define PGM_VERIFY_SESSION_DOWN 0x32534553 // SES2 #define PGM_VERIFY_SESSION_SEND 0x53534553 // SESS #define PGM_VERIFY_SESSION_RECEIVE 0x52534553 // SESR // // Enumerate all the different places the device can be referenced to // keep track of RefCounts // enum eREF_DEVICE { REF_DEV_CREATE, REF_DEV_ADDRESS_NOTIFICATION, REF_DEV_MAX }; #define WC_PGM_CLIENT_NAME L"Pgm" #define WC_PGM_DEVICE_EXPORT_NAME L"\\Device\\Pgm" #define WS_DEFAULT_SENDER_FILE_LOCATION L"\\SystemRoot\\System32" typedef struct { DEVICE_OBJECT *pPgmDeviceObject; ULONG State; ULONG Verify; ULONG RefCount; UNICODE_STRING ucBindName; // name exported by this device // these are handles to the transport control object, so we can do things // like query provider info... HANDLE hControl; PDEVICE_OBJECT pControlDeviceObject; PFILE_OBJECT pControlFileObject; KEVENT DeviceCleanedupEvent; tPGM_LOCK_INFO LockInfo; // spin lock info for this struct // #if DBG ULONG ReferenceContexts[REF_DEV_MAX]; // #endif // DBG UCHAR BindNameBuffer[1]; } tPGM_DEVICE; extern tPGM_DEVICE *pgPgmDevice; extern DEVICE_OBJECT *pPgmDeviceObject; typedef struct { UCHAR Address[6]; }tMAC_ADDRESS; typedef struct { LIST_ENTRY Linkage; tIPADDRESS IpAddress; tIPADDRESS SubnetMask; } tADDRESS_ON_INTERFACE; typedef struct { LIST_ENTRY Linkage; LIST_ENTRY Addresses; ULONG IpInterfaceIndex; ULONG MTU; tIPADDRESS SubnetMask; ULONG Flags; tMAC_ADDRESS MacAddress; } tLOCAL_INTERFACE; // ********************************************************************** // * File System Contexts * // ********************************************************************** // // Control FileSystemContext // // // Enumerate all the different places the device can be referenced to // keep track of RefCounts // enum eREF_CONTROL { REF_CONTROL_CREATE, REF_CONTROL_MAX }; typedef struct _tCONTROL_CONTEXT { // Line # 1 LIST_ENTRY Linkage; // link to next item in list ULONG Verify; // set to a known value to verify block LONG RefCount; tPGM_LOCK_INFO LockInfo; // spin lock info for this struct // #if DBG ULONG ReferenceContexts[REF_CONTROL_MAX]; // #endif // DBG } tCONTROL_CONTEXT; typedef struct _FEC_CONTEXT { LONG k; // Max Transmission Group Size LONG n; // Block size UCHAR *pEncodeMatrix; UCHAR *pDecodeMatrix; ULONG *pInvertMatrixInfo; } tFEC_CONTEXT, *PFEC_CONTEXT; typedef struct _BUILD_PARITY_CONTEXT { UCHAR NextFECPacketIndex; UCHAR NumPacketsInThisGroup; USHORT Pad; ULONG OptionsFlags; PUCHAR pDataBuffers[1]; } tBUILD_PARITY_CONTEXT; // // This is the client-procedure to be called on completing a send // typedef VOID (*pCLIENT_COMPLETION_ROUTINE) (PVOID pSendContext1, PVOID pSendContext2, NTSTATUS status); // // Address FileSystemContext // // // Enumerate all the different places the device can be referenced to // keep track of RefCounts // enum eREF_ADDRESS { REF_ADDRESS_CREATE, REF_ADDRESS_VERIFY_USER, REF_ADDRESS_ASSOCIATED, REF_ADDRESS_CONNECT, REF_ADDRESS_SET_INFO, REF_ADDRESS_SEND_DIRECT, REF_ADDRESS_TDI_RCV_HANDLER, REF_ADDRESS_SEND_IN_PROGRESS, REF_ADDRESS_RECEIVE_ACTIVE, REF_ADDRESS_CLIENT_RECEIVE, REF_ADDRESS_DISCONNECT, REF_ADDRESS_STOP_LISTENING, REF_ADDRESS_MAX }; #define MAX_STREAMS_PER_NONADMIN_RECEIVER 2 #define MAX_RECEIVE_INTERFACES 20 #define PGM_ADDRESS_FLAG_INVALID_OUT_IF 0x00000001 #define PGM_ADDRESS_USE_WINDOW_AS_DATA_CACHE 0x00000002 #define PGM_ADDRESS_LISTEN_ON_ALL_INTERFACES 0x00000004 #define PGM_ADDRESS_WAITING_FOR_NEW_INTERFACE 0x00000008 #define PGM_ADDRESS_HIGH_SPEED_OPTIMIZED 0x00000010 typedef struct _tADDRESS_CONTEXT { // // *** Common *** // // Line # 1 LIST_ENTRY Linkage; // link to next item in list ULONG Verify; // set to a known value to verify block LONG RefCount; // Line # 2 LIST_ENTRY AssociatedConnections; PEPROCESS Process; // Line # 3 PIRP pIrpClose; ULONG Flags; HANDLE FileHandle; PFILE_OBJECT pFileObject; // Line # 4 PDEVICE_OBJECT pDeviceObject; HANDLE RAlertFileHandle; PFILE_OBJECT pRAlertFileObject; PDEVICE_OBJECT pRAlertDeviceObject; // Line # 5 PTDI_IND_CONNECT evConnect; // Client Event to call PVOID ConEvContext; // EVENT Context to pass to client PTDI_IND_RECEIVE evReceive; PVOID RcvEvContext; // Line # 6 PTDI_IND_DISCONNECT evDisconnect; PVOID DiscEvContext; PTDI_IND_ERROR evError; PVOID ErrorEvContext; // Line # 7 PTDI_IND_RECEIVE_DATAGRAM evRcvDgram; PVOID RcvDgramEvContext; PTDI_IND_RECEIVE_EXPEDITED evRcvExpedited; PVOID RcvExpedEvContext; // Line # 8 PTDI_IND_SEND_POSSIBLE evSendPossible; PVOID SendPossEvContext; TOKEN_USER *pUserId; // // *** Sender -specific *** // tMAC_ADDRESS OutIfMacAddress; USHORT SenderMCastPort; // Line # 9 tIPADDRESS SenderMCastOutIf; ULONG OutIfFlags; ULONG OutIfMTU; ULONG LateJoinerPercentage; // Percentage of window that late joiner can request // Line # 10 ULONG MCastPacketTtl; // -- send window settings ULONGLONG MaxWindowSizeBytes; ULONGLONG RateKbitsPerSec; ULONGLONG WindowSizeInBytes; ULONGLONG WindowSizeInMSecs; ULONG WindowAdvancePercentage; // Line # -- FEC settings USHORT FECBlockSize; USHORT FECProActivePackets; UCHAR FECGroupSize; UCHAR FECOptions; // // *** Receiver -specific *** // LIST_ENTRY ListenHead; // List of Clients listening tIPADDRESS ReceiverMCastAddr; // For receiving MCast packets (host format) USHORT ReceiverMCastPort; USHORT NumReceiveInterfaces; ULONG ReceiverInterfaceList[MAX_RECEIVE_INTERFACES+1]; tIPADDRESS LastSpmSource; // // *** Common, including Debug *** // tPGM_LOCK_INFO LockInfo; // spin lock info for this struct // #if DBG ULONG ReferenceContexts[REF_ADDRESS_MAX]; // #endif // DBG } tADDRESS_CONTEXT, *PADDRESS_CONTEXT; typedef struct _tTDI_SEND_CONTEXT { TDI_CONNECTION_INFORMATION TdiConnectionInfo; TA_IP_ADDRESS TransportAddress; pCLIENT_COMPLETION_ROUTINE pClientCompletionRoutine; PVOID ClientCompletionContext1; PVOID ClientCompletionContext2; BOOLEAN fPagedBuffer; } tTDI_SEND_CONTEXT; typedef struct _RCV_COMPLETE_CONTEXT { tADDRESS_CONTEXT *pAddress; ULONG SrcAddressLength; ULONG BytesAvailable; PVOID pSrcAddress; UCHAR BufferData[4]; } tRCV_COMPLETE_CONTEXT; // // Connect FileSystemContext // // // Enumerate all the different places the Connection can be referenced to // keep track of RefCounts // enum eREF_CONNECT { REF_SESSION_CREATE, REF_SESSION_ASSOCIATED, REF_SESSION_TIMER_RUNNING, REF_SESSION_SEND_CONNECT, REF_SESSION_SEND_RDATA, REF_SESSION_SEND_SPM, REF_SESSION_SEND_NAK, REF_SESSION_SEND_NCF, REF_SESSION_SEND_IN_WINDOW, REF_SESSION_TDI_RCV_HANDLER, REF_SESSION_CLIENT_RECEIVE, REF_SESSION_CLEANUP_NAKS, REF_SESSION_DISCONNECT, REF_SESSION_MAX }; #define FLAG_CONNECT_CLIENT_IS_LISTENING 1 #define MAX_DATA_FILE_NAME_LENGTH 50 #define PGM_SESSION_FLAG_STOP_TIMER 0x00000001 #define PGM_SESSION_FLAG_WORKER_RUNNING 0x00000002 #define PGM_SESSION_FLAG_SEND_AMBIENT_SPM 0x00000004 #define PGM_SESSION_FLAG_FIRST_PACKET 0x00000008 #define PGM_SESSION_FLAG_SENDER 0x00000010 #define PGM_SESSION_FLAG_RECEIVER 0x00000020 #define PGM_SESSION_FLAG_NAK_TIMED_OUT 0x00000040 #define PGM_SESSION_TERMINATED_GRACEFULLY 0x00000080 #define PGM_SESSION_TERMINATED_ABORT 0x00000100 #define PGM_SESSION_ON_TIMER 0x00000200 #define PGM_SESSION_FLAG_IN_INDICATE 0x00000400 #define PGM_SESSION_WAIT_FOR_RECEIVE_IRP 0x00000800 #define PGM_SESSION_SENDER_DISCONNECTED 0x00001000 #define PGM_SESSION_CLIENT_DISCONNECTED 0x00002000 #define PGM_SESSION_SENDS_CANCELLED 0x00004000 #define PGM_SESSION_DATA_FROM_LOOKASIDE 0x00008000 typedef struct _TSI { union { struct { UCHAR GSI[SOURCE_ID_LENGTH]; USHORT hPort; // Out port for Sender, remote port for Reciever }; ULONGLONG ULLTSI; }; } tTSI, *PTSI; #define NUM_INDICES 32 #define NUM_INDICES_BITS 5 /* 5 bits all-set ==> 31 indices + 1 for overflow */ typedef struct _RDATA_INFO { LIST_ENTRY PendingRDataRequests; ULONG EntrySize; ULONG IndexShift; ULONG IndexMask; ULONG MaxIndices; ULONG TrailIndex; ULONG NumAllocated; SEQ_TYPE RepairDataMaxEntries; SEQ_TYPE RepairDataMask; SEQ_TYPE RepairDataIndexShift; LIST_ENTRY *pRepairData; NPAGED_LOOKASIDE_LIST RDataLookasideList; PVOID pFirstEntry[NUM_INDICES]; } tRDATA_INFO, *PRDATA_INFO; typedef struct _tCOMMON_SESSION_CONTEXT { // Line # 1 LIST_ENTRY Linkage; ULONG Verify; ULONG RefCount; // Line # 2 tADDRESS_CONTEXT *pAssociatedAddress; ULONG SessionFlags; struct _tSEND_CONTEXT *pSender; struct _tRECEIVE_CONTEXT *pReceiver; tIPADDRESS TdiIpAddress; USHORT TdiPort; tTSI TSI; PEPROCESS Process; CONNECTION_CONTEXT ClientSessionContext; PIRP pIrpCleanup; PIRP pIrpDisconnect; PIRP pIrpDisassociate; // -- FEC settings tFEC_CONTEXT FECContext; PUCHAR pFECBuffer; USHORT MaxMTULength; USHORT MaxFECPacketLength; USHORT FECBlockSize; USHORT FECProActivePackets; UCHAR FECGroupSize; UCHAR FECOptions; ULONG RateCalcTimeout; ULONGLONG DataBytesAtLastInterval; // # client data bytes sent upto last interval ULONGLONG TotalBytesAtLastInterval; // SPM, OData and RData bytes upto last interval ULONGLONG DataBytes; // # client data bytes sent out so far ULONGLONG TotalBytes; // SPM, OData and RData bytes ULONGLONG TotalPacketsReceived; ULONGLONG RateKBitsPerSecLast; // Internally calculated rate in the last INTERNAL_RATE_CALCULATION_FREQUENCY ULONGLONG MaxRateKBitsPerSec; // Maximum observed rate in any INTERNAL_RATE_CALCULATION_FREQUENCY ULONGLONG RateKBitsPerSecOverall; // Internally calculated rate from the beginning tPGM_TIMER SessionTimer; tPGM_LOCK_INFO LockInfo; // spin lock info for this struct // #if DBG ULONG ReferenceContexts[REF_SESSION_MAX]; // #endif // DBG } tCOMMON_SESSION_CONTEXT, *PCOMMON_SESSION_CONTEXT; typedef struct _tCOMMON_SESSION_CONTEXT tSEND_SESSION, *PSEND_SESSION; typedef struct _tCOMMON_SESSION_CONTEXT tRECEIVE_SESSION, *PRECEIVE_SESSION; typedef struct _tSEND_CONTEXT { // Line # 1 LIST_ENTRY Linkage; UNICODE_STRING DataFileName; // Line # 2 tADDRESS_CONTEXT *pAddress; tIPADDRESS DestMCastIpAddress; tIPADDRESS SenderMCastOutIf; USHORT DestMCastPort; // // DataFile options // // Line # 3 HANDLE FileHandle; HANDLE SectionHandle; PVOID pSectionObject; PUCHAR SendDataBufferMapping; // Line # 4 ULONGLONG MaxDataFileSize; ULONGLONG MaxPacketsInBuffer; // Line # 5 ULONG NextSendNumber; ULONG PacketBufferSize; ULONG MaxPayloadSize; // // Data Packet info // ULONG BufferPacketsAvailable; // Line # 6 ULONGLONG BufferSizeAvailable; ULONGLONG LeadingWindowOffset; // Line # 7 ULONGLONG TrailingWindowOffset; ULONG NumODataRequestsPending; ULONG NumRDataRequestsPending; // Line # 8 SEQ_TYPE NextODataSequenceNumber; SEQ_TYPE LastODataSentSequenceNumber; SEQ_TYPE TrailingEdgeSequenceNumber; SEQ_TYPE TrailingGroupSequenceNumber; // Line # 9 SEQ_TYPE LastMessageFirstSequence; SEQ_TYPE NextSpmSequenceNumber; SEQ_TYPE LateJoinSequenceNumbers; SEQ_TYPE LastVariableTGPacketSequenceNumber; // FEC-specific // Line # 10 SEQ_TYPE EmptySequencesForLastSend; ULONG NumPacketsRemaining; ULONG PacketsSentSinceLastSpm; ULONG SpmOptions; // Line # 11 ULONG DataOptions; ULONG DataOptionsLength; ULONG ThisSendMessageLength; ULONG BytesSent; // // Current Senders // // Line # 14 LIST_ENTRY CompletedSendsInWindow; LIST_ENTRY PendingPacketizedSends; // Line # 15 LIST_ENTRY PendingSends; tRDATA_INFO *pRDataInfo; PVOID pLastProActiveGroupLeader; // // Send Timer variables // // Line # 16 LARGE_INTEGER LastTimeout; LARGE_INTEGER TimeoutGranularity; // Line # 17 ULONGLONG TimerTickCount; ULONGLONG SendTimeoutCount; // Line # 18 ULONGLONG DisconnectTimeInTicks; ULONGLONG WindowAdvanceDeltaTime; // Line # 19 ULONGLONG WindowSizeTime; ULONGLONG RDataLingerTime; // Line # 20 ULONGLONG NextWindowAdvanceTime; ULONGLONG TrailingEdgeTime; // Line # 21 ULONGLONG CurrentTimeoutCount; ULONGLONG CurrentSPMTimeout; // Line # 22 ULONGLONG AmbientSPMTimeout; ULONGLONG HeartbeatSPMTimeout; // Line # 23 ULONGLONG InitialHeartbeatSPMTimeout; ULONGLONG MaxHeartbeatSPMTimeout; ULONG CurrentBytesSendable; ULONG IncrementBytesOnSendTimeout; ULONG OriginalIncrementBytes; ULONG DeltaIncrementBytes; // // FEC-specific // tBUILD_PARITY_CONTEXT *pProActiveParityContext; // // Lookaside list // // Line # 25 NPAGED_LOOKASIDE_LIST SenderBufferLookaside; NPAGED_LOOKASIDE_LIST SendContextLookaside; // // Event for sender thread to synchronize on // KEVENT SendEvent; HANDLE SendHandle; ERESOURCE Resource; // Used to lock access at passive Irqls ULONGLONG ODataPacketsInLastInterval; ULONGLONG RDataPacketsInLastInterval; // // Sender Statistics // ULONGLONG NaksReceived; // # NAKs received so far ULONGLONG NaksReceivedTooLate; // # NAKs recvd after window advanced ULONGLONG NumOutstandingNaks; // # NAKs yet to be responded to ULONGLONG NumNaksAfterRData; // # NAKs yet to be responded to ULONGLONG TotalODataPacketsSent; // # ODATA sent so far ULONGLONG TotalRDataPacketsSent; // # Repairs (RDATA) sent so far } tSEND_CONTEXT; typedef struct _tRECEIVE_CONTEXT { // Line # 1 LIST_ENTRY Linkage; tCOMMON_SESSION_CONTEXT *pReceive; tADDRESS_CONTEXT *pAddress; // Line # 2 -- Addresses tIPADDRESS SenderIpAddress; tIPADDRESS LastSpmSource; tIPADDRESS ListenMCastIpAddress; USHORT ListenMCastPort; USHORT SessionNakType; // Line # 3 -- Sequence # tracking SEQ_TYPE LastTrailingEdgeSeqNum; SEQ_TYPE NextODataSequenceNumber; SEQ_TYPE FirstNakSequenceNumber; SEQ_TYPE FurthestKnownGroupSequenceNumber; // Line # 4 SEQ_TYPE FurthestKnownSequenceNumber; SEQ_TYPE FinDataSequenceNumber; SEQ_TYPE LastSpmSequenceNumber; ULONG MaxNakWaitTimeoutMSecs; // Line # 5 ULONGLONG OutstandingNakTimeout; ULONGLONG MaxOutstandingNakTimeout; // Line # 6 ULONGLONG InitialOutstandingNakTimeout; ULONGLONG LastNakSendTime; ULONGLONG LastDataConsumedTime; // Line # 6 LIST_ENTRY BufferedDataList; LIST_ENTRY NaksForwardDataList; // Line # 7 LIST_ENTRY PendingNaksList; LIST_ENTRY ReceiveIrpsList; // Line # 8 LIST_ENTRY *pReceiveData; SEQ_TYPE ReceiveDataMask; USHORT ReceiveDataMaxEntries; USHORT ReceiveDataIndexShift; // Line # 8 PIRP pIrpReceive; ULONG TotalBytesInMdl; ULONG BytesInMdl; ULONG RcvBufferLength; // Line # 9 ULONG CurrentMessageLength; ULONG CurrentMessageProcessed; ULONG TotalDataPacketsBuffered; ULONG DataPacketsPendingIndicate; // Line # 10 ULONG DataPacketsPendingNaks; ULONG NumPacketGroupsPendingClient; ULONG MaxBufferLength; ULONG DataBufferLookasideLength; // Line # 11 ULONG NumDataBuffersFromLookaside; USHORT MaxPacketsBufferedInLookaside; NPAGED_LOOKASIDE_LIST DataBufferLookaside; NPAGED_LOOKASIDE_LIST NonParityContextLookaside; NPAGED_LOOKASIDE_LIST ParityContextLookaside; ULONG AverageSpmInterval; ULONG MaxSpmInterval; ULONG NumSpmIntervalSamples; ULONGLONG StatSumOfSpmIntervals; ULONGLONG LastSpmTickCount; ULONGLONG LastSessionTickCount; ULONGLONG StartTickCount; ULONGLONG MinSequencesInWindow; ULONGLONG MaxSequencesInWindow; ULONGLONG DataPacketsIndicated; ULONGLONG AverageSequencesInWindow; ULONGLONG StatSumOfWindowSeqs; ULONGLONG NumWindowSamples; ULONGLONG AverageNcfRDataResponseTC; ULONGLONG StatSumOfNcfRDataTicks; ULONGLONG NumNcfRDataTicksSamples; ULONGLONG MaxRDataResponseTCFromWindow; ULONGLONG WindowSizeLastInMSecs; ULONGLONG NumODataPacketsReceived; ULONGLONG NumRDataPacketsReceived; ULONGLONG NumDataPacketsDropped; ULONGLONG NumDupPacketsBuffered; ULONGLONG NumDupPacketsOlderThanWindow; ULONGLONG NumPendingNaks; ULONGLONG NumOutstandingNaks; ULONGLONG TotalSelectiveNaksSent; ULONGLONG TotalParityNaksSent; } tRECEIVE_CONTEXT; // // OData context // typedef struct _tCLIENT_SEND_REQUEST { // Line # 1 LIST_ENTRY Linkage; // Record-keeping information -- set when send request comes from client ULONG SendNumber; PIRP pIrp; PIRP pIrpToComplete; tSEND_SESSION *pSend; ULONGLONG SendStartTime; ULONG NextDataOffsetInMdl; ULONG DataOptions; ULONG DataOptionsLength; // Message-specific information -- set initially for tracking Message boundaries ULONG ThisMessageLength; ULONG LastMessageOffset; ULONG NumPacketsRemaining; struct _tCLIENT_SEND_REQUEST *pMessage2Request; // Static Send information -- set when the send is packetized (may be set more than once) SEQ_TYPE StartSequenceNumber; SEQ_TYPE EndSequenceNumber; SEQ_TYPE MessageFirstSequenceNumber; ULONG BytesInSend; ULONG BytesLeftToPacketize; ULONG DataPacketsPacketized; ULONG DataBytesInLastPacket; ULONG DataPayloadSize; // Dynamic-specific information -- updated on every OData send and completion ULONGLONG NextPacketOffset; ULONG NumDataPacketsSent; ULONG NumDataPacketsSentSuccessfully; ULONG NumSendsPending; ULONG NumParityPacketsToSend; // FEC-specific PVOID pLastMessageVariableTGPacket; BOOLEAN bLastSend; } tCLIENT_SEND_REQUEST, *PCLIENT_SEND_REQUEST; // // ************************************** // // Sender's Data contexts // typedef struct _tSEND_RDATA_CONTEXT { // Line # 1 LIST_ENTRY Linkage; SEQ_TYPE RDataSequenceNumber; // Line # 2 ULONGLONG EarliestRDataSendTime; ULONGLONG PostRDataHoldTime; // Line # 3 ULONGLONG CleanupTime; tSEND_SESSION *pSend; USHORT NumPacketsInTransport; USHORT NumParityNaks; // Line # 4 union { UCHAR SelectiveNaksMask[16]; // 16 * 8 = 128 ==> Max packets in group! ULONGLONG SelectiveNaks[2]; }; // Line # 5 LIST_ENTRY FastFindLinkage; tBUILD_PARITY_CONTEXT OnDemandParityContext; // Must be last field in struct } tSEND_RDATA_CONTEXT, *PSEND_RDATA_CONTEXT; typedef struct { ULONG MessageFirstSequence; ULONG MessageOffset; ULONG MessageLength; } tFRAGMENT_OPTIONS; typedef struct { USHORT EncodedTSDULength; UCHAR FragmentOptSpecific; UCHAR Pad; tFRAGMENT_OPTIONS EncodedFragmentOptions; } tPOST_PACKET_FEC_CONTEXT; typedef struct { UCHAR FECGroupInfo; UCHAR NumPacketsInThisGroup; UCHAR FragmentOptSpecific; union { UCHAR ReceiverFECOptions; UCHAR SenderNextFECPacketIndex; }; } tFEC_OPTIONS; typedef struct { USHORT TotalPacketLength; USHORT OptionsLength; ULONG OptionsFlags; USHORT LateJoinerOptionOffset; USHORT FragmentOptionOffset; ULONG LateJoinerSequence; ULONG MessageFirstSequence; ULONG MessageOffset; ULONG MessageLength; tFEC_OPTIONS FECContext; } tPACKET_OPTIONS; // // Receiver's NAK + Out-of-order context // enum eNAK_TIMEOUT { NAK_PENDING_0, NAK_PENDING_RB, NAK_PENDING_RPT_RB, NAK_OUTSTANDING }; // // Set flags for the different Nak types // #define NAK_TYPE_SELECTIVE 0x01 #define NAK_TYPE_PARITY 0x02 #define MAX_SEQUENCES_PER_NAK_OPTION 62 typedef struct _tNAKS_CONTEXT { LIST_ENTRY Linkage; SEQ_TYPE Sequences[MAX_SEQUENCES_PER_NAK_OPTION+1]; USHORT NumSequences; USHORT NakType; } tNAKS_CONTEXT, *PNAKS_CONTEXT; typedef struct _tNAKS_LIST { SEQ_TYPE pNakSequences[MAX_SEQUENCES_PER_NAK_OPTION+1]; USHORT NumSequences; USHORT NakType; union { USHORT NumParityNaks[MAX_SEQUENCES_PER_NAK_OPTION+1]; USHORT NakIndex[MAX_SEQUENCES_PER_NAK_OPTION+1]; }; } tNAKS_LIST, *PNAKS_LIST; #define PENDING_DATA_LOOKASIDE_ALLOCATION_FLAG 0x00000001 typedef struct _PENDING_DATA { PUCHAR pDataPacket; PUCHAR DecodeBuffer; USHORT PacketLength; USHORT DataOffset; UCHAR PacketIndex; UCHAR ActualIndexOfDataPacket; UCHAR NcfsReceivedForActualIndex; UCHAR FragmentOptSpecific; ULONG MessageFirstSequence; ULONG MessageOffset; ULONG MessageLength; ULONG PendingDataFlags; } tPENDING_DATA; typedef struct _tNAK_FORWARD_DATA { // Line # 1 LIST_ENTRY Linkage; SEQ_TYPE SequenceNumber; // Line # 2 ULONGLONG PendingNakTimeout; ULONGLONG OutstandingNakTimeout; // Line # 3 ULONGLONG FirstNcfTickCount; ULONG AllOptionsFlags; USHORT ParityDataSize; USHORT MinPacketLength; // Line # 4 UCHAR WaitingNcfRetries; UCHAR PacketsInGroup; UCHAR NumDataPackets; UCHAR NumParityPackets; UCHAR WaitingRDataRetries; UCHAR ThisGroupSize; UCHAR OriginalGroupSize; UCHAR NextIndexToIndicate; LIST_ENTRY LookupLinkage; LIST_ENTRY SendNakLinkage; // Line # 4 tPENDING_DATA pPendingData[1]; } tNAK_FORWARD_DATA, *PNAK_FORWARD_DATA; // // ************************************** // // Worker Queue context // typedef struct { WORK_QUEUE_ITEM Item; // Used by OS to queue these requests LIST_ENTRY PgmConfigLinkage; PVOID WorkerRoutine; PVOID Context1; PVOID Context2; PVOID Context3; } PGM_WORKER_CONTEXT; // ********************************************************************** // * Timer Definitions * // ********************************************************************** #define BASIC_TIMER_GRANULARITY_IN_MSECS 20 // 20 millisecs // Statistics timer #define INTERNAL_RATE_CALCULATION_FREQUENCY 4096 // ~4 secs #define LOG2_INTERNAL_RATE_CALCULATION_FREQUENCY 12 // ********************************************************************** // * Sender defaults * // ********************************************************************** #define NUM_LEAKY_BUCKETS 2 #define SENDER_MAX_WINDOW_SIZE_PACKETS (((SEQ_TYPE)-1) / 2) #define MIN_RECOMMENDED_WINDOW_MSECS 10*1000 // 10 seconds #define MID_RECOMMENDED_WINDOW_MSECS 30*1000 // 5 minutes #define MAX_RECOMMENDED_WINDOW_MSECS 5*60*1000 // 5 minutes // SPM timer #define AMBIENT_SPM_TIMEOUT_IN_MSECS 500 // 0.5 Sec #define INITIAL_HEARTBEAT_SPM_TIMEOUT_IN_MSECS 1000 // 1 Sec #define MAX_HEARTBEAT_SPM_TIMEOUT_IN_MSECS 15*1000 // 15 Secs #define MAX_DATA_PACKETS_BEFORE_SPM 50 // Not more than 50 data pkts before SPM // RData timer #define RDATA_LINGER_TIME_MSECS 60 // Time before and after sending RData #define MIN_PREFERRED_REPAIR_PERCENTAGE 7 // ********************************************************************** // * Receiver Settings * // ********************************************************************** #define MAX_PACKETS_BUFFERED 3*1000 // Limit on # of buffered packets/session #define MAX_SEQUENCES_IN_RCV_WINDOW 5*1000 // Limit on # of Nak Contexts/session #define MAX_SPM_INTERVAL_MSECS 5*60*1000 // 5 minutes #define MAX_DATA_CONSUMPTION_TIME_MSECS 5*60*1000 // 5 minutes // Nak timer #define OUT_OF_ORDER_PACKETS_BEFORE_NAK 2 // Before starting Nak #define NAK_WAITING_NCF_MAX_RETRIES 10 #define NAK_MIN_INITIAL_BACKOFF_TIMEOUT_MS_OPT 2 // 0.002 Secs #define NAK_MAX_INITIAL_BACKOFF_TIMEOUT_MS_OPT 20 // 0.02 Secs #define NAK_MIN_INITIAL_BACKOFF_TIMEOUT_MSECS 50 // 0.2 Secs #define NAK_MAX_INITIAL_BACKOFF_TIMEOUT_MSECS 100 // 0.5 Secs #define NAK_RANDOM_BACKOFF_MSECS \ GetRandomInteger (NAK_MIN_INITIAL_BACKOFF_TIMEOUT_MSECS,NAK_MAX_INITIAL_BACKOFF_TIMEOUT_MSECS) #define NAK_RANDOM_BACKOFF_MSECS_OPT \ GetRandomInteger (NAK_MIN_INITIAL_BACKOFF_TIMEOUT_MS_OPT,NAK_MAX_INITIAL_BACKOFF_TIMEOUT_MS_OPT) #define NAK_REPEAT_INTERVAL_MSECS_OPT 50 // 0.05 Secs -- Timeout before retrying #define NAK_REPEAT_INTERVAL_MSECS 750 // 0.75 Secs -- Timeout before retrying // Ncf timer #define INITIAL_NAK_OUTSTANDING_TIMEOUT_MS_OPT 100 // 0.1 Secs -- Waiting for RData after NCF #define INITIAL_NAK_OUTSTANDING_TIMEOUT_MSECS 2000 // 2 Secs -- Waiting for RData after NCF #define NCF_WAITING_RDATA_MAX_RETRIES 10 // Max NCFs before fatal error // ********************************************************************** // * Packet Definitions * // ********************************************************************** #include // // IP v4 Header // typedef struct IPV4Header { UCHAR HeaderLength : 4; // Version UCHAR Version : 4; // Length UCHAR TypeOfService; // Type of service. USHORT TotalLength; // Total length of datagram. USHORT Identification; // Identification. USHORT FlagsAndFragmentOffset; // Flags and fragment offset. UCHAR TimeToLive; // Time to live. UCHAR Protocol; // Protocol. USHORT Checksum; // Header checksum. ULONG SourceIp; // Source address. ULONG DestinationIp; // Destination address. } IPV4Header; // // Common PGM Header: // typedef struct { USHORT SrcPort; USHORT DestPort; UCHAR Type; UCHAR Options; USHORT Checksum; UCHAR gSourceId[SOURCE_ID_LENGTH]; USHORT TSDULength; } tCOMMON_HEADER; #define IPV4_NLA_AFI 1 typedef struct { USHORT NLA_AFI; USHORT Reserved; tIPADDRESS IpAddress; } tNLA; // // SPMs (Session-specific -- Sender only -- periodic) ==> Range: [0, 3] // #define PACKET_TYPE_SPM 0x00 #define PACKET_TYPE_POLL 0x01 #define PACKET_TYPE_POLR 0x02 typedef struct { tCOMMON_HEADER CommonHeader; ULONG SpmSequenceNumber; // SPM_SQN ULONG TrailingEdgeSeqNumber; // SPM_TRAIL == TXW_TRAIL ULONG LeadingEdgeSeqNumber; // SPM_LEAD == TXW_LEAD tNLA PathNLA; } tBASIC_SPM_PACKET_HEADER; // // Data packets (data and repairs) ==> Range: [4, 7] // #define PACKET_TYPE_ODATA 0x04 #define PACKET_TYPE_RDATA 0x05 typedef struct { tCOMMON_HEADER CommonHeader; ULONG DataSequenceNumber; ULONG TrailingEdgeSequenceNumber; } tBASIC_DATA_PACKET_HEADER; // // NAK/NCF Packets (hop-by-hop reliable NAK forwarding) ==> Range: [8, B] // #define PACKET_TYPE_NAK 0x08 #define PACKET_TYPE_NNAK 0x09 #define PACKET_TYPE_NCF 0x0A typedef struct { tCOMMON_HEADER CommonHeader; ULONG RequestedSequenceNumber; tNLA SourceNLA; tNLA MCastGroupNLA; } tBASIC_NAK_NCF_PACKET_HEADER; typedef struct { ULONG RefCount; ULONG SuccessfulSends; tBASIC_NAK_NCF_PACKET_HEADER NakPacket; } tNAK_CONTEXT; // // SPM Request Pkts (session-specific, receiver only) ==> Range: [C, F] // #define PACKET_TYPE_SPMR 0x0C // // Options flag values // #define PACKET_HEADER_OPTIONS_PRESENT 0x01 // bit 7 #define PACKET_HEADER_OPTIONS_NETWORK_SIGNIFICANT 0x02 // bit 6 #define PACKET_HEADER_OPTIONS_VAR_PKTLEN 0x40 // bit 1 #define PACKET_HEADER_OPTIONS_PARITY 0x80 // bit 0 // ********************************************************************** // * Packet Options * // ********************************************************************** // // We can have a maximum of 16 options per packet // // // Generic Packet Option Format // typedef struct { UCHAR E_OptionType; UCHAR OptionLength; UCHAR Reserved_F_Opx; UCHAR U_OptSpecific; } tPACKET_OPTION_GENERIC; #define PACKET_OPTION_TYPE_END_BIT 0x80 #define PACKET_OPTION_RES_F_OPX_IGNORE 0x00 #define PACKET_OPTION_RES_F_OPX_INVALIDATE 0x01 #define PACKET_OPTION_RES_F_OPX_DISCARD 0x02 #define PACKET_OPTION_RES_F_OPX_UNSUPPORTED 0x03 #define PACKET_OPTION_RES_F_OPX_ENCODED_BIT 0x04 #define PACKET_OPTION_SPECIFIC_ENCODED_NULL_BIT 0x80 #define PACKET_OPTION_SPECIFIC_FEC_OND_BIT 0x01 #define PACKET_OPTION_SPECIFIC_FEC_PRO_BIT 0x02 #define PACKET_OPTION_SPECIFIC_RST_N_BIT 0x80 // // Packet Option format for Length option // typedef struct { UCHAR Type; UCHAR Length; USHORT TotalOptionsLength; } tPACKET_OPTION_LENGTH; #define PACKET_OPTION_LENGTH 0x00 // All packets #define PACKET_OPTION_FRAGMENT 0x01 // ODATA, RDATA only #define PACKET_OPTION_NAK_LIST 0x02 // NAKs, NCFs #define PACKET_OPTION_JOIN 0x03 // ODATA, RDATA, SPM #define PACKET_OPTION_REDIRECT 0x07 // POLR #define PACKET_OPTION_SYN 0x0D // ODATA, RDATA #define PACKET_OPTION_FIN 0x0E // SPMs, ODATA, RDATA #define PACKET_OPTION_RST 0x0F // SPMs only #define PACKET_OPTION_PARITY_PRM 0x08 // SPMs only #define PACKET_OPTION_PARITY_GRP 0x09 // Parity packets only (parity ODATA, RDATA) #define PACKET_OPTION_CURR_TGSIZE 0x0A // ODATA, RDATA, SPMs #define PACKET_OPTION_CR 0x10 // NAKs only #define PACKET_OPTION_CRQST 0x11 // SPMs only #define PACKET_OPTION_NAK_BO_IVL 0x04 // NCFs, SPMs, or POLLs #define PACKET_OPTION_NAK_BO_RNG 0x05 // SPMs #define PACKET_OPTION_NBR_UNREACH 0x0B // SPMs and NCFs #define PACKET_OPTION_PATH_NLA 0x0C // NCFs #define PACKET_OPTION_INVALID 0x7F // // Internal flags used for processing options // #define PGM_OPTION_FLAG_FRAGMENT 0x00000001 #define PGM_OPTION_FLAG_NAK_LIST 0x00000004 // Network Significant #define PGM_OPTION_FLAG_JOIN 0x00000008 #define PGM_OPTION_FLAG_REDIRECT 0x00000010 // Network Significant #define PGM_OPTION_FLAG_SYN 0x00000020 #define PGM_OPTION_FLAG_FIN 0x00000040 #define PGM_OPTION_FLAG_RST 0x00000080 #define PGM_OPTION_FLAG_RST_N 0x00000100 // FEC-related options #define PGM_OPTION_FLAG_PARITY_PRM 0x00000200 // Network Significant #define PGM_OPTION_FLAG_PARITY_GRP 0x00000400 #define PGM_OPTION_FLAG_PARITY_CUR_TGSIZE 0x00000800 // Network Significant (except on ODATA) #define PGM_OPTION_FLAG_CR 0x00001000 // Network Significant #define PGM_OPTION_FLAG_CRQST 0x00002000 // Network Significant #define PGM_OPTION_FLAG_NAK_BO_IVL 0x00004000 #define PGM_OPTION_FLAG_NAK_BO_RNG 0x00008000 #define PGM_OPTION_FLAG_NBR_UNREACH 0x00010000 // Network Significant #define PGM_OPTION_FLAG_PATH_NLA 0x00020000 // Network Significant #define PGM_OPTION_FLAG_INVALID 0x00040000 #define PGM_OPTION_FLAG_UNRECOGNIZED 0x80000000 #define PGM_VALID_DATA_OPTION_FLAGS (PGM_OPTION_FLAG_FRAGMENT | \ PGM_OPTION_FLAG_JOIN | \ PGM_OPTION_FLAG_SYN | \ PGM_OPTION_FLAG_FIN | \ PGM_OPTION_FLAG_PARITY_GRP | \ PGM_OPTION_FLAG_PARITY_CUR_TGSIZE) #define PGM_VALID_SPM_OPTION_FLAGS (PGM_OPTION_FLAG_JOIN | \ PGM_OPTION_FLAG_FIN | \ PGM_OPTION_FLAG_RST | \ PGM_OPTION_FLAG_RST_N | \ PGM_OPTION_FLAG_PARITY_PRM | \ PGM_OPTION_FLAG_PARITY_CUR_TGSIZE |\ PGM_OPTION_FLAG_CRQST | \ PGM_OPTION_FLAG_NAK_BO_IVL | \ PGM_OPTION_FLAG_NAK_BO_RNG | \ PGM_OPTION_FLAG_NBR_UNREACH) #define PGM_VALID_NAK_OPTION_FLAGS (PGM_OPTION_FLAG_NAK_LIST | \ PGM_OPTION_FLAG_CR) #define PGM_VALID_NCF_OPTION_FLAGS (PGM_OPTION_FLAG_NAK_LIST | \ PGM_OPTION_FLAG_NAK_BO_IVL | \ PGM_OPTION_FLAG_NBR_UNREACH | \ PGM_OPTION_FLAG_PATH_NLA) #define PGM_VALID_POLR_OPTION_FLAGS (PGM_OPTION_FLAG_REDIRECT) #define PGM_VALID_POLL_OPTION_FLAGS (PGM_OPTION_FLAG_NAK_BO_IVL) #define NETWORK_SIG_ALL_OPTION_FLAGS (PGM_OPTION_FLAG_NAK_LIST | \ PGM_OPTION_FLAG_REDIRECT | \ PGM_OPTION_FLAG_PARITY_PRM | \ PGM_OPTION_FLAG_PARITY_CUR_TGSIZE |\ PGM_OPTION_FLAG_CR | \ PGM_OPTION_FLAG_CRQST | \ PGM_OPTION_FLAG_NBR_UNREACH | \ PGM_OPTION_FLAG_PATH_NLA) // // NETWORK_SIG_ODATA_OPTIONS_FLAGS == 0 // #define NETWORK_SIG_ODATA_OPTIONS_FLAGS (PGM_VALID_DATA_OPTION_FLAGS & \ NETWORK_SIG_ALL_OPTION_FLAGS & \ ~PGM_OPTION_FLAG_PARITY_CUR_TGSIZE) // // NETWORK_SIG_RDATA_OPTIONS_FLAGS == CUR_TGSIZE // #define NETWORK_SIG_RDATA_OPTIONS_FLAGS (PGM_VALID_DATA_OPTION_FLAGS & \ NETWORK_SIG_ALL_OPTION_FLAGS) // // NETWORK_SIG_SPM_OPTIONS_FLAGS == PARITY_PRM | CUR_TGSIZE | CRQST | NBR_UNREACH // #define NETWORK_SIG_SPM_OPTIONS_FLAGS (PGM_VALID_SPM_OPTION_FLAGS & \ NETWORK_SIG_ALL_OPTION_FLAGS) // // NETWORK_SIG_NAK_OPTIONS_FLAGS == NAK_LIST | CR // #define NETWORK_SIG_NAK_OPTIONS_FLAGS (PGM_VALID_NAK_OPTION_FLAGS & \ NETWORK_SIG_ALL_OPTION_FLAGS) // // NETWORK_SIG_NCF_OPTIONS_FLAGS == NAK_LIST | NBR_UNREACH | PATH_NLA // #define NETWORK_SIG_NCF_OPTIONS_FLAGS (PGM_VALID_NCF_OPTION_FLAGS & \ NETWORK_SIG_ALL_OPTION_FLAGS) // // NETWORK_SIG_POLR_OPTIONS_FLAGS == REDIRECT // #define NETWORK_SIG_POLR_OPTIONS_FLAGS (PGM_VALID_POLR_OPTION_FLAGS & \ NETWORK_SIG_ALL_OPTION_FLAGS) // // NETWORK_SIG_POLL_OPTIONS_FLAGS == 0 // #define NETWORK_SIG_POLL_OPTIONS_FLAGS (PGM_VALID_POLL_OPTION_FLAGS & \ NETWORK_SIG_ALL_OPTION_FLAGS) // Based on the above, the maximum lengths (with the addition of the Packet extension option) are: #define PGM_PACKET_EXTENSION_LENGTH 4 #define PGM_PACKET_OPT_FRAGMENT_LENGTH 16 #define PGM_PACKET_OPT_MIN_NAK_LIST_LENGTH (4 + 4) #define PGM_PACKET_OPT_MAX_NAK_LIST_LENGTH (4 + 4*MAX_SEQUENCES_PER_NAK_OPTION) #define PGM_PACKET_OPT_JOIN_LENGTH 8 #define PGM_PACKET_OPT_SYN_LENGTH 4 #define PGM_PACKET_OPT_FIN_LENGTH 4 #define PGM_PACKET_OPT_RST_LENGTH 4 #define PGM_PACKET_OPT_PARITY_PRM_LENGTH 8 #define PGM_PACKET_OPT_PARITY_GRP_LENGTH 8 #define PGM_PACKET_OPT_PARITY_CUR_TGSIZE_LENGTH 8 // // The following settings are for the currently used options only. // It will need to be modified if new options are used // #define PGM_MAX_DATA_HEADER_LENGTH (sizeof(tBASIC_DATA_PACKET_HEADER) + \ PGM_PACKET_EXTENSION_LENGTH + \ PGM_PACKET_OPT_FRAGMENT_LENGTH + \ PGM_PACKET_OPT_JOIN_LENGTH + \ PGM_PACKET_OPT_SYN_LENGTH) /* or FIN or RST */ #define PGM_MAX_FEC_DATA_HEADER_LENGTH (sizeof(tBASIC_DATA_PACKET_HEADER) + \ PGM_PACKET_EXTENSION_LENGTH + \ PGM_PACKET_OPT_FRAGMENT_LENGTH + \ PGM_PACKET_OPT_PARITY_GRP_LENGTH + \ PGM_PACKET_OPT_PARITY_CUR_TGSIZE_LENGTH + \ PGM_PACKET_OPT_SYN_LENGTH + \ PGM_PACKET_OPT_FIN_LENGTH) /* or RST */ #define PGM_MAX_SPM_HEADER_LENGTH (sizeof(tBASIC_SPM_PACKET_HEADER) + \ PGM_PACKET_EXTENSION_LENGTH + \ PGM_PACKET_OPT_JOIN_LENGTH + \ PGM_PACKET_OPT_PARITY_PRM_LENGTH + \ PGM_PACKET_OPT_PARITY_CUR_TGSIZE_LENGTH + \ PGM_PACKET_OPT_FIN_LENGTH) /* or RST */ #define PGM_MAX_NAK_NCF_HEADER_LENGTH (sizeof(tBASIC_NAK_NCF_PACKET_HEADER) + \ PGM_PACKET_EXTENSION_LENGTH + \ PGM_PACKET_OPT_MAX_NAK_LIST_LENGTH) #include // // Include the definition for the Data file formatting unit // typedef struct { tPACKET_OPTIONS PacketOptions; tBASIC_DATA_PACKET_HEADER DataPacket; } tPACKET_BUFFER; #endif // _TYPES_H