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
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++;
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 "
/**
* 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
/* 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" );