mirror of https://github.com/tongzx/nt5src
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.
227 lines
5.9 KiB
227 lines
5.9 KiB
/*++
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
}
|
|
|