ssahani / rpms / dhcp

Forked from rpms/dhcp 6 years ago
Clone
5a3797e
diff -up dhcp-4.2.0/client/dhc6.c.release6-elapsed dhcp-4.2.0/client/dhc6.c
5a3797e
--- dhcp-4.2.0/client/dhc6.c.release6-elapsed	2010-07-21 16:19:52.000000000 +0200
5a3797e
+++ dhcp-4.2.0/client/dhc6.c	2010-07-21 16:21:14.000000000 +0200
5a3797e
@@ -2177,7 +2177,7 @@ do_release6(void *input)
33f7324
 	struct client_state *client;
33f7324
 	struct data_string ds;
33f7324
 	int send_ret;
33f7324
-	struct timeval tv;
33f7324
+	struct timeval elapsed, tv;
33f7324
 
33f7324
 	client = input;
33f7324
 
5a3797e
@@ -2197,6 +2197,14 @@ do_release6(void *input)
33f7324
 		client->start_time.tv_usec = cur_tv.tv_usec;
33f7324
 	}
33f7324
 
33f7324
+	/* elapsed = cur - start */
33f7324
+	elapsed.tv_sec = cur_tv.tv_sec - client->start_time.tv_sec;
33f7324
+	elapsed.tv_usec = cur_tv.tv_usec - client->start_time.tv_usec;
33f7324
+	if (elapsed.tv_usec < 0) {
33f7324
+		elapsed.tv_sec -= 1;
33f7324
+		elapsed.tv_usec += 1000000;
33f7324
+	}
33f7324
+
33f7324
 	/*
33f7324
 	 * Don't use unicast as we don't know if we still have an
33f7324
 	 * available address with enough scope.
5a3797e
@@ -2213,6 +2221,18 @@ do_release6(void *input)
33f7324
 	ds.buffer->data[0] = DHCPV6_RELEASE;
33f7324
 	memcpy(ds.buffer->data + 1, client->dhcpv6_transaction_id, 3);
33f7324
 
33f7324
+	/* Form an elapsed option. */
33f7324
+	/* Maximum value is 65535 1/100s coded as 0xffff. */
33f7324
+	if ((elapsed.tv_sec < 0) || (elapsed.tv_sec > 655) ||
33f7324
+	    ((elapsed.tv_sec == 655) && (elapsed.tv_usec > 350000))) {
33f7324
+		client->elapsed = 0xffff;
33f7324
+	} else {
33f7324
+		client->elapsed = elapsed.tv_sec * 100;
33f7324
+		client->elapsed += elapsed.tv_usec / 10000;
33f7324
+	}
33f7324
+
33f7324
+	client->elapsed = htons(client->elapsed);
33f7324
+
33f7324
 	log_debug("XMT: Forming Release.");
33f7324
 	make_client6_options(client, &client->sent_options,
33f7324
 			     client->active_lease, DHCPV6_RELEASE);