556 lines
11 KiB
C
556 lines
11 KiB
C
/*++
|
||
|
||
Copyright (c) 1996-1999 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
PsStub.c
|
||
|
||
Abstract:
|
||
|
||
Scheduler stub. This module is the terminating module in the
|
||
scheduling component stack. It just forwards packets on to the
|
||
lower MP.
|
||
|
||
Author:
|
||
|
||
|
||
Environment:
|
||
|
||
Kernel Mode
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "psched.h"
|
||
|
||
#pragma hdrstop
|
||
|
||
// The stub's pipe information
|
||
|
||
typedef struct _PSSTUB_PIPE
|
||
{
|
||
// ContextInfo - Generic context info
|
||
// Adapter - Pointer to adapter struct
|
||
|
||
PS_PIPE_CONTEXT ContextInfo;
|
||
PADAPTER Adapter;
|
||
PSU_SEND_COMPLETE SendComplete;
|
||
PPS_PIPE_CONTEXT SendCompletePipeContext;
|
||
|
||
|
||
} PSSTUB_PIPE, *PPSSTUB_PIPE;
|
||
|
||
// The stub's flow information
|
||
|
||
typedef struct _PSSTUB_FLOW {
|
||
|
||
// ContextInfo - Generic context info
|
||
// AdapterVc - Pointer to adapter VC struct
|
||
|
||
PS_FLOW_CONTEXT ContextInfo;
|
||
PGPC_CLIENT_VC AdapterVc;
|
||
} PSSTUB_FLOW, *PPSSTUB_FLOW;
|
||
|
||
|
||
/* External */
|
||
|
||
/* Static */
|
||
|
||
/* Forward */
|
||
|
||
NDIS_STATUS
|
||
PsStubInitializePipe (
|
||
IN HANDLE PsPipeContext,
|
||
IN PPS_PIPE_PARAMETERS PipeParameters,
|
||
IN PPS_PIPE_CONTEXT ComponentPipeContext,
|
||
IN PPS_PROCS PsProcs,
|
||
IN PPS_UPCALLS Upcalls
|
||
);
|
||
|
||
NDIS_STATUS
|
||
PsStubModifyPipe (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN PPS_PIPE_PARAMETERS PipeParameters
|
||
);
|
||
|
||
VOID
|
||
PsStubDeletePipe (
|
||
IN PPS_PIPE_CONTEXT PipeContext
|
||
);
|
||
|
||
NDIS_STATUS
|
||
PsStubCreateFlow (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN HANDLE PsFlowContext,
|
||
IN PCO_CALL_PARAMETERS CallParameters,
|
||
IN PPS_FLOW_CONTEXT ComponentFlowContext
|
||
);
|
||
|
||
NDIS_STATUS
|
||
PsStubModifyFlow (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN PPS_FLOW_CONTEXT FlowContext,
|
||
IN PCO_CALL_PARAMETERS CallParameters
|
||
);
|
||
|
||
VOID
|
||
PsStubDeleteFlow (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN PPS_FLOW_CONTEXT FlowContext
|
||
);
|
||
|
||
VOID
|
||
PsStubEmptyFlow (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN PPS_FLOW_CONTEXT FlowContext
|
||
);
|
||
|
||
NDIS_STATUS
|
||
PsStubCreateClassMap (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN HANDLE PsClassMapContext,
|
||
IN PTC_CLASS_MAP_FLOW ClassMap,
|
||
IN PPS_CLASS_MAP_CONTEXT ComponentClassMapContext);
|
||
|
||
NDIS_STATUS
|
||
PsStubDeleteClassMap (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN PPS_CLASS_MAP_CONTEXT ComponentClassMapContext);
|
||
|
||
BOOLEAN
|
||
PsStubSubmitPacket (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN PPS_FLOW_CONTEXT FlowContext,
|
||
IN PPS_CLASS_MAP_CONTEXT ClassMapContext,
|
||
IN PPACKET_INFO_BLOCK Packet
|
||
);
|
||
|
||
VOID
|
||
PsStubSetInformation (
|
||
IN PPS_PIPE_CONTEXT ComponentPipeContext,
|
||
IN PPS_FLOW_CONTEXT ComponentFlowContext,
|
||
IN NDIS_OID Oid,
|
||
IN ULONG Len,
|
||
IN PVOID Data);
|
||
|
||
VOID
|
||
PsStubQueryInformation (
|
||
IN PPS_PIPE_CONTEXT ComponentPipeContext,
|
||
IN PPS_FLOW_CONTEXT ComponentFlowContext,
|
||
IN NDIS_OID Oid,
|
||
IN ULONG Len,
|
||
IN PVOID Data,
|
||
IN OUT PULONG BytesWritten,
|
||
IN OUT PULONG BytesNeeded,
|
||
IN OUT PNDIS_STATUS Status);
|
||
|
||
/* End Forward */
|
||
|
||
|
||
VOID
|
||
InitializeSchedulerStub(
|
||
PPSI_INFO Info)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Initialization routine for the stub. This routine just
|
||
fills in the PSI_INFO struct and returns.
|
||
|
||
Arguments:
|
||
|
||
Info - Pointer to component interface info struct
|
||
|
||
Return Values:
|
||
|
||
NDIS_STATUS_SUCCESS
|
||
|
||
--*/
|
||
{
|
||
Info->PipeContextLength = sizeof(PSSTUB_PIPE);
|
||
Info->FlowContextLength = sizeof(PSSTUB_FLOW);
|
||
Info->ClassMapContextLength = sizeof(PS_CLASS_MAP_CONTEXT);
|
||
Info->InitializePipe = PsStubInitializePipe;
|
||
Info->ModifyPipe = PsStubModifyPipe;
|
||
Info->DeletePipe = PsStubDeletePipe;
|
||
Info->CreateFlow = PsStubCreateFlow;
|
||
Info->ModifyFlow = PsStubModifyFlow;
|
||
Info->DeleteFlow = PsStubDeleteFlow;
|
||
Info->EmptyFlow = PsStubEmptyFlow;
|
||
Info->CreateClassMap = PsStubCreateClassMap;
|
||
Info->DeleteClassMap = PsStubDeleteClassMap;
|
||
Info->SubmitPacket = PsStubSubmitPacket;
|
||
Info->ReceivePacket = NULL;
|
||
Info->ReceiveIndication = NULL;
|
||
Info->SetInformation = PsStubSetInformation;
|
||
Info->QueryInformation = PsStubQueryInformation;
|
||
|
||
} // InitializeSchedulerStub
|
||
|
||
|
||
|
||
//
|
||
// Unload routine: currently do nothing
|
||
//
|
||
void
|
||
UnloadPsStub()
|
||
{
|
||
|
||
}
|
||
|
||
|
||
|
||
VOID
|
||
CleanupSchedulerStub(
|
||
VOID)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Cleanup routine for stub.
|
||
|
||
Arguments:
|
||
|
||
Return Values:
|
||
|
||
NDIS_STATUS_SUCCESS
|
||
|
||
--*/
|
||
{
|
||
} // CleanupSchedulerStub
|
||
|
||
|
||
|
||
NDIS_STATUS
|
||
PsStubInitializePipe (
|
||
IN HANDLE PsPipeContext,
|
||
IN PPS_PIPE_PARAMETERS PipeParameters,
|
||
IN PPS_PIPE_CONTEXT ComponentPipeContext,
|
||
IN PPS_PROCS PsProcs,
|
||
IN PPS_UPCALLS Upcalls
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Pipe initialization routine for stub.
|
||
|
||
Arguments:
|
||
|
||
PsPipeContext - PS pipe context value
|
||
PipeParameters - Pointer to pipe parameters
|
||
ComponentPipeContext - Pointer to this component's context area
|
||
PsProcs - PS's support routines
|
||
Upcalls - Previous component's upcall table
|
||
|
||
Return Values:
|
||
|
||
NDIS_STATUS_SUCCESS
|
||
|
||
--*/
|
||
{
|
||
PPSSTUB_PIPE Pipe = (PPSSTUB_PIPE)ComponentPipeContext;
|
||
|
||
Pipe->Adapter = (PADAPTER)PsPipeContext;
|
||
|
||
if (Upcalls != NULL) {
|
||
Pipe->SendComplete = Upcalls->SendComplete;
|
||
Pipe->SendCompletePipeContext = Upcalls->PipeContext;
|
||
}
|
||
else {
|
||
Pipe->SendComplete = NULL;
|
||
}
|
||
|
||
return NDIS_STATUS_SUCCESS;
|
||
|
||
} // PsStubInitializePipe
|
||
|
||
|
||
|
||
NDIS_STATUS
|
||
PsStubModifyPipe (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN PPS_PIPE_PARAMETERS PipeParameters
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Pipe parameter modification routine for stub.
|
||
|
||
Arguments:
|
||
|
||
PipeContext - Pointer to this component's pipe context area
|
||
PipeParameters - Pointer to pipe parameters
|
||
|
||
Return Values:
|
||
|
||
NDIS_STATUS_SUCCESS
|
||
|
||
--*/
|
||
{
|
||
PPSSTUB_PIPE Pipe = (PPSSTUB_PIPE)PipeContext;
|
||
|
||
return NDIS_STATUS_SUCCESS;
|
||
|
||
} // PsStubModifyPipe
|
||
|
||
|
||
|
||
VOID
|
||
PsStubDeletePipe (
|
||
IN PPS_PIPE_CONTEXT PipeContext
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Pipe removal routine for stub.
|
||
|
||
Arguments:
|
||
|
||
PipeContext - Pointer to this component's pipe context area
|
||
|
||
Return Values:
|
||
|
||
--*/
|
||
{
|
||
|
||
} // PsStubDeletePipe
|
||
|
||
|
||
|
||
NDIS_STATUS
|
||
PsStubCreateFlow (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN HANDLE PsFlowContext,
|
||
IN PCO_CALL_PARAMETERS CallParameters,
|
||
IN PPS_FLOW_CONTEXT ComponentFlowContext
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Flow creation routine for stub.
|
||
|
||
Arguments:
|
||
|
||
PipeContext - Pointer to this component's pipe context area
|
||
PsFlowContext - PS flow context value
|
||
CallParameters - Pointer to call parameters for flow
|
||
ComponentFlowContext - Pointer to this component's flow context area
|
||
|
||
Return Values:
|
||
|
||
NDIS_STATUS_SUCCESS
|
||
|
||
--*/
|
||
{
|
||
PPSSTUB_PIPE Pipe = (PPSSTUB_PIPE)PipeContext;
|
||
PPSSTUB_FLOW Flow = (PPSSTUB_FLOW)ComponentFlowContext;
|
||
|
||
Flow->AdapterVc = (PGPC_CLIENT_VC)PsFlowContext;
|
||
|
||
Flow->AdapterVc->SendComplete = Pipe->SendComplete;
|
||
Flow->AdapterVc->SendCompletePipeContext = Pipe->SendCompletePipeContext;
|
||
|
||
return NDIS_STATUS_SUCCESS;
|
||
|
||
} // PsStubCreateFlow
|
||
|
||
|
||
|
||
NDIS_STATUS
|
||
PsStubModifyFlow (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN PPS_FLOW_CONTEXT FlowContext,
|
||
IN PCO_CALL_PARAMETERS CallParameters
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Flow modification routine for stub.
|
||
|
||
Arguments:
|
||
|
||
PipeContext - Pointer to this component's pipe context area
|
||
FlowContext - Pointer to this component's flow context area
|
||
CallParameters - Pointer to call parameters for flow
|
||
|
||
Return Values:
|
||
|
||
NDIS_STATUS_SUCCESS
|
||
|
||
--*/
|
||
{
|
||
return NDIS_STATUS_SUCCESS;
|
||
|
||
} // PsStubModifyFlow
|
||
|
||
|
||
|
||
VOID
|
||
PsStubDeleteFlow (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN PPS_FLOW_CONTEXT FlowContext
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Flow removal routine for token bucket conformer.
|
||
|
||
Arguments:
|
||
|
||
PipeContext - Pointer to this component's pipe context area
|
||
FlowContext - Pointer to this component's flow context area
|
||
|
||
Return Values:
|
||
|
||
--*/
|
||
{
|
||
|
||
} // PsStubDeleteFlow
|
||
|
||
|
||
VOID
|
||
PsStubEmptyFlow (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN PPS_FLOW_CONTEXT FlowContext
|
||
)
|
||
{
|
||
|
||
}
|
||
|
||
|
||
NDIS_STATUS
|
||
PsStubCreateClassMap (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN HANDLE PsClassMapContext,
|
||
IN PTC_CLASS_MAP_FLOW ClassMap,
|
||
IN PPS_CLASS_MAP_CONTEXT ComponentClassMapContext)
|
||
{
|
||
return NDIS_STATUS_SUCCESS;
|
||
}
|
||
|
||
|
||
NDIS_STATUS
|
||
PsStubDeleteClassMap (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN PPS_CLASS_MAP_CONTEXT ComponentClassMapContext)
|
||
{
|
||
return NDIS_STATUS_SUCCESS;
|
||
}
|
||
|
||
|
||
BOOLEAN
|
||
PsStubSubmitPacket (
|
||
IN PPS_PIPE_CONTEXT PipeContext,
|
||
IN PPS_FLOW_CONTEXT FlowContext,
|
||
IN PPS_CLASS_MAP_CONTEXT ClassMapContext,
|
||
IN PPACKET_INFO_BLOCK PacketInfo
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Packet submission routine for stub.
|
||
|
||
Arguments:
|
||
|
||
PipeContext - Pointer to this component's pipe context area
|
||
FlowContext - Pointer to this component's flow context area
|
||
Packet - Pointer to packet
|
||
|
||
Return Values:
|
||
|
||
NDIS_ATATUS_SUCCESS
|
||
|
||
--*/
|
||
{
|
||
PPSSTUB_FLOW Flow = (PPSSTUB_FLOW)FlowContext;
|
||
PGPC_CLIENT_VC AdapterVc = Flow->AdapterVc;
|
||
PADAPTER Adapter = AdapterVc->Adapter;
|
||
PPS_SEND_PACKET_CONTEXT PktContext;
|
||
LARGE_INTEGER PacketLength;
|
||
PNDIS_PACKET Packet = PacketInfo->NdisPacket;
|
||
|
||
PktContext = CONTAINING_RECORD(PacketInfo, PS_SEND_PACKET_CONTEXT, Info);
|
||
PacketLength.QuadPart = (LONGLONG)PktContext->Info.PacketLength;
|
||
|
||
//
|
||
// update flow stats
|
||
//
|
||
|
||
AdapterVc->Stats.BytesTransmitted.QuadPart += PacketLength.QuadPart;
|
||
|
||
AdapterVc->Stats.PacketsTransmitted ++;
|
||
|
||
|
||
if(Adapter->MediaType != NdisMediumWan)
|
||
{
|
||
NdisSendPackets(Adapter->LowerMpHandle, &Packet, 1);
|
||
}
|
||
else{
|
||
|
||
//
|
||
// If it didn't have a VC, we wouldn't have called
|
||
// through the PS.
|
||
//
|
||
|
||
if(AdapterVc->NdisWanVcHandle)
|
||
{
|
||
NdisCoSendPackets(AdapterVc->NdisWanVcHandle,
|
||
&Packet,
|
||
1);
|
||
}
|
||
else
|
||
{
|
||
NdisSendPackets(Adapter->LowerMpHandle,
|
||
&Packet,
|
||
1);
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
|
||
} // PsStubSubmitPacket
|
||
|
||
|
||
VOID
|
||
PsStubSetInformation (
|
||
IN PPS_PIPE_CONTEXT ComponentPipeContext,
|
||
IN PPS_FLOW_CONTEXT ComponentFlowContext,
|
||
IN NDIS_OID Oid,
|
||
IN ULONG Len,
|
||
IN PVOID Data)
|
||
{
|
||
}
|
||
|
||
|
||
VOID
|
||
PsStubQueryInformation (
|
||
IN PPS_PIPE_CONTEXT ComponentPipeContext,
|
||
IN PPS_FLOW_CONTEXT ComponentFlowContext,
|
||
IN NDIS_OID Oid,
|
||
IN ULONG Len,
|
||
IN PVOID Data,
|
||
IN OUT PULONG BytesWritten,
|
||
IN OUT PULONG BytesNeeded,
|
||
IN OUT PNDIS_STATUS Status)
|
||
{
|
||
*Status = NDIS_STATUS_SUCCESS;
|
||
}
|