1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-15 20:29:03 +00:00

Let setTargetNextHopMAC call getNextHopMAC instead of duplicating code.

This commit is contained in:
david
2012-09-15 14:57:35 +00:00
parent 271045501f
commit 7527202d8b

View File

@@ -1894,11 +1894,9 @@ int setTargetMACIfAvailable(Target *target, struct link_header *linkhdr,
have already been called on target before this. The target device
and src mac address should also already be set. */
bool setTargetNextHopMAC(Target *target) {
struct sockaddr_storage targetss, srcss;
struct sockaddr_storage targetss;
size_t sslen;
arp_t *a;
u8 mac[6];
struct arp_entry ae;
if (target->ifType() != devt_ethernet)
return false; /* Duh. */
@@ -1920,43 +1918,11 @@ bool setTargetNextHopMAC(Target *target) {
fatal("%s: Failed to determine nextHop to target", __func__);
}
/* First, let us check the Nmap arp cache ... */
if (mac_cache_get(&targetss, mac)) {
if (getNextHopMAC(target->deviceFullName(), target->SrcMACAddress(), target->SourceSockAddr(), &targetss, mac)) {
target->setNextHopMACAddress(mac);
return true;
}
/* Maybe the system ARP cache will be more helpful */
a = arp_open();
addr_ston((sockaddr *) & targetss, &ae.arp_pa);
if (arp_get(a, &ae) == 0) {
mac_cache_set(&targetss, ae.arp_ha.addr_eth.data);
target->setNextHopMACAddress(ae.arp_ha.addr_eth.data);
arp_close(a);
return true;
}
arp_close(a);
/* OK, the last choice is to send our own damn ARP request (and
retransmissions if necessary) to determine the MAC */
target->SourceSockAddr(&srcss, NULL);
if (target->af() == AF_INET) {
if (doArp(target->deviceFullName(), target->SrcMACAddress(),
&srcss, &targetss, mac, PacketTrace::traceArp)) {
mac_cache_set(&targetss, mac);
target->setNextHopMACAddress(mac);
return true;
}
} else if (target->af() == AF_INET6) {
if (doND(target->deviceFullName(), target->SrcMACAddress(),
&srcss, &targetss, mac, PacketTrace::traceND)) {
mac_cache_set(&targetss, mac);
target->setNextHopMACAddress(mac);
return true;
}
}
/* I'm afraid that we couldn't find it! Maybe it doesn't exist? */
return false;
}