summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2014-10-23 16:04:10 +0200
committerMichael Brown2014-10-23 16:04:10 +0200
commitd1afe731eae1f0f97238de5213df1610d0ccf4ed (patch)
tree1f33ce9929a4373a6a8a3a38a69d0cb91d06aa84
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>
-rw-r--r--src/core/pinger.c13
-rw-r--r--src/usr/pingmgmt.c4
2 files changed, 14 insertions, 3 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 "
diff --git a/src/usr/pingmgmt.c b/src/usr/pingmgmt.c
index 2d4db491..cf6a5111 100644
--- a/src/usr/pingmgmt.c
+++ b/src/usr/pingmgmt.c
@@ -36,7 +36,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
/**
* Display ping result
*
- * @v src Source socket address
+ * @v src Source socket address, or NULL
* @v sequence Sequence number
* @v len Payload length
* @v rc Status code
@@ -46,7 +46,7 @@ static void ping_callback ( struct sockaddr *peer, unsigned int sequence,
/* Display ping response */
printf ( "%zd bytes from %s: seq=%d",
- len, sock_ntoa ( peer ), sequence );
+ len, ( peer ? sock_ntoa ( peer ) : "<none>" ), sequence );
if ( rc != 0 )
printf ( ": %s", strerror ( rc ) );
printf ( "\n" );