]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[ping] Report timed-out pings via the callback function
authorMichael Brown <mcb30@ipxe.org>
Thu, 23 Oct 2014 14:04:10 +0000 (15:04 +0100)
committerMichael Brown <mcb30@ipxe.org>
Thu, 23 Oct 2014 14:04:10 +0000 (15:04 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/pinger.c
src/usr/pingmgmt.c

index c912a64d7c4a2c3ab31e6d68111053b273e89b19..0312ff38e611f34956900e03b641ae514ae884aa 100644 (file)
@@ -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 "
index 2d4db491fbbf7952bbab203efc6896b3691ad031..cf6a51113f870beb5e0237558b211647e5808f20 100644 (file)
@@ -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" );