/*++ 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; }