297 lines
8.4 KiB
C
297 lines
8.4 KiB
C
|
/*********************************************************************/
|
|||
|
/** Copyright(c) 1995 Microsoft Corporation. **/
|
|||
|
/*********************************************************************/
|
|||
|
|
|||
|
//***
|
|||
|
//
|
|||
|
// Filename: routerif.c
|
|||
|
//
|
|||
|
// Description: Handles calls to/from the router managers.
|
|||
|
//
|
|||
|
// History: May 11,1995 NarenG Created original version.
|
|||
|
//
|
|||
|
#include "ddm.h"
|
|||
|
#include "util.h"
|
|||
|
#include "objects.h"
|
|||
|
#include "routerif.h"
|
|||
|
#include "rasapiif.h"
|
|||
|
|
|||
|
//**
|
|||
|
//
|
|||
|
// Call: DDMConnectInterface
|
|||
|
//
|
|||
|
// Returns: NO_ERROR - Already connected
|
|||
|
// PENDING - Connection initiated successfully
|
|||
|
// error code - Connection initiation failure
|
|||
|
//
|
|||
|
// Description: Called by a router manager to intiate a connection.
|
|||
|
//
|
|||
|
DWORD
|
|||
|
DDMConnectInterface(
|
|||
|
IN HANDLE hDDMInterface,
|
|||
|
IN DWORD dwProtocolId
|
|||
|
)
|
|||
|
{
|
|||
|
DWORD dwRetCode = NO_ERROR;
|
|||
|
ROUTER_INTERFACE_OBJECT * pIfObject;
|
|||
|
DWORD dwTransportIndex=GetTransportIndex(dwProtocolId);
|
|||
|
|
|||
|
RTASSERT( dwTransportIndex != (DWORD)-1 );
|
|||
|
|
|||
|
EnterCriticalSection( &(gblpInterfaceTable->CriticalSection) );
|
|||
|
|
|||
|
do
|
|||
|
{
|
|||
|
pIfObject = IfObjectGetPointer( hDDMInterface );
|
|||
|
|
|||
|
if ( pIfObject == (ROUTER_INTERFACE_OBJECT *)NULL )
|
|||
|
{
|
|||
|
dwRetCode = ERROR_INVALID_HANDLE;
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
DDM_PRINT( gblDDMConfigInfo.dwTraceId, TRACE_FSM,
|
|||
|
"DDMConnectInterface:Called by protocol=0x%x,State=%d,Interface=%ws",
|
|||
|
dwProtocolId, pIfObject->State, pIfObject->lpwsInterfaceName );
|
|||
|
|
|||
|
switch( pIfObject->State )
|
|||
|
{
|
|||
|
case RISTATE_CONNECTED:
|
|||
|
|
|||
|
if ( pIfObject->Transport[dwTransportIndex].fState &
|
|||
|
RITRANSPORT_CONNECTED )
|
|||
|
{
|
|||
|
dwRetCode = ERROR_ALREADY_CONNECTED;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
dwRetCode = ERROR_PROTOCOL_NOT_CONFIGURED;
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case RISTATE_CONNECTING:
|
|||
|
|
|||
|
dwRetCode = PENDING;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case RISTATE_DISCONNECTED:
|
|||
|
|
|||
|
//
|
|||
|
// Initiate a connection
|
|||
|
//
|
|||
|
|
|||
|
dwRetCode = RasConnectionInitiate( pIfObject, FALSE );
|
|||
|
|
|||
|
DDM_PRINT( gblDDMConfigInfo.dwTraceId, TRACE_FSM,
|
|||
|
"RasConnectionInitiate: To %ws dwRetCode=%d",
|
|||
|
pIfObject->lpwsInterfaceName, dwRetCode );
|
|||
|
|
|||
|
if ( dwRetCode == NO_ERROR )
|
|||
|
{
|
|||
|
dwRetCode = PENDING;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
LPWSTR lpwsAudit[1];
|
|||
|
|
|||
|
lpwsAudit[0] = pIfObject->lpwsInterfaceName;
|
|||
|
|
|||
|
DDMLogErrorString( ROUTERLOG_CONNECTION_FAILURE,
|
|||
|
1, lpwsAudit, dwRetCode, 1 );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
} while( FALSE );
|
|||
|
|
|||
|
LeaveCriticalSection( &(gblpInterfaceTable->CriticalSection) );
|
|||
|
|
|||
|
DDM_PRINT( gblDDMConfigInfo.dwTraceId, TRACE_FSM,
|
|||
|
"DDMConnectInterface: dwRetCode=%d", dwRetCode );
|
|||
|
|
|||
|
return( dwRetCode );
|
|||
|
}
|
|||
|
|
|||
|
//**
|
|||
|
//
|
|||
|
// Call: DDMDisconnectInterface
|
|||
|
//
|
|||
|
// Returns: NO_ERROR - Already disconnected
|
|||
|
// PENDING - Disconnection initiated successfully
|
|||
|
// error code - Disconnection initiation failure
|
|||
|
//
|
|||
|
// Description: Called by a router manager to intiate a disconnection.
|
|||
|
//
|
|||
|
DWORD
|
|||
|
DDMDisconnectInterface(
|
|||
|
IN HANDLE hDDMInterface,
|
|||
|
IN DWORD dwProtocolId
|
|||
|
)
|
|||
|
{
|
|||
|
DWORD dwRetCode = NO_ERROR;
|
|||
|
ROUTER_INTERFACE_OBJECT * pIfObject;
|
|||
|
HCONN hConnection;
|
|||
|
DWORD dwTransportIndex=GetTransportIndex(dwProtocolId);
|
|||
|
PCONNECTION_OBJECT pConnObj;
|
|||
|
|
|||
|
EnterCriticalSection( &(gblDeviceTable.CriticalSection) );
|
|||
|
|
|||
|
EnterCriticalSection( &(gblpInterfaceTable->CriticalSection) );
|
|||
|
|
|||
|
do
|
|||
|
{
|
|||
|
pIfObject = IfObjectGetPointer( hDDMInterface );
|
|||
|
|
|||
|
if ( pIfObject == (ROUTER_INTERFACE_OBJECT *)NULL )
|
|||
|
{
|
|||
|
dwRetCode = ERROR_INVALID_HANDLE;
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
DDM_PRINT( gblDDMConfigInfo.dwTraceId, TRACE_FSM,
|
|||
|
"DDMDisconnectInterface:Called by protocol=0x%x,State=%d,Interface=%ws",
|
|||
|
dwProtocolId, pIfObject->State, pIfObject->lpwsInterfaceName );
|
|||
|
|
|||
|
if ( dwTransportIndex != -1 )
|
|||
|
{
|
|||
|
pIfObject->Transport[dwTransportIndex].fState &=
|
|||
|
~RITRANSPORT_CONNECTED;
|
|||
|
}
|
|||
|
|
|||
|
switch( pIfObject->State )
|
|||
|
{
|
|||
|
|
|||
|
case RISTATE_DISCONNECTED:
|
|||
|
|
|||
|
//
|
|||
|
// Already disconnected
|
|||
|
//
|
|||
|
|
|||
|
dwRetCode = NO_ERROR;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case RISTATE_CONNECTING:
|
|||
|
|
|||
|
//
|
|||
|
// Disconnect only if all transports are disconnected
|
|||
|
//
|
|||
|
|
|||
|
if ( !IfObjectAreAllTransportsDisconnected( pIfObject ) )
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Abort locally initiated connections
|
|||
|
//
|
|||
|
|
|||
|
if ( pIfObject->fFlags & IFFLAG_LOCALLY_INITIATED )
|
|||
|
{
|
|||
|
pIfObject->fFlags |= IFFLAG_DISCONNECT_INITIATED;
|
|||
|
|
|||
|
if ( pIfObject->hRasConn != (HRASCONN)NULL )
|
|||
|
{
|
|||
|
DDM_PRINT( gblDDMConfigInfo.dwTraceId, TRACE_FSM,
|
|||
|
"DDMDisconnectInterface: %d hanging up 0x%x",
|
|||
|
__LINE__,
|
|||
|
pIfObject->hRasConn);
|
|||
|
RasHangUp( pIfObject->hRasConn );
|
|||
|
}
|
|||
|
|
|||
|
IfObjectDisconnected( pIfObject );
|
|||
|
|
|||
|
//
|
|||
|
// We need to notify router managers that the connection has
|
|||
|
// failed since the administrator has cancelled the connection
|
|||
|
// while in connecting state. This is usually called in the
|
|||
|
// RasConnectCallback routine, but we my not be actually
|
|||
|
// connecting at this time so we cannot rely on the callback
|
|||
|
// to do this.
|
|||
|
//
|
|||
|
|
|||
|
IfObjectNotifyOfReachabilityChange(
|
|||
|
pIfObject,
|
|||
|
FALSE,
|
|||
|
INTERFACE_CONNECTION_FAILURE );
|
|||
|
|
|||
|
//
|
|||
|
// Immediately go back to reachable state since it was the
|
|||
|
// admin that disconnected the line
|
|||
|
//
|
|||
|
|
|||
|
IfObjectNotifyOfReachabilityChange(
|
|||
|
pIfObject,
|
|||
|
TRUE,
|
|||
|
INTERFACE_CONNECTION_FAILURE );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//
|
|||
|
// Not yet connected, we do not support abort
|
|||
|
//
|
|||
|
|
|||
|
dwRetCode = ERROR_INTERFACE_NOT_CONNECTED;
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case RISTATE_CONNECTED:
|
|||
|
|
|||
|
//
|
|||
|
// Initiate a disconnection if all other routers are disconnected
|
|||
|
//
|
|||
|
|
|||
|
if ( !IfObjectAreAllTransportsDisconnected( pIfObject ) )
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if ( pIfObject->fFlags & IFFLAG_LOCALLY_INITIATED )
|
|||
|
{
|
|||
|
pIfObject->fFlags |= IFFLAG_DISCONNECT_INITIATED;
|
|||
|
|
|||
|
DDM_PRINT( gblDDMConfigInfo.dwTraceId, TRACE_FSM,
|
|||
|
"DDMDisconnectInterface: %d disconnecting 0x%x",
|
|||
|
__LINE__, pIfObject->hRasConn);
|
|||
|
|
|||
|
RasHangUp( pIfObject->hRasConn );
|
|||
|
}
|
|||
|
|
|||
|
pConnObj = ConnObjGetPointer( pIfObject->hConnection );
|
|||
|
|
|||
|
if ( pConnObj != (PCONNECTION_OBJECT)NULL )
|
|||
|
{
|
|||
|
if((pIfObject->fFlags & IFFLAG_DISCONNECT_INITIATED) &&
|
|||
|
(pIfObject->fFlags & IFFLAG_LOCALLY_INITIATED))
|
|||
|
{
|
|||
|
pConnObj->fFlags |= CONN_OBJ_DISCONNECT_INITIATED;
|
|||
|
}
|
|||
|
|
|||
|
DDM_PRINT( gblDDMConfigInfo.dwTraceId, TRACE_FSM,
|
|||
|
"DDMDisconnectInterface: disconnecting connobj");
|
|||
|
|
|||
|
ConnObjDisconnect( pConnObj );
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
} while( FALSE );
|
|||
|
|
|||
|
LeaveCriticalSection( &(gblpInterfaceTable->CriticalSection) );
|
|||
|
|
|||
|
LeaveCriticalSection( &(gblDeviceTable.CriticalSection) );
|
|||
|
|
|||
|
DDM_PRINT( gblDDMConfigInfo.dwTraceId, TRACE_FSM,
|
|||
|
"DDMDisconnectInterface: dwRetCode=%d", dwRetCode );
|
|||
|
|
|||
|
return( dwRetCode );
|
|||
|
}
|