#include #include #include #include #include #include "version_gen.h" #include "icmp.h" #include "internal/ping/output.h" #include "internal/ping/scheduler.h" #include "ping/ft_ping_const.h" #include "ping/ft_ping_flags.h" /* Forward declarations */ static inline void fill_payload(uint8_t *payload, size_t payload_len); static int ping_send_one(struct ping_state *state, size_t payload_len); /* -------------------- */ void do_send(struct ping_state *state, size_t payload_len) { state->send_flag = 0; if (0 != ping_send_one(state, payload_len)) dprintf(STDERR_FILENO, "%s: %s\n", g_prog_name, icmp_strerror(state->handle)); if (HAS_FLAG(state->config->flags, FLAG_FLOOD)) ping_output_flood_dot(); if (0 != ping_scheduler_arm(state->config)) { dprintf(STDERR_FILENO, "%s: setitimer: %s\n", g_prog_name, strerror(errno)); state->stop_flag = 1; } } static int ping_send_one(struct ping_state *state, size_t payload_len) { struct timespec ts; uint8_t payload[MAX_PACKET_SIZE]; uint16_t seq; fill_payload(payload, payload_len); if (0 != icmp_get_time(&ts)) return -1; seq = state->seq++; if (0 != icmp_send_echo(state->handle, state->dest, state->id, seq, state->config->ttl, payload, payload_len)) return -1; ping_tracker_record_send(state->tracker, seq, &ts); return 0; } static inline void fill_payload(uint8_t *payload, size_t payload_len) { for (size_t i = 0; i < payload_len; ++i) payload[i] = (uint8_t)('a' + (i % 26)); }