From d1afe731eae1f0f97238de5213df1610d0ccf4ed Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 23 Oct 2014 15:04:10 +0100 Subject: [PATCH] [ping] Report timed-out pings via the callback function Signed-off-by: Michael Brown --- src/core/pinger.c | 13 ++++++++++++- src/usr/pingmgmt.c | 4 ++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/core/pinger.c b/src/core/pinger.c index c912a64d7..0312ff38e 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 2d4db491f..cf6a51113 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 ) : "" ), sequence ); if ( rc != 0 ) printf ( ": %s", strerror ( rc ) ); printf ( "\n" );