summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorHans Dedecker <dedeckeh@gmail.com>2020-02-16 21:27:42 +0100
committerHans Dedecker <dedeckeh@gmail.com>2020-02-16 21:37:45 +0100
commita90cc2e147b0f6e429c4e5e3e4e42e00b01ec32c (patch)
treef1a52553de4bf07eaf5a0d3bfbc4144118eb242a
parentbb07fa4b6d0d48cb2e67a4e9979412af8b05e883 (diff)
dhcpv6-ia: avoid setting lifetime to infinite for static assignments
Don't set the valid lifetime to infinite for static assignments but rather set it to the IA lifetime given to the client. This makes it possible to display the leasetime for static assigments and simplifies the code in several places Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
-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)) {