@@ -785,34 +785,27 @@ dhcp_addoptions(struct bootp *bootp, uint8_t **p, const uint8_t *e,
785785 const struct dhcp_pool * pool , const char * msg , const struct bootp * req ,
786786 size_t reqlen )
787787{
788- const uint8_t * opt ;
789-
790788 DHCP_PUT_B (p , e , DHO_MESSAGETYPE , type );
791789 DHCP_PUT_U32 (p , e , DHO_SERVERID , pool -> dp_addr .s_addr );
792790 if (type == DHCP_OFFER || type == DHCP_ACK ) {
793- uint32_t u32 , lease_time ;
791+ struct timespec tv ;
792+ uint32_t u32 , lease_time , renew_time , rebind_time ;
794793 struct plugin * plug ;
795794 int n ;
796795
797- if (pool -> dp_lease_time != 0 )
798- lease_time = pool -> dp_lease_time ;
799- else
800- lease_time = ctx -> dhcp_lease_time ;
796+ if (timespecisset (& lease -> dl_leased )) {
797+ timespecsub (& lease -> dl_expires , & lease -> dl_leased , & tv );
798+ lease_time = (uint32_t )tv .tv_sec ;
799+ renew_time = (uint32_t )(lease_time * T1 );
800+ rebind_time = (uint32_t )(lease_time * T2 );
801+ } else
802+ lease_time = renew_time = rebind_time = INFINITE_LIFETIME ;
801803
802- /* Allow the client to request a shorter leasetime
803- * but not a longer one. */
804- opt = dhcp_findoption (req , reqlen , DHO_LEASETIME );
805- if (opt != NULL && opt [0 ] == sizeof (u32 )) {
806- memcpy (& u32 , opt + 1 , sizeof (u32 ));
807- u32 = ntohl (u32 );
808- if (u32 < lease_time )
809- lease_time = u32 ;
810- }
811804 u32 = htonl (lease_time );
812805 DHCP_PUT_U32 (p , e , DHO_LEASETIME , u32 );
813- u32 = htonl (( uint32_t )( lease_time * T1 ) );
806+ u32 = htonl (renew_time );
814807 DHCP_PUT_U32 (p , e , DHO_RENEWALTIME , u32 );
815- u32 = htonl (( uint32_t )( lease_time * T2 ) );
808+ u32 = htonl (rebind_time );
816809 DHCP_PUT_U32 (p , e , DHO_REBINDTIME , u32 );
817810
818811 n = dhcp_addhostname (p , e , lease , req , reqlen );
0 commit comments