Added client API interface. Modified: trunk/reactos/subsys/system/dhcp/Makefile Added: trunk/reactos/subsys/system/dhcp/api.c Modified: trunk/reactos/subsys/system/dhcp/dhclient.c Modified: trunk/reactos/subsys/system/dhcp/dispatch.c Modified: trunk/reactos/subsys/system/dhcp/include/dhcpd.h Modified: trunk/reactos/subsys/system/dhcp/include/rosdhcp.h Added: trunk/reactos/subsys/system/dhcp/pipe.c _____
Modified: trunk/reactos/subsys/system/dhcp/Makefile --- trunk/reactos/subsys/system/dhcp/Makefile 2005-04-12 21:25:58 UTC (rev 14598) +++ trunk/reactos/subsys/system/dhcp/Makefile 2005-04-12 23:23:26 UTC (rev 14599) @@ -10,8 +10,9 @@
TARGET_CFLAGS = -D__REACTOS__ -D_WIN32_WINNT=0x0501 -D__USE_W32API -Iinclude
-TARGET_OBJECTS = adapter.o alloc.o compat.o dhclient.o dispatch.o hash.o \ - options.o privsep.o socket.o tables.o timer.o util.o +TARGET_OBJECTS = adapter.o alloc.o api.o compat.o dhclient.o dispatch.o \ + hash.o options.o pipe.o privsep.o socket.o tables.o timer.o \ + util.o
TARGET_SDKLIBS = iphlpapi.a ws2_32.a ntdll.a
_____
Added: trunk/reactos/subsys/system/dhcp/api.c --- trunk/reactos/subsys/system/dhcp/api.c 2005-04-12 21:25:58 UTC (rev 14598) +++ trunk/reactos/subsys/system/dhcp/api.c 2005-04-12 23:23:26 UTC (rev 14599) @@ -0,0 +1,136 @@
+/* $Id: $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: subsys/system/dhcp/api.c + * PURPOSE: DHCP client api handlers + * PROGRAMMER: arty + */ + +#include <winsock2.h> +#include <iphlpapi.h> +#include "rosdhcp.h" + +static CRITICAL_SECTION ApiCriticalSection; + +VOID ApiInit() { + InitializeCriticalSection( &ApiCriticalSection ); +} + +VOID ApiLock() { + EnterCriticalSection( &ApiCriticalSection ); +} + +VOID ApiUnlock() { + LeaveCriticalSection( &ApiCriticalSection ); +} + +/* This represents the service portion of the DHCP client API */ + +DWORD DSLeaseIpAddress( 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 ) { + Adapter->DhclientState.state = S_REBOOTING; + send_discover( &Adapter->DhclientInfo ); + } + + ApiUnlock(); + + return Send( &Reply ); +} + +DWORD DSQueryHWInfo( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { + COMM_DHCP_REPLY Reply; + PDHCP_ADAPTER Adapter; + + ApiLock(); + + Adapter = AdapterFindIndex( Req->AdapterIndex ); + + Reply.QueryHWInfo.AdapterIndex = Req->AdapterIndex; + Reply.QueryHWInfo.MediaType = Adapter->IfMib.dwType; + Reply.QueryHWInfo.Mtu = Adapter->IfMib.dwMtu; + Reply.QueryHWInfo.Speed = Adapter->IfMib.dwSpeed; + + ApiUnlock(); + + return Send( &Reply ); +} + +DWORD DSReleaseIpAddressLease( 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 ) { + DeleteIPAddress( Adapter->NteContext ); + } + + ApiUnlock(); + + return Send( &Reply ); +} + +DWORD DSRenewIpAddressLease( 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 || Adapter->DhclientState.state != S_BOUND ) { + Reply.Reply = 0; + return Send( &Reply ); + } + + Adapter->DhclientState.state = S_BOUND; + + state_bound( &Adapter->DhclientInfo ); + + ApiUnlock(); + + return Send( &Reply ); +} + +DWORD DSStaticRefreshParams( PipeSendFunc Send, COMM_DHCP_REQ *Req ) { + NTSTATUS Status; + COMM_DHCP_REPLY Reply; + PDHCP_ADAPTER Adapter; + + ApiLock(); + + Adapter = AdapterFindIndex( Req->AdapterIndex ); + + Reply.Reply = Adapter ? 1 : 0; + + if( Adapter ) { + DeleteIPAddress( Adapter->NteContext ); + Adapter->DhclientState.state = S_BOUND; + Status = AddIPAddress( Req->Body.StaticRefreshParams.IPAddress, + Req->Body.StaticRefreshParams.Netmask, + Req->AdapterIndex, + &Adapter->NteContext, + &Adapter->NteInstance ); + Reply.Reply = NT_SUCCESS(Status); + } + + ApiUnlock(); + + return Send( &Reply ); +} _____
Modified: trunk/reactos/subsys/system/dhcp/dhclient.c --- trunk/reactos/subsys/system/dhcp/dhclient.c 2005-04-12 21:25:58 UTC (rev 14598) +++ trunk/reactos/subsys/system/dhcp/dhclient.c 2005-04-12 23:23:26 UTC (rev 14599) @@ -259,7 +259,9 @@
int pipe_fd[2]; struct passwd *pw;
+ ApiInit(); AdapterInit(); + PipeInit();
tzset(); time(&cur_time); _____
Modified: trunk/reactos/subsys/system/dhcp/dispatch.c --- trunk/reactos/subsys/system/dhcp/dispatch.c 2005-04-12 21:25:58 UTC (rev 14598) +++ trunk/reactos/subsys/system/dhcp/dispatch.c 2005-04-12 23:23:26 UTC (rev 14599) @@ -199,6 +199,8 @@
time_t howlong; struct timeval timeval;
+ ApiLock(); + for (l = protocols; l; l = l->next) nfds++;
@@ -269,9 +271,14 @@ timeval.tv_usec = (to_msec % 1000) * 1000; DH_DbgPrint(MID_TRACE,("select(%d,%d.%03d) =>\n", nfds,timeval.tv_sec,timeval.tv_usec/1000)); + + ApiUnlock(); + count = select(nfds, &fds, NULL, NULL, &timeval); DH_DbgPrint(MID_TRACE,(" => %d\n", count));
+ ApiLock(); + /* Not likely to be transitory... */ if (count == SOCKET_ERROR) { if (errno == EAGAIN || errno == EINTR) { @@ -304,6 +311,8 @@ } DH_DbgPrint(MID_TRACE,("Done\n")); } while (1); + + ApiUnlock(); /* Not reached currently */ }
void _____
Modified: trunk/reactos/subsys/system/dhcp/include/dhcpd.h --- trunk/reactos/subsys/system/dhcp/include/dhcpd.h 2005-04-12 21:25:58 UTC (rev 14598) +++ trunk/reactos/subsys/system/dhcp/include/dhcpd.h 2005-04-12 23:23:26 UTC (rev 14599) @@ -93,33 +93,17 @@
#define USE_SOCKET_SEND
#include <sys/types.h> - -//#include <sys/socket.h> -//#include <sys/sockio.h> #include <sys/stat.h> #include <sys/time.h> -//#include <sys/un.h> -//#include <sys/wait.h> - -//#include <net/if.h> -//#include <net/if_dl.h> -//#include <net/route.h> - -//#include <netinet/in.h> -//#include <arpa/inet.h> - #include <ctype.h> #include <errno.h> #include <fcntl.h> #include <limits.h> -//#include <netdb.h> -//#include <paths.h> #include <unistd.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -//#include <syslog.h> #include <time.h> #include <unistd.h>
_____
Modified: trunk/reactos/subsys/system/dhcp/include/rosdhcp.h --- trunk/reactos/subsys/system/dhcp/include/rosdhcp.h 2005-04-12 21:25:58 UTC (rev 14598) +++ trunk/reactos/subsys/system/dhcp/include/rosdhcp.h 2005-04-12 23:23:26 UTC (rev 14599) @@ -7,6 +7,7 @@
#include <iprtrmib.h> #include <iphlpapi.h> #include <winsock2.h> +#include <dhcpcsdk.h> #include <stdio.h> #include <setjmp.h> #include "stdint.h" @@ -41,6 +42,7 @@ MIB_IFROW IfMib; MIB_IPADDRROW IfAddr; SOCKADDR Address; + ULONG NteContext,NteInstance; struct interface_info DhclientInfo; struct client_state DhclientState; struct client_config DhclientConfig; @@ -49,7 +51,20 @@ char recv_buf[1]; } DHCP_ADAPTER, *PDHCP_ADAPTER;
+#include <rosdhcp_public.h> + +typedef DWORD (*PipeSendFunc)( COMM_DHCP_REPLY *Reply ); + #define random rand #define srandom srand
+extern PDHCP_ADAPTER AdapterFindIndex( unsigned int AdapterIndex ); +extern VOID ApiInit(); +extern VOID ApiLock(); +extern VOID ApiUnlock(); +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 ); + #endif/*ROSDHCP_H*/ _____
Added: trunk/reactos/subsys/system/dhcp/pipe.c --- trunk/reactos/subsys/system/dhcp/pipe.c 2005-04-12 21:25:58 UTC (rev 14598) +++ trunk/reactos/subsys/system/dhcp/pipe.c 2005-04-12 23:23:26 UTC (rev 14599) @@ -0,0 +1,90 @@
+/* $Id: $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: subsys/system/dhcp/pipe.c + * PURPOSE: DHCP client pipe + * PROGRAMMER: arty + */ + +#include <rosdhcp.h> + +static HANDLE CommPipe = INVALID_HANDLE_VALUE, CommThread; +DWORD CommThrId; + +#define COMM_PIPE_OUTPUT_BUFFER sizeof(COMM_DHCP_REQ) +#define COMM_PIPE_INPUT_BUFFER sizeof(COMM_DHCP_REPLY) +#define COMM_PIPE_DEFAULT_TIMEOUT 1000 + +DWORD PipeSend( COMM_DHCP_REPLY *Reply ) { + DWORD Written = 0; + BOOL Success = + WriteFile( CommPipe, + Reply, + sizeof(*Reply), + &Written, + NULL ); + return Success ? Written : -1; +} + +DWORD WINAPI PipeThreadProc( LPVOID Parameter ) { + DWORD BytesRead, BytesWritten; + COMM_DHCP_REQ Req; + BOOL Result; + HANDLE Connection; + + while( (Connection = ConnectNamedPipe( CommPipe, NULL )) ) { + Result = ReadFile( Connection, &Req, sizeof(Req), &BytesRead, NULL ); + if( Result ) { + switch( Req.Type ) { + case DhcpReqQueryHWInfo: + BytesWritten = DSQueryHWInfo( PipeSend, &Req ); + break; + + case DhcpReqLeaseIpAddress: + BytesWritten = DSLeaseIpAddress( PipeSend, &Req ); + break; + + case DhcpReqReleaseIpAddress: + BytesWritten = DSReleaseIpAddressLease( PipeSend, &Req ); + break; + + case DhcpReqRenewIpAddress: + BytesWritten = DSRenewIpAddressLease( PipeSend, &Req ); + break; + } + } + CloseHandle( Connection ); + } +} + +HANDLE PipeInit() { + CommPipe = CreateNamedPipe + ( DHCP_PIPE_NAME, + PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE, + PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, + 1, + COMM_PIPE_OUTPUT_BUFFER, + COMM_PIPE_INPUT_BUFFER, + COMM_PIPE_DEFAULT_TIMEOUT, + NULL ); + + if( CommPipe == INVALID_HANDLE_VALUE ) { + DbgPrint("DHCP: Could not create named pipe\n"); + return CommPipe; + } + + CommThread = CreateThread( NULL, 0, PipeThreadProc, NULL, 0, &CommThrId ); + + if( !CommThread ) { + CloseHandle( CommPipe ); + CommPipe = INVALID_HANDLE_VALUE; + } + + return CommPipe; +} + +VOID PipeDestroy() { + CloseHandle( CommPipe ); + CommPipe = INVALID_HANDLE_VALUE; +}