feat: implement try again on EAGAIN
This commit is contained in:
parent
97417ade90
commit
50b3a1a86b
3 changed files with 26 additions and 14 deletions
2
libcli
2
libcli
|
|
@ -1 +1 @@
|
|||
Subproject commit efbae5b7d612ddbb066eb0ba9b1569cd8bf26330
|
||||
Subproject commit ae7fdf2f94a7c3c759d449ee1c4d3439473c6e42
|
||||
2
libicmp
2
libicmp
|
|
@ -1 +1 @@
|
|||
Subproject commit f2edfed48bdb8c709f01252215ccc79491b62314
|
||||
Subproject commit a9bdaf33f22b60b8643871b2522721cd041ac885
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue