summaryrefslogtreecommitdiffstats
path: root/src/core/pinger.c
diff options
context:
space:
mode:
authorMichael Brown2014-10-23 16:04:10 +0200
committerMichael Brown2014-10-23 16:04:10 +0200
commitd1afe731eae1f0f97238de5213df1610d0ccf4ed (patch)
tree1f33ce9929a4373a6a8a3a38a69d0cb91d06aa84 /src/core/pinger.c
parent[efi] Include NII driver within "snp" and "snponly" build targets (diff)
downloadipxe-d1afe731eae1f0f97238de5213df1610d0ccf4ed.tar.gz
ipxe-d1afe731eae1f0f97238de5213df1610d0ccf4ed.tar.xz
ipxe-d1afe731eae1f0f97238de5213df1610d0ccf4ed.zip
[ping] Report timed-out pings via the callback function
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core/pinger.c')
-rw-r--r--src/core/pinger.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/core/pinger.c b/src/core/pinger.c
index c912a64d..0312ff38 100644
--- a/src/core/pinger.c
+++ b/src/core/pinger.c
@@ -68,10 +68,12 @@ struct pinger {
size_t len;
/** Current sequence number */
uint16_t sequence;
+ /** Response for current sequence number is still pending */
+ int pending;
/** Callback function
*
- * @v src Source socket address
+ * @v src Source socket address, or NULL
* @v sequence Sequence number
* @v len Payload length
* @v rc Status code
@@ -159,6 +161,11 @@ static void pinger_expired ( struct retry_timer *timer, int over __unused ) {
struct io_buffer *iobuf;
int rc;
+ /* If no response has been received, notify the callback function */
+ if ( pinger->pending )
+ pinger->callback ( NULL, pinger->sequence, 0, -ETIMEDOUT );
+ pinger->pending = 1;
+
/* Increase sequence number */
pinger->sequence++;
@@ -205,6 +212,10 @@ static int pinger_deliver ( struct pinger *pinger, struct io_buffer *iobuf,
uint16_t sequence = meta->offset;
int rc;
+ /* Clear response pending flag, if applicable */
+ if ( sequence == pinger->sequence )
+ pinger->pending = 0;
+
/* Check for errors */
if ( len != pinger->len ) {
DBGC ( pinger, "PINGER %p received incorrect length %zd "