diff --git a/includes/internal/cli/options.h b/includes/internal/cli/options.h index 53f55bc..248219a 100644 --- a/includes/internal/cli/options.h +++ b/includes/internal/cli/options.h @@ -61,6 +61,14 @@ enum { OPT_ARG_SECONDS, \ "Wait N seconds between packets" \ ) \ + X( \ + 'T', \ + "tos", \ + required_argument, \ + cli_handle_tos, \ + OPT_ARG_UINT, \ + "Set Type of Service (TOS)" \ + ) \ X( \ 't', \ "ttl", \ diff --git a/includes/internal/ping/cli_handlers.h b/includes/internal/ping/cli_handlers.h index 12f0cd9..be759bd 100644 --- a/includes/internal/ping/cli_handlers.h +++ b/includes/internal/ping/cli_handlers.h @@ -16,6 +16,7 @@ int cli_handle_quiet(const char *arg, void *config); int cli_handle_size(const char *arg, void *config); int cli_handle_linger(const char *arg, void *config); int cli_handle_timeout(const char *arg, void *config); +int cli_handle_tos(const char *arg, void *config); int cli_handle_ttl(const char *arg, void *config); int cli_handle_verbose(const char *arg, void *config); int cli_handle_version(const char *arg, void *config); diff --git a/includes/ping/ping.h b/includes/ping/ping.h index 7a9f9d1..fd98cdc 100644 --- a/includes/ping/ping.h +++ b/includes/ping/ping.h @@ -19,6 +19,7 @@ struct ping_config uint64_t preload; double interval; uint8_t ttl; + uint8_t tos; size_t packet_size; double linger; double timeout; diff --git a/libicmp b/libicmp index e6693c9..71ca9ab 160000 --- a/libicmp +++ b/libicmp @@ -1 +1 @@ -Subproject commit e6693c97cc22b82adc3be85c72a5d5f655c69eb1 +Subproject commit 71ca9abc2e05de9cf61b135a4699ed3bb97a8969 diff --git a/src/ping/Makefile.am b/src/ping/Makefile.am index 4e4e744..849cf66 100644 --- a/src/ping/Makefile.am +++ b/src/ping/Makefile.am @@ -55,6 +55,7 @@ libping_core_la_SOURCES = \ cli/handlers/option_map.c \ cli/handlers/handle_size.c \ cli/handlers/handle_timeout.c \ + cli/handlers/handle_tos.c \ cli/handlers/handle_ttl.c \ cli/handlers/handle_version.c \ cli/handlers/handle_verbose.c \ diff --git a/src/ping/cli/handlers/handle_tos.c b/src/ping/cli/handlers/handle_tos.c new file mode 100644 index 0000000..0ae01e5 --- /dev/null +++ b/src/ping/cli/handlers/handle_tos.c @@ -0,0 +1,14 @@ +#include "ping/cli.h" +#include "internal/cli/parse_utils.h" + +int +cli_handle_tos(const char *arg, void *config_void) +{ + struct ping_config *config = (struct ping_config *)config_void; + uint64_t tos; + + if (0 != cli_parse_uint64(arg, &tos) || tos > 255) + return CLI_ERROR; + config->tos = (uint8_t)tos; + return CLI_SUCCESS; +} diff --git a/src/ping/core/ping.c b/src/ping/core/ping.c index 7ccfe37..1fbf6a7 100644 --- a/src/ping/core/ping.c +++ b/src/ping/core/ping.c @@ -60,6 +60,12 @@ ping_create_handle(const struct ping_config *config) icmp_destroy(handle); return NULL; } + if (0 != config->tos && 0 != icmp_set_tos(handle, config->tos)) + { + dprintf(STDERR_FILENO, "%s: %s\n", g_prog_name, icmp_strerror(handle)); + icmp_destroy(handle); + return NULL; + } return handle; }