1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-20 22:49:01 +00:00

Add intf_name to the route_entry struct.

This is set to an empty string in all functions yielding routes,
particularly route_loop. The code to get the interface pertaining to a
route is different on different platforms, so must be added one by one.
The code setting the intf_name to an empty string is only tested on
Linux.
This commit is contained in:
david
2012-09-30 00:01:10 +00:00
parent bfea61a51e
commit 5bbe36af7a
5 changed files with 28 additions and 7 deletions

View File

@@ -15,6 +15,7 @@
* Routing table entry * Routing table entry
*/ */
struct route_entry { struct route_entry {
char intf_name[INTF_NAME_LEN]; /* interface name */
struct addr route_dst; /* destination address */ struct addr route_dst; /* destination address */
struct addr route_gw; /* gateway address */ struct addr route_gw; /* gateway address */
}; };

View File

@@ -212,6 +212,7 @@ route_get(route_t *r, struct route_entry *entry)
{ {
if (route_msg(r, RTM_GET, &entry->route_dst, &entry->route_gw) < 0) if (route_msg(r, RTM_GET, &entry->route_dst, &entry->route_gw) < 0)
return (-1); return (-1);
entry->intf_name[0] = '\0';
return (0); return (0);
} }
@@ -318,6 +319,8 @@ route_loop(route_t *r, route_handler callback, void *arg)
rtm = (struct rt_msghdr *)next; rtm = (struct rt_msghdr *)next;
sa = (struct sockaddr *)(rtm + 1); sa = (struct sockaddr *)(rtm + 1);
entry.intf_name[0] = '\0';
if ((rtm->rtm_addrs & RTA_DST) == 0) if ((rtm->rtm_addrs & RTA_DST) == 0)
/* Need a destination. */ /* Need a destination. */
continue; continue;
@@ -443,6 +446,8 @@ route_loop(route_t *r, route_handler callback, void *arg)
rt->ipRouteNextHop == IP_ADDR_ANY) rt->ipRouteNextHop == IP_ADDR_ANY)
continue; continue;
entry.intf_name[0] = '\0';
sin.sin_addr.s_addr = rt->ipRouteNextHop; sin.sin_addr.s_addr = rt->ipRouteNextHop;
addr_ston((struct sockaddr *)&sin, addr_ston((struct sockaddr *)&sin,
&entry.route_gw); &entry.route_gw);
@@ -535,6 +540,8 @@ route_loop(route_t *r, route_handler callback, void *arg)
memcmp(&rt->ipv6RouteNextHop, IP6_ADDR_UNSPEC, IP6_ADDR_LEN) == 0) memcmp(&rt->ipv6RouteNextHop, IP6_ADDR_UNSPEC, IP6_ADDR_LEN) == 0)
continue; continue;
entry.intf_name[0] = '\0';
sin6.sin6_addr = rt->ipv6RouteNextHop; sin6.sin6_addr = rt->ipv6RouteNextHop;
addr_ston((struct sockaddr *)&sin6, addr_ston((struct sockaddr *)&sin6,
&entry.route_gw); &entry.route_gw);
@@ -576,6 +583,7 @@ _radix_walk(int fd, struct radix_node *rn, route_handler callback, void *arg)
_kread(fd, rn, &rnode, sizeof(rnode)); _kread(fd, rn, &rnode, sizeof(rnode));
if (rnode.rn_b < 0) { if (rnode.rn_b < 0) {
if (!(rnode.rn_flags & RNF_ROOT)) { if (!(rnode.rn_flags & RNF_ROOT)) {
entry.intf_name[0] = '\0';
_kread(fd, rn, &rt, sizeof(rt)); _kread(fd, rn, &rt, sizeof(rt));
_kread(fd, rt_key(&rt), &sin, sizeof(sin)); _kread(fd, rt_key(&rt), &sin, sizeof(sin));
addr_ston((struct sockaddr *)&sin, &entry.route_dst); addr_ston((struct sockaddr *)&sin, &entry.route_dst);

View File

@@ -116,6 +116,7 @@ route_get(route_t *r, struct route_entry *entry)
errno = ESRCH; errno = ESRCH;
return (-1); return (-1);
} }
entry->intf_name[0] = '\0';
entry->route_gw.addr_type = ADDR_TYPE_IP; entry->route_gw.addr_type = ADDR_TYPE_IP;
entry->route_gw.addr_bits = IP_ADDR_BITS; entry->route_gw.addr_bits = IP_ADDR_BITS;
memcpy(&entry->route_gw.addr_ip, &rtr.rtr_gwayaddr, IP_ADDR_LEN); memcpy(&entry->route_gw.addr_ip, &rtr.rtr_gwayaddr, IP_ADDR_LEN);
@@ -147,8 +148,6 @@ route_loop(route_t *r, route_handler callback, void *arg)
} }
close_mib(fd); close_mib(fd);
entry.route_dst.addr_type = entry.route_gw.addr_type = ADDR_TYPE_IP;
entry.route_dst.addr_bits = entry.route_gw.addr_bits = IP_ADDR_BITS;
n /= sizeof(*rtentries); n /= sizeof(*rtentries);
ret = 0; ret = 0;
@@ -157,6 +156,9 @@ route_loop(route_t *r, route_handler callback, void *arg)
rtentries[i].Type != NMREMOTE) rtentries[i].Type != NMREMOTE)
continue; continue;
entry.intf_name[0] = '\0';
entry.route_dst.addr_type = entry.route_gw.addr_type = ADDR_TYPE_IP;
entry.route_dst.addr_bits = entry.route_gw.addr_bits = IP_ADDR_BITS;
entry.route_dst.addr_ip = rtentries[i].Dest; entry.route_dst.addr_ip = rtentries[i].Dest;
addr_mtob(&rtentries[i].Mask, IP_ADDR_LEN, addr_mtob(&rtentries[i].Mask, IP_ADDR_LEN,
&entry.route_dst.addr_bits); &entry.route_dst.addr_bits);

