Thread: [dhcp-agent-commits] dhcp-agent/src dhcp-client-control.c,1.17,1.18 dhcp-client-states.c,1.35,1.36 d
Status: Alpha
Brought to you by:
actmodern
From: <act...@us...> - 2003-06-23 06:05:06
|
Update of /cvsroot/dhcp-agent/dhcp-agent/src In directory sc8-pr-cvs1:/tmp/cvs-serv484/src Modified Files: dhcp-client-control.c dhcp-client-states.c dhcp-client.h dhcp-sysconf.c dhcp-timer.c Log Message: client now handling infinite timer Index: dhcp-client-control.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-client-control.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** dhcp-client-control.c 25 May 2003 02:18:27 -0000 1.17 --- dhcp-client-control.c 23 Jun 2003 06:05:03 -0000 1.18 *************** *** 57,60 **** --- 57,72 ---- } + /* dhcp set lease time to be infinite. */ + void dhcp_client_lease_time_is_infinite(dhcp_client_control_t *dc) + { + dc->lease_time_is_infinite = 1; + } + + /* dhcp set lease time to be finite. */ + void dhcp_client_lease_time_is_finite(dhcp_client_control_t *dc) + { + dc->lease_time_is_infinite = 0; + } + /* dhcp increment and check whether we should give up on discover offer retries. */ int dhcp_client_discover_offer_can_retry(dhcp_client_control_t *dc) *************** *** 220,223 **** --- 232,236 ---- dc->client_id = create_client_id(interface_addr); dc->discover_offer_retries = 0; /* reset discover offer. */ + dc->lease_time_is_infinite = 0; /* reset lease time infinite bit. */ /* create state context */ Index: dhcp-client-states.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-client-states.c,v retrieving revision 1.35 retrieving revision 1.36 diff -C2 -d -r1.35 -r1.36 *** dhcp-client-states.c 20 Jun 2003 01:37:15 -0000 1.35 --- dhcp-client-states.c 23 Jun 2003 06:05:03 -0000 1.36 *************** *** 380,384 **** INFO_MESSAGE("using ARP to detect address collision"); ! if(!arp_discover_hardware_address(dc->rawnet, 1, 10, *passed_ip, ð_addr)) { ERROR_MESSAGE("DHCP server assigned us a used address. Declining."); --- 380,384 ---- INFO_MESSAGE("using ARP to detect address collision"); ! if(!arp_discover_hardware_address(dc->rawnet, 1, 5, *passed_ip, ð_addr)) { ERROR_MESSAGE("DHCP server assigned us a used address. Declining."); *************** *** 911,916 **** int client_bound(dhcp_client_control_t *dc) { ! uint32_t next_timer; ! time_t time_before, time_after, time_interval; INFO_MESSAGE("entering WAIT stage"); --- 911,917 ---- int client_bound(dhcp_client_control_t *dc) { ! uint32_t next_timer = 0; /* get rid of compiler warnings. */ ! time_t time_before = 0; /* get rid of compiler warnings. */ ! time_t time_after, time_interval; INFO_MESSAGE("entering WAIT stage"); *************** *** 919,936 **** rawnet_down(dc->rawnet); ! /* peek and store our next timer in case we get an interrupt ! * which is not a timer interrupt. */ ! next_timer = timer_peek_next_timer(dc->context->timer); ! time_before = time(NULL); ! /* now fire off the next timer. */ ! if(timer_set_next(dc->context->timer)) { ! FATAL_MESSAGE("no timers set. we should have at least one for lease expiry sent to us from the server."); ! } ! /* wait for any interrupts. */ ! suspend_for_interrupts(); /* at this point we may or may not have received a timer * interrupt. if we have not then setup a timer to go off --- 920,948 ---- rawnet_down(dc->rawnet); ! if(dc->lease_time_is_infinite) { ! INFO_MESSAGE("lease time is infinite. waiting forever."); ! /* wait for any interrupts. */ ! suspend_for_interrupts(); ! } else { ! ! /* peek and store our next timer in case we get an interrupt ! * which is not a timer interrupt. */ ! ! next_timer = timer_peek_next_timer(dc->context->timer); ! time_before = time(NULL); ! ! /* now fire off the next timer. */ ! if(timer_set_next(dc->context->timer)) { ! FATAL_MESSAGE("no timers set. we should have at least one for lease expiry sent to us from the server."); ! } ! ! /* wait for any interrupts. */ ! suspend_for_interrupts(); + } + /* at this point we may or may not have received a timer * interrupt. if we have not then setup a timer to go off *************** *** 938,942 **** * difference. */ ! if(peek_interrupt_type() != INTERRUPT_ALARM) { time_after = time(NULL); --- 950,954 ---- * difference. */ ! if(peek_interrupt_type() != INTERRUPT_ALARM && !dc->lease_time_is_infinite) { time_after = time(NULL); Index: dhcp-client.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-client.h,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** dhcp-client.h 17 Jun 2003 07:34:16 -0000 1.17 --- dhcp-client.h 23 Jun 2003 06:05:03 -0000 1.18 *************** *** 55,58 **** --- 55,59 ---- int state; /* our current state. */ int discover_offer_retries; /* counter for retries on discover_offer */ + uint8_t lease_time_is_infinite; /* whether or not the lease time is infinite. */ /* use this for validation purposes. */ *************** *** 112,115 **** --- 113,119 ---- extern ip_addr_t dhcp_client_get_server_ip_address(dhcp_client_control_t *dc); extern eth_addr_t dhcp_client_get_server_hw_address(dhcp_client_control_t *dc); + + extern void dhcp_client_lease_time_is_infinite(dhcp_client_control_t *dc); + extern void dhcp_client_lease_time_is_finite(dhcp_client_control_t *dc); /* context information. */ Index: dhcp-sysconf.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-sysconf.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** dhcp-sysconf.c 20 May 2003 01:43:42 -0000 1.18 --- dhcp-sysconf.c 23 Jun 2003 06:05:03 -0000 1.19 *************** *** 50,54 **** } ! /* setup timers only. this is done internally after rebinding or renewing. */ void do_sysconf_setup_timers(list_t *options, dhcp_client_control_t *dc) { --- 50,56 ---- } ! /* setup timers only. this is done internally after rebinding, ! * renewing or acquiring a new lease. */ ! void do_sysconf_setup_timers(list_t *options, dhcp_client_control_t *dc) { *************** *** 56,59 **** --- 58,68 ---- dhcp_opt_tag_t tag; uint32_t *secs; + uint32_t renew_time = 0; + uint32_t rebind_time = 0; + uint32_t lease_time = 0; + uint8_t have_renew = 0; + uint8_t have_rebind = 0; + uint8_t have_lease_time = 0; + float percent; reinitialize_timer(dc->context->timer); *************** *** 67,71 **** secs = dhcp_opt_get_host_data(option); ! timer_add_trigger(dc->context->timer, *secs, TIMER_RENEW); continue; --- 76,81 ---- secs = dhcp_opt_get_host_data(option); ! have_renew = 1; ! renew_time = *secs; continue; *************** *** 73,77 **** secs = dhcp_opt_get_host_data(option); ! timer_add_trigger(dc->context->timer, *secs, TIMER_REBIND); continue; --- 83,88 ---- secs = dhcp_opt_get_host_data(option); ! have_rebind = 1; ! rebind_time = *secs; continue; *************** *** 79,85 **** secs = dhcp_opt_get_host_data(option); ! timer_add_trigger(dc->context->timer, *secs, TIMER_IP_LEASE); continue; } } --- 90,144 ---- secs = dhcp_opt_get_host_data(option); ! have_lease_time = 1; ! lease_time = *secs; continue; } + } + + if(have_lease_time != 1) { + + /* we don't have an actual lease time. check + * configuration options on what we should do. */ + + WARN_MESSAGE("no lease time passed. assuming lease will never expire."); + lease_time = 0xffffffff; + } + + /* a lease time of 0xffffffff is defined by the RFC2131 as infinite. */ + + if(lease_time == INFINITE_TIME) { + + INFO_MESSAGE("setting infinite lease time."); + dhcp_client_lease_time_is_infinite(dc); + + } else { + + dhcp_client_lease_time_is_finite(dc); + INFO_MESSAGE("setting lease time to: %"PRIu32" seconds", lease_time); + + timer_add_trigger(dc->context->timer, lease_time, TIMER_IP_LEASE); + + if(!have_renew) { + + percent = (float)client_conf_get_renew_percent(dc->conf)/100; + INFO_MESSAGE("no renew time passed. using %%%.2f percent of lease time as renew time.", percent); + + renew_time = lease_time * percent; + + } + + INFO_MESSAGE("setting renew time to: %"PRIu32" seconds", renew_time); + timer_add_trigger(dc->context->timer, renew_time, TIMER_REBIND); + + if(!have_rebind) { + + percent = (float)client_conf_get_rebind_percent(dc->conf)/100; + INFO_MESSAGE("no rebind time passed. using %%%.2f percent of lease time as rebind time.", percent); + + rebind_time = lease_time * percent; + } + + INFO_MESSAGE("setting rebind time to: %"PRIu32" seconds", rebind_time); + timer_add_trigger(dc->context->timer, rebind_time, TIMER_REBIND); } Index: dhcp-timer.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-timer.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** dhcp-timer.c 23 May 2003 03:30:27 -0000 1.10 --- dhcp-timer.c 23 Jun 2003 06:05:03 -0000 1.11 *************** *** 195,198 **** return timer_copy; } - - --- 195,196 ---- |