- Don't use a global interface_info struct

- This should allow for multiple NIC support but it's currently broken because GetIfTable returns invalid information for NICs after the first one which prevents DHCP initialization for those adapters

svn path=/trunk/; revision=41763
This commit is contained in:
Cameron Gutman 2009-07-04 03:36:19 +00:00
parent 4e4637dbb8
commit 1511c65eb3
5 changed files with 33 additions and 40 deletions

View file

@ -3,7 +3,6 @@
static SOCKET DhcpSocket = INVALID_SOCKET; static SOCKET DhcpSocket = INVALID_SOCKET;
static LIST_ENTRY AdapterList; static LIST_ENTRY AdapterList;
static WSADATA wsd; static WSADATA wsd;
extern struct interface_info *ifi;
PCHAR *GetSubkeyNames( PCHAR MainKeyName, PCHAR Append ) { PCHAR *GetSubkeyNames( PCHAR MainKeyName, PCHAR Append ) {
int i = 0; int i = 0;
@ -215,6 +214,7 @@ void AdapterInit() {
PMIB_IFTABLE Table = (PMIB_IFTABLE) malloc(sizeof(MIB_IFTABLE)); PMIB_IFTABLE Table = (PMIB_IFTABLE) malloc(sizeof(MIB_IFTABLE));
DWORD Error, Size, i; DWORD Error, Size, i;
PDHCP_ADAPTER Adapter = NULL; PDHCP_ADAPTER Adapter = NULL;
struct interface_info *ifi = NULL;
WSAStartup(0x0101,&wsd); WSAStartup(0x0101,&wsd);

View file

@ -100,8 +100,6 @@ int no_daemon;
int unknown_ok = 1; int unknown_ok = 1;
int routefd; int routefd;
struct interface_info *ifi = NULL;
void usage(void); void usage(void);
int check_option(struct client_lease *l, int option); int check_option(struct client_lease *l, int option);
int ipv4addrs(char * buf); int ipv4addrs(char * buf);
@ -135,6 +133,7 @@ int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
int i = 0; int i = 0;
PDHCP_ADAPTER Adapter;
ApiInit(); ApiInit();
AdapterInit(); AdapterInit();
PipeInit(); PipeInit();
@ -150,32 +149,29 @@ main(int argc, char *argv[])
DH_DbgPrint(MID_TRACE,("DHCP Service Started\n")); DH_DbgPrint(MID_TRACE,("DHCP Service Started\n"));
read_client_conf(); for (Adapter = AdapterGetFirst();
Adapter != NULL;
Adapter = AdapterGetNext(Adapter))
{
read_client_conf(&Adapter->DhclientInfo);
if (!interface_link_status(ifi->name)) { if (!interface_link_status(Adapter->DhclientInfo.name)) {
DH_DbgPrint(MID_TRACE,("%s: no link ", ifi->name)); DH_DbgPrint(MID_TRACE,("%s: no link ", Adapter->DhclientInfo.name));
Sleep(1000); Sleep(1000);
while (!interface_link_status(ifi->name)) { while (!interface_link_status(Adapter->DhclientInfo.name)) {
DH_DbgPrint(MID_TRACE,(".")); DH_DbgPrint(MID_TRACE,("."));
if (++i > 10) { if (++i > 10) {
DH_DbgPrint(MID_TRACE,("Giving up for now on adapter [%s]\n", ifi->name)); DH_DbgPrint(MID_TRACE,("Giving up for now on adapter [%s]\n", Adapter->DhclientInfo.name));
} }
Sleep(1000); Sleep(1000);
} }
DH_DbgPrint(MID_TRACE,("Got link on [%s]\n", ifi->name)); DH_DbgPrint(MID_TRACE,("Got link on [%s]\n", Adapter->DhclientInfo.name));
} }
DH_DbgPrint(MID_TRACE,("Discover Interfaces\n")); DH_DbgPrint(MID_TRACE,("Discover Interfaces\n"));
/* If no adapters were found, just idle for now ... If any show up,
* then we'll start it later */
if( ifi ) {
/* set up the interface */ /* set up the interface */
discover_interfaces(ifi); discover_interfaces(&Adapter->DhclientInfo);
DH_DbgPrint
(MID_TRACE,
("Setting init state and restarting interface %p\n",ifi));
} }
bootp_packet_handler = do_packet; bootp_packet_handler = do_packet;
@ -1556,7 +1552,7 @@ free_client_lease(struct client_lease *lease)
FILE *leaseFile; FILE *leaseFile;
void void
rewrite_client_leases(void) rewrite_client_leases(struct interface_info *ifi)
{ {
struct client_lease *lp; struct client_lease *lp;
@ -1587,7 +1583,7 @@ write_client_lease(struct interface_info *ip, struct client_lease *lease,
if (!rewrite) { if (!rewrite) {
if (leases_written++ > 20) { if (leases_written++ > 20) {
rewrite_client_leases(); rewrite_client_leases(ip);
leases_written = 0; leases_written = 0;
} }
} }
@ -1674,19 +1670,16 @@ script_init(char *reason, struct string_list *medium)
} }
void void
priv_script_init(char *reason, char *medium) priv_script_init(struct interface_info *ip, char *reason, char *medium)
{ {
struct interface_info *ip = ifi;
if (ip) { if (ip) {
// XXX Do we need to do anything? // XXX Do we need to do anything?
} }
} }
void void
priv_script_write_params(char *prefix, struct client_lease *lease) priv_script_write_params(struct interface_info *ip, char *prefix, struct client_lease *lease)
{ {
struct interface_info *ip = ifi;
u_int8_t dbuf[1500]; u_int8_t dbuf[1500];
int i, len = 0; int i, len = 0;

View file

@ -426,11 +426,11 @@ void make_request(struct interface_info *, struct client_lease *);
void make_decline(struct interface_info *, struct client_lease *); void make_decline(struct interface_info *, struct client_lease *);
void free_client_lease(struct client_lease *); void free_client_lease(struct client_lease *);
void rewrite_client_leases(void); void rewrite_client_leases(struct interface_info *);
void write_client_lease(struct interface_info *, struct client_lease *, int); void write_client_lease(struct interface_info *, struct client_lease *, int);
void priv_script_init(char *, char *); void priv_script_init(struct interface_info *, char *, char *);
void priv_script_write_params(char *, struct client_lease *); void priv_script_write_params(struct interface_info *, char *, struct client_lease *);
int priv_script_go(void); int priv_script_go(void);
void script_init(char *, struct string_list *); void script_init(char *, struct string_list *);
@ -466,7 +466,7 @@ ssize_t decode_ethernet_header(struct interface_info *, unsigned char *,
int, struct hardware *); int, struct hardware *);
/* clparse.c */ /* clparse.c */
int read_client_conf(void); int read_client_conf(struct interface_info *);
void read_client_leases(void); void read_client_leases(void);
void parse_client_statement(FILE *, struct interface_info *, void parse_client_statement(FILE *, struct interface_info *,
struct client_config *); struct client_config *);

View file

@ -72,6 +72,8 @@ typedef DWORD (*PipeSendFunc)( COMM_DHCP_REPLY *Reply );
void AdapterInit(VOID); void AdapterInit(VOID);
HANDLE PipeInit(VOID); HANDLE PipeInit(VOID);
extern PDHCP_ADAPTER AdapterGetFirst();
extern PDHCP_ADAPTER AdapterGetNext(PDHCP_ADAPTER);
extern PDHCP_ADAPTER AdapterFindIndex( unsigned int AdapterIndex ); extern PDHCP_ADAPTER AdapterFindIndex( unsigned int AdapterIndex );
extern PDHCP_ADAPTER AdapterFindInfo( struct interface_info *info ); extern PDHCP_ADAPTER AdapterFindInfo( struct interface_info *info );
extern VOID ApiInit(); extern VOID ApiInit();

View file

@ -4,8 +4,6 @@
#define NDEBUG #define NDEBUG
#include <reactos/debug.h> #include <reactos/debug.h>
extern struct interface_info *ifi;
char *piaddr( struct iaddr addr ) { char *piaddr( struct iaddr addr ) {
struct sockaddr_in sa; struct sockaddr_in sa;
memcpy(&sa.sin_addr,addr.iabuf,sizeof(sa.sin_addr)); memcpy(&sa.sin_addr,addr.iabuf,sizeof(sa.sin_addr));
@ -96,7 +94,7 @@ int addr_eq( struct iaddr a, struct iaddr b ) {
void *dmalloc( int size, char *name ) { return malloc( size ); } void *dmalloc( int size, char *name ) { return malloc( size ); }
int read_client_conf(void) { int read_client_conf(struct interface_info *ifi) {
/* What a strange dance */ /* What a strange dance */
struct client_config *config; struct client_config *config;
char ComputerName [MAX_COMPUTERNAME_LENGTH + 1]; char ComputerName [MAX_COMPUTERNAME_LENGTH + 1];