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

View file

@ -100,8 +100,6 @@ int no_daemon;
int unknown_ok = 1;
int routefd;
struct interface_info *ifi = NULL;
void usage(void);
int check_option(struct client_lease *l, int option);
int ipv4addrs(char * buf);
@ -135,6 +133,7 @@ int
main(int argc, char *argv[])
{
int i = 0;
PDHCP_ADAPTER Adapter;
ApiInit();
AdapterInit();
PipeInit();
@ -150,32 +149,29 @@ main(int argc, char *argv[])
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)) {
DH_DbgPrint(MID_TRACE,("%s: no link ", ifi->name));
Sleep(1000);
while (!interface_link_status(ifi->name)) {
DH_DbgPrint(MID_TRACE,("."));
if (++i > 10) {
DH_DbgPrint(MID_TRACE,("Giving up for now on adapter [%s]\n", ifi->name));
}
Sleep(1000);
}
DH_DbgPrint(MID_TRACE,("Got link on [%s]\n", ifi->name));
}
if (!interface_link_status(Adapter->DhclientInfo.name)) {
DH_DbgPrint(MID_TRACE,("%s: no link ", Adapter->DhclientInfo.name));
Sleep(1000);
while (!interface_link_status(Adapter->DhclientInfo.name)) {
DH_DbgPrint(MID_TRACE,("."));
if (++i > 10) {
DH_DbgPrint(MID_TRACE,("Giving up for now on adapter [%s]\n", Adapter->DhclientInfo.name));
}
Sleep(1000);
}
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 */
discover_interfaces(ifi);
DH_DbgPrint
(MID_TRACE,
("Setting init state and restarting interface %p\n",ifi));
/* set up the interface */
discover_interfaces(&Adapter->DhclientInfo);
}
bootp_packet_handler = do_packet;
@ -1556,7 +1552,7 @@ free_client_lease(struct client_lease *lease)
FILE *leaseFile;
void
rewrite_client_leases(void)
rewrite_client_leases(struct interface_info *ifi)
{
struct client_lease *lp;
@ -1587,7 +1583,7 @@ write_client_lease(struct interface_info *ip, struct client_lease *lease,
if (!rewrite) {
if (leases_written++ > 20) {
rewrite_client_leases();
rewrite_client_leases(ip);
leases_written = 0;
}
}
@ -1674,19 +1670,16 @@ script_init(char *reason, struct string_list *medium)
}
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) {
// XXX Do we need to do anything?
}
}
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];
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 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 priv_script_init(char *, char *);
void priv_script_write_params(char *, struct client_lease *);
void priv_script_init(struct interface_info *, char *, char *);
void priv_script_write_params(struct interface_info *, char *, struct client_lease *);
int priv_script_go(void);
void script_init(char *, struct string_list *);
@ -466,7 +466,7 @@ ssize_t decode_ethernet_header(struct interface_info *, unsigned char *,
int, struct hardware *);
/* clparse.c */
int read_client_conf(void);
int read_client_conf(struct interface_info *);
void read_client_leases(void);
void parse_client_statement(FILE *, struct interface_info *,
struct client_config *);

View file

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

View file

@ -4,8 +4,6 @@
#define NDEBUG
#include <reactos/debug.h>
extern struct interface_info *ifi;
char *piaddr( struct iaddr addr ) {
struct sockaddr_in sa;
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 ); }
int read_client_conf(void) {
int read_client_conf(struct interface_info *ifi) {
/* What a strange dance */
struct client_config *config;
char ComputerName [MAX_COMPUTERNAME_LENGTH + 1];