@@ -3406,6 +3406,48 @@ dhcp6_bind(struct interface *ifp, const char *op, const char *sfrom)
34063406 }
34073407}
34083408
3409+ static void
3410+ dhcp6_adjust_max_rt (struct interface * ifp ,
3411+ struct dhcp6_message * r , size_t len )
3412+ {
3413+ struct dhcp6_state * state = D6_STATE (ifp );
3414+ uint8_t * o ;
3415+ uint16_t ol ;
3416+
3417+ /* RFC 8415 */
3418+ o = dhcp6_findmoption (r , len , D6_OPTION_SOL_MAX_RT , & ol );
3419+ if (o != NULL && ol == sizeof (uint32_t )) {
3420+ uint32_t max_rt ;
3421+
3422+ memcpy (& max_rt , o , sizeof (max_rt ));
3423+ max_rt = ntohl (max_rt );
3424+ if (max_rt >= 60 && max_rt <= 86400 ) {
3425+ logdebugx ("%s: SOL_MAX_RT %llu -> %u" ,
3426+ ifp -> name ,
3427+ (unsigned long long )state -> sol_max_rt ,
3428+ max_rt );
3429+ state -> sol_max_rt = max_rt ;
3430+ } else
3431+ logerrx ("%s: invalid SOL_MAX_RT %u" , ifp -> name , max_rt );
3432+ }
3433+
3434+ o = dhcp6_findmoption (r , len , D6_OPTION_INF_MAX_RT , & ol );
3435+ if (o != NULL && ol == sizeof (uint32_t )) {
3436+ uint32_t max_rt ;
3437+
3438+ memcpy (& max_rt , o , sizeof (max_rt ));
3439+ max_rt = ntohl (max_rt );
3440+ if (max_rt >= 60 && max_rt <= 86400 ) {
3441+ logdebugx ("%s: INF_MAX_RT %llu -> %u" ,
3442+ ifp -> name ,
3443+ (unsigned long long )state -> inf_max_rt ,
3444+ max_rt );
3445+ state -> inf_max_rt = max_rt ;
3446+ } else
3447+ logerrx ("%s: invalid INF_MAX_RT %u" , ifp -> name , max_rt );
3448+ }
3449+ }
3450+
34093451static void
34103452dhcp6_recvif (struct interface * ifp , const char * sfrom ,
34113453 struct dhcp6_message * r , size_t len )
@@ -3526,6 +3568,7 @@ dhcp6_recvif(struct interface *ifp, const char *sfrom,
35263568 case DH6S_REQUEST : /* FALLTHROUGH */
35273569 case DH6S_RENEW : /* FALLTHROUGH */
35283570 case DH6S_REBIND :
3571+ dhcp6_adjust_max_rt (ifp , r , len );
35293572 if (dhcp6_validatelease (ifp , r , len , sfrom , NULL ) == -1 )
35303573 {
35313574 /*
@@ -3594,39 +3637,7 @@ dhcp6_recvif(struct interface *ifp, const char *sfrom,
35943637 }
35953638 }
35963639
3597- /* RFC7083 */
3598- o = dhcp6_findmoption (r , len , D6_OPTION_SOL_MAX_RT , & ol );
3599- if (o && ol == sizeof (uint32_t )) {
3600- uint32_t max_rt ;
3601-
3602- memcpy (& max_rt , o , sizeof (max_rt ));
3603- max_rt = ntohl (max_rt );
3604- if (max_rt >= 60 && max_rt <= 86400 ) {
3605- logdebugx ("%s: SOL_MAX_RT %llu -> %u" ,
3606- ifp -> name ,
3607- (unsigned long long )state -> sol_max_rt ,
3608- max_rt );
3609- state -> sol_max_rt = max_rt ;
3610- } else
3611- logerr ("%s: invalid SOL_MAX_RT %u" ,
3612- ifp -> name , max_rt );
3613- }
3614- o = dhcp6_findmoption (r , len , D6_OPTION_INF_MAX_RT , & ol );
3615- if (o && ol == sizeof (uint32_t )) {
3616- uint32_t max_rt ;
3617-
3618- memcpy (& max_rt , o , sizeof (max_rt ));
3619- max_rt = ntohl (max_rt );
3620- if (max_rt >= 60 && max_rt <= 86400 ) {
3621- logdebugx ("%s: INF_MAX_RT %llu -> %u" ,
3622- ifp -> name ,
3623- (unsigned long long )state -> inf_max_rt ,
3624- max_rt );
3625- state -> inf_max_rt = max_rt ;
3626- } else
3627- logerrx ("%s: invalid INF_MAX_RT %u" ,
3628- ifp -> name , max_rt );
3629- }
3640+ dhcp6_adjust_max_rt (ifp , r , len );
36303641 if (dhcp6_validatelease (ifp , r , len , sfrom , NULL ) == -1 )
36313642 return ;
36323643 break ;
0 commit comments