Skip to content

Commit 0104902

Browse files
Jon Franklinrsmarples
authored andcommitted
DHCP6: Apply SOL and INF MAX_RT to REPLY messages too.
1 parent 1b840e0 commit 0104902

1 file changed

Lines changed: 44 additions & 33 deletions

File tree

src/dhcp6.c

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
34093451
static void
34103452
dhcp6_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

Comments
 (0)