Source code of Windows XP (NT5)
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.
|
|
/*******************************************************************/ /* Copyright(c) 1995 Microsoft Corporation */ /*******************************************************************/
//***
//
// Filename: rmif.c
//
// Description: implements the IPXCP i/f with the IPX Router Manager
//
//
// Author: Stefan Solomon (stefans) October 27, 1995.
//
// Revision History:
//
//***
#include "precomp.h"
#pragma hdrstop
extern BOOL WanConfigDbaseInitialized;
// IPX Router Manager Entry Points
DWORD (WINAPI *RmCreateGlobalRoute)(PUCHAR Network);
DWORD (WINAPI *RmAddLocalWkstaDialoutInterface) (IN LPWSTR InterfaceNamep, IN LPVOID InterfaceInfop, IN OUT PULONG InterfaceIndexp);
DWORD (WINAPI *RmDeleteLocalWkstaDialoutInterface)(ULONG InterfaceIndex);
DWORD (WINAPI *RmGetIpxwanInterfaceConfig) (ULONG InterfaceIndex, PULONG IpxwanConfigRequired);
BOOL (WINAPI *RmIsRoute)(PUCHAR Network);
DWORD (WINAPI *RmGetInternalNetNumber)(PUCHAR Network);
DWORD (WINAPI *RmUpdateIpxcpConfig)(PIPXCP_ROUTER_CONFIG_PARAMS pParams) = NULL;
// Our Entry Points
VOID IpxcpRouterStarted(VOID);
VOID IpxcpRouterStopped(VOID);
// Flag to indicate router state
BOOL RouterStarted;
// [pmay] This will be removed when the router is modified to use MprInfo api's
typedef RTR_INFO_BLOCK_HEADER IPX_INFO_BLOCK_HEADER, *PIPX_INFO_BLOCK_HEADER; typedef RTR_TOC_ENTRY IPX_TOC_ENTRY, *PIPX_TOC_ENTRY;
//*** Interface Configuration Info for the WORKSTATION_ON_ROUTER_DIALOUT ***
typedef struct _WKSTA_ON_ROUTER_INFO {
IPX_INFO_BLOCK_HEADER header; IPX_TOC_ENTRY toc[3]; IPX_IF_INFO ipxifinfo; RIP_IF_CONFIG ripifinfo; SAP_IF_CONFIG sapifinfo; IPXWAN_IF_INFO ipxwanifinfo;
} WKSTA_ON_ROUTER_INFO, *PWKSTA_ON_ROUTER_INFO;
WKSTA_ON_ROUTER_INFO WkstaOnRouterInfo;
#define ipxtoc WkstaOnRouterInfo.header.TocEntry[0]
#define riptoc WkstaOnRouterInfo.toc[0]
#define saptoc WkstaOnRouterInfo.toc[1]
#define ipxwantoc WkstaOnRouterInfo.toc[2]
#define ipxinfo WkstaOnRouterInfo.ipxifinfo
#define ripinfo WkstaOnRouterInfo.ripifinfo.RipIfInfo
#define sapinfo WkstaOnRouterInfo.sapifinfo.SapIfInfo
#define ipxwaninfo WkstaOnRouterInfo.ipxwanifinfo
/*++
Function: InitializeRouterManagerIf
Descr:
Remark: Called from process attach
--*/
VOID InitializeRouterManagerIf(VOID) { // init wksta on router info
WkstaOnRouterInfo.header.Version = IPX_ROUTER_VERSION_1; WkstaOnRouterInfo.header.Size = sizeof(WkstaOnRouterInfo); WkstaOnRouterInfo.header.TocEntriesCount = 4;
ipxtoc.InfoType = IPX_INTERFACE_INFO_TYPE; ipxtoc.InfoSize = sizeof(IPX_IF_INFO); ipxtoc.Count = 1; ipxtoc.Offset = (ULONG)((PUCHAR)&WkstaOnRouterInfo.ipxifinfo - (PUCHAR)&WkstaOnRouterInfo);
riptoc.InfoType = IPX_PROTOCOL_RIP; riptoc.InfoSize = sizeof(RIP_IF_CONFIG); riptoc.Count = 1; riptoc.Offset = ipxtoc.Offset + sizeof(IPX_IF_INFO);
saptoc.InfoType = IPX_PROTOCOL_SAP; saptoc.InfoSize = sizeof(SAP_IF_CONFIG); saptoc.Count = 1; saptoc.Offset = riptoc.Offset + sizeof(RIP_IF_CONFIG);
ipxwantoc.InfoType = IPXWAN_INTERFACE_INFO_TYPE; ipxwantoc.InfoSize = sizeof(IPXWAN_IF_INFO); ipxwantoc.Count = 1; ipxwantoc.Offset = saptoc.Offset + sizeof(SAP_IF_CONFIG);
ipxinfo.AdminState = ADMIN_STATE_ENABLED; ipxinfo.NetbiosAccept = ADMIN_STATE_ENABLED; ipxinfo.NetbiosDeliver = ADMIN_STATE_ENABLED_ONLY_FOR_OPER_STATE_UP;
ripinfo.AdminState = ADMIN_STATE_ENABLED; ripinfo.UpdateMode = IPX_STANDARD_UPDATE; ripinfo.PacketType = IPX_STANDARD_PACKET_TYPE; ripinfo.Supply = ADMIN_STATE_ENABLED; ripinfo.Listen = ADMIN_STATE_ENABLED; ripinfo.PeriodicUpdateInterval = 60; ripinfo.AgeIntervalMultiplier = 3;
sapinfo.AdminState = ADMIN_STATE_DISABLED; sapinfo.UpdateMode = IPX_NO_UPDATE; sapinfo.PacketType = IPX_STANDARD_PACKET_TYPE; sapinfo.Supply = ADMIN_STATE_DISABLED; sapinfo.Listen = ADMIN_STATE_DISABLED; sapinfo.PeriodicUpdateInterval = 60; sapinfo.AgeIntervalMultiplier = 3;
if(GlobalConfig.EnableIpxwanForWorkstationDialout) {
ipxwaninfo.AdminState = ADMIN_STATE_ENABLED; } else { ipxwaninfo.AdminState = ADMIN_STATE_DISABLED; } }
DWORD IPXCP_BIND_ENTRY_POINT(PIPXCP_INTERFACE IpxcpInterfacep) { TraceIpx(RMIF_TRACE, "IpxcpBind: Entered\n");
// Get the IPX Router Manager Entry Points
RmCreateGlobalRoute = IpxcpInterfacep->RmCreateGlobalRoute; RmAddLocalWkstaDialoutInterface = IpxcpInterfacep->RmAddLocalWkstaDialoutInterface; RmDeleteLocalWkstaDialoutInterface = IpxcpInterfacep->RmDeleteLocalWkstaDialoutInterface; RmGetIpxwanInterfaceConfig = IpxcpInterfacep->RmGetIpxwanInterfaceConfig; RmIsRoute = IpxcpInterfacep->RmIsRoute; RmGetInternalNetNumber = IpxcpInterfacep->RmGetInternalNetNumber; RmUpdateIpxcpConfig = IpxcpInterfacep->RmUpdateIpxcpConfig;
// Give it ours
IpxcpInterfacep->IpxcpRouterStarted = IpxcpRouterStarted; IpxcpInterfacep->IpxcpRouterStopped = IpxcpRouterStopped;
ACQUIRE_DATABASE_LOCK;
IpxcpInterfacep->Params.ThisMachineOnly = GlobalConfig.RParams.ThisMachineOnly;
if(WanConfigDbaseInitialized) {
IpxcpInterfacep->Params.WanNetDatabaseInitialized = TRUE;
IpxcpInterfacep->Params.EnableGlobalWanNet = GlobalConfig.RParams.EnableGlobalWanNet;
if(GlobalConfig.RParams.EnableGlobalWanNet) {
memcpy(IpxcpInterfacep->Params.GlobalWanNet, GlobalConfig.RParams.GlobalWanNet, 4); } } else { IpxcpInterfacep->Params.WanNetDatabaseInitialized = FALSE; IpxcpInterfacep->Params.EnableGlobalWanNet = FALSE; }
RELEASE_DATABASE_LOCK;
return NO_ERROR; }
VOID IpxcpRouterStarted(VOID) { TraceIpx(RMIF_TRACE, "IpxcpRouterStarted: Entered\n");
ACQUIRE_DATABASE_LOCK;
RouterStarted = TRUE;
RELEASE_DATABASE_LOCK; }
VOID IpxcpRouterStopped(VOID) { TraceIpx(RMIF_TRACE, "IpxcpRouterStopped: Entered\n");
ACQUIRE_DATABASE_LOCK;
RouterStarted = FALSE;
RELEASE_DATABASE_LOCK; }
DWORD AddLocalWkstaDialoutInterface(PULONG InterfaceIndexp) { DWORD rc;
ACQUIRE_DATABASE_LOCK;
if(!RouterStarted) {
RELEASE_DATABASE_LOCK; return ERROR_CAN_NOT_COMPLETE; }
rc = (*RmAddLocalWkstaDialoutInterface)(L"LocalWorkstationDialout", &WkstaOnRouterInfo, InterfaceIndexp);
RELEASE_DATABASE_LOCK;
return rc; }
DWORD DeleteLocalWkstaDialoutInterface(ULONG InterfaceIndex) { DWORD rc;
ACQUIRE_DATABASE_LOCK;
if(!RouterStarted) {
RELEASE_DATABASE_LOCK; return ERROR_CAN_NOT_COMPLETE; }
rc = (*RmDeleteLocalWkstaDialoutInterface)(InterfaceIndex);
RELEASE_DATABASE_LOCK;
return rc; }
DWORD GetIpxwanInterfaceConfig(ULONG InterfaceIndex, PULONG IpxwanConfigRequiredp) { DWORD rc;
ACQUIRE_DATABASE_LOCK;
if(!RouterStarted) {
RELEASE_DATABASE_LOCK; return ERROR_CAN_NOT_COMPLETE; }
rc = (*RmGetIpxwanInterfaceConfig)(InterfaceIndex, IpxwanConfigRequiredp);
RELEASE_DATABASE_LOCK;
return rc; }
BOOL IsRoute(PUCHAR Network) { BOOL rc;
ACQUIRE_DATABASE_LOCK;
if(!RouterStarted) {
RELEASE_DATABASE_LOCK; return FALSE; }
rc = (*RmIsRoute)(Network);
RELEASE_DATABASE_LOCK;
return rc; }
/*++
Function: GetInternalNetNumber
Descr:
--*/
VOID GetInternalNetNumber(PUCHAR Network) { DWORD rc;
ACQUIRE_DATABASE_LOCK;
if(!RouterStarted) {
memcpy(Network, nullnet, 4); RELEASE_DATABASE_LOCK; return; }
rc = RmGetInternalNetNumber(Network);
if(rc != NO_ERROR) {
memcpy(Network, nullnet, 4); }
RELEASE_DATABASE_LOCK; }
|