diff --git a/libcli b/libcli index efbae5b..ae7fdf2 160000 --- a/libcli +++ b/libcli @@ -1 +1 @@ -Subproject commit efbae5b7d612ddbb066eb0ba9b1569cd8bf26330 +Subproject commit ae7fdf2f94a7c3c759d449ee1c4d3439473c6e42 diff --git a/libicmp b/libicmp index f2edfed..a9bdaf3 160000 --- a/libicmp +++ b/libicmp @@ -1 +1 @@ -Subproject commit f2edfed48bdb8c709f01252215ccc79491b62314 +Subproject commit a9bdaf33f22b60b8643871b2522721cd041ac885 diff --git a/src/ping/core/send.c b/src/ping/core/send.c index d207375..b5cac1a 100644 --- a/src/ping/core/send.c +++ b/src/ping/core/send.c @@ -13,16 +13,29 @@ /* 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); +static int ping_send_one(struct ping_state *state, uint16_t seq, + const uint8_t *payload, size_t payload_len, struct timespec *ts); /* -------------------- */ void do_send(struct ping_state *state, size_t payload_len) { + uint8_t payload[MAX_PACKET_SIZE]; + struct timespec ts; + int ret; + state->send_flag = 0; - if (0 != ping_send_one(state, payload_len)) + fill_payload(payload, payload_len); + ret = ping_send_one(state, state->seq, payload, payload_len, &ts); + if (-1 == ret) dprintf(STDERR_FILENO, "%s: %s\n", g_prog_name, icmp_strerror(state->handle)); + else if (0 == ret) + { + ping_tracker_record_send(state->tracker, state->seq, &ts); + state->seq++; + } + if (HAS_FLAG(state->config->flags, FLAG_FLOOD)) ping_output_flood_dot(); if (0 != ping_scheduler_arm(state->config)) @@ -34,24 +47,23 @@ do_send(struct ping_state *state, size_t payload_len) } static int -ping_send_one(struct ping_state *state, size_t payload_len) +ping_send_one(struct ping_state *state, uint16_t seq, + const uint8_t *payload, size_t payload_len, struct timespec *ts) { - struct timespec ts; - uint8_t payload[MAX_PACKET_SIZE]; - uint16_t seq; + int ret; - fill_payload(payload, payload_len); - if (0 != icmp_get_time(&ts)) + if (0 != icmp_get_time(ts)) return -1; - seq = state->seq++; - if (0 != icmp_send_echo(state->handle, + ret = icmp_send_echo(state->handle, state->dest, state->id, seq, state->config->ttl, - payload, payload_len)) + payload, payload_len); + if (1 == ret && icmp_should_retry(state->handle)) + return 1; + if (0 != ret) return -1; - ping_tracker_record_send(state->tracker, seq, &ts); return 0; }