[netperf-dev] netperf2 commit notice r274 - trunk/src
raj at netperf.org
raj at netperf.org
Fri Mar 21 10:52:45 PDT 2008
Author: raj
Date: 2008-03-21 10:52:44 -0700 (Fri, 21 Mar 2008)
New Revision: 274
Modified:
trunk/src/netrt_rtmget.c
Log:
first check destination ip against local IPs before doing route lookup so we can report lo0 as the interface when the destionation is a local IP rather than the name of the interface to which that IP is bound
Modified: trunk/src/netrt_rtmget.c
===================================================================
--- trunk/src/netrt_rtmget.c 2008-03-20 23:20:53 UTC (rev 273)
+++ trunk/src/netrt_rtmget.c 2008-03-21 17:52:44 UTC (rev 274)
@@ -21,9 +21,8 @@
#include <sys/sockio.h>
#endif
-/* more UNP leverage */
char *
-find_egress_interface_by_addr(struct sockaddr *addr) {
+find_egress_interface_by_addr(struct sockaddr *addr, int local_ip_check) {
#ifdef HAVE_GETIFADDRS
#include <ifaddrs.h>
@@ -43,8 +42,12 @@
ret = getifaddrs(&ifap);
- if (ret < 0)
- return("ifgetaddrs");
+ if (ret < 0) {
+ if (local_ip_check)
+ return NULL;
+ else
+ return("ifgetaddrs");
+ }
temp = ifap;
while (temp) {
@@ -68,7 +71,10 @@
break;
default:
freeifaddrs(ifap);
- return strdup("BadAF");
+ if (local_ip_check)
+ return NULL;
+ else
+ return strdup("BadAF");
}
if (memcmp(addr1,addr2,cmplen) == 0) {
strcpy(temp_name,temp->ifa_name);
@@ -79,7 +85,10 @@
temp = temp->ifa_next;
}
freeifaddrs(ifap);
- return strdup("NotFound");
+ if (local_ip_check)
+ return NULL;
+ else
+ return strdup("NotFound");
#else
char *buf,*ptr;
@@ -103,15 +112,22 @@
#endif
sockfd = socket(AF_INET,SOCK_DGRAM,0);
- if (sockfd < 0)
- return strdup("socket");
-
+ if (sockfd < 0) {
+ if (local_ip_check)
+ return NULL;
+ else
+ return strdup("socket");
+ }
lastlen = 0;
len = 100 * sizeof(struct ifreq);
while (1) {
buf = malloc(len);
- if (NULL == buf)
- return strdup("malloc");
+ if (NULL == buf) {
+ if (local_ip_check)
+ return NULL;
+ else
+ return strdup("malloc");
+ }
ifc.ifc_len = len;
ifc.ifc_buf = buf;
@@ -119,7 +135,10 @@
if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {
if (errno != EINVAL || lastlen != 0) {
free(buf);
- return strdup("SIOCIFCONF");
+ if (local_ip_check)
+ return NULL;
+ else
+ return strdup("SIOCIFCONF");
}
}
else {
@@ -200,7 +219,10 @@
}
close(sockfd);
free(buf);
- return strdup("EgressByAddr");
+ if (local_ip_check)
+ return NULL;
+ else
+ return strdup("EgressByAddr");
#endif
}
@@ -258,13 +280,24 @@
struct sockaddr_in *sin;
struct sockaddr_in6 *sin6;
+ /* first, check if the destination address is a local one. if it is,
+ return "lo0" as the interface because we will ass-u-me the
+ traffic isn't leaving the host */
+ if (NULL != find_egress_interface_by_addr(dest,1)) {
+#if defined(NETPERF_STANDALONE_DEBUG)
+ printf("Destination is a local IP\n");
+#endif
+ return strdup("lo0");
+ }
+
+
sockfd = socket(AF_ROUTE, SOCK_RAW, 0);
if (sockfd < 0)
- return (strdup("socket"));
+ return strdup("socket");
buffer = calloc(1,BUFLEN);
if (NULL == buffer)
- return (strdup("calloc"));
+ return strdup("calloc");
rtm = (struct rt_msghdr *)buffer;
@@ -304,7 +337,7 @@
ret = write(sockfd,rtm,rtm->rtm_msglen);
if (ret != rtm->rtm_msglen) {
free(buffer);
- return(strdup("write"));
+ return strdup("write");
}
/* seek the reply */
@@ -347,11 +380,11 @@
#endif
if (AF_INET == sin->sin_family) {
- return find_egress_interface_by_addr((struct sockaddr *)sin);
+ return find_egress_interface_by_addr((struct sockaddr *)sin,0);
}
#if defined(AF_INET6)
else if (AF_INET6 == sin6->sin6_family) {
- return find_egress_interface_by_addr((struct sockaddr *)sin6);
+ return find_egress_interface_by_addr((struct sockaddr *)sin6,0);
}
#endif
#if defined(AF_LINK)
More information about the netperf-dev
mailing list