mirror of
https://github.com/nmap/nmap.git
synced 2025-12-07 05:01:29 +00:00
ARP: Look for an earlier probe if response seems too fast. See #92
This commit is contained in:
@@ -1571,7 +1571,7 @@ bool get_arp_result(UltraScanInfo *USI, struct timeval *stime) {
|
|||||||
int rc;
|
int rc;
|
||||||
u8 rcvdmac[6];
|
u8 rcvdmac[6];
|
||||||
struct in_addr rcvdIP;
|
struct in_addr rcvdIP;
|
||||||
struct timeval rcvdtime;
|
struct timeval rcvdtime, fudgedsenttime;
|
||||||
bool timedout = false;
|
bool timedout = false;
|
||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
HostScanStats *hss = NULL;
|
HostScanStats *hss = NULL;
|
||||||
@@ -1628,7 +1628,10 @@ bool get_arp_result(UltraScanInfo *USI, struct timeval *stime) {
|
|||||||
/* Delay in libpcap could mean we sent another probe *after* this
|
/* Delay in libpcap could mean we sent another probe *after* this
|
||||||
* response was received. Search back for the last probe before rcvdtime. */
|
* response was received. Search back for the last probe before rcvdtime. */
|
||||||
probeI--;
|
probeI--;
|
||||||
} while (TIMEVAL_AFTER((*probeI)->sent, rcvdtime) && probeI != hss->probes_outstanding.begin());
|
/* If the response came just a hair (<10ms) after the probe was sent, it's
|
||||||
|
* probably a response to an earlier probe instead. Keep looking. */
|
||||||
|
TIMEVAL_MSEC_ADD(fudgedsenttime, (*probeI)->sent, INITIAL_ARP_RTT_TIMEOUT / 20);
|
||||||
|
} while (TIMEVAL_AFTER(fudgedsenttime, rcvdtime) && probeI != hss->probes_outstanding.begin());
|
||||||
ultrascan_host_probe_update(USI, hss, probeI, HOST_UP, &rcvdtime);
|
ultrascan_host_probe_update(USI, hss, probeI, HOST_UP, &rcvdtime);
|
||||||
/* Now that we know the host is up, we can forget our other probes. */
|
/* Now that we know the host is up, we can forget our other probes. */
|
||||||
hss->destroyAllOutstandingProbes();
|
hss->destroyAllOutstandingProbes();
|
||||||
|
|||||||
Reference in New Issue
Block a user