mirror of
https://github.com/reactos/reactos.git
synced 2024-10-20 08:01:05 +00:00
[TCPIP]
- Support media state changes properly svn path=/branches/wlan-bringup/; revision=54929
This commit is contained in:
parent
ff8d0071db
commit
1ac7212b37
|
@ -556,6 +556,216 @@ VOID NTAPI ProtocolReceiveComplete(
|
|||
}
|
||||
|
||||
|
||||
BOOLEAN ReconfigureAdapter(PLAN_ADAPTER Adapter, BOOLEAN FinishedReset)
|
||||
{
|
||||
PIP_INTERFACE Interface = Adapter->Context;
|
||||
NDIS_STATUS NdisStatus;
|
||||
IP_ADDRESS DefaultMask, Router;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
HANDLE ParameterHandle;
|
||||
PKEY_VALUE_PARTIAL_INFORMATION KeyValueInfo;
|
||||
WCHAR Buffer[150];
|
||||
UNICODE_STRING IPAddress = RTL_CONSTANT_STRING(L"IPAddress");
|
||||
UNICODE_STRING Netmask = RTL_CONSTANT_STRING(L"SubnetMask");
|
||||
UNICODE_STRING Gateway = RTL_CONSTANT_STRING(L"DefaultGateway");
|
||||
UNICODE_STRING EnableDhcp = RTL_CONSTANT_STRING(L"EnableDHCP");
|
||||
UNICODE_STRING Prefix = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\");
|
||||
UNICODE_STRING TcpipRegistryPath;
|
||||
UNICODE_STRING RegistryDataU;
|
||||
ANSI_STRING RegistryDataA;
|
||||
ULONG Unused;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Initalize the default unspecified address (0.0.0.0) */
|
||||
AddrInitIPv4(&DefaultMask, 0);
|
||||
if (Adapter->State == LAN_STATE_STARTED && !FinishedReset)
|
||||
{
|
||||
TcpipRegistryPath.MaximumLength = sizeof(WCHAR) * 150;
|
||||
TcpipRegistryPath.Length = 0;
|
||||
TcpipRegistryPath.Buffer = Buffer;
|
||||
|
||||
/* Build the registry path */
|
||||
RtlAppendUnicodeStringToString(&TcpipRegistryPath, &Prefix);
|
||||
RtlAppendUnicodeStringToString(&TcpipRegistryPath, &Interface->Name);
|
||||
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&TcpipRegistryPath,
|
||||
OBJ_CASE_INSENSITIVE,
|
||||
0,
|
||||
NULL);
|
||||
|
||||
/* Open a handle to the adapter parameters */
|
||||
Status = ZwOpenKey(&ParameterHandle, KEY_READ, &ObjectAttributes);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Just use defaults if the open fails for some reason */
|
||||
Interface->Unicast = DefaultMask;
|
||||
Interface->Netmask = DefaultMask;
|
||||
}
|
||||
else
|
||||
{
|
||||
KeyValueInfo = ExAllocatePool(PagedPool, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR));
|
||||
if (!KeyValueInfo)
|
||||
{
|
||||
ZwClose(ParameterHandle);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Read the EnableDHCP entry */
|
||||
Status = ZwQueryValueKey(ParameterHandle,
|
||||
&EnableDhcp,
|
||||
KeyValuePartialInformation,
|
||||
KeyValueInfo,
|
||||
sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG),
|
||||
&Unused);
|
||||
if (NT_SUCCESS(Status) && KeyValueInfo->DataLength == sizeof(ULONG) && (*(PULONG)KeyValueInfo->Data) == 0)
|
||||
{
|
||||
RegistryDataU.MaximumLength = 16 + sizeof(WCHAR);
|
||||
RegistryDataU.Buffer = (PWCHAR)KeyValueInfo->Data;
|
||||
|
||||
/* Read the IP address */
|
||||
Status = ZwQueryValueKey(ParameterHandle,
|
||||
&IPAddress,
|
||||
KeyValuePartialInformation,
|
||||
KeyValueInfo,
|
||||
sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR),
|
||||
&Unused);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
RegistryDataU.Length = KeyValueInfo->DataLength;
|
||||
|
||||
RtlUnicodeStringToAnsiString(&RegistryDataA,
|
||||
&RegistryDataU,
|
||||
TRUE);
|
||||
|
||||
AddrInitIPv4(&Interface->Unicast, inet_addr(RegistryDataA.Buffer));
|
||||
|
||||
RtlFreeAnsiString(&RegistryDataA);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
Interface->Unicast = DefaultMask;
|
||||
}
|
||||
|
||||
Status = ZwQueryValueKey(ParameterHandle,
|
||||
&Netmask,
|
||||
KeyValuePartialInformation,
|
||||
KeyValueInfo,
|
||||
sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR),
|
||||
&Unused);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
RegistryDataU.Length = KeyValueInfo->DataLength;
|
||||
|
||||
RtlUnicodeStringToAnsiString(&RegistryDataA,
|
||||
&RegistryDataU,
|
||||
TRUE);
|
||||
|
||||
AddrInitIPv4(&Interface->Netmask, inet_addr(RegistryDataA.Buffer));
|
||||
|
||||
RtlFreeAnsiString(&RegistryDataA);
|
||||
}
|
||||
else
|
||||
{
|
||||
Interface->Netmask = DefaultMask;
|
||||
}
|
||||
|
||||
/* Read default gateway info */
|
||||
Status = ZwQueryValueKey(ParameterHandle,
|
||||
&Gateway,
|
||||
KeyValuePartialInformation,
|
||||
KeyValueInfo,
|
||||
sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR),
|
||||
&Unused);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
RegistryDataU.Length = KeyValueInfo->DataLength;
|
||||
|
||||
RtlUnicodeStringToAnsiString(&RegistryDataA,
|
||||
&RegistryDataU,
|
||||
TRUE);
|
||||
|
||||
AddrInitIPv4(&Router, inet_addr(RegistryDataA.Buffer));
|
||||
|
||||
RtlFreeAnsiString(&RegistryDataA);
|
||||
|
||||
/* Create the default route */
|
||||
if (!AddrIsUnspecified(&Router)) RouterCreateRoute(&DefaultMask, &DefaultMask, &Router, Interface, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Interface->Unicast = DefaultMask;
|
||||
Interface->Netmask = DefaultMask;
|
||||
}
|
||||
|
||||
ZwClose(ParameterHandle);
|
||||
}
|
||||
|
||||
/* Compute the broadcast address */
|
||||
Interface->Broadcast.Type = IP_ADDRESS_V4;
|
||||
Interface->Broadcast.Address.IPv4Address =
|
||||
Interface->Unicast.Address.IPv4Address |
|
||||
~Interface->Netmask.Address.IPv4Address;
|
||||
}
|
||||
else if (!FinishedReset)
|
||||
{
|
||||
/* Clear IP configuration */
|
||||
Interface->Unicast = DefaultMask;
|
||||
Interface->Netmask = DefaultMask;
|
||||
Interface->Broadcast = DefaultMask;
|
||||
|
||||
/* Remove all interface routes */
|
||||
RouterRemoveRoutesForInterface(Interface);
|
||||
|
||||
/* Destroy all cached neighbors */
|
||||
NBDestroyNeighborsForInterface(Interface);
|
||||
}
|
||||
|
||||
/* We're done here if the adapter isn't connected */
|
||||
if (Adapter->State != LAN_STATE_STARTED) return TRUE;
|
||||
|
||||
/* Get maximum link speed */
|
||||
NdisStatus = NDISCall(Adapter,
|
||||
NdisRequestQueryInformation,
|
||||
OID_GEN_LINK_SPEED,
|
||||
&Interface->Speed,
|
||||
sizeof(UINT));
|
||||
|
||||
if (!NT_SUCCESS(NdisStatus))
|
||||
Interface->Speed = IP_DEFAULT_LINK_SPEED;
|
||||
|
||||
Adapter->Speed = Interface->Speed * 100L;
|
||||
|
||||
/* Get maximum frame size */
|
||||
NdisStatus = NDISCall(Adapter,
|
||||
NdisRequestQueryInformation,
|
||||
OID_GEN_MAXIMUM_FRAME_SIZE,
|
||||
&Adapter->MTU,
|
||||
sizeof(UINT));
|
||||
if (NdisStatus != NDIS_STATUS_SUCCESS)
|
||||
return FALSE;
|
||||
|
||||
Interface->MTU = Adapter->MTU;
|
||||
|
||||
/* Get maximum packet size */
|
||||
NdisStatus = NDISCall(Adapter,
|
||||
NdisRequestQueryInformation,
|
||||
OID_GEN_MAXIMUM_TOTAL_SIZE,
|
||||
&Adapter->MaxPacketSize,
|
||||
sizeof(UINT));
|
||||
if (NdisStatus != NDIS_STATUS_SUCCESS)
|
||||
return FALSE;
|
||||
|
||||
/* Add the interface for a static IP */
|
||||
if (!AddrIsUnspecified(&Interface->Unicast))
|
||||
IPAddInterfaceRoute(Interface);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID NTAPI ProtocolStatus(
|
||||
NDIS_HANDLE BindingContext,
|
||||
NDIS_STATUS GeneralStatus,
|
||||
|
@ -576,25 +786,41 @@ VOID NTAPI ProtocolStatus(
|
|||
|
||||
switch(GeneralStatus)
|
||||
{
|
||||
case NDIS_STATUS_MEDIA_CONNECT:
|
||||
DbgPrint("NDIS_STATUS_MEDIA_CONNECT\n");
|
||||
break;
|
||||
case NDIS_STATUS_MEDIA_CONNECT:
|
||||
DbgPrint("NDIS_STATUS_MEDIA_CONNECT\n");
|
||||
|
||||
case NDIS_STATUS_MEDIA_DISCONNECT:
|
||||
DbgPrint("NDIS_STATUS_MEDIA_DISCONNECT\n");
|
||||
break;
|
||||
if (Adapter->State == LAN_STATE_STARTED)
|
||||
break;
|
||||
|
||||
case NDIS_STATUS_RESET_START:
|
||||
Adapter->State = LAN_STATE_RESETTING;
|
||||
break;
|
||||
Adapter->State = LAN_STATE_STARTED;
|
||||
ReconfigureAdapter(Adapter, FALSE);
|
||||
|
||||
case NDIS_STATUS_RESET_END:
|
||||
Adapter->State = LAN_STATE_STARTED;
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
DbgPrint("Unhandled status: %x", GeneralStatus);
|
||||
break;
|
||||
case NDIS_STATUS_MEDIA_DISCONNECT:
|
||||
DbgPrint("NDIS_STATUS_MEDIA_DISCONNECT\n");
|
||||
|
||||
if (Adapter->State == LAN_STATE_STOPPED)
|
||||
break;
|
||||
|
||||
Adapter->State = LAN_STATE_STOPPED;
|
||||
ReconfigureAdapter(Adapter, FALSE);
|
||||
break;
|
||||
|
||||
case NDIS_STATUS_RESET_START:
|
||||
Adapter->OldState = Adapter->State;
|
||||
Adapter->State = LAN_STATE_RESETTING;
|
||||
/* Nothing else to do here */
|
||||
break;
|
||||
|
||||
case NDIS_STATUS_RESET_END:
|
||||
Adapter->State = Adapter->OldState;
|
||||
ReconfigureAdapter(Adapter, TRUE);
|
||||
break;
|
||||
|
||||
default:
|
||||
DbgPrint("Unhandled status: %x", GeneralStatus);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1033,21 +1259,8 @@ BOOLEAN BindAdapter(
|
|||
PIP_INTERFACE IF;
|
||||
NDIS_STATUS NdisStatus;
|
||||
LLIP_BIND_INFO BindInfo;
|
||||
IP_ADDRESS DefaultMask, Router;
|
||||
ULONG Lookahead = LOOKAHEAD_SIZE, Unused;
|
||||
ULONG Lookahead = LOOKAHEAD_SIZE;
|
||||
NTSTATUS Status;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
HANDLE ParameterHandle;
|
||||
PKEY_VALUE_PARTIAL_INFORMATION KeyValueInfo;
|
||||
WCHAR Buffer[150];
|
||||
UNICODE_STRING IPAddress = RTL_CONSTANT_STRING(L"IPAddress");
|
||||
UNICODE_STRING Netmask = RTL_CONSTANT_STRING(L"SubnetMask");
|
||||
UNICODE_STRING Gateway = RTL_CONSTANT_STRING(L"DefaultGateway");
|
||||
UNICODE_STRING EnableDhcp = RTL_CONSTANT_STRING(L"EnableDHCP");
|
||||
UNICODE_STRING Prefix = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\");
|
||||
UNICODE_STRING TcpipRegistryPath;
|
||||
UNICODE_STRING RegistryDataU;
|
||||
ANSI_STRING RegistryDataA;
|
||||
|
||||
TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
|
||||
|
||||
|
@ -1067,7 +1280,6 @@ BOOLEAN BindAdapter(
|
|||
BindInfo.Context = Adapter;
|
||||
BindInfo.HeaderSize = Adapter->HeaderSize;
|
||||
BindInfo.MinFrameSize = Adapter->MinFrameSize;
|
||||
BindInfo.MTU = Adapter->MTU;
|
||||
BindInfo.Address = (PUCHAR)&Adapter->HWAddress;
|
||||
BindInfo.AddressLength = Adapter->HWAddressLength;
|
||||
BindInfo.Transmit = LANTransmit;
|
||||
|
@ -1100,149 +1312,16 @@ BOOLEAN BindAdapter(
|
|||
TI_DbgPrint(DEBUG_DATALINK,("Adapter Description: %wZ\n",
|
||||
&IF->Description));
|
||||
|
||||
TcpipRegistryPath.MaximumLength = sizeof(WCHAR) * 150;
|
||||
TcpipRegistryPath.Length = 0;
|
||||
TcpipRegistryPath.Buffer = Buffer;
|
||||
|
||||
RtlAppendUnicodeStringToString(&TcpipRegistryPath,
|
||||
&Prefix);
|
||||
|
||||
RtlAppendUnicodeStringToString(&TcpipRegistryPath,
|
||||
&IF->Name);
|
||||
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&TcpipRegistryPath,
|
||||
OBJ_CASE_INSENSITIVE,
|
||||
0,
|
||||
NULL);
|
||||
|
||||
AddrInitIPv4(&DefaultMask, 0);
|
||||
|
||||
Status = ZwOpenKey(&ParameterHandle, KEY_READ, &ObjectAttributes);
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
IF->Unicast = DefaultMask;
|
||||
IF->Netmask = DefaultMask;
|
||||
}
|
||||
else
|
||||
{
|
||||
KeyValueInfo = ExAllocatePool(PagedPool, sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR));
|
||||
if (!KeyValueInfo)
|
||||
{
|
||||
ZwClose(ParameterHandle);
|
||||
IPDestroyInterface(IF);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Status = ZwQueryValueKey(ParameterHandle,
|
||||
&EnableDhcp,
|
||||
KeyValuePartialInformation,
|
||||
KeyValueInfo,
|
||||
sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG),
|
||||
&Unused);
|
||||
if (NT_SUCCESS(Status) && KeyValueInfo->DataLength == sizeof(ULONG) && (*(PULONG)KeyValueInfo->Data) == 0)
|
||||
{
|
||||
RegistryDataU.MaximumLength = 16 + sizeof(WCHAR);
|
||||
RegistryDataU.Buffer = (PWCHAR)KeyValueInfo->Data;
|
||||
|
||||
Status = ZwQueryValueKey(ParameterHandle,
|
||||
&IPAddress,
|
||||
KeyValuePartialInformation,
|
||||
KeyValueInfo,
|
||||
sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR),
|
||||
&Unused);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
RegistryDataU.Length = KeyValueInfo->DataLength;
|
||||
|
||||
RtlUnicodeStringToAnsiString(&RegistryDataA,
|
||||
&RegistryDataU,
|
||||
TRUE);
|
||||
|
||||
AddrInitIPv4(&IF->Unicast, inet_addr(RegistryDataA.Buffer));
|
||||
|
||||
RtlFreeAnsiString(&RegistryDataA);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
IF->Unicast = DefaultMask;
|
||||
}
|
||||
|
||||
Status = ZwQueryValueKey(ParameterHandle,
|
||||
&Netmask,
|
||||
KeyValuePartialInformation,
|
||||
KeyValueInfo,
|
||||
sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR),
|
||||
&Unused);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
RegistryDataU.Length = KeyValueInfo->DataLength;
|
||||
|
||||
RtlUnicodeStringToAnsiString(&RegistryDataA,
|
||||
&RegistryDataU,
|
||||
TRUE);
|
||||
|
||||
AddrInitIPv4(&IF->Netmask, inet_addr(RegistryDataA.Buffer));
|
||||
|
||||
RtlFreeAnsiString(&RegistryDataA);
|
||||
}
|
||||
else
|
||||
{
|
||||
IF->Netmask = DefaultMask;
|
||||
}
|
||||
|
||||
Status = ZwQueryValueKey(ParameterHandle,
|
||||
&Gateway,
|
||||
KeyValuePartialInformation,
|
||||
KeyValueInfo,
|
||||
sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 16 * sizeof(WCHAR),
|
||||
&Unused);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
RegistryDataU.Length = KeyValueInfo->DataLength;
|
||||
|
||||
RtlUnicodeStringToAnsiString(&RegistryDataA,
|
||||
&RegistryDataU,
|
||||
TRUE);
|
||||
|
||||
AddrInitIPv4(&Router, inet_addr(RegistryDataA.Buffer));
|
||||
|
||||
RtlFreeAnsiString(&RegistryDataA);
|
||||
|
||||
if (!AddrIsUnspecified(&Router)) RouterCreateRoute(&DefaultMask, &DefaultMask, &Router, IF, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
IF->Unicast = DefaultMask;
|
||||
IF->Netmask = DefaultMask;
|
||||
}
|
||||
|
||||
ZwClose(ParameterHandle);
|
||||
}
|
||||
|
||||
IF->Broadcast.Type = IP_ADDRESS_V4;
|
||||
IF->Broadcast.Address.IPv4Address =
|
||||
IF->Unicast.Address.IPv4Address |
|
||||
~IF->Netmask.Address.IPv4Address;
|
||||
|
||||
TI_DbgPrint(DEBUG_DATALINK,("BCAST(IF) %s\n", A2S(&IF->Broadcast)));
|
||||
|
||||
/* Get maximum link speed */
|
||||
NdisStatus = NDISCall(Adapter,
|
||||
NdisRequestQueryInformation,
|
||||
OID_GEN_LINK_SPEED,
|
||||
&IF->Speed,
|
||||
sizeof(UINT));
|
||||
|
||||
if( !NT_SUCCESS(NdisStatus) )
|
||||
IF->Speed = IP_DEFAULT_LINK_SPEED;
|
||||
|
||||
/* Register interface with IP layer */
|
||||
IPRegisterInterface(IF);
|
||||
|
||||
/* Set adapter state */
|
||||
Adapter->State = LAN_STATE_STARTED;
|
||||
Adapter->Context = IF;
|
||||
|
||||
/* Configure the adapter */
|
||||
ReconfigureAdapter(Adapter, FALSE);
|
||||
|
||||
/* Set packet filter so we can send and receive packets */
|
||||
NdisStatus = NDISCall(Adapter,
|
||||
NdisRequestSetInformation,
|
||||
|
@ -1257,8 +1336,6 @@ BOOLEAN BindAdapter(
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
Adapter->Context = IF;
|
||||
Adapter->State = LAN_STATE_STARTED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -1301,7 +1378,6 @@ NDIS_STATUS LANRegisterAdapter(
|
|||
UINT MediaIndex;
|
||||
NDIS_MEDIUM MediaArray[MAX_MEDIA];
|
||||
UINT AddressOID;
|
||||
UINT Speed;
|
||||
|
||||
TI_DbgPrint(DEBUG_DATALINK, ("Called.\n"));
|
||||
|
||||
|
@ -1372,30 +1448,6 @@ NDIS_STATUS LANRegisterAdapter(
|
|||
return NDIS_STATUS_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
/* Get maximum frame size */
|
||||
NdisStatus = NDISCall(IF,
|
||||
NdisRequestQueryInformation,
|
||||
OID_GEN_MAXIMUM_FRAME_SIZE,
|
||||
&IF->MTU,
|
||||
sizeof(UINT));
|
||||
if (NdisStatus != NDIS_STATUS_SUCCESS) {
|
||||
TI_DbgPrint(DEBUG_DATALINK,("denying adapter %wZ (NDISCall)\n", AdapterName));
|
||||
ExFreePoolWithTag(IF, LAN_ADAPTER_TAG);
|
||||
return NdisStatus;
|
||||
}
|
||||
|
||||
/* Get maximum packet size */
|
||||
NdisStatus = NDISCall(IF,
|
||||
NdisRequestQueryInformation,
|
||||
OID_GEN_MAXIMUM_TOTAL_SIZE,
|
||||
&IF->MaxPacketSize,
|
||||
sizeof(UINT));
|
||||
if (NdisStatus != NDIS_STATUS_SUCCESS) {
|
||||
TI_DbgPrint(MIN_TRACE, ("Query for maximum packet size failed.\n"));
|
||||
ExFreePoolWithTag(IF, LAN_ADAPTER_TAG);
|
||||
return NdisStatus;
|
||||
}
|
||||
|
||||
/* Get maximum number of packets we can pass to NdisSend(Packets) at one time */
|
||||
NdisStatus = NDISCall(IF,
|
||||
NdisRequestQueryInformation,
|
||||
|
@ -1419,21 +1471,6 @@ NDIS_STATUS LANRegisterAdapter(
|
|||
return NdisStatus;
|
||||
}
|
||||
|
||||
/* Get maximum link speed */
|
||||
NdisStatus = NDISCall(IF,
|
||||
NdisRequestQueryInformation,
|
||||
OID_GEN_LINK_SPEED,
|
||||
&Speed,
|
||||
sizeof(UINT));
|
||||
if (NdisStatus != NDIS_STATUS_SUCCESS) {
|
||||
TI_DbgPrint(MIN_TRACE, ("Query for maximum link speed failed.\n"));
|
||||
ExFreePoolWithTag(IF, LAN_ADAPTER_TAG);
|
||||
return NdisStatus;
|
||||
}
|
||||
|
||||
/* Convert returned link speed to bps (it is in 100bps increments) */
|
||||
IF->Speed = Speed * 100L;
|
||||
|
||||
/* Bind adapter to IP layer */
|
||||
if( !BindAdapter(IF, RegistryPath) ) {
|
||||
TI_DbgPrint(DEBUG_DATALINK,("denying adapter %wZ (BindAdapter)\n", AdapterName));
|
||||
|
|
|
@ -127,7 +127,6 @@ typedef struct _LLIP_BIND_INFO {
|
|||
PVOID Context; /* Pointer to link layer context information */
|
||||
UINT HeaderSize; /* Size of link level header */
|
||||
UINT MinFrameSize; /* Minimum frame size in bytes */
|
||||
UINT MTU; /* Maximum transmission unit */
|
||||
PUCHAR Address; /* Pointer to interface address */
|
||||
UINT AddressLength; /* Length of address in bytes */
|
||||
LL_TRANSMIT_ROUTINE Transmit; /* Transmit function for this interface */
|
||||
|
|
|
@ -39,7 +39,7 @@ typedef struct ETH_HEADER {
|
|||
typedef struct LAN_ADAPTER {
|
||||
LIST_ENTRY ListEntry; /* Entry on list */
|
||||
KSPIN_LOCK Lock; /* Lock for this structure */
|
||||
UCHAR State; /* State of the adapter */
|
||||
UCHAR State, OldState; /* State of the adapter */
|
||||
KEVENT Event; /* Opening event */
|
||||
PVOID Context; /* Upper layer context information */
|
||||
NDIS_HANDLE NdisHandle; /* NDIS binding handle */
|
||||
|
|
|
@ -105,4 +105,6 @@ ULONG NBCopyNeighbors(
|
|||
VOID NBResetNeighborTimeout(
|
||||
PIP_ADDRESS Address);
|
||||
|
||||
VOID NBDestroyNeighborsForInterface(PIP_INTERFACE Interface);
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -43,6 +43,8 @@ NTSTATUS RouterStartup(
|
|||
NTSTATUS RouterShutdown(
|
||||
VOID);
|
||||
|
||||
VOID RouterRemoveRoutesForInterface(PIP_INTERFACE Interface);
|
||||
|
||||
UINT CountFIBs(PIP_INTERFACE IF);
|
||||
|
||||
UINT CopyFIBs( PIP_INTERFACE IF, PFIB_ENTRY Target );
|
||||
|
|
|
@ -206,7 +206,6 @@ PIP_INTERFACE IPCreateInterface(
|
|||
IF->Context = BindInfo->Context;
|
||||
IF->HeaderSize = BindInfo->HeaderSize;
|
||||
IF->MinFrameSize = BindInfo->MinFrameSize;
|
||||
IF->MTU = BindInfo->MTU;
|
||||
IF->Address = BindInfo->Address;
|
||||
IF->AddressLength = BindInfo->AddressLength;
|
||||
IF->Transmit = BindInfo->Transmit;
|
||||
|
@ -314,11 +313,6 @@ BOOLEAN IPRegisterInterface(
|
|||
|
||||
IF->Index = ChosenIndex;
|
||||
|
||||
if (!AddrIsUnspecified(&IF->Unicast))
|
||||
{
|
||||
IPAddInterfaceRoute(IF);
|
||||
}
|
||||
|
||||
/* Add interface to the global interface list */
|
||||
TcpipInterlockedInsertTailList(&InterfaceListHead,
|
||||
&IF->ListEntry,
|
||||
|
|
|
@ -106,7 +106,6 @@ NDIS_STATUS LoopRegisterAdapter(
|
|||
BindInfo.Context = NULL;
|
||||
BindInfo.HeaderSize = 0;
|
||||
BindInfo.MinFrameSize = 0;
|
||||
BindInfo.MTU = 16384;
|
||||
BindInfo.Address = NULL;
|
||||
BindInfo.AddressLength = 0;
|
||||
BindInfo.Transmit = LoopTransmit;
|
||||
|
@ -114,6 +113,8 @@ NDIS_STATUS LoopRegisterAdapter(
|
|||
Loopback = IPCreateInterface(&BindInfo);
|
||||
if (!Loopback) return NDIS_STATUS_RESOURCES;
|
||||
|
||||
Loopback->MTU = 16384;
|
||||
|
||||
Loopback->Name.Buffer = L"Loopback";
|
||||
Loopback->Name.MaximumLength = Loopback->Name.Length =
|
||||
wcslen(Loopback->Name.Buffer) * sizeof(WCHAR);
|
||||
|
@ -124,6 +125,8 @@ NDIS_STATUS LoopRegisterAdapter(
|
|||
|
||||
IPRegisterInterface(Loopback);
|
||||
|
||||
IPAddInterfaceRoute(Loopback);
|
||||
|
||||
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
|
||||
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
|
|
|
@ -223,6 +223,42 @@ VOID NBSendSolicit(PNEIGHBOR_CACHE_ENTRY NCE)
|
|||
NCE->Interface);
|
||||
}
|
||||
|
||||
VOID NBDestroyNeighborsForInterface(PIP_INTERFACE Interface)
|
||||
{
|
||||
KIRQL OldIrql;
|
||||
PNEIGHBOR_CACHE_ENTRY *PrevNCE;
|
||||
PNEIGHBOR_CACHE_ENTRY NCE;
|
||||
ULONG i;
|
||||
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
for (i = 0; i <= NB_HASHMASK; i++)
|
||||
{
|
||||
TcpipAcquireSpinLockAtDpcLevel(&NeighborCache[i].Lock);
|
||||
|
||||
for (PrevNCE = &NeighborCache[i].Cache;
|
||||
(NCE = *PrevNCE) != NULL;)
|
||||
{
|
||||
if (NCE->Interface == Interface)
|
||||
{
|
||||
/* Unlink and destroy the NCE */
|
||||
*PrevNCE = NCE->Next;
|
||||
|
||||
NBFlushPacketQueue(NCE, NDIS_STATUS_REQUEST_ABORTED);
|
||||
ExFreePoolWithTag(NCE, NCE_TAG);
|
||||
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
PrevNCE = &NCE->Next;
|
||||
}
|
||||
}
|
||||
|
||||
TcpipReleaseSpinLockFromDpcLevel(&NeighborCache[i].Lock);
|
||||
}
|
||||
KeLowerIrql(OldIrql);
|
||||
}
|
||||
|
||||
PNEIGHBOR_CACHE_ENTRY NBAddNeighbor(
|
||||
PIP_INTERFACE Interface,
|
||||
PIP_ADDRESS Address,
|
||||
|
|
|
@ -339,6 +339,29 @@ PNEIGHBOR_CACHE_ENTRY RouteGetRouteToDestination(PIP_ADDRESS Destination)
|
|||
return NCE;
|
||||
}
|
||||
|
||||
VOID RouterRemoveRoutesForInterface(PIP_INTERFACE Interface)
|
||||
{
|
||||
KIRQL OldIrql;
|
||||
PLIST_ENTRY CurrentEntry;
|
||||
PLIST_ENTRY NextEntry;
|
||||
PFIB_ENTRY Current;
|
||||
|
||||
TcpipAcquireSpinLock(&FIBLock, &OldIrql);
|
||||
|
||||
CurrentEntry = FIBListHead.Flink;
|
||||
while (CurrentEntry != &FIBListHead) {
|
||||
NextEntry = CurrentEntry->Flink;
|
||||
Current = CONTAINING_RECORD(CurrentEntry, FIB_ENTRY, ListEntry);
|
||||
|
||||
if (Interface == Current->Router->Interface)
|
||||
DestroyFIBE(Current);
|
||||
|
||||
CurrentEntry = NextEntry;
|
||||
}
|
||||
|
||||
TcpipReleaseSpinLock(&FIBLock, OldIrql);
|
||||
}
|
||||
|
||||
NTSTATUS RouterRemoveRoute(PIP_ADDRESS Target, PIP_ADDRESS Router)
|
||||
/*
|
||||
* FUNCTION: Removes a route from the Forward Information Base (FIB)
|
||||
|
|
Loading…
Reference in a new issue