56 lines
1.4 KiB
C
56 lines
1.4 KiB
C
#include <stdio.h>
|
|
#include <arpa/inet.h>
|
|
|
|
#include "internal/output.h"
|
|
#include "internal/stats.h"
|
|
#include "internal/tracker.h"
|
|
|
|
/* Forward declarations */
|
|
static void print_loss_line(size_t sent, size_t ok_recv, size_t errors);
|
|
static void print_rtt_line(const t_ping_stats *stats);
|
|
/* -------------------- */
|
|
|
|
void
|
|
ping_output_summary(const t_ping_state *state, struct in_addr dest)
|
|
{
|
|
char dest_str[INET_ADDRSTRLEN];
|
|
size_t sent;
|
|
size_t errors;
|
|
size_t ok_recv;
|
|
|
|
inet_ntop(AF_INET, &dest, dest_str, sizeof(dest_str));
|
|
sent = state->tracker->nb_sent;
|
|
errors = state->nb_errors;
|
|
ok_recv = state->tracker->nb_recv - errors;
|
|
printf("--- %s ping statistics ---\n", dest_str);
|
|
print_loss_line(sent, ok_recv, errors);
|
|
if (0 < ok_recv)
|
|
print_rtt_line(state->stats);
|
|
}
|
|
|
|
static void
|
|
print_loss_line(size_t sent, size_t ok_recv, size_t errors)
|
|
{
|
|
int loss_pct;
|
|
|
|
loss_pct = (0 < sent) ? (int)((sent - ok_recv) * 100 / sent) : 0;
|
|
if (0 < errors)
|
|
printf("%zu packets transmitted, %zu received, +%zu errors,"
|
|
" %d%% packet loss\n", sent, ok_recv, errors, loss_pct);
|
|
else
|
|
printf("%zu packets transmitted, %zu received, %d%% packet loss\n",
|
|
sent, ok_recv, loss_pct);
|
|
}
|
|
|
|
static void
|
|
print_rtt_line(const t_ping_stats *stats)
|
|
{
|
|
double min_ms;
|
|
double max_ms;
|
|
double avg_ms;
|
|
double mdev_ms;
|
|
|
|
ping_stats_get(stats, &min_ms, &max_ms, &avg_ms, &mdev_ms);
|
|
printf("round-trip min/avg/max/mdev = %.3f/%.3f/%.3f/%.3f ms\n",
|
|
min_ms, avg_ms, max_ms, mdev_ms);
|
|
}
|