228 lines
5.9 KiB
C
228 lines
5.9 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1995 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
net\routing\ipx\sap\adaptdb.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module implements interface to net adapter driver
|
||
|
notification mechanism for standalone (not part of a router) SAP
|
||
|
agent
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Vadim Eydelman 05-15-1995
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
#include "sapp.h"
|
||
|
|
||
|
HANDLE ConfigEvent;
|
||
|
HANDLE ConfigPort;
|
||
|
|
||
|
// Interval for periodic update broadcasts (for standalone service only)
|
||
|
ULONG UpdateInterval = SAP_UPDATE_INTERVAL_DEF;
|
||
|
|
||
|
// Server aging timeout (for standalone service only)
|
||
|
ULONG WanUpdateMode = SAP_WAN_UPDATE_MODE_DEF;
|
||
|
|
||
|
// Update mode on WAN lines (for standalone service only)
|
||
|
ULONG WanUpdateInterval = SAP_WAN_UPDATE_INTERVAL_DEF;
|
||
|
|
||
|
// Interval for periodic update broadcasts on WAN lines (for standalone service only)
|
||
|
ULONG ServerAgingTimeout = SAP_AGING_TIMEOUT_DEF;
|
||
|
|
||
|
// Makes pnp changes to an interface
|
||
|
DWORD SapReconfigureInterface (ULONG idx,
|
||
|
PIPX_ADAPTER_BINDING_INFO pAdapter);
|
||
|
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
C r e a t e A d a p t e r P o r t
|
||
|
|
||
|
Routine Description:
|
||
|
Allocates resources and establishes connection to net adapter
|
||
|
notification mechanism
|
||
|
|
||
|
Arguments:
|
||
|
cfgEvent - event to be signalled when adapter configuration changes
|
||
|
|
||
|
Return Value:
|
||
|
NO_ERROR - resources were allocated successfully
|
||
|
other - reason of failure (windows error code)
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
DWORD
|
||
|
CreateAdapterPort (
|
||
|
IN HANDLE *cfgEvent
|
||
|
) {
|
||
|
DWORD status;
|
||
|
ADAPTERS_GLOBAL_PARAMETERS params;
|
||
|
|
||
|
ConfigEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
|
||
|
if (ConfigEvent!=NULL) {
|
||
|
*cfgEvent = ConfigEvent;
|
||
|
ConfigPort = IpxCreateAdapterConfigurationPort(
|
||
|
ConfigEvent,
|
||
|
¶ms);
|
||
|
if (ConfigPort!=INVALID_HANDLE_VALUE)
|
||
|
return NO_ERROR;
|
||
|
else {
|
||
|
status = GetLastError ();
|
||
|
Trace (DEBUG_FAILURES, "File: %s, line %ld."
|
||
|
" Failed to create adapter cfg port(gle:%ld).",
|
||
|
__FILE__, __LINE__, status);
|
||
|
}
|
||
|
CloseHandle (ConfigEvent);
|
||
|
}
|
||
|
else {
|
||
|
status = GetLastError ();
|
||
|
Trace (DEBUG_FAILURES, "File: %s, line %ld."
|
||
|
" Failed to create cfg event(gle:%ld).",
|
||
|
__FILE__, __LINE__, status);
|
||
|
}
|
||
|
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
D e l e t e A d a p t e r P o r t
|
||
|
|
||
|
Routine Description:
|
||
|
Dispose of resources and break connection to net adapter
|
||
|
notification mechanism
|
||
|
|
||
|
Arguments:
|
||
|
None
|
||
|
Return Value:
|
||
|
None
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
VOID
|
||
|
DeleteAdapterPort (
|
||
|
void
|
||
|
) {
|
||
|
IpxDeleteAdapterConfigurationPort (ConfigPort);
|
||
|
ConfigPort = NULL;
|
||
|
CloseHandle (ConfigEvent);
|
||
|
ConfigEvent = NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*++
|
||
|
*******************************************************************
|
||
|
P r o c e s s A d a p t e r E v e n t s
|
||
|
|
||
|
Routine Description:
|
||
|
Dequeues and process adapter configuration change events and maps them
|
||
|
to interface configuration calls
|
||
|
This routine should be called when configuration event is signalled
|
||
|
|
||
|
Arguments:
|
||
|
None
|
||
|
Return Value:
|
||
|
None
|
||
|
|
||
|
*******************************************************************
|
||
|
--*/
|
||
|
VOID
|
||
|
ProcessAdapterEvents (
|
||
|
VOID
|
||
|
) {
|
||
|
ULONG cfgStatus;
|
||
|
ADAPTER_INFO params;
|
||
|
ULONG idx;
|
||
|
SAP_IF_INFO info;
|
||
|
IPX_ADAPTER_BINDING_INFO adapter;
|
||
|
NET_INTERFACE_TYPE InterfaceType;
|
||
|
DWORD dwErr;
|
||
|
|
||
|
while (IpxGetQueuedAdapterConfigurationStatus (
|
||
|
ConfigPort,
|
||
|
&idx,
|
||
|
&cfgStatus,
|
||
|
¶ms)==NO_ERROR) {
|
||
|
switch (cfgStatus) {
|
||
|
case ADAPTER_CREATED:
|
||
|
case ADAPTER_UP:
|
||
|
Trace (DEBUG_ADAPTERS, "New adapter %d"
|
||
|
" (addr: %02X%02X%02X%02X:"
|
||
|
"%02X%02X%02X%02X%02X%02X).",
|
||
|
idx,
|
||
|
params.Network[0],
|
||
|
params.Network[1],
|
||
|
params.Network[2],
|
||
|
params.Network[3],
|
||
|
params.LocalNode[0],
|
||
|
params.LocalNode[1],
|
||
|
params.LocalNode[2],
|
||
|
params.LocalNode[3],
|
||
|
params.LocalNode[4],
|
||
|
params.LocalNode[5]);
|
||
|
info.AdminState = ADMIN_STATE_ENABLED;
|
||
|
info.PacketType = IPX_STANDARD_PACKET_TYPE;
|
||
|
info.Supply = ADMIN_STATE_ENABLED;
|
||
|
info.Listen = ADMIN_STATE_ENABLED;
|
||
|
info.GetNearestServerReply = ADMIN_STATE_ENABLED;
|
||
|
|
||
|
IpxNetCpy (adapter.Network, params.Network);
|
||
|
IpxNodeCpy (adapter.LocalNode, params.LocalNode);
|
||
|
if (params.NdisMedium==NdisMediumWan) {
|
||
|
InterfaceType = DEMAND_DIAL;
|
||
|
switch (WanUpdateMode) {
|
||
|
case SAP_WAN_NO_UPDATE:
|
||
|
info.UpdateMode = IPX_NO_UPDATE;
|
||
|
break;
|
||
|
case SAP_WAN_CHANGES_ONLY:
|
||
|
info.UpdateMode = IPX_STANDARD_UPDATE;
|
||
|
info.PeriodicUpdateInterval = MAXULONG;
|
||
|
break;
|
||
|
case SAP_WAN_STANDART_UPDATE:
|
||
|
info.UpdateMode = IPX_STANDARD_UPDATE;
|
||
|
info.PeriodicUpdateInterval = WanUpdateInterval*60;
|
||
|
info.AgeIntervalMultiplier = ServerAgingTimeout/UpdateInterval;
|
||
|
break;
|
||
|
}
|
||
|
IpxNodeCpy (adapter.RemoteNode, params.RemoteNode);
|
||
|
}
|
||
|
else {
|
||
|
InterfaceType = PERMANENT;
|
||
|
info.UpdateMode = IPX_STANDARD_UPDATE;
|
||
|
info.PeriodicUpdateInterval = UpdateInterval*60;
|
||
|
info.AgeIntervalMultiplier = ServerAgingTimeout/UpdateInterval;
|
||
|
memset (adapter.RemoteNode, 0xFF, sizeof (adapter.RemoteNode));
|
||
|
}
|
||
|
adapter.MaxPacketSize = params.MaxPacketSize;
|
||
|
adapter.AdapterIndex = idx;
|
||
|
if (((dwErr = SapCreateSapInterface (L"",idx, InterfaceType, &info)) == NO_ERROR)
|
||
|
&& (SapSetInterfaceEnable (idx, TRUE)==NO_ERROR)) {
|
||
|
SapBindSapInterfaceToAdapter (idx, &adapter);
|
||
|
}
|
||
|
else if (dwErr == ERROR_ALREADY_EXISTS) {
|
||
|
SapReconfigureInterface (idx, &adapter);
|
||
|
Trace (DEBUG_ADAPTERS, "Adapter %d has been reconfigured", idx);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case ADAPTER_DOWN:
|
||
|
case ADAPTER_DELETED:
|
||
|
Trace (DEBUG_ADAPTERS, "Adapter %d is gone.", idx);
|
||
|
SapDeleteSapInterface (idx);
|
||
|
break;
|
||
|
default:
|
||
|
Trace (DEBUG_ADAPTERS, "Unknown adapter event %d.", cfgStatus);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|