summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/dhcpv6-ia.c30
1 files changed, 10 insertions, 20 deletions
diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c
index d8187ff..836c111 100644
--- a/src/dhcpv6-ia.c
+++ b/src/dhcpv6-ia.c
@@ -529,7 +529,7 @@ static void managed_handle_pd_data(struct ustream *s, _unused int bytes_new)
if (first && c->managed_size == 0)
free_assignment(c);
- else if (first && !(c->flags & OAF_STATIC))
+ else if (first)
c->valid_until = now + 150;
}
@@ -540,8 +540,7 @@ static void managed_handle_pd_done(struct ustream *s)
struct ustream_fd *fd = container_of(s, struct ustream_fd, stream);
struct dhcp_assignment *c = container_of(fd, struct dhcp_assignment, managed_sock);
- if (!(c->flags & OAF_STATIC))
- c->valid_until = odhcpd_time() + 15;
+ c->valid_until = odhcpd_time() + 15;
c->managed_size = 0;
@@ -569,8 +568,7 @@ static bool assign_pd(struct interface *iface, struct dhcp_assignment *assign)
ustream_write_pending(&assign->managed_sock.stream);
assign->managed_size = -1;
- if (!(assign->flags & OAF_STATIC))
- assign->valid_until = odhcpd_time() + 15;
+ assign->valid_until = odhcpd_time() + 15;
list_add(&assign->head, &iface->ia_assignments);
@@ -1252,9 +1250,7 @@ ssize_t dhcpv6_ia_handle_IAs(uint8_t *buf, size_t buflen, struct interface *ifac
a->length = reqlen;
a->peer = *addr;
a->assigned = is_na && l ? l->hostid : reqhint;
- /* Set valid time to 0 for static lease indicating */
- /* infinite lifetime otherwise current time */
- a->valid_until = l ? 0 : now;
+ a->valid_until = now;
a->dhcp_free_cb = dhcpv6_ia_free_assignment;
a->iface = iface;
a->flags = (is_pd ? OAF_DHCPV6_PD : OAF_DHCPV6_NA);
@@ -1334,9 +1330,8 @@ ssize_t dhcpv6_ia_handle_IAs(uint8_t *buf, size_t buflen, struct interface *ifac
a->flags &= ~OAF_BOUND;
a->flags |= OAF_TENTATIVE;
- if (!(a->flags & OAF_STATIC))
- /* Keep tentative assignment around for 60 seconds */
- a->valid_until = now + 60;
+ /* Keep tentative assignment around for 60 seconds */
+ a->valid_until = now + 60;
} else if (assigned &&
((hdr->msg_type == DHCPV6_MSG_SOLICIT && rapid_commit) ||
@@ -1378,20 +1373,15 @@ ssize_t dhcpv6_ia_handle_IAs(uint8_t *buf, size_t buflen, struct interface *ifac
apply_lease(a, true);
}
} else if (hdr->msg_type == DHCPV6_MSG_RELEASE) {
- if (a->flags & OAF_STATIC) {
- apply_lease(a, false);
- a->flags &= ~OAF_BOUND;
- }
- else
- a->valid_until = now - 1;
-
+ a->valid_until = now - 1;
} else if ((a->flags & OAF_DHCPV6_NA) && hdr->msg_type == DHCPV6_MSG_DECLINE) {
a->flags &= ~OAF_BOUND;
- if (!(a->flags & OAF_STATIC)) {
+ if (!(a->flags & OAF_STATIC) || a->lease->hostid != a->assigned) {
memset(a->clid_data, 0, a->clid_len);
a->valid_until = now + 3600; /* Block address for 1h */
- }
+ } else
+ a->valid_until = now - 1;
}
} else if (hdr->msg_type == DHCPV6_MSG_CONFIRM) {
if (ia_addr_present && !dhcpv6_ia_on_link(ia, a, iface)) {