From 8192d9020a3299f3e8ada094ba8b95fb776d0b56 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Wed, 27 Oct 2010 11:05:35 +0200 Subject: [PATCH] src/oping.c: Add function for formatted printing of the QoS byte. --- src/oping.c | 87 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 72 insertions(+), 15 deletions(-) diff --git a/src/oping.c b/src/oping.c index 240e7e7..84d97af 100644 --- a/src/oping.c +++ b/src/oping.c @@ -272,7 +272,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 +307,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 +315,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 +341,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 +351,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 +364,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 +392,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 +400,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 +817,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 +838,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); + recv_qos = 0; + buffer_len = sizeof (recv_qos); ping_iterator_get_info (iter, PING_INFO_RECV_QOS, - &recv_tos, &buffer_len); + &recv_qos, &buffer_len); data_len = 0; ping_iterator_get_info (iter, PING_INFO_DATA, @@ -827,10 +881,11 @@ 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 + HOST_PRINTF ("%zu bytes from %s (%s): icmp_seq=%u ttl=%i qos=%s" " time=", 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))); wattron (main_win, COLOR_PAIR(color)); HOST_PRINTF ("%.2f", latency); wattroff (main_win, COLOR_PAIR(color)); @@ -839,11 +894,13 @@ 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 + HOST_PRINTF ("%zu bytes from %s (%s): icmp_seq=%u ttl=%i qos=%s" " time=%.2f ms\n", data_len, context->host, context->addr, - sequence, recv_ttl, recv_tos, latency); + sequence, recv_ttl, + format_qos (recv_qos, recv_qos_str, sizeof (recv_qos_str)), + latency); #if USE_NCURSES } #endif -- 2.30.2