X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Foping.c;h=5b13a1ffe3269424e02ecd72fd23b6c7b4d60ae5;hb=4b7074ad0d82ced50c9bade2ccbf97189f4e65c1;hp=5c1d8a18fc91132afc42cce51b96e2815e30d6b7;hpb=138ea1eeeb00196386faab0740a9cfafc8394f97;p=liboping.git diff --git a/src/oping.c b/src/oping.c index 5c1d8a1..5b13a1f 100644 --- a/src/oping.c +++ b/src/oping.c @@ -247,10 +247,6 @@ static int ping_initialize_contexts (pingobj_t *ping) /* {{{ */ static void usage_exit (const char *name, int status) /* {{{ */ { - int name_length; - - name_length = (int) strlen (name); - fprintf (stderr, "Usage: %s [OPTIONS] " "-f filename | host [host [host ...]]\n" @@ -272,7 +268,7 @@ static void usage_exit (const char *name, int status) /* {{{ */ exit (status); } /* }}} void usage_exit */ -static void usage_tos_exit (const char *arg, int status) /* {{{ */ +static void usage_qos_exit (const char *arg, int status) /* {{{ */ { if (arg != 0) fprintf (stderr, "Invalid QoS argument: \"%s\"\n\n", arg); @@ -307,7 +303,7 @@ static void usage_tos_exit (const char *arg, int status) /* {{{ */ (unsigned int) IPTOS_MINCOST); exit (status); -} /* }}} void usage_tos_exit */ +} /* }}} void usage_qos_exit */ static int set_opt_send_qos (const char *opt) /* {{{ */ { @@ -315,7 +311,7 @@ static int set_opt_send_qos (const char *opt) /* {{{ */ return (EINVAL); if (strcasecmp ("help", opt) == 0) - usage_tos_exit (/* arg = */ NULL, /* status = */ EXIT_SUCCESS); + usage_qos_exit (/* arg = */ NULL, /* status = */ EXIT_SUCCESS); /* DiffServ (RFC 2474): */ /* - Best effort (BE) */ else if (strcasecmp ("be", opt) == 0) @@ -341,7 +337,7 @@ static int set_opt_send_qos (const char *opt) /* {{{ */ else if (opt[2] == '4') class = 4; else - usage_tos_exit (/* arg = */ opt, /* status = */ EXIT_SUCCESS); + usage_qos_exit (/* arg = */ opt, /* status = */ EXIT_SUCCESS); /* In each class, there are three precedences, AFx1, AFx2, and AFx3 */ if (opt[3] == '1') @@ -351,7 +347,7 @@ static int set_opt_send_qos (const char *opt) /* {{{ */ else if (opt[3] == '3') prec = 3; else - usage_tos_exit (/* arg = */ opt, /* status = */ EXIT_SUCCESS); + usage_qos_exit (/* arg = */ opt, /* status = */ EXIT_SUCCESS); dscp = (8 * class) + (2 * prec); /* The lower two bits are used for Explicit Congestion Notification (ECN) */ @@ -364,7 +360,7 @@ static int set_opt_send_qos (const char *opt) /* {{{ */ uint8_t class; if ((opt[2] < '0') || (opt[2] > '7')) - usage_tos_exit (/* arg = */ opt, /* status = */ EXIT_FAILURE); + usage_qos_exit (/* arg = */ opt, /* status = */ EXIT_FAILURE); /* Not exactly legal by the C standard, but I don't know of any * system not supporting this hack. */ @@ -392,7 +388,7 @@ static int set_opt_send_qos (const char *opt) /* {{{ */ if ((errno != 0) || (endptr == opt) || (endptr == NULL) || (*endptr != 0) || (value > 0xff)) - usage_tos_exit (/* arg = */ opt, /* status = */ EXIT_FAILURE); + usage_qos_exit (/* arg = */ opt, /* status = */ EXIT_FAILURE); opt_send_qos = (uint8_t) value; } @@ -400,6 +396,59 @@ static int set_opt_send_qos (const char *opt) /* {{{ */ return (0); } /* }}} int set_opt_send_qos */ +static char *format_qos (uint8_t qos, char *buffer, size_t buffer_size) /* {{{ */ +{ + uint8_t dscp; + uint8_t ecn; + char *dscp_str; + char *ecn_str; + + dscp = qos >> 2; + ecn = qos & 0x03; + + switch (dscp) + { + case 0x00: dscp_str = "be"; break; + case 0x2e: dscp_str = "ef"; break; + case 0x0a: dscp_str = "af11"; break; + case 0x0c: dscp_str = "af12"; break; + case 0x0e: dscp_str = "af13"; break; + case 0x12: dscp_str = "af21"; break; + case 0x14: dscp_str = "af22"; break; + case 0x16: dscp_str = "af23"; break; + case 0x1a: dscp_str = "af31"; break; + case 0x1c: dscp_str = "af32"; break; + case 0x1e: dscp_str = "af33"; break; + case 0x22: dscp_str = "af41"; break; + case 0x24: dscp_str = "af42"; break; + case 0x26: dscp_str = "af43"; break; + case 0x08: dscp_str = "cs1"; break; + case 0x10: dscp_str = "cs2"; break; + case 0x18: dscp_str = "cs3"; break; + case 0x20: dscp_str = "cs4"; break; + case 0x28: dscp_str = "cs5"; break; + case 0x30: dscp_str = "cs6"; break; + case 0x38: dscp_str = "cs7"; break; + default: dscp_str = NULL; + } + + switch (ecn) + { + case 0x01: ecn_str = ",ecn(1)"; break; + case 0x02: ecn_str = ",ecn(0)"; break; + case 0x03: ecn_str = ",ce"; break; + default: ecn_str = ""; + } + + if (dscp_str == NULL) + snprintf (buffer, buffer_size, "0x%02x%s", dscp, ecn_str); + else + snprintf (buffer, buffer_size, "%s%s", dscp_str, ecn_str); + buffer[buffer_size - 1] = 0; + + return (buffer); +} /* }}} char *format_qos */ + static int read_options (int argc, char **argv) /* {{{ */ { int optchar; @@ -764,7 +813,8 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ double latency; unsigned int sequence; int recv_ttl; - uint8_t recv_tos; + uint8_t recv_qos; + char recv_qos_str[16]; size_t buffer_len; size_t data_len; ping_context_t *context; @@ -784,10 +834,10 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ ping_iterator_get_info (iter, PING_INFO_RECV_TTL, &recv_ttl, &buffer_len); - recv_tos = 0; - buffer_len = sizeof (recv_tos); - ping_iterator_get_info (iter, PING_INFO_RECV_TOS, - &recv_tos, &buffer_len); + recv_qos = 0; + buffer_len = sizeof (recv_qos); + ping_iterator_get_info (iter, PING_INFO_RECV_QOS, + &recv_qos, &buffer_len); data_len = 0; ping_iterator_get_info (iter, PING_INFO_DATA, @@ -827,10 +877,16 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ || (latency > (average + stddev))) color = OPING_YELLOW; - HOST_PRINTF ("%zu bytes from %s (%s): icmp_seq=%u ttl=%i tos=0x%02"PRIx8 - " time=", + HOST_PRINTF ("%zu bytes from %s (%s): icmp_seq=%u ttl=%i ", data_len, context->host, context->addr, - sequence, recv_ttl, recv_tos); + sequence, recv_ttl, + format_qos (recv_qos, recv_qos_str, sizeof (recv_qos_str))); + if ((recv_qos != 0) || (opt_send_qos != 0)) + { + HOST_PRINTF ("qos=%s ", + format_qos (recv_qos, recv_qos_str, sizeof (recv_qos_str))); + } + HOST_PRINTF ("time="); wattron (main_win, COLOR_PAIR(color)); HOST_PRINTF ("%.2f", latency); wattroff (main_win, COLOR_PAIR(color)); @@ -839,11 +895,16 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ else { #endif - HOST_PRINTF ("%zu bytes from %s (%s): icmp_seq=%u ttl=%i tos=0x%02"PRIx8 - " time=%.2f ms\n", + HOST_PRINTF ("%zu bytes from %s (%s): icmp_seq=%u ttl=%i ", data_len, context->host, context->addr, - sequence, recv_ttl, recv_tos, latency); + sequence, recv_ttl); + if ((recv_qos != 0) || (opt_send_qos != 0)) + { + HOST_PRINTF ("qos=%s ", + format_qos (recv_qos, recv_qos_str, sizeof (recv_qos_str))); + } + HOST_PRINTF ("time=%.2f ms\n", latency); #if USE_NCURSES } #endif @@ -986,7 +1047,7 @@ int main (int argc, char **argv) /* {{{ */ opt_send_ttl, ping_get_error (ping)); } - if (ping_setopt (ping, PING_OPT_TOS, &opt_send_qos) != 0) + if (ping_setopt (ping, PING_OPT_QOS, &opt_send_qos) != 0) { fprintf (stderr, "Setting TOS to %i failed: %s\n", opt_send_qos, ping_get_error (ping));