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.
254 lines
5.9 KiB
254 lines
5.9 KiB
/*++
|
|
|
|
Copyright (c) 1996-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
status.c
|
|
|
|
Abstract:
|
|
|
|
status indications handled in here....
|
|
|
|
Author:
|
|
|
|
Charlie Wickham (charlwi) 20-Jun-1996
|
|
Rajesh Sundaram (rajeshsu) 01-Aug-1998.
|
|
|
|
Environment:
|
|
|
|
Kernel Mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "psched.h"
|
|
#pragma hdrstop
|
|
|
|
/* External */
|
|
|
|
/* Static */
|
|
|
|
/* Forward */
|
|
|
|
VOID
|
|
ClStatusIndication(
|
|
IN NDIS_HANDLE ProtocolBindingContext,
|
|
IN NDIS_STATUS GeneralStatus,
|
|
IN PVOID StatusBuffer,
|
|
IN UINT StatusBufferSize
|
|
);
|
|
|
|
VOID
|
|
ClStatusIndicationComplete(
|
|
IN NDIS_HANDLE BindingContext
|
|
);
|
|
|
|
/* End Forward */
|
|
|
|
|
|
VOID
|
|
ClStatusIndication(
|
|
IN NDIS_HANDLE ProtocolBindingContext,
|
|
IN NDIS_STATUS GeneralStatus,
|
|
IN PVOID StatusBuffer,
|
|
IN UINT StatusBufferSize
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called by the NIC via NdisIndicateStatus
|
|
|
|
Arguments:
|
|
|
|
See the DDK...
|
|
|
|
Return Values:
|
|
|
|
None
|
|
|
|
--*/
|
|
|
|
{
|
|
PADAPTER Adapter = (PADAPTER)ProtocolBindingContext;
|
|
NDIS_STATUS Status;
|
|
ULONG ErrorLogData[2];
|
|
PVOID Context;
|
|
|
|
PsDbgOut(DBG_TRACE,
|
|
DBG_PROTOCOL,
|
|
("(%08X) ClStatusIndication: Status %08X\n",
|
|
Adapter,
|
|
GeneralStatus));
|
|
|
|
// General rule:
|
|
// If our device is not ready, we cannot forward the status indication.
|
|
// Yes - we care about the Media connect and link speed oids. We will
|
|
// query for these OIDs when we get to D0.
|
|
//
|
|
|
|
// (i) Special case for media_status. <need to pass it up>
|
|
// Condition is that:
|
|
// (Adapter state is OFF, so we can't process it ourselves) AND
|
|
// (Status indication is about 'connect' or 'disconnect') AND
|
|
// (Adapter state is 'running') AND
|
|
// (Adapter has a binding handle for the protocol above)
|
|
// We will process fix our internal state when we wake up and go back to D0.
|
|
if( (IsDeviceStateOn(Adapter) == FALSE) &&
|
|
((GeneralStatus == NDIS_STATUS_MEDIA_CONNECT) || (GeneralStatus == NDIS_STATUS_MEDIA_DISCONNECT)) &&
|
|
(Adapter->PsMpState == AdapterStateRunning ) &&
|
|
(Adapter->PsNdisHandle != NULL) )
|
|
{
|
|
NdisMIndicateStatus(Adapter->PsNdisHandle,
|
|
GeneralStatus,
|
|
StatusBuffer,
|
|
StatusBufferSize );
|
|
|
|
return;
|
|
}
|
|
|
|
// (ii) Special case for wan-line-down: <need to process it>
|
|
// This is a special case for wan_line_down. Need to forward it even if the adapter is not in D0.
|
|
if( (IsDeviceStateOn(Adapter) == FALSE) && (GeneralStatus != NDIS_STATUS_WAN_LINE_DOWN) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
// we cannot forward status indications until we have been called in our
|
|
// MpInitialize handler. But we need to look at certain events even if we
|
|
// are not called in the MpInitialize handler. Otherwise, we could lose these
|
|
// indications.
|
|
//
|
|
|
|
switch(GeneralStatus)
|
|
{
|
|
case NDIS_STATUS_MEDIA_CONNECT:
|
|
case NDIS_STATUS_LINK_SPEED_CHANGE:
|
|
|
|
PsGetLinkSpeed(Adapter);
|
|
|
|
break;
|
|
|
|
case NDIS_STATUS_MEDIA_DISCONNECT:
|
|
|
|
//
|
|
// reset the link speed so definite rate flows can be
|
|
// admitted.
|
|
//
|
|
|
|
Adapter->RawLinkSpeed = (ULONG)UNSPECIFIED_RATE;
|
|
UpdateAdapterBandwidthParameters(Adapter);
|
|
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Our virtual adapter has not been initialized. We cannot forward this indication.
|
|
//
|
|
|
|
if(Adapter->PsMpState != AdapterStateRunning || Adapter->PsNdisHandle == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//
|
|
// For these WAN related indications, we have to send them to wanarp
|
|
// So, there is no point in looking at these if our virtual adapter has not been initialized.
|
|
//
|
|
|
|
switch(GeneralStatus)
|
|
{
|
|
case NDIS_STATUS_WAN_LINE_UP:
|
|
{
|
|
if(Adapter->ProtocolType == ARP_ETYPE_IP)
|
|
{
|
|
|
|
//
|
|
// This will call NdisMIndicateStatus, so we have to return
|
|
// directly.
|
|
//
|
|
|
|
Status = CreateInterfaceForNdisWan(Adapter,
|
|
StatusBuffer,
|
|
StatusBufferSize);
|
|
return;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case NDIS_STATUS_WAN_LINE_DOWN:
|
|
|
|
//
|
|
// NDISWAN link has been torn down.
|
|
//
|
|
if(Adapter->ProtocolType == ARP_ETYPE_IP)
|
|
{
|
|
DeleteInterfaceForNdisWan(Adapter,
|
|
StatusBuffer,
|
|
StatusBufferSize);
|
|
return;
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
//
|
|
// now indicate the status to the upper layer.
|
|
//
|
|
|
|
NdisMIndicateStatus(Adapter->PsNdisHandle,
|
|
GeneralStatus,
|
|
StatusBuffer,
|
|
StatusBufferSize );
|
|
|
|
} // ClStatusIndication
|
|
|
|
|
|
|
|
VOID
|
|
ClStatusIndicationComplete(
|
|
IN NDIS_HANDLE ProtocolBindingContext
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called by the NIC via NdisIndicateStatusComplete
|
|
|
|
Arguments:
|
|
|
|
See the DDK...
|
|
|
|
Return Values:
|
|
|
|
None
|
|
|
|
--*/
|
|
|
|
{
|
|
PADAPTER Adapter = (PADAPTER)ProtocolBindingContext;
|
|
|
|
PsDbgOut(DBG_TRACE, DBG_PROTOCOL, ("(%08X) ClStatusIndicationComplete\n", Adapter));
|
|
|
|
if ( Adapter->PsNdisHandle != NULL) {
|
|
|
|
NdisMIndicateStatusComplete( Adapter->PsNdisHandle );
|
|
}
|
|
|
|
} // ClStatusIndication
|
|
|
|
/* end status.c */
|