From d7b7ff36722e7acc4af45827917e1df5268e8d3f Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Fri, 22 Apr 2005 09:45:17 +0000 Subject: [PATCH] tcpmisc.h: - Correct wrongly sized struct IPAddrEntry. dhcp: dhclient.c and dispatch.c - remove lots of #if 0 - remove instances of script_go and associated stuff - write stub check_arp pending ARP api functions being implemented - introduced S_STATIC state for adapters dhcp: api.c: - Do add_protocol and send_discover when telling an adapter to lease. - Do remove_protocol when we make an adapter static. dhcp: adapter.c: - Add infrastructure for finding the adapter key in the registry - Check for IP address settings and apply as static if set, otherwise dynamic tcpip: *info and lan: - Set info types to DEBUG_INFO and DEBUG_DATALINK everywhere tcpip: lan: - Remove kernel IP configuration. bootdata: - Added dhcp service and make it start. - Removed static IP address settings from the default configuration - Removed old JS bootcode svn path=/trunk/; revision=14737 --- reactos/bootdata/hivesft.inf | 4 +- reactos/bootdata/hivesys.inf | 121 +----- reactos/bootdata/packages/reactos.dff | 1 + reactos/drivers/lib/ip/network/loopback.c | 4 + reactos/drivers/net/tcpip/datalink/lan.c | 102 +---- reactos/drivers/net/tcpip/include/debug.h | 1 + reactos/drivers/net/tcpip/tcpip/iinfo.c | 21 +- reactos/drivers/net/tcpip/tcpip/info.c | 14 +- reactos/drivers/net/tcpip/tcpip/ninfo.c | 26 +- reactos/subsys/system/dhcp/Makefile | 2 + reactos/subsys/system/dhcp/adapter.c | 257 ++++++++++-- reactos/subsys/system/dhcp/api.c | 12 +- reactos/subsys/system/dhcp/dhclient.c | 400 ++----------------- reactos/subsys/system/dhcp/dispatch.c | 139 ++----- reactos/subsys/system/dhcp/include/dhcpd.h | 4 +- reactos/subsys/system/dhcp/include/rosdhcp.h | 2 +- 16 files changed, 368 insertions(+), 742 deletions(-) diff --git a/reactos/bootdata/hivesft.inf b/reactos/bootdata/hivesft.inf index fa442487eb8..6cffb3b0e0a 100644 --- a/reactos/bootdata/hivesft.inf +++ b/reactos/bootdata/hivesft.inf @@ -725,8 +725,8 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\New Zealand Standa 0x00,0x00,0x0a,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -;HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\system32\cmd.exe" -HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\explorer.exe" +HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\system32\cmd.exe" +;HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\explorer.exe" HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","StartServices",0x00010001,0x00000001 HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","StartGUI",0x00010001,0x00000000 HKLM,"SOFTWARE\ReactOS\Windows NT\CurrentVersion\Winlogon","Userinit",0x00020000,"%SystemRoot%\system32\userinit.exe" diff --git a/reactos/bootdata/hivesys.inf b/reactos/bootdata/hivesys.inf index c0163644835..9db0c3482f5 100644 --- a/reactos/bootdata/hivesys.inf +++ b/reactos/bootdata/hivesys.inf @@ -293,9 +293,9 @@ HKLM,"SYSTEM\CurrentControlSet\Services\3c90x1\Linkage","Export",0x00010000,"\De HKLM,"SYSTEM\CurrentControlSet\Services\3c90x1\Linkage","Route",0x00010000,"3c90x1" HKLM,"SYSTEM\CurrentControlSet\Services\3c90x1\Parameters","SlotNumber",0x00000000,"10" HKLM,"SYSTEM\CurrentControlSet\Services\3c90x1\Parameters","BusNumber",0x00000000,"0" -HKLM,"SYSTEM\CurrentControlSet\Services\3c90x1\Parameters\Tcpip","DefaultGateway",0x00010000,"10.0.0.1" -HKLM,"SYSTEM\CurrentControlSet\Services\3c90x1\Parameters\Tcpip","IPAddress",0x00010000,"10.0.0.100" -HKLM,"SYSTEM\CurrentControlSet\Services\3c90x1\Parameters\Tcpip","SubnetMask",0x00010000,"255.255.255.0" +HKLM,"SYSTEM\CurrentControlSet\Services\3c90x1\Parameters\Tcpip","DefaultGateway",0x00010000,"0.0.0.0" +HKLM,"SYSTEM\CurrentControlSet\Services\3c90x1\Parameters\Tcpip","IPAddress",0x00010000,"0.0.0.0" +HKLM,"SYSTEM\CurrentControlSet\Services\3c90x1\Parameters\Tcpip","SubnetMask",0x00010000,"0.0.0.0" ; Afd driver HKLM,"SYSTEM\CurrentControlSet\Services\Afd","ErrorControl",0x00010001,0x00000001 @@ -446,6 +446,13 @@ HKLM,"SYSTEM\CurrentControlSet\Services\EventLog","ImagePath",0x00020000,"%Syste HKLM,"SYSTEM\CurrentControlSet\Services\EventLog","Start",0x00010001,0x00000002 HKLM,"SYSTEM\CurrentControlSet\Services\EventLog","Type",0x00010001,0x00000010 +; DHCP client service +HKLM,"SYSTEM\CurrentControlSet\Services\DHCP","ErrorControl",0x00010001,0x00000000 +HKLM,"SYSTEM\CurrentControlSet\Services\DHCP","Group",0x00000000,"Network" +HKLM,"SYSTEM\CurrentControlSet\Services\DHCP","ImagePath",0x00020000,"%SystemRoot%\system32\dhcp.exe" +HKLM,"SYSTEM\CurrentControlSet\Services\DHCP","Start",0x00010001,0x00000002 +HKLM,"SYSTEM\CurrentControlSet\Services\DHCP","Type",0x00010001,0x00000010 + ; Floppy driver HKLM,"SYSTEM\CurrentControlSet\Services\Floppy","ErrorControl",0x00010001,0x00000000 HKLM,"SYSTEM\CurrentControlSet\Services\Floppy","Group",0x00000000,"Primary Disk" @@ -572,9 +579,9 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE103 HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0001","Port",0x00000000,"280" HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0001","Irq",0x00000000,"9" HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0001","NetworkAddress",0x00000000,"001122334455" -HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters\Tcpip","DefaultGateway",0x00010000,"10.0.0.1" -HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters\Tcpip","IPAddress",0x00010000,"10.0.0.100" -HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters\Tcpip","SubnetMask",0x00010000,"255.255.255.0" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters\Tcpip","DefaultGateway",0x00010000,"0.0.0.0" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters\Tcpip","IPAddress",0x00010000,"0.0.0.0" +HKLM,"SYSTEM\CurrentControlSet\Services\Ne20001\Parameters\Tcpip","SubnetMask",0x00010000,"0.0.0.0" ; one day this will happen automatically; until then we need this since ndis5 drivers ; rely on the fact that their resources are handed to them by ndis, so we have to find @@ -663,9 +670,9 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE103 HKLM,"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000","BusNumber",0x00000000,"0" HKLM,"SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{RANDOMCFGGUIDFOR_PCNET1}",,0x00000000,"Network Adapters" HKLM,"SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{RANDOMCFGGUIDFOR_PCNET1}\Connection","Name",0x00000000,"AMD PCNet (static Registry entry)" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","DefaultGateway",0x00010000,"10.0.0.1" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","IPAddress",0x00010000,"10.0.0.100" -HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","SubnetMask",0x00010000,"255.255.255.0" +HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","DefaultGateway",0x00010000,"0.0.0.0" +HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","IPAddress",0x00010000,"0.0.0.0" +HKLM,"SYSTEM\CurrentControlSet\Services\PCNet1\Parameters\Tcpip","SubnetMask",0x00010000,"0.0.0.0" ; Named Pipe filesystem driver HKLM,"SYSTEM\CurrentControlSet\Services\Npfs","ErrorControl",0x00010001,0x00000000 @@ -867,100 +874,4 @@ HKLM,"SYSTEM\Setup","OsLoaderPath",0x00000000,"\" HKLM,"SYSTEM\Setup","SetupType",0x00010001,0x00000001 HKLM,"SYSTEM\Setup","SystemPartition",0x00000000,"\Device\Harddisk0\Partition1" HKLM,"SYSTEM\Setup","SystemSetupInProgress",0x00010001,0x00000000 - -; ----------------------------- KJS Init ---------------------------- -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","kjsinit",0x00010000,\ -"function init(v) { var rk = '\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Kdb'; eval(System.regread(rk,v)); } for( i = 1; i <= 45; i++ ) { init((new Number(i)).toString()); }" - -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","1",0x00010000,\ -"function write(x) { System.print(x); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","2",0x00010000,\ -"function regs(n) { return System.regs(n); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","3",0x00010000,\ -"function debugebp() { return regs(0); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","4",0x00010000,\ -"function debugeip() { return regs(1); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","5",0x00010000,\ -"function tf_argmark() { return regs(2); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","6",0x00010000,\ -"function tf_pointer() { return regs(3); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","7",0x00010000,\ -"function tf_tempcs() { return regs(4); } " -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","8",0x00010000,\ -"function tf_tempeip() { return regs(5); } " -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","9",0x00010000,\ -"function dr0() { return regs(6); } " -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","10",0x00010000,\ -"function dr1() { return regs(7); } " -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","11",0x00010000,\ -"function dr2() { return regs(8); } " -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","12",0x00010000,\ -"function dr3() { return regs(9); } " -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","13",0x00010000,\ -"function dr6() { return regs(10); } " -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","14",0x00010000,\ -"function dr7() { return regs(11); } " -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","15",0x00010000,\ -"function gs() { return regs(12) & 0xffff; }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","16",0x00010000,\ -"function es() { return regs(13) & 0xffff; }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","17",0x00010000,\ -"function ds() { return regs(14) & 0xffff; }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","18",0x00010000,\ -"function edx() { return regs(15); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","19",0x00010000,\ -"function ecx() { return regs(16); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","20",0x00010000,\ -"function eax() { return regs(17); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","21",0x00010000,\ -"function tf_pmode() { return regs(18); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","22",0x00010000,\ -"function tf_exl() { return regs(19); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","23",0x00010000,\ -"function fs() { return regs(20) & 0xffff; }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","24",0x00010000,\ -"function edi() { return regs(21); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","25",0x00010000,\ -"function esi() { return regs(22); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","26",0x00010000,\ -"function ebx() { return regs(23); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","27",0x00010000,\ -"function ebp() { return regs(24); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","28",0x00010000,\ -"function error_code() { return regs(25); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","29",0x00010000,\ -"function eip() { return regs(26); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","30",0x00010000,\ -"function cs() { return regs(27) & 0xffff; }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","31",0x00010000,\ -"function eflags() { return regs(28); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","32",0x00010000,\ -"function esp() { return regs(29); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","33",0x00010000,\ -"function ss() { return regs(30) & 0xffff; }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","34",0x00010000,\ -"function v86_es() { return regs(31) & 0xffff; }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","35",0x00010000,\ -"function v86_ds() { return regs(32) & 0xffff; }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","36",0x00010000,\ -"function v86_fs() { return regs(33) & 0xffff; }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","37",0x00010000,\ -"function v86_gs() { return regs(34) & 0xffff; }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","38",0x00010000,\ -"function peekl(a) { return System.mread(4,a); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","39",0x00010000,\ -"function pokel(a,b) { return System.mwrite(4,a,b); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","40",0x00010000,\ -"function peekw(a) { return System.mread(2,a); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","41",0x00010000,\ -"function pokew(a,b) { return System.mwrite(2,a,b); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","42",0x00010000,\ -"function peek(a) { return System.mread(1,a); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","43",0x00010000,\ -"function poke(a,b) { return System.mwrite(1,a,b); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","44",0x00010000,\ -"function regread(x,y) { return System.regread(x,y); }" -HKLM,"SYSTEM\CurrentControlSet\Control\Kdb","45",0x00010000,\ -"write('JS Registry Init Complete. Welcome to ReactOS kernel scripting');" - ; EOF diff --git a/reactos/bootdata/packages/reactos.dff b/reactos/bootdata/packages/reactos.dff index 02c7d5a4d34..0fb31ebf2ac 100755 --- a/reactos/bootdata/packages/reactos.dff +++ b/reactos/bootdata/packages/reactos.dff @@ -167,6 +167,7 @@ subsys\system\userinit\userinit.exe 1 subsys\system\vmwinst\vmwinst.exe 1 subsys\system\winlogon\winlogon.exe 1 subsys\system\winefile\winefile.exe 1 +subsys\system\dhcp\dhcp.exe 1 services\eventlog\eventlog.exe 1 services\rpcss\rpcss.exe 1 services\umpnpmgr\umpnpmgr.exe 1 diff --git a/reactos/drivers/lib/ip/network/loopback.c b/reactos/drivers/lib/ip/network/loopback.c index e2be1fa4383..375b274cb17 100644 --- a/reactos/drivers/lib/ip/network/loopback.c +++ b/reactos/drivers/lib/ip/network/loopback.c @@ -189,6 +189,10 @@ NDIS_STATUS LoopRegisterAdapter( Loopback = IPCreateInterface(&BindInfo); + Loopback->Name.Buffer = L"Loopback"; + Loopback->Name.MaximumLength = Loopback->Name.Length = + wcslen(Loopback->Name.Buffer) * sizeof(WCHAR); + AddrInitIPv4(&Loopback->Unicast, LOOPBACK_ADDRESS_IPv4); AddrInitIPv4(&Loopback->Netmask, LOOPBACK_ADDRMASK_IPv4); diff --git a/reactos/drivers/net/tcpip/datalink/lan.c b/reactos/drivers/net/tcpip/datalink/lan.c index 77ea9511fb1..1a544a6fc29 100644 --- a/reactos/drivers/net/tcpip/datalink/lan.c +++ b/reactos/drivers/net/tcpip/datalink/lan.c @@ -366,6 +366,8 @@ VOID LanSubmitReceiveWork( PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext; KIRQL OldIrql; + TI_DbgPrint(DEBUG_DATALINK,("called\n")); + TcpipAcquireSpinLock( &LanWorkLock, &OldIrql ); WQItem = ExAllocatePool( NonPagedPool, sizeof(LAN_WQ_ITEM) ); @@ -408,6 +410,8 @@ VOID STDCALL ProtocolTransferDataComplete( { ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + TI_DbgPrint(DEBUG_DATALINK,("called\n")); + TransferDataCompleteCalled++; ASSERT(TransferDataCompleteCalled <= TransferDataCalled); @@ -736,59 +740,6 @@ OpenRegistryKey( PNDIS_STRING RegistryPath, PHANDLE RegHandle ) { return Status; } -static NTSTATUS ReadIPAddressFromRegistry( HANDLE RegHandle, - PWCHAR RegistryValue, - PIP_ADDRESS Address ) { - UNICODE_STRING ValueName; - UNICODE_STRING UnicodeAddress; - NTSTATUS Status; - ULONG ResultLength; - UCHAR buf[1024]; - PKEY_VALUE_PARTIAL_INFORMATION Information = (PKEY_VALUE_PARTIAL_INFORMATION)buf; - ANSI_STRING AnsiAddress; - ULONG AnsiLen; - - RtlInitUnicodeString(&ValueName, RegistryValue); - Status = - ZwQueryValueKey(RegHandle, - &ValueName, - KeyValuePartialInformation, - Information, - sizeof(buf), - &ResultLength); - - if (!NT_SUCCESS(Status)) - return Status; - /* IP address is stored as a REG_MULTI_SZ - we only pay attention to the first one though */ - TI_DbgPrint(MIN_TRACE, ("Information DataLength: 0x%x\n", Information->DataLength)); - - UnicodeAddress.Buffer = (PWCHAR)&Information->Data; - UnicodeAddress.Length = Information->DataLength; - UnicodeAddress.MaximumLength = Information->DataLength; - - AnsiLen = RtlUnicodeStringToAnsiSize(&UnicodeAddress); - if(!AnsiLen) - return STATUS_NO_MEMORY; - - AnsiAddress.Buffer = exAllocatePoolWithTag(PagedPool, AnsiLen, 0x01020304); - if(!AnsiAddress.Buffer) - return STATUS_NO_MEMORY; - - AnsiAddress.Length = AnsiLen; - AnsiAddress.MaximumLength = AnsiLen; - - Status = RtlUnicodeStringToAnsiString(&AnsiAddress, &UnicodeAddress, FALSE); - if (!NT_SUCCESS(Status)) { - exFreePool(AnsiAddress.Buffer); - return STATUS_UNSUCCESSFUL; - } - - AnsiAddress.Buffer[AnsiAddress.Length] = 0; - AddrInitIPv4(Address, inet_addr(AnsiAddress.Buffer)); - - return STATUS_SUCCESS; -} - static NTSTATUS ReadStringFromRegistry( HANDLE RegHandle, PWCHAR RegistryValue, PUNICODE_STRING String ) { @@ -1001,7 +952,7 @@ VOID BindAdapter( PIP_INTERFACE IF; NDIS_STATUS NdisStatus; LLIP_BIND_INFO BindInfo; - IP_ADDRESS DefaultGateway, DefaultMask = { 0 }; + IP_ADDRESS DefaultMask = { 0 }; ULONG Lookahead = LOOKAHEAD_SIZE; NTSTATUS Status; HANDLE RegHandle = 0; @@ -1055,20 +1006,10 @@ VOID BindAdapter( TI_DbgPrint(DEBUG_DATALINK,("Adapter Name: %wZ\n", &IF->Name)); } - if(NT_SUCCESS(Status)) - Status = ReadIPAddressFromRegistry( RegHandle, L"DefaultGateway", - &DefaultGateway ); - if(!NT_SUCCESS(Status)) { - Status = STATUS_SUCCESS; - RtlZeroMemory( &DefaultGateway, sizeof(DefaultGateway) ); - } + DefaultMask.Type = IP_ADDRESS_V4; - if(NT_SUCCESS(Status)) - Status = ReadIPAddressFromRegistry( RegHandle, L"IPAddress", - &IF->Unicast ); - if(NT_SUCCESS(Status)) - Status = ReadIPAddressFromRegistry( RegHandle, L"SubnetMask", - &IF->Netmask ); + IF->Unicast = DefaultMask; + IF->Netmask = DefaultMask; IF->Broadcast.Type = IP_ADDRESS_V4; IF->Broadcast.Address.IPv4Address = @@ -1077,33 +1018,6 @@ VOID BindAdapter( TI_DbgPrint(DEBUG_DATALINK,("BCAST(IF) %s\n", A2S(&IF->Broadcast))); - if(NT_SUCCESS(Status)) { - /* It's ok to fail some of the above. We'll just use DHCP. */ - TI_DbgPrint - (DEBUG_DATALINK, - ("--> Our IP address on this interface: '%s'\n", - A2S(&IF->Unicast))); - - TI_DbgPrint - (DEBUG_DATALINK, - ("--> Our net mask on this interface: '%s'\n", - A2S(&IF->Netmask))); - - if( DefaultGateway.Address.IPv4Address ) { - TI_DbgPrint - (DEBUG_DATALINK, - ("--> Our gateway is: '%s'\n", - A2S(&DefaultGateway))); - - /* Create a default route */ - RouterCreateRoute( &DefaultMask, /* Zero */ - &DefaultMask, /* Zero */ - &DefaultGateway, - IF, - 1 ); - } - } - /* Get maximum link speed */ NdisStatus = NDISCall(Adapter, NdisRequestQueryInformation, diff --git a/reactos/drivers/net/tcpip/include/debug.h b/reactos/drivers/net/tcpip/include/debug.h index 95f649cf380..8b8419cdfca 100644 --- a/reactos/drivers/net/tcpip/include/debug.h +++ b/reactos/drivers/net/tcpip/include/debug.h @@ -32,6 +32,7 @@ #define DEBUG_NCACHE 0x00400000 #define DEBUG_CPOINT 0x00800000 #define DEBUG_LOCK 0x01000000 +#define DEBUG_INFO 0x02000000 #define DEBUG_ULTRA 0xFFFFFFFF #ifdef DBG diff --git a/reactos/drivers/net/tcpip/tcpip/iinfo.c b/reactos/drivers/net/tcpip/tcpip/iinfo.c index 2c14402f29e..54225c563d6 100644 --- a/reactos/drivers/net/tcpip/tcpip/iinfo.c +++ b/reactos/drivers/net/tcpip/tcpip/iinfo.c @@ -21,7 +21,7 @@ TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID *ID, ULONG Size; UINT DescrLenMax = MAX_IFDESCR_LEN - 1; - TI_DbgPrint(MAX_TRACE, + TI_DbgPrint(DEBUG_INFO, ("Getting IFEntry MIB (IF %08x LA %08x) (%04x:%d)\n", Interface, IF, ID->tei_entity, ID->tei_instance)); @@ -38,7 +38,7 @@ TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID *ID, OutData->Type = Interface == Loopback ? MIB_IF_TYPE_LOOPBACK : MIB_IF_TYPE_ETHERNET; OutData->Mtu = Interface->MTU; - TI_DbgPrint(MAX_TRACE, + TI_DbgPrint(DEBUG_INFO, ("Getting interface speed\n")); OutData->PhysAddrLen = Interface->AddressLength; OutData->AdminStatus = MIB_IF_ADMIN_STATUS_UP; @@ -53,27 +53,28 @@ TDI_STATUS InfoTdiQueryGetInterfaceMIB(TDIEntityID *ID, if( IF ) { GetInterfaceSpeed( Interface, (PUINT)&OutData->Speed ); - TI_DbgPrint(MAX_TRACE, + TI_DbgPrint(DEBUG_INFO, ("IF Speed = %d * 100bps\n", OutData->Speed)); memcpy(OutData->PhysAddr,Interface->Address,Interface->AddressLength); - TI_DbgPrint(MAX_TRACE, ("Got HWAddr\n")); - GetInterfaceName( Interface, IFDescr, MAX_IFDESCR_LEN - 1 ); - DescrLenMax = strlen( IFDescr ) + 1; + TI_DbgPrint(DEBUG_INFO, ("Got HWAddr\n")); } - IFDescr[DescrLenMax] = 0; /* Terminate ifdescr string */ + GetInterfaceName( Interface, IFDescr, MAX_IFDESCR_LEN - 1 ); + DescrLenMax = strlen( IFDescr ) + 1; - TI_DbgPrint(MAX_TRACE, ("Copied in name %s\n", IFDescr)); + TI_DbgPrint(DEBUG_INFO, ("Copied in name %s\n", IFDescr)); OutData->DescrLen = DescrLenMax; IFDescr += DescrLenMax; Size = IFDescr - (PCHAR)OutData + 1; - TI_DbgPrint(MAX_TRACE, ("Finished IFEntry MIB (%04x:%d) size %d\n", + TI_DbgPrint(DEBUG_INFO, ("Finished IFEntry MIB (%04x:%d) size %d\n", ID->tei_entity, ID->tei_instance, Size)); Status = InfoCopyOut( (PCHAR)OutData, Size, Buffer, BufferSize ); ExFreePool( OutData ); + TI_DbgPrint(DEBUG_INFO,("Returning %x\n", Status)); + return Status; } @@ -104,7 +105,7 @@ TDI_STATUS InfoInterfaceTdiSetEx( UINT InfoClass, TDIEntityID *id, PCHAR Buffer, UINT BufferSize ) { - TI_DbgPrint(MAX_TRACE, ("Got Request: Class %x Type %x Id %x, EntityID %x:%x\n", + TI_DbgPrint(DEBUG_INFO, ("Got Request: Class %x Type %x Id %x, EntityID %x:%x\n", InfoClass, InfoId, id->tei_entity, id->tei_instance)); return TDI_INVALID_REQUEST; } diff --git a/reactos/drivers/net/tcpip/tcpip/info.c b/reactos/drivers/net/tcpip/tcpip/info.c index 42f042ee292..dd50c97334c 100644 --- a/reactos/drivers/net/tcpip/tcpip/info.c +++ b/reactos/drivers/net/tcpip/tcpip/info.c @@ -28,7 +28,7 @@ VOID InsertTDIInterfaceEntity( PIP_INTERFACE Interface ) { KIRQL OldIrql; UINT Count = 0, i; - TI_DbgPrint(MAX_TRACE, + TI_DbgPrint(DEBUG_INFO, ("Inserting interface %08x (%d entities already)\n", Interface, EntityCount)); @@ -38,7 +38,7 @@ VOID InsertTDIInterfaceEntity( PIP_INTERFACE Interface ) { for( i = 0; i < EntityCount; i++ ) if( EntityList[i].tei_entity == IF_ENTITY ) { Count++; - TI_DbgPrint(MAX_TRACE, ("Entity %d is an IF. Found %d\n", + TI_DbgPrint(DEBUG_INFO, ("Entity %d is an IF. Found %d\n", i, Count)); } @@ -80,7 +80,7 @@ TDI_STATUS InfoTdiQueryListEntities(PNDIS_BUFFER Buffer, UINT Count, Size, BufSize = *BufferSize; KIRQL OldIrql; - TI_DbgPrint(MAX_TRACE,("About to copy %d TDIEntityIDs to user\n", + TI_DbgPrint(DEBUG_INFO,("About to copy %d TDIEntityIDs to user\n", EntityCount)); TcpipAcquireSpinLock(&EntityListLock, &OldIrql); @@ -134,7 +134,7 @@ TDI_STATUS InfoTdiQueryInformationEx( BOOL FoundEntity = FALSE; InfoRequest_f InfoRequest = NULL; - TI_DbgPrint(MAX_TRACE, + TI_DbgPrint(DEBUG_INFO, ("InfoEx Req: %x %x %x!%04x:%d\n", ID->toi_class, ID->toi_type, @@ -148,7 +148,7 @@ TDI_STATUS InfoTdiQueryInformationEx( if ((ID->toi_class != INFO_CLASS_GENERIC) || (ID->toi_type != INFO_TYPE_PROVIDER) || (ID->toi_id != ENTITY_LIST_ID)) { - TI_DbgPrint(MAX_TRACE,("Invalid parameter\n")); + TI_DbgPrint(DEBUG_INFO,("Invalid parameter\n")); Status = TDI_INVALID_PARAMETER; } else Status = InfoTdiQueryListEntities(Buffer, BufferSize); @@ -168,7 +168,7 @@ TDI_STATUS InfoTdiQueryInformationEx( TcpipReleaseSpinLock( &EntityListLock, OldIrql ); if( FoundEntity ) { - TI_DbgPrint(MAX_TRACE, + TI_DbgPrint(DEBUG_INFO, ("Calling Entity %d (%04x:%d) InfoEx (%x,%x,%x)\n", i, ID->toi_entity.tei_entity, ID->toi_entity.tei_instance, @@ -183,7 +183,7 @@ TDI_STATUS InfoTdiQueryInformationEx( } } - TI_DbgPrint(MAX_TRACE,("Status: %08x\n", Status)); + TI_DbgPrint(DEBUG_INFO,("Status: %08x\n", Status)); return Status; } diff --git a/reactos/drivers/net/tcpip/tcpip/ninfo.c b/reactos/drivers/net/tcpip/tcpip/ninfo.c index 59578a98588..ddc8c5df1e1 100644 --- a/reactos/drivers/net/tcpip/tcpip/ninfo.c +++ b/reactos/drivers/net/tcpip/tcpip/ninfo.c @@ -25,7 +25,7 @@ TDI_STATUS InfoTdiQueryGetAddrTable( PNDIS_BUFFER Buffer, ExAllocatePool( NonPagedPool, sizeof( IPADDR_ENTRY ) * IfCount ); PIPADDR_ENTRY IpCurrent = IpAddress; - TI_DbgPrint(MAX_TRACE, ("Called.\n")); + TI_DbgPrint(DEBUG_INFO, ("Called.\n")); TcpipAcquireSpinLock(&InterfaceListLock, &OldIrql); @@ -56,7 +56,7 @@ TDI_STATUS InfoTdiQueryGetAddrTable( PNDIS_BUFFER Buffer, ExFreePool( IpAddress ); - TI_DbgPrint(MAX_TRACE, ("Returning %08x\n", Status)); + TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status)); return Status; } @@ -73,7 +73,7 @@ TDI_STATUS InfoTdiQueryGetRouteTable( PNDIS_BUFFER Buffer, PUINT BufferSize ) { PIPROUTE_ENTRY RouteEntries = ExAllocatePool( NonPagedPool, Size ), RtCurrent = RouteEntries; - TI_DbgPrint(MAX_TRACE, ("Called, routes = %d, RCache = %08x\n", + TI_DbgPrint(DEBUG_INFO, ("Called, routes = %d, RCache = %08x\n", RtCount, RCache)); if( !RCache || !RouteEntries ) { @@ -106,7 +106,7 @@ TDI_STATUS InfoTdiQueryGetRouteTable( PNDIS_BUFFER Buffer, PUINT BufferSize ) { RtCurrent->Type = TDI_ADDRESS_TYPE_IP; TI_DbgPrint - (MAX_TRACE, + (DEBUG_INFO, ("%d: NA %08x NM %08x GW %08x MT %x\n", RtCurrent - RouteEntries, RtCurrent->Dest, @@ -132,7 +132,7 @@ TDI_STATUS InfoTdiQueryGetRouteTable( PNDIS_BUFFER Buffer, PUINT BufferSize ) { ExFreePool( RouteEntries ); ExFreePool( RCache ); - TI_DbgPrint(MAX_TRACE, ("Returning %08x\n", Status)); + TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status)); return Status; } @@ -144,7 +144,7 @@ TDI_STATUS InfoTdiQueryGetIPSnmpInfo( PNDIS_BUFFER Buffer, UINT RouteCount = CountFIBs( NULL ); TDI_STATUS Status = TDI_INVALID_REQUEST; - TI_DbgPrint(MAX_TRACE, ("Called.\n")); + TI_DbgPrint(DEBUG_INFO, ("Called.\n")); RtlZeroMemory(&SnmpInfo, sizeof(IPSNMP_INFO)); @@ -155,7 +155,7 @@ TDI_STATUS InfoTdiQueryGetIPSnmpInfo( PNDIS_BUFFER Buffer, Status = InfoCopyOut( (PCHAR)&SnmpInfo, sizeof(SnmpInfo), Buffer, BufferSize ); - TI_DbgPrint(MAX_TRACE, ("Returning %08x\n", Status)); + TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status)); return Status; } @@ -169,7 +169,7 @@ TDI_STATUS InfoNetworkLayerTdiQueryEx( UINT InfoClass, PUINT BufferSize ) { TDI_STATUS Status = TDI_INVALID_REQUEST; - TI_DbgPrint(MAX_TRACE, ("Called.\n")); + TI_DbgPrint(DEBUG_INFO, ("Called.\n")); switch( InfoClass ) { case INFO_CLASS_GENERIC: @@ -200,7 +200,7 @@ TDI_STATUS InfoNetworkLayerTdiQueryEx( UINT InfoClass, } } - TI_DbgPrint(MAX_TRACE, ("Returning %08x\n", Status)); + TI_DbgPrint(DEBUG_INFO, ("Returning %08x\n", Status)); return Status; } @@ -218,7 +218,7 @@ TDI_STATUS InfoNetworkLayerTdiSetEx( UINT InfoClass, IP_ADDRESS Router; PNEIGHBOR_CACHE_ENTRY NCE; - TI_DbgPrint(MID_TRACE,("Called\n")); + TI_DbgPrint(DEBUG_INFO,("Called\n")); OskitDumpBuffer( (OSK_PCHAR)Buffer, BufferSize ); @@ -232,7 +232,7 @@ TDI_STATUS InfoNetworkLayerTdiSetEx( UINT InfoClass, AddrInitIPv4( &Router, Route->Gw ); if( Route->Type == IP_ROUTE_TYPE_ADD ) { /* Add the route */ - TI_DbgPrint(MID_TRACE,("Adding route (%s)\n", A2S(&Address))); + TI_DbgPrint(DEBUG_INFO,("Adding route (%s)\n", A2S(&Address))); /* Find the existing route this belongs to */ NCE = RouterGetRoute( &Router ); /* Really add the route */ @@ -243,12 +243,12 @@ TDI_STATUS InfoNetworkLayerTdiSetEx( UINT InfoClass, else Status = STATUS_UNSUCCESSFUL; } else if( Route->Type == IP_ROUTE_TYPE_DEL ) { - TI_DbgPrint(MID_TRACE,("Removing route (%s)\n", A2S(&Address))); + TI_DbgPrint(DEBUG_INFO,("Removing route (%s)\n", A2S(&Address))); Status = RouterRemoveRoute( &Address, &Router ); } else Status = TDI_INVALID_REQUEST; } - TI_DbgPrint(MID_TRACE,("Returning %x\n", Status)); + TI_DbgPrint(DEBUG_INFO,("Returning %x\n", Status)); return Status; } diff --git a/reactos/subsys/system/dhcp/Makefile b/reactos/subsys/system/dhcp/Makefile index b90766ce0a3..a6147d92c68 100644 --- a/reactos/subsys/system/dhcp/Makefile +++ b/reactos/subsys/system/dhcp/Makefile @@ -16,6 +16,8 @@ TARGET_OBJECTS = adapter.o alloc.o api.o compat.o dhclient.o dispatch.o \ TARGET_SDKLIBS = iphlpapi.a ws2_32.a ntdll.a +TARGET_INSTALLDIR = system32 + TARGET_RC_SRCS = dhcp.rc TARGET_RC_BINSRC = diff --git a/reactos/subsys/system/dhcp/adapter.c b/reactos/subsys/system/dhcp/adapter.c index 5b793210eb8..713a7f71706 100644 --- a/reactos/subsys/system/dhcp/adapter.c +++ b/reactos/subsys/system/dhcp/adapter.c @@ -5,34 +5,212 @@ static LIST_ENTRY AdapterList; static WSADATA wsd; extern struct interface_info *ifi; -DWORD GetAddress( PDHCP_ADAPTER Adapter ) { - PMIB_IPADDRTABLE AddressTable = NULL; - ULONG i, Size = 0, NumAddressRows; - DWORD Error = GetIpAddrTable( AddressTable, &Size, FALSE ); +PCHAR *GetSubkeyNames( PCHAR MainKeyName, PCHAR Append ) { + int i = 0; + DWORD Error; + HKEY MainKey; + PCHAR *Out, OutKeyName; + DWORD CharTotal = 0, ThisKey, AppendLen = 1 + strlen(Append); + DWORD MaxSubKeyLen = 0, MaxSubKeys = 0; - while( Error == ERROR_INSUFFICIENT_BUFFER ) { - free( AddressTable ); - AddressTable = malloc( Size ); - if( AddressTable ) - Error = GetIpAddrTable( AddressTable, &Size, FALSE ); - } - if( Error != ERROR_SUCCESS ) { - free( AddressTable ); - return Error; + Error = RegOpenKey( HKEY_LOCAL_MACHINE, MainKeyName, &MainKey ); + + if( Error ) return NULL; + + Error = RegQueryInfoKey + ( MainKey, + NULL, NULL, NULL, + &MaxSubKeys, &MaxSubKeyLen, + NULL, NULL, NULL, NULL, NULL, NULL ); + + DH_DbgPrint(MID_TRACE,("MaxSubKeys: %d, MaxSubKeyLen %d\n", + MaxSubKeys, MaxSubKeyLen)); + + CharTotal = (sizeof(PCHAR) + MaxSubKeyLen + AppendLen) * (MaxSubKeys + 1); + + DH_DbgPrint(MID_TRACE,("AppendLen: %d, CharTotal: %d\n", + AppendLen, CharTotal)); + + Out = malloc( CharTotal ); + OutKeyName = ((PCHAR)&Out[MaxSubKeys+1]); + + if( !Out ) { RegCloseKey( MainKey ); return NULL; } + + i = 0; + do { + Out[i] = OutKeyName; + Error = RegEnumKey( MainKey, i, OutKeyName, MaxSubKeyLen ); + if( !Error ) { + strcat( OutKeyName, Append ); + DH_DbgPrint(MID_TRACE,("[%d]: %s\n", i, OutKeyName)); + OutKeyName += strlen(OutKeyName) + 1; + i++; + } else Out[i] = 0; + } while( Error == ERROR_SUCCESS ); + + RegCloseKey( MainKey ); + + return Out; +} + +PCHAR RegReadString( HKEY Root, PCHAR Subkey, PCHAR Value ) { + PCHAR SubOut = NULL; + DWORD SubOutLen = 0, Error = 0; + HKEY ValueKey = NULL; + + DH_DbgPrint(MID_TRACE,("Looking in %x:%s:%s\n", Root, Subkey, Value )); + + if( Subkey && strlen(Subkey) ) { + if( RegOpenKey( Root, Subkey, &ValueKey ) != ERROR_SUCCESS ) + goto regerror; + } else ValueKey = Root; + + DH_DbgPrint(MID_TRACE,("Got Key %x\n", ValueKey)); + + if( (Error = RegQueryValueEx( ValueKey, Value, NULL, NULL, + SubOut, &SubOutLen )) != ERROR_SUCCESS ) + goto regerror; + + DH_DbgPrint(MID_TRACE,("Value %s has size %d\n", Value, SubOutLen)); + + if( !(SubOut = malloc(SubOutLen)) ) + goto regerror; + + if( (Error = RegQueryValueEx( ValueKey, Value, NULL, NULL, + SubOut, &SubOutLen )) != ERROR_SUCCESS ) + goto regerror; + + DH_DbgPrint(MID_TRACE,("Value %s is %s\n", Value, SubOut)); + + goto cleanup; + +regerror: + if( SubOut ) free( SubOut ); +cleanup: + if( ValueKey && ValueKey != Root ) { + DH_DbgPrint(MID_TRACE,("Closing key %x\n", ValueKey)); + RegCloseKey( ValueKey ); } - NumAddressRows = Size / sizeof(MIB_IPADDRTABLE); - for( i = 0; i < AddressTable->dwNumEntries; i++ ) { - DH_DbgPrint(MID_TRACE, - ("Finding address for adapter %d: (%d -> %x)\n", - Adapter->IfMib.dwIndex, - AddressTable->table[i].dwIndex, - AddressTable->table[i].dwAddr)); - if( Adapter->IfMib.dwIndex == AddressTable->table[i].dwIndex ) { - memcpy( &Adapter->IfAddr, &AddressTable->table[i], - sizeof( MIB_IPADDRROW ) ); + DH_DbgPrint(MID_TRACE,("Returning %x with error %d\n", SubOut, Error)); + + return SubOut; +} + +HKEY FindAdapterKey( PDHCP_ADAPTER Adapter ) { + int i = 0; + PCHAR EnumKeyName = + "SYSTEM\\CurrentControlSet\\Control\\Class\\" + "{4D36E972-E325-11CE-BFC1-08002BE10318}"; + PCHAR TargetKeyNameStart = + "SYSTEM\\CurrentControlSet\\Services\\"; + PCHAR TargetKeyNameEnd = "\\Parameters\\Tcpip"; + PCHAR TargetKeyName = NULL; + PCHAR *EnumKeysLinkage = GetSubkeyNames( EnumKeyName, "\\Linkage" ); + PCHAR *EnumKeysTop = GetSubkeyNames( EnumKeyName, "" ); + PCHAR RootDevice = NULL, DriverDesc = NULL; + HKEY EnumKey, OutKey = NULL; + DWORD Error = ERROR_SUCCESS; + + if( !EnumKeysLinkage || !EnumKeysTop ) goto cleanup; + + Error = RegOpenKey( HKEY_LOCAL_MACHINE, EnumKeyName, &EnumKey ); + + if( Error ) goto cleanup; + + for( i = 0; EnumKeysLinkage[i]; i++ ) { + RootDevice = RegReadString + ( EnumKey, EnumKeysLinkage[i], "RootDevice" ); + DriverDesc = RegReadString + ( EnumKey, EnumKeysTop[i], "DriverDesc" ); + + if( DriverDesc && + !strcmp( DriverDesc, Adapter->DhclientInfo.name ) ) { + TargetKeyName = + malloc( strlen( TargetKeyNameStart ) + + strlen( RootDevice ) + + strlen( TargetKeyNameEnd ) + 1 ); + if( !TargetKeyName ) goto cleanup; + sprintf( TargetKeyName, "%s%s%s", + TargetKeyNameStart, RootDevice, TargetKeyNameEnd ); + Error = RegOpenKey( HKEY_LOCAL_MACHINE, TargetKeyName, &OutKey ); + break; + } else { + free( RootDevice ); RootDevice = 0; + free( DriverDesc ); DriverDesc = 0; } } + +cleanup: + if( RootDevice ) free( RootDevice ); + if( DriverDesc ) free( DriverDesc ); + if( EnumKeysLinkage ) free( EnumKeysLinkage ); + if( EnumKeysTop ) free( EnumKeysTop ); + if( TargetKeyName ) free( TargetKeyName ); + + return OutKey; +} + +BOOL PrepareAdapterForService( PDHCP_ADAPTER Adapter ) { + HKEY AdapterKey = NULL; + PCHAR IPAddress = NULL, Netmask = NULL, DefaultGateway = NULL; + NTSTATUS Status = STATUS_SUCCESS; + DWORD Error = ERROR_SUCCESS; + MIB_IPFORWARDROW DefGatewayRow; + + Adapter->DhclientState.config = &Adapter->DhclientConfig; + strncpy(Adapter->DhclientInfo.name, Adapter->IfMib.bDescr, + sizeof(Adapter->DhclientInfo.name)); + + AdapterKey = FindAdapterKey( Adapter ); + if( AdapterKey ) + IPAddress = RegReadString( AdapterKey, NULL, "IPAddress" ); + + if( IPAddress && strcmp( IPAddress, "0.0.0.0" ) ) { + /* Non-automatic case */ + DH_DbgPrint + (MID_TRACE,("Adapter Name: [%s] (Bind Status %x) (static %s)\n", + Adapter->DhclientInfo.name, + Adapter->BindStatus, + IPAddress)); + + Adapter->DhclientState.state = S_STATIC; + + Netmask = RegReadString( AdapterKey, NULL, "Subnetmask" ); + if( !Netmask ) Netmask = "255.255.255.0"; + + Status = AddIPAddress( inet_addr( IPAddress ), + inet_addr( Netmask ), + Adapter->IfMib.dwIndex, + &Adapter->NteContext, + &Adapter->NteInstance ); + + DefaultGateway = RegReadString( AdapterKey, NULL, "DefaultGateway" ); + + if( DefaultGateway ) { + DefGatewayRow.dwForwardDest = 0; + DefGatewayRow.dwForwardMask = 0; + DefGatewayRow.dwForwardMetric1 = 1; + DefGatewayRow.dwForwardNextHop = inet_addr(DefaultGateway); + Error = CreateIpForwardEntry( &DefGatewayRow ); + if( Error ) + warning("Failed to set default gateway %s: %d\n", + DefaultGateway, Error); + } + + if( DefaultGateway ) free( DefaultGateway ); + if( Netmask ) free( Netmask ); + } else { + /* Automatic case */ + DH_DbgPrint + (MID_TRACE,("Adapter Name: [%s] (Bind Status %x) (dynamic)\n", + Adapter->DhclientInfo.name, + Adapter->BindStatus)); + } + + if( IPAddress ) free( IPAddress ); + + return TRUE; } /* @@ -66,20 +244,23 @@ void AdapterInit() { Table->table[i].dwIndex)); Adapter = calloc( sizeof( DHCP_ADAPTER ) + Table->table[i].dwMtu, 1 ); - if( Adapter && Table->table[i].dwType ) { + if( Adapter && Table->table[i].dwType == MIB_IF_TYPE_ETHERNET ) { memcpy( &Adapter->IfMib, &Table->table[i], sizeof(Adapter->IfMib) ); - GetAddress( Adapter ); - InsertTailList( &AdapterList, &Adapter->ListEntry ); - Adapter->DhclientInfo.next = ifi; Adapter->DhclientInfo.client = &Adapter->DhclientState; Adapter->DhclientInfo.rbuf = Adapter->recv_buf; Adapter->DhclientInfo.rbuf_max = Table->table[i].dwMtu; Adapter->DhclientInfo.rbuf_len = Adapter->DhclientInfo.rbuf_offset = 0; + memcpy(Adapter->DhclientInfo.hw_address.haddr, + Adapter->IfMib.bPhysAddr, + Adapter->IfMib.dwPhysAddrLen); + Adapter->DhclientInfo.hw_address.hlen = + Adapter->IfMib.dwPhysAddrLen; + if( DhcpSocket == INVALID_SOCKET ) { DhcpSocket = - Adapter->DhclientInfo.rfdesc = + Adapter->DhclientInfo.rfdesc = Adapter->DhclientInfo.wfdesc = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); Adapter->ListenAddr.sin_family = AF_INET; @@ -93,7 +274,7 @@ void AdapterInit() { Adapter->DhclientInfo.rfdesc = Adapter->DhclientInfo.wfdesc = DhcpSocket; } - Adapter->DhclientState.config = &Adapter->DhclientConfig; + Adapter->DhclientConfig.timeout = DHCP_PANIC_TIMEOUT; Adapter->DhclientConfig.initial_interval = DHCP_DISCOVER_INTERVAL; Adapter->DhclientConfig.retry_interval = DHCP_DISCOVER_INTERVAL; @@ -102,13 +283,17 @@ void AdapterInit() { Adapter->DhclientConfig.backoff_cutoff = DHCP_BACKOFF_MAX; Adapter->DhclientState.interval = Adapter->DhclientConfig.retry_interval; - strncpy(Adapter->DhclientInfo.name, Adapter->IfMib.bDescr, - sizeof(Adapter->DhclientInfo.name)); - DH_DbgPrint(MID_TRACE,("Adapter Name: [%s] (Bind Status %x)\n", - Adapter->DhclientInfo.name, - Adapter->BindStatus)); - ifi = &Adapter->DhclientInfo; - } + + if( PrepareAdapterForService( Adapter ) ) { + Adapter->DhclientInfo.next = ifi; + ifi = &Adapter->DhclientInfo; + InsertTailList( &AdapterList, &Adapter->ListEntry ); + } else { free( Adapter ); Adapter = 0; } + } else { free( Adapter ); Adapter = 0; } + + if( !Adapter ) + DH_DbgPrint(MID_TRACE,("Adapter %d was rejected\n", + Table->table[i].dwIndex)); } DH_DbgPrint(MID_TRACE,("done with AdapterInit\n")); diff --git a/reactos/subsys/system/dhcp/api.c b/reactos/subsys/system/dhcp/api.c index 4c70147b970..bf4be82f125 100644 --- a/reactos/subsys/system/dhcp/api.c +++ b/reactos/subsys/system/dhcp/api.c @@ -38,8 +38,11 @@ DWORD DSLeaseIpAddress( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { Reply.Reply = Adapter ? 1 : 0; if( Adapter ) { - Adapter->DhclientState.state = S_REBOOTING; - send_discover( &Adapter->DhclientInfo ); + add_protocol( Adapter->DhclientInfo.name, + Adapter->DhclientInfo.rfdesc, got_one, + &Adapter->DhclientInfo ); + Adapter->DhclientInfo.client->state = S_INIT; + state_reboot(&Adapter->DhclientInfo); } ApiUnlock(); @@ -77,6 +80,7 @@ DWORD DSReleaseIpAddressLease( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { if( Adapter ) { DeleteIPAddress( Adapter->NteContext ); + remove_protocol( find_protocol_by_adapter( &Adapter->DhclientInfo ) ); } ApiUnlock(); @@ -101,6 +105,7 @@ DWORD DSRenewIpAddressLease( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { Adapter->DhclientState.state = S_BOUND; + send_discover( &Adapter->DhclientInfo ); state_bound( &Adapter->DhclientInfo ); ApiUnlock(); @@ -121,7 +126,8 @@ DWORD DSStaticRefreshParams( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { if( Adapter ) { DeleteIPAddress( Adapter->NteContext ); - Adapter->DhclientState.state = S_BOUND; + Adapter->DhclientState.state = S_STATIC; + remove_protocol( find_protocol_by_adapter( &Adapter->DhclientInfo ) ); Status = AddIPAddress( Req->Body.StaticRefreshParams.IPAddress, Req->Body.StaticRefreshParams.Netmask, Req->AdapterIndex, diff --git a/reactos/subsys/system/dhcp/dhclient.c b/reactos/subsys/system/dhcp/dhclient.c index dd8700314eb..4f6a96078c5 100644 --- a/reactos/subsys/system/dhcp/dhclient.c +++ b/reactos/subsys/system/dhcp/dhclient.c @@ -108,6 +108,7 @@ int ipv4addrs(char * buf); int res_hnok(const char *dn); char *option_as_string(unsigned int code, unsigned char *data, int len); int fork_privchld(int, int); +int check_arp( struct interface_info *ip, struct client_lease *lp ); #define ROUNDUP(a) \ ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) @@ -115,143 +116,11 @@ int fork_privchld(int, int); time_t scripttime; -#if 0 - -int -findproto(char *cp, int n) -{ - struct sockaddr *sa; - int i; - - if (n == 0) - return -1; - for (i = 1; i; i <<= 1) { - if (i & n) { - sa = (struct sockaddr *)cp; - switch (i) { - case RTA_IFA: - case RTA_DST: - case RTA_GATEWAY: - case RTA_NETMASK: - if (sa->sa_family == AF_INET) - return AF_INET; - if (sa->sa_family == AF_INET6) - return AF_INET6; - break; - case RTA_IFP: - break; - } - ADVANCE(cp, sa); - } - } - return (-1); +/* XXX Implement me */ +int check_arp( struct interface_info *ip, struct client_lease *lp ) { + return 1; } - -struct sockaddr * -get_ifa(char *cp, int n) -{ - struct sockaddr *sa; - int i; - - if (n == 0) - return (NULL); - for (i = 1; i; i <<= 1) - if (i & n) { - sa = (struct sockaddr *)cp; - if (i == RTA_IFA) - return (sa); - ADVANCE(cp, sa); - } - - return (NULL); -} -struct iaddr defaddr = { 4 }; - -/* ARGSUSED */ -void -routehandler(struct protocol *p) -{ - char msg[2048]; - struct rt_msghdr *rtm; - struct if_msghdr *ifm; - struct ifa_msghdr *ifam; - struct if_announcemsghdr *ifan; - struct client_lease *l; - time_t t = time(NULL); - struct sockaddr *sa; - struct iaddr a; - ssize_t n; - - n = read(routefd, &msg, sizeof(msg)); - rtm = (struct rt_msghdr *)msg; - if (n < sizeof(rtm->rtm_msglen) || n < rtm->rtm_msglen || - rtm->rtm_version != RTM_VERSION) - return; - - switch (rtm->rtm_type) { - case RTM_NEWADDR: - ifam = (struct ifa_msghdr *)rtm; - if (ifam->ifam_index != ifi->index) - break; - if (findproto((char *)(ifam + 1), ifam->ifam_addrs) != AF_INET) - break; - if (ifi == NULL) - goto die; - sa = get_ifa((char *)(ifam + 1), ifam->ifam_addrs); - if (sa == NULL) - goto die; - - if ((a.len = sizeof(struct in_addr)) > sizeof(a.iabuf)) - error("king bula sez: len mismatch"); - memcpy(a.iabuf, &((struct sockaddr_in *)sa)->sin_addr, a.len); - if (addr_eq(a, defaddr)) - break; - - for (l = ifi->client->active; l != NULL; l = l->next) - if (addr_eq(a, l->address)) - break; - - if (l != NULL) /* new addr is the one we set */ - break; - - goto die; - case RTM_DELADDR: - ifam = (struct ifa_msghdr *)rtm; - if (ifam->ifam_index != ifi->index) - break; - if (findproto((char *)(ifam + 1), ifam->ifam_addrs) != AF_INET) - break; - if (scripttime == 0 || t < scripttime + 10) - break; - goto die; - case RTM_IFINFO: - ifm = (struct if_msghdr *)rtm; - if (ifm->ifm_index != ifi->index) - break; - if ((rtm->rtm_flags & RTF_UP) == 0) - goto die; - break; - case RTM_IFANNOUNCE: - ifan = (struct if_announcemsghdr *)rtm; - if (ifan->ifan_what == IFAN_DEPARTURE && - ifan->ifan_index == ifi->index) - goto die; - break; - default: - break; - } - return; - -die: - script_init("FAIL", NULL); - if (ifi->client->alias) - script_write_params("alias_", ifi->client->alias); - script_go(); - exit(1); -} -#endif - int main(int argc, char *argv[]) { @@ -299,9 +168,6 @@ main(int argc, char *argv[]) (MID_TRACE, ("Setting init state and restarting interface %p\n",ifi)); - ifi->client->state = S_INIT; - state_reboot(ifi); - bootp_packet_handler = do_packet; DH_DbgPrint(MID_TRACE,("Going into dispatch()\n")); @@ -438,20 +304,7 @@ state_selecting(void *ipp) /* Check to see if we got an ARPREPLY for the address in this particular lease. */ if (!picked) { - script_init("ARPCHECK", lp->medium); - script_write_params("check_", lp); - - /* If the ARPCHECK code detects another - machine using the offered address, it exits - nonzero. We need to send a DHCPDECLINE and - toss the lease. */ -#if 0 /* XXX Later check ARP. For now, trust leases */ - if (script_go()) { - make_decline(ip, lp); - send_decline(ip); - goto freeit; - } -#endif + if( !check_arp(ip,lp) ) goto freeit; picked = lp; picked->next = NULL; } else { @@ -805,8 +658,8 @@ dhcpoffer(struct packet *packet) /* If we're not receptive to an offer right now, or if the offer has an unrecognizable transaction id, then just drop it. */ if (ip->client->state != S_SELECTING || - packet->interface->client->xid != packet->raw->xid || - (packet->interface->hw_address.hlen != packet->raw->hlen) || + packet->interface->client->xid != packet->raw->xid || + (packet->interface->hw_address.hlen != packet->raw->hlen) || (memcmp(packet->interface->hw_address.haddr, packet->raw->chaddr, packet->raw->hlen))) return; @@ -850,14 +703,10 @@ dhcpoffer(struct packet *packet) lease->medium = ip->client->medium; /* Send out an ARP Request for the offered IP address. */ - script_init("ARPSEND", lease->medium); - script_write_params("check_", lease); - /* If the script can't send an ARP request without waiting, - we'll be waiting when we do the ARPCHECK, so don't wait now. */ - if (script_go()) - arp_timeout_needed = 0; - else - arp_timeout_needed = 2; + if( !check_arp( ip, lease ) ) { + note("Arp check failed\n"); + return; + } /* Figure out when we're supposed to stop selecting. */ stop_selecting = @@ -1072,9 +921,7 @@ again: note("Trying medium \"%s\" %d", ip->client->medium->string, increase); - script_init("MEDIUM", ip->client->medium); - if (script_go()) - goto again; + /* XXX Support other media types eventually */ } /* @@ -1170,25 +1017,22 @@ state_panic(void *ipp) /* If the old lease is still good and doesn't yet need renewal, go into BOUND state and timeout at the renewal time. */ - if (!script_go()) { - if (cur_time < - ip->client->active->renewal) { - ip->client->state = S_BOUND; - note("bound: renewal in %d seconds.", - ip->client->active->renewal - - cur_time); - add_timeout( - ip->client->active->renewal, - state_bound, ip); - } else { - ip->client->state = S_BOUND; - note("bound: immediate renewal."); - state_bound(ip); - } - reinitialize_interfaces(); - //go_daemon(); - return; - } + if (cur_time < + ip->client->active->renewal) { + ip->client->state = S_BOUND; + note("bound: renewal in %d seconds.", + ip->client->active->renewal - + cur_time); + add_timeout( + ip->client->active->renewal, + state_bound, ip); + } else { + ip->client->state = S_BOUND; + note("bound: immediate renewal."); + state_bound(ip); + } + reinitialize_interfaces(); + return; } /* If there are no other leases, give up. */ @@ -1222,14 +1066,10 @@ activate_next: tell the shell script that we failed to allocate an address, and try again later. */ note("No working leases in persistent database - sleeping.\n"); - script_init("FAIL", NULL); - if (ip->client->alias) - script_write_params("alias_", ip->client->alias); - script_go(); ip->client->state = S_INIT; add_timeout(cur_time + ip->client->config->retry_interval, state_init, ip); -// go_daemon(); + /* XXX Take any failure actions necessary */ } void @@ -1271,8 +1111,7 @@ cancel: script_init("MEDIUM", ip->client->active->medium); /* If the medium we chose won't fly, go to INIT state. */ - if (script_go()) - goto cancel; + /* XXX Nothing for now */ /* Record the medium. */ ip->client->medium = ip->client->active->medium; @@ -1282,23 +1121,18 @@ cancel: to the INIT state. */ if (ip->client->state != S_REQUESTING && cur_time > ip->client->active->expiry) { - /* Run the client script with the new parameters. */ - script_init("EXPIRE", NULL); - script_write_params("old_", ip->client->active); - if (ip->client->alias) - script_write_params("alias_", ip->client->alias); - script_go(); + PDHCP_ADAPTER Adapter = AdapterFindInfo( ip ); + /* Run the client script with the new parameters. */ + /* No script actions necessary in the expiry case */ + /* Now do a preinit on the interface so that we can + discover a new address. */ - /* Now do a preinit on the interface so that we can - discover a new address. */ - script_init("PREINIT", NULL); - if (ip->client->alias) - script_write_params("alias_", ip->client->alias); - script_go(); - - ip->client->state = S_INIT; - state_init(ip); - return; + if( Adapter ) + DeleteIPAddress( Adapter->NteContext ); + + ip->client->state = S_INIT; + state_init(ip); + return; } /* Do the exponential backoff... */ @@ -1974,158 +1808,6 @@ script_write_params(char *prefix, struct client_lease *lease) error("buf_close: %m"); } -int -script_go(void) -{ - struct imsg_hdr hdr; - struct buf *buf; - int ret; - - scripttime = time(NULL); - - hdr.code = IMSG_SCRIPT_GO; - hdr.len = sizeof(struct imsg_hdr); - - if ((buf = buf_open(hdr.len)) == NULL) - error("buf_open: %m"); - - if (buf_add(buf, &hdr, sizeof(hdr))) - error("buf_add: %m"); - - if (buf_close(privfd, buf) == -1) - error("buf_close: %m"); - - memset(&hdr, 0, sizeof(hdr)); - //bzero(&hdr, sizeof(hdr)); - buf_read(privfd, &hdr, sizeof(hdr)); - if (hdr.code != IMSG_SCRIPT_GO_RET) - error("unexpected msg type %u", hdr.code); - if (hdr.len != sizeof(hdr) + sizeof(int)) - error("received corrupted message"); - buf_read(privfd, &ret, sizeof(ret)); - - return (ret); -} - -#if 0 -int -priv_script_go(void) -{ - char *scriptName, *argv[2], **envp, *epp[3], reason[] = "REASON=NBI"; - static char client_path[] = CLIENT_PATH; - struct interface_info *ip = ifi; - int pid, wpid, wstatus; - - scripttime = time(NULL); - - if (ip) { - scriptName = ip->client->config->script_name; - envp = ip->client->scriptEnv; - } else { - scriptName = top_level_config.script_name; - epp[0] = reason; - epp[1] = client_path; - epp[2] = NULL; - envp = epp; - } - - argv[0] = scriptName; - argv[1] = NULL; - - pid = fork(); - if (pid < 0) { - error("fork: %m"); - wstatus = 0; - } else if (pid) { - do { - wpid = wait(&wstatus); - } while (wpid != pid && wpid > 0); - if (wpid < 0) { - error("wait: %m"); - wstatus = 0; - } - } else { - execve(scriptName, argv, envp); - error("execve (%s, ...): %m", scriptName); - } - - if (ip) - script_flush_env(ip->client); - - return (wstatus & 0xff); -} -#endif - -#if 0 -void -script_set_env(struct client_state *client, const char *prefix, - const char *name, const char *value) -{ - int i, j, namelen; - - namelen = strlen(name); - - for (i = 0; client->scriptEnv[i]; i++) - if (strncmp(client->scriptEnv[i], name, namelen) == 0 && - client->scriptEnv[i][namelen] == '=') - break; - - if (client->scriptEnv[i]) - /* Reuse the slot. */ - free(client->scriptEnv[i]); - else { - /* New variable. Expand if necessary. */ - if (i >= client->scriptEnvsize - 1) { - char **newscriptEnv; - int newscriptEnvsize = client->scriptEnvsize + 50; - - newscriptEnv = realloc(client->scriptEnv, - newscriptEnvsize); - if (newscriptEnv == NULL) { - free(client->scriptEnv); - client->scriptEnv = NULL; - client->scriptEnvsize = 0; - error("script_set_env: no memory for variable"); - } - client->scriptEnv = newscriptEnv; - client->scriptEnvsize = newscriptEnvsize; - } - /* need to set the NULL pointer at end of array beyond - the new slot. */ - client->scriptEnv[i + 1] = NULL; - } - /* Allocate space and format the variable in the appropriate slot. */ - client->scriptEnv[i] = malloc(strlen(prefix) + strlen(name) + 1 + - strlen(value) + 1); - if (client->scriptEnv[i] == NULL) - error("script_set_env: no memory for variable assignment"); - - /* No `` or $() command substitution allowed in environment values! */ - for (j=0; j < strlen(value); j++) - switch (value[j]) { - case '`': - case '$': - error("illegal character (%c) in value '%s'", value[j], - value); - /* not reached */ - } - snprintf(client->scriptEnv[i], strlen(prefix) + strlen(name) + - 1 + strlen(value) + 1, "%s%s=%s", prefix, name, value); -} - -void -script_flush_env(struct client_state *client) -{ - int i; - - for (i = 0; client->scriptEnv[i]; i++) { - free(client->scriptEnv[i]); - client->scriptEnv[i] = NULL; - } - client->scriptEnvsize = 0; -} -#endif - int dhcp_option_ev_name(char *buf, size_t buflen, struct dhcp_option *option) { diff --git a/reactos/subsys/system/dhcp/dispatch.c b/reactos/subsys/system/dhcp/dispatch.c index 3fdfb2131d5..121daa9937b 100644 --- a/reactos/subsys/system/dhcp/dispatch.c +++ b/reactos/subsys/system/dhcp/dispatch.c @@ -63,120 +63,21 @@ static int interface_status(struct interface_info *ifinfo); * register that interface with the network I/O software, figure out * what subnet it's on, and add it to the list of interfaces. */ -#if 0 -void -discover_interfaces(struct interface_info *iface) -{ - struct ifaddrs *ifap, *ifa; - struct sockaddr_in foo; - struct ifreq *tif; - - if (getifaddrs(&ifap) != 0) - error("getifaddrs failed"); - - for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { - if ((ifa->ifa_flags & IFF_LOOPBACK) || - (ifa->ifa_flags & IFF_POINTOPOINT) || - (!(ifa->ifa_flags & IFF_UP))) - continue; - - - if (strcmp(iface->name, ifa->ifa_name)) - continue; - - /* - * If we have the capability, extract link information - * and record it in a linked list. - */ - if (ifa->ifa_addr->sa_family == AF_LINK) { - struct sockaddr_dl *foo = - (struct sockaddr_dl *)ifa->ifa_addr; - - iface->index = foo->sdl_index; - iface->hw_address.hlen = foo->sdl_alen; - iface->hw_address.htype = HTYPE_ETHER; /* XXX */ - memcpy(iface->hw_address.haddr, - LLADDR(foo), foo->sdl_alen); - } else if (ifa->ifa_addr->sa_family == AF_INET) { - struct iaddr addr; - - memcpy(&foo, ifa->ifa_addr, sizeof(foo)); - if (foo.sin_addr.s_addr == htonl(INADDR_LOOPBACK)) - continue; - if (!iface->ifp) { - int len = IFNAMSIZ + ifa->ifa_addr->sa_len; - if ((tif = malloc(len)) == NULL) - error("no space to remember ifp"); - strlcpy(tif->ifr_name, ifa->ifa_name, IFNAMSIZ); - memcpy(&tif->ifr_addr, ifa->ifa_addr, - ifa->ifa_addr->sa_len); - iface->ifp = tif; - iface->primary_address = foo.sin_addr; - } - addr.len = 4; - memcpy(addr.iabuf, &foo.sin_addr.s_addr, addr.len); - } - } - - if (!iface->ifp) - error("%s: not found", iface->name); - - /* Register the interface... */ - if_register_receive(iface); - if_register_send(iface); - add_protocol(iface->name, iface->rfdesc, got_one, iface); - freeifaddrs(ifap); -} -#else void discover_interfaces(struct interface_info *iface) { NTSTATUS Status; - ULONG dim; - char TmpName [IFNAMSIZ]; + PDHCP_ADAPTER Adapter = AdapterFindInfo( iface ); - PIP_ADAPTER_INFO pAdapterInfo; - PIP_ADAPTER_INFO pAdapter = NULL; + if_register_receive(iface); + if_register_send(iface); - pAdapterInfo = malloc(sizeof(IP_ADAPTER_INFO)); - dim = sizeof(IP_ADAPTER_INFO); - - if (GetAdaptersInfo( pAdapterInfo, &dim) != ERROR_SUCCESS) { - free(pAdapterInfo); - pAdapterInfo = (IP_ADAPTER_INFO *) malloc (dim); - } - - if ((Status = GetAdaptersInfo( pAdapterInfo, &dim)) != NO_ERROR) { - note("Error %x", Status); - free (pAdapterInfo); - return; - } - - for (pAdapter = pAdapterInfo; pAdapter; pAdapter = pAdapter->Next) { - /* we only do ethernet */ - note("found: %s %x\n", pAdapter->AdapterName, pAdapter->Address); - if (pAdapter->Type != MIB_IF_TYPE_ETHERNET) { - continue; - } - note ("found ethernet\n"); - - iface->hw_address.hlen = pAdapter->AddressLength; - iface->hw_address.htype = HTYPE_ETHER; - memcpy (&iface->hw_address.haddr[0], - pAdapter->Address, iface->hw_address.hlen); - - if (pAdapter->IpAddressList.IpAddress.String) - iface->primary_address.S_un.S_addr = inet_addr(pAdapter->IpAddressList.IpAddress.String); - - } - if (iface) { - if_register_receive(iface); - if_register_send(iface); + if( Adapter->DhclientState.state != S_STATIC ) { add_protocol(iface->name, iface->rfdesc, got_one, iface); + iface->client->state = S_INIT; + state_reboot(iface); } - free (pAdapterInfo); } -#endif void reinitialize_interfaces(void) @@ -247,12 +148,16 @@ dispatch(void) } } - if (i == 0) - error("No live interfaces to poll on - exiting."); - - /* Wait for a packet or a timeout... XXX */ - timeval.tv_sec = to_msec / 1000; - timeval.tv_usec = (to_msec % 1000) * 1000; + if (i == 0) { + /* No interfaces for now, set the select timeout reasonably so + * we can recover from that condition later. */ + timeval.tv_sec = 5; + timeval.tv_usec = 0; + } else { + /* Wait for a packet or a timeout... XXX */ + timeval.tv_sec = to_msec / 1000; + timeval.tv_usec = (to_msec % 1000) * 1000; + } ApiUnlock(); @@ -547,6 +452,18 @@ remove_protocol(struct protocol *proto) } } +struct protocol * +find_protocol_by_adapter(struct interface_info *info) +{ + struct protocol *p; + + for( p = protocols; p; p = p->next ) { + if( p->local == (void *)info ) return p; + } + + return NULL; +} + int interface_link_status(char *ifname) { diff --git a/reactos/subsys/system/dhcp/include/dhcpd.h b/reactos/subsys/system/dhcp/include/dhcpd.h index b4106c1599a..1434021afe1 100644 --- a/reactos/subsys/system/dhcp/include/dhcpd.h +++ b/reactos/subsys/system/dhcp/include/dhcpd.h @@ -171,7 +171,8 @@ enum dhcp_state { S_REQUESTING, S_BOUND, S_RENEWING, - S_REBINDING + S_REBINDING, + S_STATIC }; struct client_config { @@ -342,6 +343,7 @@ void add_timeout(time_t, void (*)(void *), void *); void cancel_timeout(void (*)(void *), void *); void add_protocol(char *, int, void (*)(struct protocol *), void *); void remove_protocol(struct protocol *); +struct protocol *find_protocol_by_adapter( struct interface_info * ); int interface_link_status(char *); /* hash.c */ diff --git a/reactos/subsys/system/dhcp/include/rosdhcp.h b/reactos/subsys/system/dhcp/include/rosdhcp.h index d678472b5c0..bf2a43fae96 100644 --- a/reactos/subsys/system/dhcp/include/rosdhcp.h +++ b/reactos/subsys/system/dhcp/include/rosdhcp.h @@ -24,7 +24,7 @@ #define DHCP_PANIC_TIMEOUT DHCP_REBOOT_TIMEOUT * 3 #define DHCP_BACKOFF_MAX 300 #define _PATH_DHCLIENT_PID "\\systemroot\\system32\\drivers\\etc\\dhclient.pid" - +#define RRF_RT_REG_SZ 2 typedef void *VOIDPTR; #define NTOS_MODE_USER