mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-08-30 21:45:37 +00:00
[master] Fixing use of IfacePtr in iface_mgr_linux.cc and iface_mgr_sun.cc.
This is a fix after merge of #3715.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2011-2014 Internet Systems Consortium, Inc. ("ISC")
|
||||
// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
@@ -474,22 +474,22 @@ void IfaceMgr::detectIfaces() {
|
||||
// into three separate steps for easier debugging.
|
||||
const char* tmp = static_cast<const char*>(RTA_DATA(attribs_table[IFLA_IFNAME]));
|
||||
string iface_name(tmp); // <--- bogus valgrind warning here
|
||||
Iface iface = Iface(iface_name, interface_info->ifi_index);
|
||||
IfacePtr iface(new Iface(iface_name, interface_info->ifi_index));
|
||||
|
||||
iface.setHWType(interface_info->ifi_type);
|
||||
iface.setFlags(interface_info->ifi_flags);
|
||||
iface->setHWType(interface_info->ifi_type);
|
||||
iface->setFlags(interface_info->ifi_flags);
|
||||
|
||||
// Does interface have LL_ADDR?
|
||||
if (attribs_table[IFLA_ADDRESS]) {
|
||||
iface.setMac(static_cast<const uint8_t*>(RTA_DATA(attribs_table[IFLA_ADDRESS])),
|
||||
RTA_PAYLOAD(attribs_table[IFLA_ADDRESS]));
|
||||
iface->setMac(static_cast<const uint8_t*>(RTA_DATA(attribs_table[IFLA_ADDRESS])),
|
||||
RTA_PAYLOAD(attribs_table[IFLA_ADDRESS]));
|
||||
}
|
||||
else {
|
||||
// Tunnels can have no LL_ADDR. RTA_PAYLOAD doesn't check it and
|
||||
// try to dereference it in this manner
|
||||
}
|
||||
|
||||
nl.ipaddrs_get(iface, addr_info);
|
||||
nl.ipaddrs_get(*iface, addr_info);
|
||||
ifaces_.push_back(iface);
|
||||
}
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2011, 2013-2014 Internet Systems Consortium, Inc. ("ISC")
|
||||
// Copyright (C) 2011, 2013-2015 Internet Systems Consortium, Inc. ("ISC")
|
||||
//
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
@@ -39,19 +39,20 @@ namespace dhcp {
|
||||
/// only, as earlier versions did not support getifaddrs() API.
|
||||
void
|
||||
IfaceMgr::detectIfaces() {
|
||||
struct ifaddrs * iflist = 0, * ifptr = 0;
|
||||
struct ifaddrs* iflist = 0;// The whole interface list
|
||||
struct ifaddrs* ifptr = 0; // The interface we're processing now
|
||||
|
||||
// Gets list of ifaddrs struct
|
||||
if(getifaddrs(& iflist) != 0) {
|
||||
if(getifaddrs(&iflist) != 0) {
|
||||
isc_throw(Unexpected, "Network interfaces detection failed.");
|
||||
}
|
||||
|
||||
typedef std::map<string, Iface> ifaceLst;
|
||||
ifaceLst::iterator iface_iter;
|
||||
ifaceLst ifaces;
|
||||
typedef map<string, IfacePtr> IfaceLst;
|
||||
IfaceLst::iterator iface_iter;
|
||||
IfaceLst ifaces;
|
||||
|
||||
// First lookup for getting interfaces ...
|
||||
for(ifptr = iflist; ifptr != 0; ifptr = ifptr->ifa_next) {
|
||||
for (ifptr = iflist; ifptr != 0; ifptr = ifptr->ifa_next) {
|
||||
const char * ifname = ifptr->ifa_name;
|
||||
uint ifindex = 0;
|
||||
|
||||
@@ -66,53 +67,52 @@ IfaceMgr::detectIfaces() {
|
||||
continue;
|
||||
}
|
||||
|
||||
Iface iface(ifname, ifindex);
|
||||
iface.setFlags(ifptr->ifa_flags);
|
||||
ifaces.insert(pair<string, Iface>(ifname, iface));
|
||||
IfacePtr iface(new Iface(ifname, ifindex));
|
||||
iface->setFlags(ifptr->ifa_flags);
|
||||
ifaces.insert(pair<string, IfacePtr>(ifname, iface));
|
||||
}
|
||||
|
||||
// Second lookup to get MAC and IP addresses
|
||||
for (ifptr = iflist; ifptr != 0; ifptr = ifptr->ifa_next) {
|
||||
|
||||
iface_iter = ifaces.find(ifptr->ifa_name);
|
||||
if (iface_iter == ifaces.end()) {
|
||||
continue;
|
||||
}
|
||||
// Common byte pointer for following data
|
||||
const uint8_t * ptr = 0;
|
||||
if (ifptr->ifa_addr->sa_family == AF_LINK) {
|
||||
if(ifptr->ifa_addr->sa_family == AF_LINK) {
|
||||
// HWAddr
|
||||
struct sockaddr_dl * ldata =
|
||||
reinterpret_cast<struct sockaddr_dl *>(ifptr->ifa_addr);
|
||||
ptr = reinterpret_cast<uint8_t *>(LLADDR(ldata));
|
||||
|
||||
iface_iter->second.setHWType(ldata->sdl_type);
|
||||
iface_iter->second.setMac(ptr, ldata->sdl_alen);
|
||||
} else if (ifptr->ifa_addr->sa_family == AF_INET6) {
|
||||
iface_iter->second->setHWType(ldata->sdl_type);
|
||||
iface_iter->second->setMac(ptr, ldata->sdl_alen);
|
||||
} else if(ifptr->ifa_addr->sa_family == AF_INET6) {
|
||||
// IPv6 Addr
|
||||
struct sockaddr_in6 * adata =
|
||||
reinterpret_cast<struct sockaddr_in6 *>(ifptr->ifa_addr);
|
||||
ptr = reinterpret_cast<uint8_t *>(& adata->sin6_addr);
|
||||
ptr = reinterpret_cast<uint8_t *>(&adata->sin6_addr);
|
||||
|
||||
IOAddress a = IOAddress::fromBytes(AF_INET6, ptr);
|
||||
iface_iter->second.addAddress(a);
|
||||
iface_iter->second->addAddress(a);
|
||||
} else {
|
||||
// IPv4 Addr
|
||||
struct sockaddr_in * adata =
|
||||
reinterpret_cast<struct sockaddr_in *>(ifptr->ifa_addr);
|
||||
ptr = reinterpret_cast<uint8_t *>(& adata->sin_addr);
|
||||
ptr = reinterpret_cast<uint8_t *>(&adata->sin_addr);
|
||||
|
||||
IOAddress a = IOAddress::fromBytes(AF_INET, ptr);
|
||||
iface_iter->second.addAddress(a);
|
||||
iface_iter->second->addAddress(a);
|
||||
}
|
||||
}
|
||||
|
||||
freeifaddrs(iflist);
|
||||
|
||||
// Interfaces registering
|
||||
for (ifaceLst::const_iterator iface_iter = ifaces.begin();
|
||||
for(IfaceLst::const_iterator iface_iter = ifaces.begin();
|
||||
iface_iter != ifaces.end(); ++iface_iter) {
|
||||
ifaces_.push_back(iface_iter->second);
|
||||
addInterface(iface_iter->second);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user