Obtain DHCP info from DHCP client service

svn path=/trunk/; revision=20736
This commit is contained in:
Gé van Geldorp 2006-01-08 22:14:26 +00:00
parent 79678edae8
commit 7735f4484a
14 changed files with 253 additions and 19 deletions

View file

@ -7,6 +7,7 @@ enum {
DhcpReqReleaseIpAddress,
DhcpReqRenewIpAddress,
DhcpReqStaticRefreshParams,
DhcpReqGetAdapterInfo,
};
typedef struct _COMM_DHCP_REQ {
@ -39,6 +40,12 @@ typedef union _COMM_DHCP_REPLY {
DWORD Mtu;
DWORD Speed;
} QueryHWInfo;
struct {
BOOL DhcpEnabled;
DWORD DhcpServer;
time_t LeaseObtained;
time_t LeaseExpires;
} GetAdapterInfo;
} COMM_DHCP_REPLY;
#define DHCP_PIPE_NAME "\\\\.\\pipe\\dhcpclient"

View file

@ -12,6 +12,7 @@
#include <roscfg.h>
#include <winsock2.h>
#include <dhcpcsdk.h>
#include <time.h>
#include <dhcp/rosdhcp_public.h>
#define DHCP_TIMEOUT 1000
@ -117,6 +118,70 @@ DWORD APIENTRY DhcpStaticRefreshParams( DWORD AdapterIndex,
return Reply.Reply;
}
/*++
* @name DhcpRosGetAdapterInfo
* @implemented ReactOS only
*
* Get DHCP info for an adapter
*
* @param AdapterIndex
* Index of the adapter (iphlpapi-style) for which info is
* requested
*
* @param DhcpEnabled
* Returns whether DHCP is enabled for the adapter
*
* @param DhcpServer
* Returns DHCP server IP address (255.255.255.255 if no
* server reached yet), in network byte order
*
* @param LeaseObtained
* Returns time at which the lease was obtained
*
* @param LeaseExpires
* Returns time at which the lease will expire
*
* @return non-zero on success
*
* @remarks This is a ReactOS-only routine
*
*--*/
DWORD APIENTRY DhcpRosGetAdapterInfo( DWORD AdapterIndex,
PBOOL DhcpEnabled,
PDWORD DhcpServer,
time_t *LeaseObtained,
time_t *LeaseExpires )
{
COMM_DHCP_REQ Req;
COMM_DHCP_REPLY Reply;
DWORD BytesRead;
BOOL Result;
Req.Type = DhcpReqGetAdapterInfo;
Req.AdapterIndex = AdapterIndex;
Result = CallNamedPipe
( DHCP_PIPE_NAME, &Req, sizeof(Req), &Reply, sizeof(Reply),
&BytesRead, DHCP_TIMEOUT );
if ( 0 != Result && 0 != Reply.Reply ) {
*DhcpEnabled = Reply.GetAdapterInfo.DhcpEnabled;
} else {
*DhcpEnabled = FALSE;
}
if ( *DhcpEnabled ) {
*DhcpServer = Reply.GetAdapterInfo.DhcpServer;
*LeaseObtained = Reply.GetAdapterInfo.LeaseObtained;
*LeaseExpires = Reply.GetAdapterInfo.LeaseExpires;
} else {
*DhcpServer = INADDR_NONE;
*LeaseObtained = 0;
*LeaseExpires = 0;
}
return Reply.Reply;
}
INT STDCALL
DllMain(PVOID hinstDll,
ULONG dwReason,

View file

@ -1,16 +0,0 @@
; $Id: dhcpcapi.def 14337 2005-03-26 22:10:04Z $
;
; dhcpcsvc.def
;
; ReactOS Operating System
;
LIBRARY dhcpcsvc.dll
EXPORTS
DhcpCApiInitialize@4
DhcpCApiCleanup@0
DhcpQueryHWInfo@16
DhcpLeaseIpAddress@4
DhcpReleaseIpAddressLease@4
DhcpRenewIpAddressLease@4
DhcpStaticRefreshParams@12
; EOF

View file

@ -0,0 +1,47 @@
#
# PROJECT: ReactOS Networking
# LICENSE: GPL - See COPYING in the top level directory
# FILE: lib/dhcpcsvc/dhcpcsvc.spec
# PURPOSE: dhcpcsvc exports
# COPYRIGHT: Copyright 2006 Ge van Geldorp <gvg@reactos.org>
#
@ stub DhcpAcquireParameters
@ stub DhcpAcquireParametersByBroadcast
@ stdcall DhcpCApiCleanup()
@ stdcall DhcpCApiInitialize(ptr)
@ stub DhcpDelPersistentRequestParams
@ stub DhcpDeRegisterOptions
@ stub DhcpDeRegisterParamChange
@ stub DhcpEnumClasses
@ stub DhcpFallbackRefreshParams
@ stub DhcpHandlePnPEvent
@ stdcall DhcpLeaseIpAddress(long)
@ stub DhcpLeaseIpAddressEx
@ stub DhcpNotifyConfigChange
@ stub DhcpNotifyConfigChangeEx
@ stub DhcpNotifyMediaReconnected
@ stub DhcpOpenGlobalEvent
@ stub DhcpPersistentRequestParams
@ stdcall DhcpQueryHWInfo(long ptr ptr ptr)
@ stub DhcpRegisterOptions
@ stub DhcpRegisterParamChange
@ stdcall DhcpReleaseIpAddressLease(long)
@ stub DhcpReleaseIpAddressLeaseEx
@ stub DhcpReleaseParameters
@ stub DhcpRemoveDNSRegistrations
@ stdcall DhcpRenewIpAddressLease(long)
@ stub DhcpRenewIpAddressLeaseEx
@ stub DhcpRequestOptions
@ stub DhcpRequestParams
@ stdcall DhcpStaticRefreshParams(long long long)
@ stub DhcpUndoRequestParams
@ stub McastApiCleanup
@ stub McastApiStartup
@ stub McastEnumerateScopes
@ stub McastGenUID
@ stub McastReleaseAddress
@ stub McastRenewAddress
@ stub McastRequestAddress
@ stdcall DhcpRosGetAdapterInfo(long ptr ptr ptr ptr)
# The Windows DHCP client service is implemented in the DLL too
#@ stub ServiceMain

View file

@ -1,5 +1,5 @@
<module name="dhcpcsvc" type="win32dll" installbase="system32" installname="dhcpcsvc.dll">
<importlibrary definition="dhcpcsvc.def" />
<importlibrary definition="dhcpcsvc.spec.def" />
<include base="dhcpcsvc">include</include>
<define name="_DISABLE_TIDENTS" />
<define name="__USE_W32API" />
@ -11,4 +11,5 @@
<library>iphlpapi</library>
<file>dhcpcsvc.c</file>
<file>dhcpcsvc.rc</file>
<file>dhcpcsvc.spec</file>
</module>

View file

@ -0,0 +1,18 @@
/*
* PROJECT: ReactOS Networking
* LICENSE: GPL - See COPYING in the top level directory
* FILE: lib/iphlpapi/dhcp_reactos.c
* PURPOSE: DHCP helper functions for ReactOS
* COPYRIGHT: Copyright 2006 Ge van Geldorp <gvg@reactos.org>
*/
#ifndef WINE_DHCP_H_
#define WINE_DHCP_H_
DWORD getDhcpInfoForAdapter(DWORD AdapterIndex,
PBOOL DhcpEnabled,
PDWORD DhcpServer,
time_t *LeaseObtained,
time_t *LeaseExpires);
#endif /* ndef WINE_DHCP_H_ */

View file

@ -0,0 +1,30 @@
/*
* PROJECT: ReactOS Networking
* LICENSE: GPL - See COPYING in the top level directory
* FILE: lib/iphlpapi/dhcp_reactos.c
* PURPOSE: DHCP helper functions for ReactOS
* COPYRIGHT: Copyright 2006 Ge van Geldorp <gvg@reactos.org>
*/
#include "iphlpapi_private.h"
#include "dhcp.h"
#include <assert.h>
#define NDEBUG
#include "debug.h"
DWORD APIENTRY DhcpRosGetAdapterInfo(DWORD AdapterIndex,
PBOOL DhcpEnabled,
PDWORD DhcpServer,
time_t *LeaseObtained,
time_t *LeaseExpires);
DWORD getDhcpInfoForAdapter(DWORD AdapterIndex,
PBOOL DhcpEnabled,
PDWORD DhcpServer,
time_t *LeaseObtained,
time_t *LeaseExpires)
{
return DhcpRosGetAdapterInfo(AdapterIndex, DhcpEnabled, DhcpServer,
LeaseObtained, LeaseExpires);
}

View file

@ -11,6 +11,8 @@
<library>kernel32</library>
<library>advapi32</library>
<library>ws2_32</library>
<library>dhcpcsvc</library>
<file>dhcp_reactos.c</file>
<file>ifenum_reactos.c</file>
<file>ipstats_reactos.c</file>
<file>iphlpapi_main.c</file>

View file

@ -42,6 +42,7 @@
#include "winbase.h"
#include "winreg.h"
#include "iphlpapi.h"
#include "dhcp.h"
#include "ifenum.h"
#include "ipstats.h"
#include "resinfo.h"
@ -559,6 +560,8 @@ DWORD WINAPI GetAdapterIndex(LPWSTR AdapterName, PULONG IfIndex)
DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen)
{
DWORD ret;
BOOL dhcpEnabled;
DWORD dhcpServer;
TRACE("pAdapterInfo %p, pOutBufLen %p\n", pAdapterInfo, pOutBufLen);
if (!pOutBufLen)
@ -637,6 +640,12 @@ DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen)
ptr->IpAddressList.IpAddress.String);
toIPAddressString(getInterfaceMaskByIndex(table->indexes[ndx]),
ptr->IpAddressList.IpMask.String);
getDhcpInfoForAdapter(table->indexes[ndx], &dhcpEnabled,
&dhcpServer, &ptr->LeaseObtained,
&ptr->LeaseExpires);
ptr->DhcpEnabled = (DWORD) dhcpEnabled;
toIPAddressString(dhcpServer,
ptr->DhcpServer.IpAddress.String);
if (winsEnabled) {
ptr->HaveWins = TRUE;
memcpy(ptr->PrimaryWinsServer.IpAddress.String,

View file

@ -11,6 +11,9 @@
#include <winsock2.h>
#include <iphlpapi.h>
#define NDEBUG
#include <reactos/debug.h>
static CRITICAL_SECTION ApiCriticalSection;
VOID ApiInit() {
@ -140,3 +143,40 @@ DWORD DSStaticRefreshParams( PipeSendFunc Send, COMM_DHCP_REQ *Req ) {
return Send( &Reply );
}
DWORD DSGetAdapterInfo( PipeSendFunc Send, COMM_DHCP_REQ *Req ) {
COMM_DHCP_REPLY Reply;
PDHCP_ADAPTER Adapter;
ApiLock();
Adapter = AdapterFindIndex( Req->AdapterIndex );
Reply.Reply = Adapter ? 1 : 0;
if( Adapter ) {
Reply.GetAdapterInfo.DhcpEnabled = (S_STATIC != Adapter->DhclientState.state);
if (S_BOUND == Adapter->DhclientState.state) {
if (sizeof(Reply.GetAdapterInfo.DhcpServer) ==
Adapter->DhclientState.active->serveraddress.len) {
memcpy(&Reply.GetAdapterInfo.DhcpServer,
Adapter->DhclientState.active->serveraddress.iabuf,
Adapter->DhclientState.active->serveraddress.len);
} else {
DPRINT1("Unexpected server address len %d\n",
Adapter->DhclientState.active->serveraddress.len);
Reply.GetAdapterInfo.DhcpServer = htonl(INADDR_NONE);
}
Reply.GetAdapterInfo.LeaseObtained = Adapter->DhclientState.active->obtained;
Reply.GetAdapterInfo.LeaseExpires = Adapter->DhclientState.active->expiry;
} else {
Reply.GetAdapterInfo.DhcpServer = htonl(INADDR_NONE);
Reply.GetAdapterInfo.LeaseObtained = 0;
Reply.GetAdapterInfo.LeaseExpires = 0;
}
}
ApiUnlock();
return Send( &Reply );
}

View file

@ -420,6 +420,9 @@ dhcpack(struct packet *packet)
ip->client->new->rebind = ip->client->new->renewal +
ip->client->new->renewal / 2 + ip->client->new->renewal / 4;
#ifdef _REACTOS_
ip->client->new->obtained = cur_time;
#endif
ip->client->new->expiry += cur_time;
/* Lease lengths can never be negative. */
if (ip->client->new->expiry < cur_time)
@ -809,6 +812,10 @@ packet_to_lease(struct packet *packet)
lease->address.len = sizeof(packet->raw->yiaddr);
memcpy(lease->address.iabuf, &packet->raw->yiaddr, lease->address.len);
#ifdef _REACTOS_
lease->serveraddress.len = sizeof(packet->raw->siaddr);
memcpy(lease->serveraddress.iabuf, &packet->raw->siaddr, lease->address.len);
#endif
/* If the server name was filled out, copy it. */
if ((!packet->options[DHO_DHCP_OPTION_OVERLOAD].len ||

View file

@ -158,6 +158,10 @@ struct client_lease {
time_t expiry, renewal, rebind;
struct iaddr address;
char *server_name;
#ifdef _REACTOS_
time_t obtained;
struct iaddr serveraddress;
#endif
char *filename;
struct string_list *medium;
unsigned int is_static : 1;

View file

@ -67,6 +67,8 @@ extern DWORD DSQueryHWInfo( PipeSendFunc Send, COMM_DHCP_REQ *Req );
extern DWORD DSLeaseIpAddress( PipeSendFunc Send, COMM_DHCP_REQ *Req );
extern DWORD DSRenewIpAddressLease( PipeSendFunc Send, COMM_DHCP_REQ *Req );
extern DWORD DSReleaseIpAddressLease( PipeSendFunc Send, COMM_DHCP_REQ *Req );
extern DWORD DSStaticRefreshParams( PipeSendFunc Send, COMM_DHCP_REQ *Req );
extern DWORD DSGetAdapterInfo( PipeSendFunc Send, COMM_DHCP_REQ *Req );
extern int inet_aton(const char *s, struct in_addr *addr);
int warn( char *format, ... );
#endif/*ROSDHCP_H*/

View file

@ -9,6 +9,9 @@
#include <rosdhcp.h>
#define NDEBUG
#include <reactos/debug.h>
static HANDLE CommPipe = INVALID_HANDLE_VALUE, CommThread;
DWORD CommThrId;
@ -30,8 +33,8 @@ DWORD PipeSend( COMM_DHCP_REPLY *Reply ) {
DWORD WINAPI PipeThreadProc( LPVOID Parameter ) {
DWORD BytesRead, BytesWritten;
COMM_DHCP_REQ Req;
BOOL Result;
BOOLEAN Connection;
COMM_DHCP_REPLY Reply;
BOOL Result, Connection;
while( (Connection = ConnectNamedPipe( CommPipe, NULL )) ) {
Result = ReadFile( CommPipe, &Req, sizeof(Req), &BytesRead, NULL );
@ -52,6 +55,21 @@ DWORD WINAPI PipeThreadProc( LPVOID Parameter ) {
case DhcpReqRenewIpAddress:
BytesWritten = DSRenewIpAddressLease( PipeSend, &Req );
break;
case DhcpReqStaticRefreshParams:
BytesWritten = DSStaticRefreshParams( PipeSend, &Req );
break;
case DhcpReqGetAdapterInfo:
BytesWritten = DSGetAdapterInfo( PipeSend, &Req );
break;
default:
DPRINT1("Unrecognized request type %d\n", Req.Type);
ZeroMemory( &Reply, sizeof( COMM_DHCP_REPLY ) );
Reply.Reply = 0;
BytesWritten = PipeSend( &Reply );
break;
}
}
DisconnectNamedPipe( CommPipe );