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.
|
|
/*++
Copyright (c) 1996-1999 Microsoft Corporation
Module Name:
DRRSeq.c
Abstract:
Priority/DRR Sequencer. This module is a scheduling component that determines the order in which submitted packets should be sent.
Author:
Environment:
Kernel Mode
Revision History:
--*/
#ifndef _DRRSEQ_H_FILE
#define _DRRSEQ_H_FILE
// The sequencer classifies each flow into an internal "priority group" based
// on the flow's service type and conformance status. Within each priority
// group, there may be one or more priority levels or offsets. The total
// number of internal priority levels is the sum of the priority levels for
// each priority group. The internal priority assigned to each flow is
// calculated from the priority group and the relative priority within the
// group, which is obtained from the QOS Priority object. The 802.1 priority,
// is set by the wrapper. The non conforming values are obtained from the
// packet.
//
// The flows of the following servicetypes have no internal priority.
// SERVICETYPE_BESTEFFORT
// SERVICETYPE_NONCONFORMING
// SERVICETYPE_QUALITATIVE.
//
// SERVICETYPE_BESTEFFORT is treated as SERVICETYPE_QUALITATIVE in the sequencer, so the no of priority
// groups is 1 less than the no. of servicetypes.
#define RELATIVE_PRIORITIES 8
#define PRIORITY_GROUPS (NUM_TC_SERVICETYPES - 1)
#define INTERNAL_PRIORITIES (((PRIORITY_GROUPS - 2) * RELATIVE_PRIORITIES) + 2)
#define DEFAULT_PRIORITY_OFFSET 3
#define DEFAULT_MIN_QUANTUM 1500
#define PRIORITY_GROUP_NON_CONFORMING 0
#define PRIORITY_GROUP_BEST_EFFORT 1
#define PRIORITY_GROUP_CONTROLLED_LOAD 2
#define PRIORITY_GROUP_GUARANTEED 3
#define PRIORITY_GROUP_NETWORK_CONTROL 4
//
// For maintaining stats
//
#define SEQUENCER_AVERAGING_ARRAY_SIZE 256
#define NETCARD_AVERAGING_ARRAY_SIZE 256
#define SEQUENCER_FLOW_AVERAGING_ARRAY_SIZE 256
// The DRR Sequencer's pipe information
typedef struct _DSEQ_PIPE {
// ContextInfo - Generic context info
// Lock - Protects pipe and flow data
// Flags - See below
// Flows - List of all installed flows
// ActiveFlows - Lists of flows that are waiting to send packets
// PriorityLevels - Number of priority offsets for each priority group
// StartPriority - Lowest internal priority value for each priority group
// ActiveFlowCount - Number of active flows for each service type
// MaxOutstandingSends - Maximum number of outstanding sends
// OutstandingSends - Number of outstanding sends
// PacketsInNetcardAveragingArray
// PacketsInSequencer - Current number packets in sequencer
// PacketsInSequencerAveragingArray
// Bandwidth - Link speed
// MinimumQuantum - Minimum quantum size for DRR
// MinimumRate - Smallest rate currently assigned to a flow
// TimerResolution - Timer resolution in OS time units
// PsFlags - Flags from pipe parameters
// PsPipeContext - PS's pipe context value
PS_PIPE_CONTEXT ContextInfo; #ifdef INSTRUMENT
PS_DRRSEQ_STATS Stats; PRUNNING_AVERAGE PacketsInNetcardAveragingArray; ULONG PacketsInSequencer; PRUNNING_AVERAGE PacketsInSequencerAveragingArray; #endif
NDIS_SPIN_LOCK Lock; ULONG Flags; LIST_ENTRY Flows; LIST_ENTRY ActiveFlows[INTERNAL_PRIORITIES]; ULONG PriorityLevels[PRIORITY_GROUPS]; ULONG StartPriority[PRIORITY_GROUPS]; ULONG ActiveFlowCount[PRIORITY_GROUPS]; ULONG TotalActiveFlows; ULONG MaxOutstandingSends; ULONG OutstandingSends; ULONG Bandwidth; ULONG MinimumQuantum; ULONG MinimumRate; ULONG TimerResolution; ULONG PsFlags; HANDLE PsPipeContext; PPS_PROCS PsProcs; PSU_SEND_COMPLETE PreviousUpcallsSendComplete; PPS_PIPE_CONTEXT PreviousUpcallsSendCompletePipeContext; } DSEQ_PIPE, *PDSEQ_PIPE;
// Pipe flag values
#define DSEQ_DEQUEUE 1
#define DSEQ_PASSTHRU 2
typedef enum _FLOW_STATE { DRRSEQ_FLOW_CREATED = 1, DRRSEQ_FLOW_DELETED } FLOW_STATE;
// The DRR Sequencer's flow information
typedef struct _DSEQ_FLOW {
// ContextInfo - Generic context info
// ActiveLinks - Links in active flow list
// Links - Links in installed flow list
// PacketQueue - Self-explanatory
// PacketSendTime - Send time for current packet
// LastConformanceTime - Absolute conformance time of last packet
// TokenRate - TokenRate from GQOS
// UserPriority - Priority offset assigned by user
// Priority - Internal priority
// PriorityGroup - Priority group for flow
// Quantum - Quantum assigned to flow for DRR
// DeficitCounter - Current value of DRR deficit counter
// Flags - See below
// PsFlowContext - PS's flow context value
// BucketSize - TokenBucketSize from GQOS
// NumPacketsInSeq - Number of packets from this flow in the sequencer
// PacketsInSeqAveragingArray-Data for computing average packets in seq from this flow
PS_FLOW_CONTEXT ContextInfo; LIST_ENTRY ActiveLinks; LIST_ENTRY Links; LIST_ENTRY PacketQueue; LARGE_INTEGER PacketSendTime; LARGE_INTEGER LastConformanceTime; ULONG TokenRate; ULONG UserPriority; ULONG Priority; ULONG PriorityGroup; ULONG Quantum; ULONG DeficitCounter; ULONG Flags; HANDLE PsFlowContext; ULONG BucketSize; #ifdef INSTRUMENT
ULONG PacketsInSequencer; PS_DRRSEQ_STATS Stats; PRUNNING_AVERAGE PacketsInSeqAveragingArray; #endif
FLOW_STATE State; } DSEQ_FLOW, *PDSEQ_FLOW;
#define MAX_DEQUEUED_PACKETS 8
#define FLOW_USER_PRIORITY 0x00000002
// The following macro checks a packet for conformance based on the flow's
// LastPacketTime, the current time, and the timer resolution.
#define PacketIsConforming(_flow, _curtime, _r) \
( (_flow)->PacketSendTime.QuadPart <= ((_curtime).QuadPart + (_r)) )
#define AdjustLastPacketTime(_flow, _curtime, _r) \
if ((_curtime).QuadPart > ((_flow)->PacketSendTime.QuadPart + (_r))) \ if ((_curtime).QuadPart > ((_flow)->LastConformanceTime.QuadPart - (_r))) \ (_flow)->PacketSendTime = (_flow)->LastConformanceTime; \ else \ (_flow)->PacketSendTime = (_curtime);
// The Shaper's pipe information
typedef struct _TS_PIPE {
// ContextInfo - Generic context info
// Lock - Protects pipe data
// ActiveFlows - List of flows that are waiting to send packets
// Timer - Timer struct
// TimerStatus - Status of timer
// TimerResolution - Timer resolution in OS time units
// PsPipeContext - PS's pipe context value
// DropPacket - PS's drop packet routine
// ControlledLoadMode - Default mode for non-conforming traffic from
// controlled load flows
// GuaranteedMode - Default mode for non-conforming traffic from
// guaranteed service flows
// IntermediateSystem - TRUE if "IS" mode should be used for implementing discard semantics
// Stats - Per Pipe stats.
// PacketsInShaperAveragingArray
PS_PIPE_CONTEXT ContextInfo; #ifdef INSTRUMENT
PS_SHAPER_STATS Stats; PRUNNING_AVERAGE PacketsInShaperAveragingArray; ULONG PacketsInShaper; #endif
NDIS_SPIN_LOCK Lock; LIST_ENTRY ActiveFlows; NDIS_MINIPORT_TIMER Timer; ULONG TimerStatus; ULONG TimerResolution; HANDLE PsPipeContext; PPS_PROCS PsProcs; ULONG ControlledLoadMode; ULONG GuaranteedMode; ULONG NetworkControlMode; ULONG Qualitative; ULONG IntermediateSystem; } TS_PIPE, *PTS_PIPE;
#define TIMER_UNINITIALIZED 0
#define TIMER_INACTIVE 1
#define TIMER_SET 2
#define TIMER_PROC_EXECUTING 3
// The Shaper's flow information
typedef struct _TS_FLOW {
// ContextInfo - Generic context info
// Flags - See below
// Links - Links in active flow list
// Mode - Shape/Discard mode
// Shape - Indicates whether to shape traffic
// PacketQueue - Self-explanatory
// FlowEligibilityTime - Absolute conformance time of 1st packet in queue
// PsFlowContext - PS's flow context value
// Stats - Per flow stats.
// PacketsInShaperAveragingArray - Per flow averaging data
// State - State of the flow
PS_FLOW_CONTEXT ContextInfo; ULONG Flags; LIST_ENTRY Links; ULONG Mode; ULONG Shape; LIST_ENTRY PacketQueue; LARGE_INTEGER FlowEligibilityTime; HANDLE PsFlowContext; #ifdef QUEUE_LIMIT
ULONG QueueSize; ULONG QueueSizeLimit; ULONG DropOverLimitPacketsFromHead; ULONG UseDefaultQueueLimit; #endif // QUEUE_LIMIT
#ifdef INSTRUMENT
ULONG PacketsInShaper; PS_SHAPER_STATS Stats; PRUNNING_AVERAGE PacketsInShaperAveragingArray; #endif
FLOW_STATE State; } TS_FLOW, *PTS_FLOW;
typedef struct _TBC_PIPE {
// ContextInfo - Generic context info
// MaxPacket - Maximum packet size for pipe
// PsPipeContext - PS's pipe context value
// DropPacket - PS's drop packet routine
// HeaderLength - Length of MAC header for this pipe
// ControlledLoadMode - Default mode for non-conforming traffic from
// controlled load flows
// GuaranteedMode - Default mode for non-conforming traffic from
// guaranteed service flows
// IntermediateSystem - TRUE if "IS" mode should be used for implementing discard semantics
// Stats - Per Pipe stats.
PS_PIPE_CONTEXT ContextInfo; #ifdef INSTRUMENT
PS_CONFORMER_STATS Stats; #endif // INSTRUMENT
ULONG MaxPacket; HANDLE PsPipeContext; ULONG TimerResolution; PPS_PROCS PsProcs; ULONG HeaderLength; ULONG ControlledLoadMode; ULONG GuaranteedMode; ULONG NetworkControlMode; ULONG Qualitative; ULONG IntermediateSystem; } TBC_PIPE, *PTBC_PIPE;
// The conformer's flow information
typedef struct _TBC_FLOW {
// ContextInfo - Generic context info
// Lock - Protects flow data
// TokenRate - TokenRate from generic QoS
// Capacity - TokenBucketSize from generic QoS
// PeakRate - PeakBandwidth from generic QoS
// MinPolicedUnit - MinimumPolicedUnit from generic QoS
// Mode - Flow S/D mode
// NoConformance - Indicates whether flow is exempt from conformance algorithm
// LastConformanceTime - Absolute tb conformance time of last non-discarded packet
// LastPeakTime - Absolute peak conformance time of last non-discarded packet
// PeakConformanceTime - Earliest time next packet can be sent, based on peak rate
// LastConformanceCredits - Number of credits at LastConformanceTime
// PsFlowContext - PS's flow context value
// Stats - Per flow stats.
PS_FLOW_CONTEXT ContextInfo; NDIS_SPIN_LOCK Lock; ULONG TokenRate; ULONG Capacity; ULONG PeakRate; ULONG MinPolicedUnit; ULONG Mode; ULONG NoConformance; LARGE_INTEGER LastConformanceTime; LARGE_INTEGER LastPeakTime; LARGE_INTEGER PeakConformanceTime; ULONG LastConformanceCredits; HANDLE PsFlowContext; #ifdef INSTRUMENT
PS_CONFORMER_STATS Stats; #endif // INSTRUMENT
} TBC_FLOW, *PTBC_FLOW;
#endif
|