[netperf-dev] netperf2 commit notice r265 - trunk/src

raj at netperf.org raj at netperf.org
Tue Mar 18 09:50:08 PDT 2008


Author: raj
Date: 2008-03-18 09:50:07 -0700 (Tue, 18 Mar 2008)
New Revision: 265

Modified:
   trunk/src/netrt_rtmget.c
Log:
use getifaddrs where available

Modified: trunk/src/netrt_rtmget.c
===================================================================
--- trunk/src/netrt_rtmget.c	2008-03-18 01:16:07 UTC (rev 264)
+++ trunk/src/netrt_rtmget.c	2008-03-18 16:50:07 UTC (rev 265)
@@ -20,7 +20,64 @@
 /* more UNP leverage */
 char *
 find_egress_interface_by_addr(struct sockaddr *addr) {
-  
+
+#ifdef HAVE_GETIFADDRS
+#include <ifaddrs.h>
+
+  struct ifaddrs *ifap;
+  struct ifaddrs *temp;
+  struct sockaddr_in *sin,*tsin;
+#ifdef AF_INET6
+  struct sockaddr_in6 *sin6,*tsin6;
+#endif
+  void *addr1,*addr2;
+  int ret,cmplen;
+  char temp_name[IFNAMSIZ];
+
+  sin = (struct sockaddr_in *)addr;
+  sin6 = (struct sockaddr_in6 *)sin;
+
+  ret = getifaddrs(&ifap);
+
+  if (ret < 0) 
+    return("ifgetaddrs");
+
+  temp = ifap;
+  while (temp) {
+    if ((temp->ifa_flags & IFF_UP) &&
+	(temp->ifa_addr->sa_family == sin->sin_family)) {
+      sin = (struct sockaddr_in *)temp->ifa_addr;
+      switch (temp->ifa_addr->sa_family) {
+#ifdef AF_INET6
+      case AF_INET6:
+	addr1 = &(sin6->sin6_addr);
+	tsin6 = (struct sockaddr_in6 *)(temp->ifa_addr);
+	addr2 = &(tsin6->sin6_addr);
+	cmplen = sizeof(tsin6->sin6_addr);
+	break;
+#endif
+      case AF_INET:
+	addr1 = &(sin->sin_addr.s_addr);
+	tsin = (struct sockaddr_in *)(temp->ifa_addr);
+	addr2 = &(tsin->sin_addr.s_addr);
+	cmplen = sizeof(struct in_addr);
+	break;
+      default:
+	freeifaddrs(ifap);
+	return strdup("BadAF");
+      }
+      if (memcmp(addr1,addr2,cmplen) == 0) {
+	strcpy(temp_name,temp->ifa_name);
+	freeifaddrs(ifap);
+	return strdup(temp_name);
+      }
+    }
+    temp = temp->ifa_next;
+  }
+  freeifaddrs(ifap);
+  return strdup("NotFound");
+
+#else  
   char *buf,*ptr;
   int  lastlen,len,cmplen;
   int   sockfd;
@@ -94,6 +151,10 @@
       break;
     }
 
+    printf("hello i am interface %s family %d\n",
+	   ifr->ifr_name,
+	   ifr->ifr_addr.sa_family);
+
     ptr += sizeof(ifr->ifr_name) + len;
 
     if (ifr->ifr_addr.sa_family != sin->sin_family)
@@ -122,6 +183,7 @@
   close(sockfd);
   free(buf);
   return strdup("EgressByAddr");
+#endif
 }
 
 #if defined(AF_LINK)
@@ -132,7 +194,7 @@
   char *cret;
 
 #if defined(NETPERF_STANDALONE_DEBUG)
-  printf("link index %d nlen %d alen %d slen %d\n",
+  printf("link asdf index %d nlen %d alen %d slen %d\n",
 	 link->sdl_index,
 	 link->sdl_nlen,
 	 link->sdl_alen,
@@ -253,14 +315,6 @@
      and I'm _guessing_ BSD and OSX, who are kind enough to take
      things down to an AF_LINK entry. */
 
-#if defined(NETPERF_STANDALONE_DEBUG)
-  printf("rtm_msglen %d\n",rtm->rtm_msglen);
-  printf("rtm_errno %d\n",rtm->rtm_errno);
-  printf("rtm_index %d\n",rtm->rtm_index);
-  printf("rtm_flags %x\n",rtm->rtm_flags);
-  printf("rtm_addrs %x\n",rtm->rtm_addrs);
-#endif
-
   sin = (struct sockaddr_in *)(rtm +1);
   sin = sin + 1;
   sin6 = (struct sockaddr_in6 *)sin;
@@ -269,15 +323,18 @@
   printf("address two %p family %d\n",sin,sin->sin_family);
 #endif
 
-  if (AF_INET == sin->sin_family)
+  if (AF_INET == sin->sin_family) {
     return find_egress_interface_by_addr((struct sockaddr *)sin);
+  }
 #if defined(AF_INET6)
-  else if (AF_INET6 == sin6->sin6_family)
+  else if (AF_INET6 == sin6->sin6_family) {
     return find_egress_interface_by_addr((struct sockaddr *)sin6);
+  }
 #endif
 #if defined(AF_LINK)
-  else if (AF_LINK == sin->sin_family)
+  else if (AF_LINK == sin->sin_family) {
     return find_egress_interface_by_link((struct sockaddr_dl *)sin);
+  }
 #endif
   else
     return strdup("LastHop AF");
@@ -296,6 +353,7 @@
   sin = (struct sockaddr_in *)&destination;
   sin->sin_family = AF_INET;
   sin->sin_addr.s_addr = inet_addr(argv[1]);
+  sin->sin_len = sizeof(struct sockaddr_in);
   printf("address is %s\n",inet_ntoa(sin->sin_addr));
   egress_if = find_egress_interface(NULL,(struct sockaddr *)&destination);
 



More information about the netperf-dev mailing list