View File

@@ -194,6 +194,7 @@ route_get(route_t *r, struct route_entry *entry)
while (RTA_OK(rta, i)) { while (RTA_OK(rta, i)) {
if (rta->rta_type == RTA_GATEWAY) { if (rta->rta_type == RTA_GATEWAY) {
entry->intf_name[0] = '\0';
entry->route_gw.addr_type = entry->route_dst.addr_type; entry->route_gw.addr_type = entry->route_dst.addr_type;
memcpy(entry->route_gw.addr_data8, RTA_DATA(rta), alen); memcpy(entry->route_gw.addr_data8, RTA_DATA(rta), alen);
entry->route_gw.addr_bits = alen * 8; entry->route_gw.addr_bits = alen * 8;
@@ -228,6 +229,8 @@ route_loop(route_t *r, route_handler callback, void *arg)
if (i < 11 || !(iflags & RTF_UP)) if (i < 11 || !(iflags & RTF_UP))
continue; continue;
entry.intf_name[0] = '\0';
entry.route_dst.addr_type = entry.route_gw.addr_type = entry.route_dst.addr_type = entry.route_gw.addr_type =
ADDR_TYPE_IP; ADDR_TYPE_IP;
@@ -259,6 +262,8 @@ route_loop(route_t *r, route_handler callback, void *arg)
if (i < 21 || !(iflags & RTF_UP)) if (i < 21 || !(iflags & RTF_UP))
continue; continue;
entry.intf_name[0] = '\0';
snprintf(buf, sizeof(buf), "%s:%s:%s:%s:%s:%s:%s:%s/%d", snprintf(buf, sizeof(buf), "%s:%s:%s:%s:%s:%s:%s:%s/%d",
d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7],
dlen); dlen);

View File

@@ -115,6 +115,7 @@ route_get(route_t *route, struct route_entry *entry)
} }
addr_btom(entry->route_dst.addr_bits, &mask, IP_ADDR_LEN); addr_btom(entry->route_dst.addr_bits, &mask, IP_ADDR_LEN);
entry->intf_name[0] = '\0';
entry->route_gw.addr_type = ADDR_TYPE_IP; entry->route_gw.addr_type = ADDR_TYPE_IP;
entry->route_gw.addr_bits = IP_ADDR_BITS; entry->route_gw.addr_bits = IP_ADDR_BITS;
entry->route_gw.addr_ip = ipfrow.dwForwardNextHop; entry->route_gw.addr_ip = ipfrow.dwForwardNextHop;
@@ -139,13 +140,16 @@ route_loop_getipforwardtable(route_t *r, route_handler callback, void *arg)
else if (ret != ERROR_INSUFFICIENT_BUFFER) else if (ret != ERROR_INSUFFICIENT_BUFFER)
return (-1); return (-1);
} }
entry.route_dst.addr_type = ADDR_TYPE_IP;
entry.route_dst.addr_bits = IP_ADDR_BITS;
entry.route_gw.addr_type = ADDR_TYPE_IP;
entry.route_gw.addr_bits = IP_ADDR_BITS;
for (i = 0; i < (int)r->ipftable->dwNumEntries; i++) { for (i = 0; i < (int)r->ipftable->dwNumEntries; i++) {
entry.intf_name[0] = '\0';
entry.route_dst.addr_type = ADDR_TYPE_IP;
entry.route_dst.addr_bits = IP_ADDR_BITS;
entry.route_gw.addr_type = ADDR_TYPE_IP;
entry.route_gw.addr_bits = IP_ADDR_BITS;
entry.route_dst.addr_ip = r->ipftable->table[i].dwForwardDest; entry.route_dst.addr_ip = r->ipftable->table[i].dwForwardDest;
addr_mtob(&r->ipftable->table[i].dwForwardMask, IP_ADDR_LEN, addr_mtob(&r->ipftable->table[i].dwForwardMask, IP_ADDR_LEN,
&entry.route_dst.addr_bits); &entry.route_dst.addr_bits);
@@ -174,6 +178,7 @@ route_loop_getipforwardtable2(GETIPFORWARDTABLE2 GetIpForwardTable2,
MIB_IPFORWARD_ROW2 *row; MIB_IPFORWARD_ROW2 *row;
row = &r->ipftable2->Table[i]; row = &r->ipftable2->Table[i];
entry.intf_name[0] = '\0';
addr_ston((struct sockaddr *) &row->DestinationPrefix.Prefix, &entry.route_dst); addr_ston((struct sockaddr *) &row->DestinationPrefix.Prefix, &entry.route_dst);
entry.route_dst.addr_bits = row->DestinationPrefix.PrefixLength; entry.route_dst.addr_bits = row->DestinationPrefix.PrefixLength;
addr_ston((struct sockaddr *) &row->NextHop, &entry.route_gw); addr_ston((struct sockaddr *) &row->NextHop, &entry.route_gw);