679 lines
18 KiB
C
679 lines
18 KiB
C
/* Copyright (c) 1993, Microsoft Corporation, all rights reserved
|
||
**
|
||
** rasppp.c
|
||
** Remote Access PPP APIs
|
||
**
|
||
** 11/15/93 Steve Cobb
|
||
*/
|
||
#include <nt.h>
|
||
#include <ntrtl.h>
|
||
#include <nturtl.h>
|
||
|
||
#include <windows.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <wchar.h>
|
||
|
||
#include <ctype.h>
|
||
#include <stdarg.h>
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <lmcons.h>
|
||
#include <rasauth.h>
|
||
#include <rasman.h>
|
||
#include <rasppp.h>
|
||
#include <ddmif.h>
|
||
#include <rtutils.h>
|
||
#include <mprlog.h>
|
||
#include <raserror.h>
|
||
#include <pppcp.h>
|
||
#include <ppp.h>
|
||
#include <util.h>
|
||
#include <init.h>
|
||
#include <worker.h>
|
||
#include <bap.h>
|
||
#include <raseapif.h>
|
||
|
||
//**
|
||
//
|
||
// Call: StartPPP
|
||
//
|
||
// Returns: NO_ERROR - Success.
|
||
// Non zero return code - Failure
|
||
//
|
||
// Description:
|
||
//
|
||
DWORD APIENTRY
|
||
StartPPP(
|
||
DWORD NumPorts
|
||
)
|
||
{
|
||
DWORD dwRetCode;
|
||
|
||
//
|
||
// Read registry info, load CP DLLS, initialize globals etc.
|
||
//
|
||
|
||
PcbTable.NumPcbBuckets = ((DWORD)NumPorts > MAX_NUMBER_OF_PCB_BUCKETS)
|
||
? MAX_NUMBER_OF_PCB_BUCKETS
|
||
: (DWORD)NumPorts;
|
||
|
||
dwRetCode = InitializePPP();
|
||
|
||
if ( dwRetCode != NO_ERROR )
|
||
{
|
||
PPPCleanUp();
|
||
}
|
||
else
|
||
{
|
||
PppLog( 2, "PPP Initialized successfully." );
|
||
}
|
||
|
||
return( dwRetCode );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: StopPPP
|
||
//
|
||
// Returns: NO_ERROR - Success.
|
||
// Non zero return code - Failure
|
||
//
|
||
DWORD APIENTRY
|
||
StopPPP(
|
||
HANDLE hEventStopPPP
|
||
)
|
||
{
|
||
PCB_WORK_ITEM * pWorkItem;
|
||
|
||
PppLog( 2, "StopPPP called" );
|
||
|
||
//
|
||
// Insert shutdown event
|
||
//
|
||
|
||
pWorkItem = (PCB_WORK_ITEM*)LOCAL_ALLOC(LPTR,sizeof(PCB_WORK_ITEM));
|
||
|
||
if ( pWorkItem == (PCB_WORK_ITEM *)NULL )
|
||
{
|
||
return( GetLastError() );
|
||
}
|
||
|
||
pWorkItem->Process = ProcessStopPPP;
|
||
|
||
pWorkItem->hEvent = hEventStopPPP;
|
||
|
||
InsertWorkItemInQ( pWorkItem );
|
||
|
||
return( NO_ERROR );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: SendPPPMessageToEngine
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// non-zero - FAILURE
|
||
//
|
||
// Description: Will create a PCB_WORK_ITEM from a PPPE_MESSAGE structure
|
||
// received from client or rassrv and Send it to the engine.
|
||
//
|
||
DWORD APIENTRY
|
||
SendPPPMessageToEngine(
|
||
IN PPPE_MESSAGE* pMessage
|
||
)
|
||
{
|
||
PCB_WORK_ITEM * pWorkItem = (PCB_WORK_ITEM *)LOCAL_ALLOC(
|
||
LPTR,
|
||
sizeof(PCB_WORK_ITEM));
|
||
|
||
if ( pWorkItem == (PCB_WORK_ITEM *)NULL )
|
||
{
|
||
LogPPPEvent( ROUTERLOG_NOT_ENOUGH_MEMORY, 0 );
|
||
|
||
return( GetLastError() );
|
||
}
|
||
|
||
//
|
||
// Set up PCB_WORK_ITEM structure from the PPPE_MESSAGE
|
||
//
|
||
|
||
pWorkItem->hPort = pMessage->hPort;
|
||
|
||
switch( pMessage->dwMsgId )
|
||
{
|
||
case PPPEMSG_Start:
|
||
|
||
pWorkItem->Process = ProcessLineUp;
|
||
pWorkItem->fServer = FALSE;
|
||
pWorkItem->PppMsg.Start = pMessage->ExtraInfo.Start;
|
||
//Create a seed for encoding the password
|
||
pMessage->ExtraInfo.Start.chSeed = pWorkItem->PppMsg.Start.chSeed = GEN_RAND_ENCODE_SEED;
|
||
|
||
PppLog( 2, "PPPEMSG_Start recvd, d=%s, hPort=%d,callback=%d,"
|
||
"mask=%x,IfType=%d",
|
||
pMessage->ExtraInfo.Start.szDomain,
|
||
pWorkItem->hPort,
|
||
pMessage->ExtraInfo.Start.fThisIsACallback,
|
||
pMessage->ExtraInfo.Start.ConfigInfo.dwConfigMask,
|
||
pMessage->ExtraInfo.Start.PppInterfaceInfo.IfType );
|
||
|
||
EncodePw( pWorkItem->PppMsg.Start.chSeed, pWorkItem->PppMsg.Start.szPassword );
|
||
EncodePw( pMessage->ExtraInfo.Start.chSeed, pMessage->ExtraInfo.Start.szPassword );
|
||
|
||
break;
|
||
|
||
case PPPEMSG_Stop:
|
||
|
||
PppLog( 2, "PPPEMSG_Stop recvd\r\n" );
|
||
|
||
pWorkItem->Process = ProcessClose;
|
||
pWorkItem->PppMsg.PppStop = pMessage->ExtraInfo.Stop;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_Callback:
|
||
|
||
PppLog( 2, "PPPEMSG_Callback recvd, hPort=%d\r\n",
|
||
pWorkItem->hPort);
|
||
|
||
pWorkItem->Process = ProcessGetCallbackNumberFromUser;
|
||
pWorkItem->PppMsg.Callback = pMessage->ExtraInfo.Callback;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_ChangePw:
|
||
|
||
PppLog( 2, "PPPEMSG_ChangePw recvd, hPort=%d\r\n",
|
||
pWorkItem->hPort);
|
||
|
||
pWorkItem->Process = ProcessChangePassword;
|
||
pWorkItem->PppMsg.ChangePw = pMessage->ExtraInfo.ChangePw;
|
||
pWorkItem->PppMsg.ChangePw.chSeed = pMessage->ExtraInfo.ChangePw.chSeed = GEN_RAND_ENCODE_SEED;
|
||
|
||
EncodePw( pWorkItem->PppMsg.ChangePw.chSeed, pWorkItem->PppMsg.ChangePw.szNewPassword );
|
||
EncodePw( pMessage->ExtraInfo.ChangePw.chSeed, pMessage->ExtraInfo.ChangePw.szNewPassword );
|
||
EncodePw( pWorkItem->PppMsg.ChangePw.chSeed, pWorkItem->PppMsg.ChangePw.szOldPassword );
|
||
EncodePw( pMessage->ExtraInfo.ChangePw.chSeed, pMessage->ExtraInfo.ChangePw.szOldPassword );
|
||
|
||
break;
|
||
|
||
case PPPEMSG_Retry:
|
||
|
||
PppLog( 2, "PPPEMSG_Retry recvd hPort=%d,u=%s",
|
||
pWorkItem->hPort,
|
||
pMessage->ExtraInfo.Start.szUserName );
|
||
|
||
pWorkItem->Process = ProcessRetryPassword;
|
||
pWorkItem->PppMsg.Retry = pMessage->ExtraInfo.Retry;
|
||
pWorkItem->PppMsg.Retry.chSeed = pMessage->ExtraInfo.Retry.chSeed = GEN_RAND_ENCODE_SEED;
|
||
|
||
EncodePw( pWorkItem->PppMsg.Retry.chSeed, pWorkItem->PppMsg.Retry.szPassword );
|
||
EncodePw( pMessage->ExtraInfo.Retry.chSeed, pMessage->ExtraInfo.Retry.szPassword );
|
||
|
||
break;
|
||
|
||
case PPPEMSG_Receive:
|
||
|
||
pWorkItem->Process = ProcessReceive;
|
||
pWorkItem->PacketLen = pMessage->ExtraInfo.Receive.dwNumBytes;
|
||
|
||
PppLog( 2, "Packet received (%d bytes) for hPort %d",
|
||
pWorkItem->PacketLen, pWorkItem->hPort );
|
||
|
||
pWorkItem->pPacketBuf = (PPP_PACKET *)LOCAL_ALLOC(LPTR,
|
||
pWorkItem->PacketLen);
|
||
if ( pWorkItem->pPacketBuf == (PPP_PACKET*)NULL )
|
||
{
|
||
LogPPPEvent( ROUTERLOG_NOT_ENOUGH_MEMORY, 0 );
|
||
LOCAL_FREE( pWorkItem );
|
||
|
||
return( GetLastError() );
|
||
}
|
||
|
||
CopyMemory( pWorkItem->pPacketBuf,
|
||
pMessage->ExtraInfo.Receive.pbBuffer,
|
||
pWorkItem->PacketLen );
|
||
|
||
break;
|
||
|
||
case PPPEMSG_LineDown:
|
||
|
||
PppLog( 2, "PPPEMSG_LineDown recvd, hPort=%d\r\n",
|
||
pWorkItem->hPort);
|
||
|
||
pWorkItem->Process = ProcessLineDown;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_ListenResult:
|
||
|
||
pWorkItem->Process = ProcessRasPortListenEvent;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_BapEvent:
|
||
|
||
BapTrace( "Threshold event on HCONN 0x%x. Type: %s, Threshold: %s",
|
||
pMessage->hConnection,
|
||
pMessage->ExtraInfo.BapEvent.fTransmit ? "transmit" : "receive",
|
||
pMessage->ExtraInfo.BapEvent.fAdd ? "upper" : "lower");
|
||
|
||
pWorkItem->Process = ProcessThresholdEvent;
|
||
pWorkItem->hConnection = pMessage->hConnection;
|
||
pWorkItem->PppMsg.BapEvent = pMessage->ExtraInfo.BapEvent;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_DdmStart:
|
||
|
||
pWorkItem->Process = ProcessLineUp;
|
||
pWorkItem->fServer = TRUE;
|
||
pWorkItem->PppMsg.DdmStart = pMessage->ExtraInfo.DdmStart;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_DdmCallbackDone:
|
||
|
||
PppLog( 2, "PPPEMSG_DdmCallbackDone recvd\r\n" );
|
||
|
||
pWorkItem->Process = ProcessCallbackDone;
|
||
pWorkItem->fServer = TRUE;
|
||
pWorkItem->PppMsg.CallbackDone = pMessage->ExtraInfo.CallbackDone;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_DdmInterfaceInfo:
|
||
|
||
pWorkItem->Process = ProcessInterfaceInfo;
|
||
pWorkItem->fServer = TRUE;
|
||
pWorkItem->hConnection = pMessage->hConnection;
|
||
|
||
pWorkItem->PppMsg.InterfaceInfo = pMessage->ExtraInfo.InterfaceInfo;
|
||
|
||
PppLog(2,"PPPEMSG_DdmInterfaceInfo recvd,IPXif=%x,IPif=%x,Type=%x\r\n",
|
||
pWorkItem->PppMsg.InterfaceInfo.hIPXInterface,
|
||
pWorkItem->PppMsg.InterfaceInfo.hIPInterface,
|
||
pWorkItem->PppMsg.InterfaceInfo.IfType );
|
||
|
||
break;
|
||
|
||
case PPPEMSG_DdmBapCallbackResult:
|
||
|
||
pWorkItem->Process = ProcessCallResult;
|
||
pWorkItem->hConnection = pMessage->hConnection;
|
||
pWorkItem->PppMsg.BapCallResult.dwResult =
|
||
pMessage->ExtraInfo.BapCallbackResult.dwCallbackResultCode;
|
||
pWorkItem->PppMsg.BapCallResult.hRasConn = (HRASCONN) -1;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_DhcpInform:
|
||
|
||
pWorkItem->Process = ProcessDhcpInform;
|
||
pWorkItem->hConnection = pMessage->hConnection;
|
||
pWorkItem->PppMsg.DhcpInform = pMessage->ExtraInfo.DhcpInform;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_EapUIData:
|
||
|
||
pWorkItem->Process = ProcessEapUIData;
|
||
pWorkItem->PppMsg.EapUIData = pMessage->ExtraInfo.EapUIData;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_ProtocolEvent:
|
||
|
||
pWorkItem->Process = ProcessProtocolEvent;
|
||
pWorkItem->PppMsg.ProtocolEvent = pMessage->ExtraInfo.ProtocolEvent;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_DdmChangeNotification:
|
||
|
||
pWorkItem->Process = ProcessChangeNotification;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_IpAddressLeaseExpired:
|
||
|
||
pWorkItem->Process = ProcessIpAddressLeaseExpired;
|
||
pWorkItem->PppMsg.IpAddressLeaseExpired =
|
||
pMessage->ExtraInfo.IpAddressLeaseExpired;
|
||
|
||
break;
|
||
|
||
case PPPEMSG_PostLineDown:
|
||
pWorkItem->Process = ProcessPostLineDown;
|
||
pWorkItem->PppMsg.PostLineDown =
|
||
pMessage->ExtraInfo.PostLineDown;
|
||
break;
|
||
default:
|
||
|
||
PppLog( 2,"Unknown IPC message %d received\r\n", pMessage->dwMsgId );
|
||
|
||
LOCAL_FREE( pWorkItem );
|
||
|
||
pWorkItem = (PCB_WORK_ITEM*)NULL;
|
||
}
|
||
|
||
if ( pWorkItem != NULL )
|
||
{
|
||
InsertWorkItemInQ( pWorkItem );
|
||
}
|
||
|
||
return( NO_ERROR );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: PppDdmInit
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description: Will initialize the entry point into DDM that it will call to
|
||
// send DDM a PPP_MESSAGE
|
||
//
|
||
DWORD
|
||
PppDdmInit(
|
||
IN VOID (*SendPPPMessageToDdm)( PPP_MESSAGE * PppMsg ),
|
||
IN DWORD dwServerFlags,
|
||
IN DWORD dwLoggingLevel,
|
||
IN DWORD dwNASIpAddress,
|
||
IN BOOL fRadiusAuthentication,
|
||
IN LPVOID lpfnRasAuthProviderAuthenticateUser,
|
||
IN LPVOID lpfnRasAuthProviderFreeAttributes,
|
||
IN LPVOID lpfnRasAcctProviderStartAccounting,
|
||
IN LPVOID lpfnRasAcctProviderInterimAccounting,
|
||
IN LPVOID lpfnRasAcctProviderStopAccounting,
|
||
IN LPVOID lpfnRasAcctProviderFreeAttributes,
|
||
IN LPVOID lpfnGetNextAccountingSessionId
|
||
)
|
||
{
|
||
DWORD dwRetCode;
|
||
|
||
PppConfigInfo.SendPPPMessageToDdm = SendPPPMessageToDdm;
|
||
PppConfigInfo.ServerConfigInfo.dwConfigMask |= dwServerFlags;
|
||
PppConfigInfo.dwNASIpAddress = dwNASIpAddress;
|
||
PppConfigInfo.dwLoggingLevel = dwLoggingLevel;
|
||
|
||
if ( dwNASIpAddress == 0 )
|
||
{
|
||
DWORD dwComputerNameLen = MAX_COMPUTERNAME_LENGTH + 1;
|
||
|
||
//
|
||
// Failed to get the LOCAL IP address, used computer name instead.
|
||
//
|
||
|
||
PppConfigInfo.dwNASIpAddress = 0;
|
||
|
||
if ( !GetComputerNameA( PppConfigInfo.szNASIdentifier,
|
||
&dwComputerNameLen ) )
|
||
{
|
||
return( GetLastError() );
|
||
}
|
||
}
|
||
|
||
PppConfigInfo.fRadiusAuthenticationUsed = fRadiusAuthentication;
|
||
|
||
PppConfigInfo.RasAuthProviderFreeAttributes =
|
||
(DWORD(*)( RAS_AUTH_ATTRIBUTE *))
|
||
lpfnRasAuthProviderFreeAttributes;
|
||
|
||
PppConfigInfo.RasAuthProviderAuthenticateUser =
|
||
(DWORD(*)( RAS_AUTH_ATTRIBUTE * ,
|
||
PRAS_AUTH_ATTRIBUTE* ,
|
||
DWORD *))
|
||
lpfnRasAuthProviderAuthenticateUser;
|
||
|
||
PppConfigInfo.RasAcctProviderStartAccounting =
|
||
(DWORD(*)( RAS_AUTH_ATTRIBUTE *,
|
||
PRAS_AUTH_ATTRIBUTE*))
|
||
lpfnRasAcctProviderStartAccounting;
|
||
|
||
PppConfigInfo.RasAcctProviderInterimAccounting =
|
||
(DWORD(*)( RAS_AUTH_ATTRIBUTE * ,
|
||
PRAS_AUTH_ATTRIBUTE*))
|
||
lpfnRasAcctProviderInterimAccounting;
|
||
|
||
PppConfigInfo.RasAcctProviderStopAccounting =
|
||
(DWORD(*)( RAS_AUTH_ATTRIBUTE * ,
|
||
PRAS_AUTH_ATTRIBUTE*))
|
||
lpfnRasAcctProviderStopAccounting;
|
||
|
||
PppConfigInfo.RasAcctProviderFreeAttributes =
|
||
(DWORD(*)( RAS_AUTH_ATTRIBUTE *))
|
||
lpfnRasAcctProviderFreeAttributes;
|
||
|
||
PppConfigInfo.GetNextAccountingSessionId =
|
||
(DWORD(*)(VOID))
|
||
lpfnGetNextAccountingSessionId;
|
||
|
||
return( NO_ERROR );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: PppDdmDeInit
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description:
|
||
//
|
||
VOID
|
||
PppDdmDeInit(
|
||
VOID
|
||
)
|
||
{
|
||
return;
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: PppDdmCallbackDone
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description: Will create a PPPEMSG_DdmCallbackDone and send it to the
|
||
// worker thread of the PPP engine.
|
||
//
|
||
DWORD
|
||
PppDdmCallbackDone(
|
||
IN HPORT hPort,
|
||
IN WCHAR* pwszCallbackNumber
|
||
)
|
||
{
|
||
PPPE_MESSAGE PppMessage;
|
||
|
||
PppMessage.hPort = hPort;
|
||
PppMessage.dwMsgId = PPPEMSG_DdmCallbackDone;
|
||
|
||
wcstombs( PppMessage.ExtraInfo.CallbackDone.szCallbackNumber,
|
||
pwszCallbackNumber,
|
||
sizeof( PppMessage.ExtraInfo.CallbackDone.szCallbackNumber ) );
|
||
|
||
return( SendPPPMessageToEngine( &PppMessage ) );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: PppDdmStart
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description: Will create a PPPEMSG_DdmStart and send it to the
|
||
// worker thread of the PPP engine.
|
||
//
|
||
DWORD
|
||
PppDdmStart(
|
||
IN HPORT hPort,
|
||
IN WCHAR * wszPortName,
|
||
IN CHAR* pchFirstFrame,
|
||
IN DWORD cbFirstFrame,
|
||
IN DWORD dwAuthRetries
|
||
)
|
||
{
|
||
PPPE_MESSAGE PppMessage;
|
||
|
||
PppMessage.hPort = hPort;
|
||
PppMessage.dwMsgId = PPPEMSG_DdmStart;
|
||
|
||
PppMessage.ExtraInfo.DdmStart.dwAuthRetries = dwAuthRetries;
|
||
|
||
wcstombs( PppMessage.ExtraInfo.DdmStart.szPortName,
|
||
wszPortName,
|
||
sizeof( PppMessage.ExtraInfo.DdmStart.szPortName ) );
|
||
|
||
CopyMemory( &(PppMessage.ExtraInfo.DdmStart.achFirstFrame),
|
||
pchFirstFrame,
|
||
sizeof( PppMessage.ExtraInfo.DdmStart.achFirstFrame ) );
|
||
|
||
PppMessage.ExtraInfo.DdmStart.cbFirstFrame = cbFirstFrame;
|
||
|
||
return( SendPPPMessageToEngine( &PppMessage ) );
|
||
}
|
||
|
||
|
||
|
||
|
||
//**
|
||
//
|
||
// Call: PppStop
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description: Will create a PPPEMSG_Stop and send it to the
|
||
// worker thread of the PPP engine.
|
||
//
|
||
DWORD
|
||
PppStop(
|
||
IN HPORT hPort
|
||
)
|
||
{
|
||
PPPE_MESSAGE PppMessage;
|
||
|
||
PppLog( 2, "PppStop\r\n" );
|
||
|
||
PppMessage.hPort = hPort;
|
||
PppMessage.dwMsgId = PPPEMSG_Stop;
|
||
|
||
PppMessage.ExtraInfo.Stop.dwStopReason = NO_ERROR;
|
||
|
||
return( SendPPPMessageToEngine( &PppMessage ) );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: PppDdmStop
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description: Will create a PPPEMSG_Stop and send it to the
|
||
// worker thread of the PPP engine.
|
||
//
|
||
DWORD
|
||
PppDdmStop(
|
||
IN HPORT hPort,
|
||
IN DWORD dwStopReason
|
||
)
|
||
{
|
||
PPPE_MESSAGE PppMessage;
|
||
|
||
PppLog( 2, "PppDdmStop\r\n" );
|
||
|
||
PppMessage.hPort = hPort;
|
||
PppMessage.dwMsgId = PPPEMSG_Stop;
|
||
|
||
PppMessage.ExtraInfo.Stop.dwStopReason = dwStopReason;
|
||
|
||
return( SendPPPMessageToEngine( &PppMessage ) );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: PppDdmSendInterfaceInfo
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description: Will create a PPPEMSG_DdmInterfaceInfo and send it to the
|
||
// worker thread of the PPP engine.
|
||
//
|
||
DWORD
|
||
PppDdmSendInterfaceInfo(
|
||
IN HCONN hConnection,
|
||
IN PPP_INTERFACE_INFO * pInterfaceInfo
|
||
)
|
||
{
|
||
PPPE_MESSAGE PppMessage;
|
||
|
||
PppMessage.hConnection = hConnection;
|
||
PppMessage.dwMsgId = PPPEMSG_DdmInterfaceInfo;
|
||
|
||
PppMessage.ExtraInfo.InterfaceInfo = *pInterfaceInfo;
|
||
|
||
return( SendPPPMessageToEngine( &PppMessage ) );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: PppDdmBapCallbackResult
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description: Will create a PPPEMSG_DdmBapCallbackResult and send it to the
|
||
// worker thread of the PPP engine.
|
||
//
|
||
DWORD
|
||
PppDdmBapCallbackResult(
|
||
IN HCONN hConnection,
|
||
IN DWORD dwBapCallbackResultCode
|
||
)
|
||
{
|
||
PPPE_MESSAGE PppMessage;
|
||
|
||
PppMessage.hConnection = hConnection;
|
||
PppMessage.dwMsgId = PPPEMSG_DdmBapCallbackResult;
|
||
|
||
PppMessage.ExtraInfo.BapCallbackResult.dwCallbackResultCode
|
||
= dwBapCallbackResultCode;
|
||
|
||
return( SendPPPMessageToEngine( &PppMessage ) );
|
||
}
|
||
|
||
//**
|
||
//
|
||
// Call: PppDdmChangeNotification
|
||
//
|
||
// Returns: NO_ERROR - Success
|
||
// Non-zero returns - Failure
|
||
//
|
||
// Description:
|
||
//
|
||
DWORD
|
||
PppDdmChangeNotification(
|
||
IN DWORD dwServerFlags,
|
||
IN DWORD dwLoggingLevel
|
||
)
|
||
{
|
||
PPPE_MESSAGE PppMessage;
|
||
|
||
PppLog( 2, "PppDdmChangeNotification. New flags: 0x%x", dwServerFlags );
|
||
|
||
PppMessage.dwMsgId = PPPEMSG_DdmChangeNotification;
|
||
|
||
PppConfigInfo.ServerConfigInfo.dwConfigMask = dwServerFlags;
|
||
|
||
PppConfigInfo.dwLoggingLevel = dwLoggingLevel;
|
||
|
||
return( SendPPPMessageToEngine( &PppMessage ) );
|
||
}
|