You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2014/01/31 00:31:20 UTC

[07/12] git commit: TS-2530 - Check for loopback interfaces to avoid false multi-cycle hop detection

TS-2530 - Check for loopback interfaces to avoid false multi-cycle hop detection


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/61dbe66e
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/61dbe66e
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/61dbe66e

Branch: refs/heads/5.0.x
Commit: 61dbe66ece9dff3ab98abfc3d2463ca65bd75d3e
Parents: eb450fa
Author: Alan M. Carroll <am...@network-geographics.com>
Authored: Wed Jan 29 10:10:17 2014 -0600
Committer: Alan M. Carroll <am...@network-geographics.com>
Committed: Wed Jan 29 10:10:17 2014 -0600

----------------------------------------------------------------------
 CHANGES                 |  2 ++
 iocore/utils/Machine.cc | 20 ++++++++++++++------
 2 files changed, 16 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/61dbe66e/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 7fddf93..a45040f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,8 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache Traffic Server 4.2.0
 
+  *) [TS-2530] Check for loopback interfaces when computing the local address.
+
   *) [TS-2031] Prevent duplicate SSL SNI name registration.
    Author: Feifei Cai <ff...@yahoo-inc.com>
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/61dbe66e/iocore/utils/Machine.cc
----------------------------------------------------------------------
diff --git a/iocore/utils/Machine.cc b/iocore/utils/Machine.cc
index fdc089c..756d3a3 100644
--- a/iocore/utils/Machine.cc
+++ b/iocore/utils/Machine.cc
@@ -25,8 +25,8 @@
 #include "I_Machine.h"
 
 #if HAVE_IFADDRS_H
-#include <ifaddrs.h>
-# endif
+#  include <ifaddrs.h>
+#endif
 
 // Singleton
 Machine* Machine::_instance = NULL;
@@ -83,7 +83,6 @@ Machine::Machine(char const* the_hostname, sockaddr const* addr)
         conf.ifc_len = sizeof(req);
         conf.ifc_req = req;
         status = ioctl(s, SIOCGIFCONF, &conf);
-        close(s);
       } else {
         status = -1;
       }
@@ -105,6 +104,7 @@ Machine::Machine(char const* the_hostname, sockaddr const* addr)
         GL  // Global.
       } spot_type = NA, ip4_type = NA, ip6_type = NA;
       sockaddr const* ifip;
+      unsigned int ifflags;
       for (
 #if HAVE_IFADDRS_H
         ifaddrs* spot = ifa_addrs ; spot ; spot = spot->ifa_next
@@ -114,17 +114,22 @@ Machine::Machine(char const* the_hostname, sockaddr const* addr)
       ) {
 #if HAVE_IFADDRS_H
         ifip = spot->ifa_addr;
+        ifflags = spot->ifa_flags;
 #else
         ifip = &spot->ifr_addr;
-#endif
 
+        // get the interface's flags
+        struct ifreq ifr;
+        ink_strlcpy(ifr.ifr_name, spot->ifr_name, IFNAMSIZ);
+        if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0)   ifflags = ifr.ifr_flags;
+        else ifflags = 0; // flags not available, default to just looking at IP
+#endif
         if (!ats_is_ip(ifip)) spot_type = NA;
-        else if (ats_is_ip_loopback(ifip)) spot_type = LO;
+        else if (ats_is_ip_loopback(ifip) || (IFF_LOOPBACK & ifflags)) spot_type = LO;
         else if (ats_is_ip_linklocal(ifip)) spot_type = LL;
         else if (ats_is_ip_private(ifip)) spot_type = PR;
         else if (ats_is_ip_multicast(ifip)) spot_type = MC;
         else spot_type = GL;
-
         if (spot_type == NA) continue; // Next!
 
         if (ats_is_ip4(ifip)) {
@@ -150,6 +155,9 @@ Machine::Machine(char const* the_hostname, sockaddr const* addr)
       else
         ats_ip_copy(&ip.sa, &ip6.sa);
     }
+#if ! HAVE_IFADDRS_H
+    close(s);
+#endif
   } else { // address provided.
     ats_ip_copy(&ip, addr);
     if (ats_is_ip4(addr)) ats_ip_copy(&ip4, addr);