[dhcp-agent-commits] dhcp-agent/src dhcp-server-control.c,1.3,1.4 dhcp-server-states.c,1.3,1.4 dhcp-
Status: Alpha
Brought to you by:
actmodern
From: <act...@us...> - 2003-07-20 05:52:34
|
Update of /cvsroot/dhcp-agent/dhcp-agent/src In directory sc8-pr-cvs1:/tmp/cvs-serv1609/src Modified Files: dhcp-server-control.c dhcp-server-states.c dhcp-server.c dhcp-server.h Log Message: update to server code; now using udp socket for DHCP and rawnet for everything else; added skeleton for state machine Index: dhcp-server-control.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-server-control.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** dhcp-server-control.c 8 Jul 2003 07:05:07 -0000 1.3 --- dhcp-server-control.c 20 Jul 2003 05:52:31 -0000 1.4 *************** *** 35,39 **** dhcp_server_control_t *dhcp_server_control_create(const char *interface) { ! int dport, sport; stringbuffer_t *filter; dhcp_server_control_t *dhcp_server_control; --- 35,39 ---- dhcp_server_control_t *dhcp_server_control_create(const char *interface) { ! int port; stringbuffer_t *filter; dhcp_server_control_t *dhcp_server_control; *************** *** 47,74 **** } ! /* get the source port and destination port for BOOTP. */ ! dport = rawnet_port_for_service("bootps", "udp"); ! sport = rawnet_port_for_service("bootpc", "udp"); ! ! dport = ntohs(dport); ! sport = ntohs(sport); ! if(dport == -1 || sport == -1) { WARN_MESSAGE ("could not lookup dhcp services in service db (%s) will use reasonable defaults."); ! sport = BOOTP_CLIENT; ! dport = BOOTP_SERVER; } /* Create filter. */ filter = stringbuffer_create(); ! stringbuffer_aprintf(filter, "arp or icmp or (udp and src port %d)", sport); ! /* create rawnet handler. */ ! if((dhcp_server_control->rawnet = rawnet_create(interface, stringbuffer_getstring(filter), -1, sport, ! dport, 0, 0)) == NULL) { FATAL_MESSAGE("could not create raw network handler."); } --- 47,78 ---- } ! /* get the source port for BOOTP. */ ! port = rawnet_port_for_service("bootpc", "udp"); ! if(port == -1) { WARN_MESSAGE ("could not lookup dhcp services in service db (%s) will use reasonable defaults."); ! port = BOOTP_SERVER; } + port = ntohs(port); + /* Create filter. */ filter = stringbuffer_create(); ! stringbuffer_aprintf(filter, "arp or icmp"); ! /* create rawnet handler: we pass sport/dport as 0 because we ! * won't be doing any DHCP handling rawly for the server. */ ! if((dhcp_server_control->rawnet = rawnet_create(interface, stringbuffer_getstring(filter), -1, 0, ! 0, 0, 0)) == NULL) { FATAL_MESSAGE("could not create raw network handler."); + } + + if((dhcp_server_control->udp_sock = + udp_sock_create(port, + rawnet_get_ip_addr(dhcp_server_control->rawnet))) < 0) { + FATAL_MESSAGE("unable to open udp socket"); } Index: dhcp-server-states.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-server-states.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** dhcp-server-states.c 15 Jul 2003 10:57:55 -0000 1.3 --- dhcp-server-states.c 20 Jul 2003 05:52:31 -0000 1.4 *************** *** 38,48 **** /******************************* * event processing routines. * *******************************/ static int server_next_event(dhcp_server_control_t *sc) { ! ! return 0; } --- 38,137 ---- /******************************* + * utilities * + *******************************/ + + /* turn an interrupt type to an event. */ + int interrupt2event(void) + { + /* convert current interrupt to event type. */ + switch(got_interrupt_type()) { + + case INTERRUPT_ALARM: + return SERVER_EVENT_LEASE_EXPIRE; + + case INTERRUPT_HUP: + return SERVER_EVENT_USER_HUP; + + case INTERRUPT_TERM: + return SERVER_EVENT_TERMINATE; + + default: + FATAL_MESSAGE("received illegal signal type"); + exit(1); + } + + } + + /******************************* * event processing routines. * *******************************/ + /* process next event: this means waiting for data on our udp descriptor or getting an interrupt. */ static int server_next_event(dhcp_server_control_t *sc) { ! struct timeval timeout; ! int retval; ! fd_set fd; ! ! /* allow signal starvation if necessary, but we don't want to ! * handle interrupts with gaps in between for everyime we ! * select. call once at the beginning and per select ! * timeout. */ ! ! if(check_for_interrupts()) { ! return interrupt2event(); ! } ! ! while(1) { ! ! FD_ZERO(&fd); ! FD_SET(sc->udp_sock, &fd); ! ! /* main even handling loop. we return one of the event ! * types depending on whether we received data, or caught ! * a signal. */ ! ! timeout.tv_usec = 0; ! timeout.tv_sec = server_conf_get_poll_timeout(sc->server_conf); ! ! /* Why pass a timeout to select? We check for signals ! * atomically. There's no way to run select, and catch ! * signals which would just set a global variable. For ! * example: ! * ! * unblock_interrupts(); ! * retval = select(sc->udp_sock + 1, &fd, NULL, NULL, NULL); ! * ! * Would not work. There is a race condition in between ! * unblocking and the call to select. ! * ! * To get around this we implement a small but reasonable ! * timeout. It's user configurable, but by default we set ! * it to something small like 5 seconds. On today's ! * hardware this doesn't hurt at all. We literally run a ! * bunch of syscalls to check for interrupts and then get ! * back in the select. */ ! ! retval = select(sc->udp_sock + 1, &fd, NULL, NULL, &timeout); ! ! if(retval < 0) { ! /* this is very bad. */ ! ERROR_MESSAGE("error from select(): %s", strerror(errno)); ! FATAL_MESSAGE("I cannot carry on. exiting."); ! } ! ! if(retval == 0) { /* timeout */ ! ! if(check_for_interrupts()) { ! return interrupt2event(); /* check for interrupt. */ ! } ! } ! ! if(retval > 0) { /* we have data. */ ! ! return SERVER_EVENT_DATA_WAITING; ! } ! } ! } *************** *** 56,70 **** * receive one of the following events back. * - * (1) SERVER_EVENT_LEASE_EXPIRE - * (2) SERVER_EVENT_DATA_WAITING - * */ ! int server_wait(dhcp_server_control_t *sc) { ! server_next_event(sc); return STATE_SHUTDOWN; } int server_shutdown(dhcp_server_control_t *sc) { --- 145,179 ---- * receive one of the following events back. * */ ! /* main loop: essentially an event2state converter. */ ! int server_listen(dhcp_server_control_t *sc) { ! int event; ! ! event = server_next_event(sc); ! ! switch(event) { ! ! case SERVER_EVENT_LEASE_EXPIRE: ! return STATE_CLEAN_LEASES; ! ! case SERVER_EVENT_DATA_WAITING: ! return STATE_HANDLE_PACKET; ! ! case SERVER_EVENT_USER_HUP: ! return STATE_HUP; ! ! case SERVER_EVENT_TERMINATE: ! return STATE_SHUTDOWN; ! ! default: ! FATAL_MESSAGE("illegal event generated. this is a bug. report me."); ! } ! return STATE_SHUTDOWN; } + /* shutdown state. */ int server_shutdown(dhcp_server_control_t *sc) { *************** *** 81,82 **** --- 190,210 ---- } + /* handle an incoming DHCP packet. */ + int server_handle_packet(dhcp_server_control_t *sc) + { + /* TODO. */ + return STATE_LISTEN; + } + + /* handle user hup. */ + int server_hup(dhcp_server_control_t *sc) + { + /* TODO. */ + return STATE_LISTEN; + } + + int server_clean_leases(dhcp_server_control_t *sc) + { + /* TODO. */ + return STATE_LISTEN; + } Index: dhcp-server.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-server.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** dhcp-server.c 15 Jul 2003 10:57:18 -0000 1.8 --- dhcp-server.c 20 Jul 2003 05:52:31 -0000 1.9 *************** *** 63,68 **** server_state server_states[] = { - NULL, server_shutdown, }; --- 63,71 ---- server_state server_states[] = { server_shutdown, + server_listen, + server_clean_leases, + server_handle_packet, + server_hup, }; *************** *** 134,137 **** --- 137,141 ---- INFO_MESSAGE("default-rebind-percent: %d", server_conf->default_rebind_percent); INFO_MESSAGE("default-renew-percent: %d", server_conf->default_renew_percent); + INFO_MESSAGE("poll-timeout: %d", server_conf->poll_timeout); INFO_MESSAGE(" "); Index: dhcp-server.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-server.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** dhcp-server.h 15 Jul 2003 10:57:55 -0000 1.5 --- dhcp-server.h 20 Jul 2003 05:52:31 -0000 1.6 *************** *** 32,35 **** --- 32,36 ---- server_conf_t *server_conf; /* server configuration. */ + int udp_sock; /* udp socket. */ } dhcp_server_control_t; *************** *** 41,46 **** /* constants. */ enum command_codes { DO_VERSION = 0, DO_KILL, DO_STATUS, DO_SERVER, DO_CHECK_CONFIG }; ! enum server_states { STATE_LISTEN, STATE_SHUTDOWN = 0 }; ! enum server_events { SERVER_EVENT_DATA_WAITING = 0, SERVER_EVENT_LEASE_EXPIRE, SERVER_EVENT_ERROR }; /* prototypes. */ --- 42,47 ---- /* constants. */ enum command_codes { DO_VERSION = 0, DO_KILL, DO_STATUS, DO_SERVER, DO_CHECK_CONFIG }; ! enum server_states { STATE_SHUTDOWN = 0, STATE_LISTEN, STATE_CLEAN_LEASES, STATE_HANDLE_PACKET, STATE_HUP }; ! enum server_events { SERVER_EVENT_LEASE_EXPIRE = 0, SERVER_EVENT_DATA_WAITING, SERVER_EVENT_USER_HUP, SERVER_EVENT_TERMINATE }; /* prototypes. */ *************** *** 50,53 **** --- 51,58 ---- extern int server_shutdown(dhcp_server_control_t *sc); + extern int server_listen(dhcp_server_control_t *sc); + extern int server_clean_leases(dhcp_server_control_t *sc); + extern int server_handle_packet(dhcp_server_control_t *sc); + extern int server_hup(dhcp_server_control_t *sc); #endif /* DHCP_SERVER_H */ |