diff --git a/src/oping.c b/src/oping.c
index cce437904d856ff01571b1ffede9c41362a33f84..28f761cfffaad55418d7103eb7f9e69de835971d 100644 (file)
--- a/src/oping.c
+++ b/src/oping.c
#endif
/* The last n RTTs in the order they were sent. */
double history_by_time[HISTORY_SIZE_MAX];
- /* Current size of the history. This is a value between 0 and
- * HISTORY_SIZE_MAX. */
+
+ /* Current number of entries in the history. This is a value between 0
+ * and HISTORY_SIZE_MAX. */
size_t history_size;
+
+ /* Number "received" entries in the history, i.e. non-NAN entries. */
+ size_t history_received;
+
/* Index of the next RTT to be written to history_by_time. This wraps
* around to 0 once the histroty has grown to HISTORY_SIZE_MAX. */
size_t history_index;
- /* Number received replies, i.e. non-NAN entries. */
- size_t history_received;
- /* The last n RTTs sorted by value. timed out packets are sorted to the
- * back. */
+
+ /* The last history_size RTTs sorted by value. timed out packets (NAN
+ * entries) are sorted to the back. */
double history_by_value[HISTORY_SIZE_MAX];
+
/* If set to true, history_by_value has to be re-calculated. */
_Bool history_dirty;
/* Copy all values from by_time to by_value. */
memcpy (ctx->history_by_value, ctx->history_by_time,
sizeof (ctx->history_by_time));
+
/* Sort all RTTs. */
qsort (ctx->history_by_value, ctx->history_size, sizeof
(ctx->history_by_value[0]), compare_double);
+ /* Update the number of received RTTs. */
ctx->history_received = 0;
for (i = 0; i < ctx->history_size; i++)
if (!isnan (ctx->history_by_value[i]))
clean_history (ctx);
+ /* Not a single packet was received successfully. */
if (ctx->history_received == 0)
return NAN;
} /* }}} double percentile_to_latency */
#if USE_NCURSES
-static double latency_to_percentile (ping_context_t *ctx, /* {{{ */
+static double latency_to_ratio (ping_context_t *ctx, /* {{{ */
double latency)
{
size_t low;
clean_history (ctx);
+ /* Not a single packet was received successfully. */
if (ctx->history_received == 0)
return NAN;
else if (latency >= ctx->history_by_value[high])
return 100.0;
+ /* Do a binary search for the latency. This will work even when the
+ * exact latency is not in the array. If the latency is in the array
+ * multiple times, "low" will be set to the index of the last
+ * occurrence. The value at index "high" will be larger than the
+ * searched for latency (assured by the above "if" block. */
while ((high - low) > 1)
{
index = (high + low) / 2;
else
index = high;
- return (100.0 * ((double) (index + 1)) / ((double) ctx->history_received));
-} /* }}} double latency_to_percentile */
+ return (((double) (index + 1)) / ((double) ctx->history_received));
+} /* }}} double latency_to_ratio */
#endif
static double context_get_packet_loss (const ping_context_t *ctx) /* {{{ */
" -Z percent Exit with non-zero exit status if more than this percentage of\n"
" probes timed out. (default: never)\n"
- "\noping "PACKAGE_VERSION", http://verplant.org/liboping/\n"
- "by Florian octo Forster <octo@verplant.org>\n"
+ "\noping "PACKAGE_VERSION", http://noping.cc/\n"
+ "by Florian octo Forster <ff@octo.it>\n"
"for contributions see `AUTHORS'\n",
name);
exit (status);
opt_show_graph = 0;
else if (strcasecmp ("prettyping", optarg) == 0)
opt_show_graph = 1;
- else if (strcasecmp ("boxplot", optarg) == 0)
- opt_show_graph = 2;
else if (strcasecmp ("histogram", optarg) == 0)
+ opt_show_graph = 2;
+ else if (strcasecmp ("boxplot", optarg) == 0)
opt_show_graph = 3;
else
fprintf (stderr, "Unknown graph option: %s\n", optarg);
return (EINVAL);
x_max -= 4;
+ /* Determine the first index in the history we need to draw
+ * the graph. */
history_offset = 0;
- if (((size_t) x_max) < ctx->history_size)
+ if (((size_t) x_max) < ctx->history_size) /* window is smaller than history */
{
if (ctx->history_index > x_max)
history_offset = ctx->history_index - x_max;
else /* wrap around */
- history_offset = ctx->history_index + x_max - ctx->history_size;
+ history_offset = ctx->history_index + ctx->history_size - x_max;
+ }
+ else /* window is larger than history */
+ {
+ if (ctx->history_index != ctx->history_size) /* no longer growing. */
+ history_offset = ctx->history_index;
+ else /* start-up */
+ history_offset = 0;
}
for (x = 0; x < x_max; x++)
@@ -1196,16 +1219,16 @@ static int update_stats_from_context (ping_context_t *ctx, pingobj_iter_t *iter)
percentile = percentile_to_latency (ctx, opt_percentile);
mvwprintw (ctx->window, /* y = */ 2, /* x = */ 2,
- "RTT[ms]: min = %.0f, median = %.0f, p(%.0f) = %.0f, max = %.0f",
+ "RTT[ms]: min = %.0f, median = %.0f, p(%.0f) = %.0f, max = %.0f ",
min, median, opt_percentile, percentile, max);
}
if (opt_show_graph == 1)
update_graph_prettyping (ctx, latency, sequence);
else if (opt_show_graph == 2)
- update_graph_boxplot (ctx);
- else if (opt_show_graph == 3)
update_graph_histogram (ctx);
+ else if (opt_show_graph == 3)
+ update_graph_boxplot (ctx);
wrefresh (ctx->window);
break;
else if (key == KEY_RESIZE)
need_resize = 1;
+ else if (key == 'g')
+ {
+ if (opt_show_graph == 3)
+ opt_show_graph = 1;
+ else if (opt_show_graph > 0)
+ opt_show_graph++;
+ }
}
if (need_resize)
#if USE_NCURSES
if (has_colors () == TRUE)
{
- double percentile;
+ double ratio;
int color = OPING_GREEN;
- percentile = latency_to_percentile (context, latency);
- if (percentile < (100.0 * threshold_green))
+ ratio = latency_to_ratio (context, latency);
+ if (ratio < threshold_green)
color = OPING_GREEN;
- else if (percentile < (100.0 * threshold_yellow))
+ else if (ratio < threshold_yellow)
color = OPING_YELLOW;
else
color = OPING_RED;
-#if 0
- if ((ratio_this <= threshold_green)
- || ((ratio_prev < threshold_green)
- && (ratio_this > threshold_green)))
- color = OPING_GREEN;
- else if ((ratio_this <= threshold_yellow)
- || ((ratio_prev < threshold_yellow)
- && (ratio_this > threshold_yellow)))
- color = OPING_YELLOW;
- else
- color = OPING_RED;
-#endif
-
HOST_PRINTF ("%zu bytes from %s (%s): icmp_seq=%u ttl=%i ",
data_len, context->host, context->addr,
sequence, recv_ttl,