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 */
|
/* Forward declarations */
|
||||||
static inline void fill_payload(uint8_t *payload, size_t payload_len);
|
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
|
void
|
||||||
do_send(struct ping_state *state, size_t payload_len)
|
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;
|
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",
|
dprintf(STDERR_FILENO, "%s: %s\n",
|
||||||
g_prog_name, icmp_strerror(state->handle));
|
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))
|
if (HAS_FLAG(state->config->flags, FLAG_FLOOD))
|
||||||
ping_output_flood_dot();
|
ping_output_flood_dot();
|
||||||
if (0 != ping_scheduler_arm(state->config))
|
if (0 != ping_scheduler_arm(state->config))
|
||||||
|
|
@ -34,24 +47,23 @@ do_send(struct ping_state *state, size_t payload_len)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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;
|
int ret;
|
||||||
uint8_t payload[MAX_PACKET_SIZE];
|
|
||||||
uint16_t seq;
|
|
||||||
|
|
||||||
fill_payload(payload, payload_len);
|
if (0 != icmp_get_time(ts))
|
||||||
if (0 != icmp_get_time(&ts))
|
|
||||||
return -1;
|
return -1;
|
||||||
seq = state->seq++;
|
ret = icmp_send_echo(state->handle,
|
||||||
if (0 != icmp_send_echo(state->handle,
|
|
||||||
state->dest,
|
state->dest,
|
||||||
state->id,
|
state->id,
|
||||||
seq,
|
seq,
|
||||||
state->config->ttl,
|
state->config->ttl,
|
||||||
payload, payload_len))
|
payload, payload_len);
|
||||||
|
if (1 == ret && icmp_should_retry(state->handle))
|
||||||
|
return 1;
|
||||||
|
if (0 != ret)
|
||||||
return -1;
|
return -1;
|
||||||
ping_tracker_record_send(state->tracker, seq, &ts);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue