14 May 2007: Wouter
- Port to OS/X and Dec Alpha. Printf format and alignment fixes.
- extensive lock debug report on join timeout.
+ - proper RTT calculation, in utility code.
11 May 2007: Wouter
- iterator/iterator.c module.
(thr->arg?*(int*)thr->arg:0));
log_info("thread num is %d", thr->num);
log_info("locks created %d", thr->locks_created);
- log_info("FILE for lockinfo: %x. flushing.", (int)thr->order_info);
+ log_info("open file for lockinfo: %s",
+ thr->order_info?"yes, flushing":"no");
fflush(thr->order_info);
w = thr->waiting;
f = thr->holding_first;
unit_assert( !is_pow2(259) );
}
+#include "util/rtt.h"
+/** test RTT code */
+static void
+rtt_test()
+{
+ int i;
+ struct rtt_info r;
+ rtt_init(&r);
+ /* initial value sensible */
+ unit_assert( rtt_timeout(&r) == 3000 );
+ rtt_lost(&r);
+ unit_assert( rtt_timeout(&r) == 6000 );
+ rtt_lost(&r);
+ unit_assert( rtt_timeout(&r) == 12000 );
+ rtt_update(&r, 4000);
+ unit_assert( rtt_timeout(&r) >= 5000 );
+ rtt_lost(&r);
+ for(i=0; i<100; i++) {
+ rtt_lost(&r);
+ unit_assert( rtt_timeout(&r) > RTT_MIN_TIMEOUT-1);
+ unit_assert( rtt_timeout(&r) < RTT_MAX_TIMEOUT+1);
+ }
+}
+
/**
* Main unit test program. Setup, teardown and report errors.
* @param argc: arg count.
checklock_start();
net_test();
dname_test();
+ rtt_test();
alloc_test();
lruhash_test();
slabhash_test();
--- /dev/null
+/*
+ * util/rtt.c - UDP round trip time estimator for resend timeouts.
+ *
+ * Copyright (c) 2007, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file contains a data type and functions to help estimate good
+ * round trip times for UDP resend timeout values.
+ */
+#include "config.h"
+#include "util/rtt.h"
+#include "util/log.h"
+
+/** calculate RTO from rtt information */
+static int
+calc_rto(const struct rtt_info* rtt)
+{
+ /* From Stevens, Unix Network Programming, p.598 */
+ int rto = rtt->srtt + 4*rtt->rttvar;
+ if(rto < RTT_MIN_TIMEOUT)
+ rto = RTT_MIN_TIMEOUT;
+ if(rto > RTT_MAX_TIMEOUT)
+ rto = RTT_MAX_TIMEOUT;
+ return rto;
+}
+
+void
+rtt_init(struct rtt_info* rtt)
+{
+ rtt->srtt = 0;
+ rtt->rttvar = 750;
+ rtt->rto = calc_rto(rtt);
+ /* first RTO is 0 + 4*0.75 = 3 seconds */
+}
+
+int
+rtt_timeout(const struct rtt_info* rtt)
+{
+ return rtt->rto;
+}
+
+void
+rtt_update(struct rtt_info* rtt, int ms)
+{
+ int delta = ms - rtt->srtt;
+ rtt->srtt += delta / 8; /* g = 1/8 */
+ if(delta < 0)
+ delta = -delta; /* |delta| */
+ rtt->rttvar += (delta - rtt->rttvar) / 4; /* h = 1/4 */
+ rtt->rto = calc_rto(rtt);
+}
+
+void
+rtt_lost(struct rtt_info* rtt)
+{
+ /* exponential backoff */
+ rtt->rto *= 2;
+ if(rtt->rto > RTT_MAX_TIMEOUT)
+ rtt->rto = RTT_MAX_TIMEOUT;
+}
--- /dev/null
+/*
+ * util/rtt.h - UDP round trip time estimator for resend timeouts.
+ *
+ * Copyright (c) 2007, NLnet Labs. All rights reserved.
+ *
+ * This software is open source.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NLNET LABS nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * \file
+ *
+ * This file contains a data type and functions to help estimate good
+ * round trip times for UDP resend timeout values.
+ */
+
+#ifndef UTIL_RTT_H
+#define UTIL_RTT_H
+
+/**
+ * RTT information. Keeps packet Round Trip Time.
+ */
+struct rtt_info {
+ /** smoothed rtt estimator, in milliseconds */
+ int srtt;
+ /** smoothed mean deviation, in milliseconds */
+ int rttvar;
+ /** current RTO in use, in milliseconds */
+ int rto;
+};
+
+/** min retransmit timeout value, in milliseconds */
+#define RTT_MIN_TIMEOUT 2000
+/** max retransmit timeout value, in milliseconds */
+#define RTT_MAX_TIMEOUT 120000
+
+/**
+ * Initialize RTT estimators.
+ * @param rtt: The structure. Caller is responsible for allocation of it.
+ */
+void rtt_init(struct rtt_info* rtt);
+
+/**
+ * Get timeout to use for sending a UDP packet.
+ * @param rtt: round trip statistics structure.
+ * @return: timeout to use in milliseconds. Relative time value.
+ */
+int rtt_timeout(const struct rtt_info* rtt);
+
+/**
+ * Update the statistics with a new roundtrip estimate observation.
+ * @param rtt: round trip statistics structure.
+ * @param ms: estimate of roundtrip time in milliseconds.
+ */
+void rtt_update(struct rtt_info* rtt, int ms);
+
+/**
+ * Update the statistics with a new timout expired observation.
+ * @param rtt: round trip statistics structure.
+ */
+void rtt_lost(struct rtt_info* rtt);
+
+#endif /* UTIL_RTT_H */