[DHCPCSVC]

- Use an event to signal when an adapter has been added

svn path=/trunk/; revision=47866
This commit is contained in:
Cameron Gutman 2010-06-27 20:05:52 +00:00
parent 763a24d9d7
commit f4530b30f2
3 changed files with 38 additions and 24 deletions

View file

@ -227,10 +227,11 @@ InterfaceConnected(MIB_IFROW IfEntry)
/* /*
* XXX Figure out the way to bind a specific adapter to a socket. * XXX Figure out the way to bind a specific adapter to a socket.
*/ */
DWORD WINAPI AdapterDiscoveryThread(LPVOID Unused) { DWORD WINAPI AdapterDiscoveryThread(LPVOID Context) {
PMIB_IFTABLE Table = (PMIB_IFTABLE) malloc(sizeof(MIB_IFTABLE)); PMIB_IFTABLE Table = (PMIB_IFTABLE) malloc(sizeof(MIB_IFTABLE));
DWORD Error, Size = sizeof(MIB_IFTABLE); DWORD Error, Size = sizeof(MIB_IFTABLE);
PDHCP_ADAPTER Adapter = NULL; PDHCP_ADAPTER Adapter = NULL;
HANDLE AdapterStateChangedEvent = (HANDLE)Context;
struct interface_info *ifi = NULL; struct interface_info *ifi = NULL;
int i; int i;
@ -345,6 +346,8 @@ DWORD WINAPI AdapterDiscoveryThread(LPVOID Unused) {
ApiLock(); ApiLock();
InsertTailList( &AdapterList, &Adapter->ListEntry ); InsertTailList( &AdapterList, &Adapter->ListEntry );
DbgPrint("DHCPCSVC: Discovered new adapter [%s]\n", Adapter->DhclientInfo.name);
SetEvent(AdapterStateChangedEvent);
ApiUnlock(); ApiUnlock();
} else { free( Adapter ); Adapter = 0; } } else { free( Adapter ); Adapter = 0; }
} else { free( Adapter ); Adapter = 0; } } else { free( Adapter ); Adapter = 0; }
@ -361,22 +364,27 @@ DWORD WINAPI AdapterDiscoveryThread(LPVOID Unused) {
return Error; return Error;
} }
BOOLEAN StartAdapterDiscovery(VOID) { HANDLE StartAdapterDiscovery(VOID) {
HANDLE ThreadHandle; HANDLE ThreadHandle, EventHandle;
EventHandle = CreateEvent(NULL,
FALSE,
FALSE,
NULL);
ThreadHandle = CreateThread(NULL, ThreadHandle = CreateThread(NULL,
0, 0,
AdapterDiscoveryThread, AdapterDiscoveryThread,
NULL, (LPVOID)EventHandle,
0, 0,
NULL); NULL);
if (ThreadHandle == NULL) if (ThreadHandle == NULL)
return FALSE; return NULL;
CloseHandle(ThreadHandle); CloseHandle(ThreadHandle);
return TRUE; return EventHandle;
} }
void AdapterStop() { void AdapterStop() {

View file

@ -68,8 +68,10 @@ dispatch(void)
fd_set fds; fd_set fds;
time_t howlong, cur_time; time_t howlong, cur_time;
struct timeval timeval; struct timeval timeval;
HANDLE AdapterStateChangedEvent;
if (!StartAdapterDiscovery()) AdapterStateChangedEvent = StartAdapterDiscovery();
if (!AdapterStateChangedEvent)
return; return;
ApiLock(); ApiLock();
@ -103,29 +105,31 @@ dispatch(void)
if (howlong > INT_MAX / 1000) if (howlong > INT_MAX / 1000)
howlong = INT_MAX / 1000; howlong = INT_MAX / 1000;
to_msec = howlong * 1000; to_msec = howlong * 1000;
} else
to_msec = 5000;
/* Set up the descriptors to be polled. */ /* Set up the descriptors to be polled. */
FD_ZERO(&fds); FD_ZERO(&fds);
for (l = protocols; l; l = l->next) for (l = protocols; l; l = l->next)
FD_SET(l->fd, &fds); FD_SET(l->fd, &fds);
/* Wait for a packet or a timeout... XXX */ /* Wait for a packet or a timeout... XXX */
timeval.tv_sec = to_msec / 1000; timeval.tv_sec = to_msec / 1000;
timeval.tv_usec = to_msec % 1000; timeval.tv_usec = to_msec % 1000;
ApiUnlock(); ApiUnlock();
if (protocols)
count = select(0, &fds, NULL, NULL, &timeval); count = select(0, &fds, NULL, NULL, &timeval);
else {
Sleep(to_msec);
count = 0;
}
ApiLock(); ApiLock();
}
else
{
ApiUnlock();
WaitForSingleObject(AdapterStateChangedEvent, INFINITE);
ApiLock();
continue;
}
DH_DbgPrint(MID_TRACE,("Select: %d\n", count)); DH_DbgPrint(MID_TRACE,("Select: %d\n", count));
@ -149,6 +153,8 @@ dispatch(void)
} }
} while (1); } while (1);
CloseHandle(AdapterStateChangedEvent);
ApiUnlock(); ApiUnlock();
} }

View file

@ -77,7 +77,7 @@ typedef DWORD (*PipeSendFunc)( COMM_DHCP_REPLY *Reply );
#define srandom srand #define srandom srand
void AdapterInit(VOID); void AdapterInit(VOID);
BOOLEAN StartAdapterDiscovery(VOID); HANDLE StartAdapterDiscovery(VOID);
void AdapterStop(VOID); void AdapterStop(VOID);
extern PDHCP_ADAPTER AdapterGetFirst(); extern PDHCP_ADAPTER AdapterGetFirst();
extern PDHCP_ADAPTER AdapterGetNext(PDHCP_ADAPTER); extern PDHCP_ADAPTER AdapterGetNext(PDHCP_ADAPTER);