|
@@ -1364,7 +1364,7 @@ void parse_ifconfig(const std::string& textFile, IfaceMgr::IfaceCollection& ifac
|
|
|
// TODO: temporarily disabled, see ticket #1529
|
|
|
TEST_F(IfaceMgrTest, DISABLED_detectIfaces_linux) {
|
|
|
|
|
|
- NakedIfaceMgr* ifacemgr = new NakedIfaceMgr();
|
|
|
+ scoped_ptr<NakedIfaceMgr> ifacemgr(new NakedIfaceMgr());
|
|
|
IfaceMgr::IfaceCollection& detectedIfaces = ifacemgr->getIfacesLst();
|
|
|
|
|
|
const std::string textFile = "ifconfig.txt";
|
|
@@ -1469,13 +1469,9 @@ TEST_F(IfaceMgrTest, DISABLED_detectIfaces_linux) {
|
|
|
FAIL();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- delete ifacemgr;
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-#if defined(OS_LINUX) || defined(OS_BSD) || defined(OS_SUN)
|
|
|
-
|
|
|
#if defined(OS_BSD)
|
|
|
#include <net/if_dl.h>
|
|
|
#endif
|
|
@@ -1484,19 +1480,23 @@ TEST_F(IfaceMgrTest, DISABLED_detectIfaces_linux) {
|
|
|
#include <net/if.h>
|
|
|
#include <ifaddrs.h>
|
|
|
|
|
|
-// Checks the index of this interface
|
|
|
+/// @brief Checks the index of this interface
|
|
|
+/// @param iface Kea interface structure to be checked
|
|
|
+/// @param ifptr original structure returned by getifaddrs
|
|
|
+/// @return true if index is returned properly
|
|
|
bool
|
|
|
checkIfIndex(const Iface & iface,
|
|
|
struct ifaddrs *& ifptr) {
|
|
|
- cout << "Checks index of " << iface.getName() << endl;
|
|
|
return (iface.getIndex() == if_nametoindex(ifptr->ifa_name));
|
|
|
}
|
|
|
|
|
|
-// Checks if the interface has proper flags set
|
|
|
+/// @brief Checks if the interface has proper flags set
|
|
|
+/// @param iface Kea interface structure to be checked
|
|
|
+/// @param ifptr original structure returned by getifaddrs
|
|
|
+/// @return true if flags are set properly
|
|
|
bool
|
|
|
checkIfFlags(const Iface & iface,
|
|
|
struct ifaddrs *& ifptr) {
|
|
|
- cout << "Checks flags of " << iface.getName() << endl;
|
|
|
bool flag_loopback_ = ifptr->ifa_flags & IFF_LOOPBACK;
|
|
|
bool flag_up_ = ifptr->ifa_flags & IFF_UP;
|
|
|
bool flag_running_ = ifptr->ifa_flags & IFF_RUNNING;
|
|
@@ -1511,6 +1511,7 @@ checkIfFlags(const Iface & iface,
|
|
|
/// @brief Checks if MAC Address/IP Addresses are properly well formed
|
|
|
/// @param iface Kea interface structure to be checked
|
|
|
/// @param ifptr original structure returned by getifaddrs
|
|
|
+/// @return true if addresses are returned properly
|
|
|
bool
|
|
|
checkIfAddrs(const Iface & iface, struct ifaddrs *& ifptr) {
|
|
|
const unsigned char * p = 0;
|
|
@@ -1518,24 +1519,21 @@ checkIfAddrs(const Iface & iface, struct ifaddrs *& ifptr) {
|
|
|
// Workaround for Linux ...
|
|
|
if(ifptr->ifa_data != 0) {
|
|
|
// We avoid localhost as it has no MAC Address
|
|
|
- if(!strncmp(iface.getName().c_str(), "lo", 2)) {
|
|
|
+ if (!strncmp(iface.getName().c_str(), "lo", 2)) {
|
|
|
return (true);
|
|
|
}
|
|
|
|
|
|
- // Typically unit-tests try to be silent. But interface detection is
|
|
|
- // tricky enough to warrant additional prints.
|
|
|
- cout << "Checks MAC Addr of " << iface.getName() << endl;
|
|
|
struct ifreq ifr;
|
|
|
memset(& ifr.ifr_name, 0, sizeof ifr.ifr_name);
|
|
|
strncpy(ifr.ifr_name, iface.getName().c_str(), sizeof ifr.ifr_name);
|
|
|
|
|
|
int s = -1; // Socket descriptor
|
|
|
|
|
|
- if((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
|
|
+ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
|
|
|
isc_throw(Unexpected, "Cannot create AF_INET socket");
|
|
|
}
|
|
|
|
|
|
- if(ioctl(s, SIOCGIFHWADDR, & ifr) < 0) {
|
|
|
+ if (ioctl(s, SIOCGIFHWADDR, & ifr) < 0) {
|
|
|
close(s);
|
|
|
isc_throw(Unexpected, "Cannot set SIOCGIFHWADDR flag");
|
|
|
}
|
|
@@ -1548,15 +1546,7 @@ checkIfAddrs(const Iface & iface, struct ifaddrs *& ifptr) {
|
|
|
/// @todo: Check MAC address length. For some interfaces it is
|
|
|
/// different than 6. Some have 0, while some exotic ones (like
|
|
|
/// infiniband) have 20.
|
|
|
- int i = 0;
|
|
|
- while(i < 6) {
|
|
|
- if(* (p + i) != * (iface.getMac() + i)) {
|
|
|
- return (false);
|
|
|
- }
|
|
|
- ++ i;
|
|
|
- }
|
|
|
-
|
|
|
- return (true);
|
|
|
+ return (!memcmp(p, iface.getMac(), iface.getMacLen()));
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -1568,42 +1558,33 @@ checkIfAddrs(const Iface & iface, struct ifaddrs *& ifptr) {
|
|
|
#if defined(OS_BSD)
|
|
|
case AF_LINK: {
|
|
|
// We avoid localhost as it has no MAC Address
|
|
|
- if(!strncmp(iface.getName().c_str(), "lo", 2)) {
|
|
|
+ if (!strncmp(iface.getName().c_str(), "lo", 2)) {
|
|
|
return (true);
|
|
|
}
|
|
|
|
|
|
- cout << "Checks MAC Addr of " << iface.getName() << endl;
|
|
|
struct sockaddr_dl * hwdata =
|
|
|
reinterpret_cast<struct sockaddr_dl *>(ifptr->ifa_addr);
|
|
|
p = reinterpret_cast<uint8_t *>(LLADDR(hwdata));
|
|
|
|
|
|
// Extract MAC address length
|
|
|
- if(hwdata->sdl_alen != iface.getMacLen()) {
|
|
|
+ if (hwdata->sdl_alen != iface.getMacLen()) {
|
|
|
return (false);
|
|
|
}
|
|
|
|
|
|
- int i = 0;
|
|
|
- while(i < hwdata->sdl_alen) {
|
|
|
- if(* (p + i) != * (iface.getMac() + i)) {
|
|
|
- return (false);
|
|
|
- }
|
|
|
- ++ i;
|
|
|
- }
|
|
|
-
|
|
|
- return (true);
|
|
|
+ return (!memcmp(p, iface.getMac(), hwdata->sdl_alen));
|
|
|
}
|
|
|
#endif
|
|
|
case AF_INET: {
|
|
|
- cout << "Checks IPv4 address of " << iface.getName() << endl;
|
|
|
struct sockaddr_in * v4data =
|
|
|
reinterpret_cast<struct sockaddr_in *>(ifptr->ifa_addr);
|
|
|
p = reinterpret_cast<uint8_t *>(& v4data->sin_addr);
|
|
|
|
|
|
IOAddress addrv4 = IOAddress::fromBytes(AF_INET, p);
|
|
|
|
|
|
- for(Iface::AddressCollection::const_iterator a = iface.getAddresses().begin();
|
|
|
- a != iface.getAddresses().end(); ++ a) {
|
|
|
- if((* a).isV4() && (* a) == addrv4) {
|
|
|
+ for (Iface::AddressCollection::const_iterator a =
|
|
|
+ iface.getAddresses().begin();
|
|
|
+ a != iface.getAddresses().end(); ++ a) {
|
|
|
+ if(a->isV4() && (*a) == addrv4) {
|
|
|
return (true);
|
|
|
}
|
|
|
}
|
|
@@ -1611,16 +1592,16 @@ checkIfAddrs(const Iface & iface, struct ifaddrs *& ifptr) {
|
|
|
return (false);
|
|
|
}
|
|
|
case AF_INET6: {
|
|
|
- cout << "Checks IPv6 address of " << iface.getName() << endl;
|
|
|
struct sockaddr_in6 * v6data =
|
|
|
reinterpret_cast<struct sockaddr_in6 *>(ifptr->ifa_addr);
|
|
|
p = reinterpret_cast<uint8_t *>(& v6data->sin6_addr);
|
|
|
|
|
|
IOAddress addrv6 = IOAddress::fromBytes(AF_INET6, p);
|
|
|
|
|
|
- for(Iface::AddressCollection::const_iterator a = iface.getAddresses().begin();
|
|
|
+ for(Iface::AddressCollection::const_iterator a =
|
|
|
+ iface.getAddresses().begin();
|
|
|
a != iface.getAddresses().end(); ++ a) {
|
|
|
- if((* a).isV6() && (* a) == addrv6) {
|
|
|
+ if(a->isV6() && (*a) == addrv6) {
|
|
|
return (true);
|
|
|
}
|
|
|
}
|
|
@@ -1646,15 +1627,24 @@ TEST_F(IfaceMgrTest, detectIfaces) {
|
|
|
isc_throw(Unexpected, "Cannot detect interfaces");
|
|
|
}
|
|
|
|
|
|
- for(ifptr = iflist; ifptr != 0; ifptr = ifptr->ifa_next) {
|
|
|
- for(IfaceMgr::IfaceCollection::const_iterator i = detectedIfaces.begin();
|
|
|
+ for (ifptr = iflist; ifptr != 0; ifptr = ifptr->ifa_next) {
|
|
|
+ for (IfaceMgr::IfaceCollection::const_iterator i = detectedIfaces.begin();
|
|
|
i != detectedIfaces.end(); ++ i) {
|
|
|
- if(!strncmp(ifptr->ifa_name, (*i).getName().c_str(),
|
|
|
- (*i).getName().size())) {
|
|
|
+ if (!strncmp(ifptr->ifa_name, (*i).getName().c_str(),
|
|
|
+ (*i).getName().size())) {
|
|
|
+
|
|
|
+ // Typically unit-tests try to be silent. But interface detection
|
|
|
+ // is tricky enough to warrant additional prints.
|
|
|
+ std::cout << "Checking interface " << i->getName() << std::endl;
|
|
|
+
|
|
|
+ // Check if interface index is reported properly
|
|
|
+ EXPECT_TRUE(checkIfIndex(*i, ifptr));
|
|
|
|
|
|
- checkIfIndex(*i, ifptr);
|
|
|
- checkIfFlags(*i, ifptr);
|
|
|
- checkIfAddrs(*i, ifptr);
|
|
|
+ // Check if flags are reported properly
|
|
|
+ EXPECT_TRUE(checkIfFlags(*i, ifptr));
|
|
|
+
|
|
|
+ // Check if addresses are reported properly
|
|
|
+ EXPECT_TRUE(checkIfAddrs(*i, ifptr));
|
|
|
|
|
|
}
|
|
|
}
|
|
@@ -1665,7 +1655,6 @@ TEST_F(IfaceMgrTest, detectIfaces) {
|
|
|
|
|
|
delete ifacemgr;
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
volatile bool callback_ok;
|
|
|
|