Merge pull request #275 from pstavirs/hostdev

Hostdev
This commit is contained in:
Srivats P 2019-04-11 21:38:42 +05:30 committed by GitHub
commit 13eed5f528
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 38 additions and 19 deletions

View File

@ -1,5 +1,5 @@
TEMPLATE = lib TEMPLATE = lib
CONFIG += testcase static CONFIG += testcase static no_testcase_installs
QT += widgets testlib QT += widgets testlib
SOURCES += modeltest.cpp dynamictreemodel.cpp SOURCES += modeltest.cpp dynamictreemodel.cpp
HEADERS += modeltest.h dynamictreemodel.h HEADERS += modeltest.h dynamictreemodel.h

View File

@ -38,10 +38,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include <unistd.h> #include <unistd.h>
#ifndef SA_SIZE // For some reason MacOS doesn't define this while BSD does #ifndef SA_SIZE // For some reason MacOS doesn't define this while BSD does
// And the story of how to roundup is ugly - see
// https://github.com/FRRouting/frr/blob/master/zebra/kernel_socket.c
#ifdef __APPLE__
#define ROUNDUP_TYPE int
#else
#define ROUNDUP_TYPE long
#endif
#define SA_SIZE(sa) \ #define SA_SIZE(sa) \
( (!(sa) || ((struct sockaddr *)(sa))->sa_len == 0) ? \ ( (!(sa) || ((struct sockaddr *)(sa))->sa_len == 0) ? \
sizeof(long) : \ sizeof(ROUNDUP_TYPE) : \
1 + ( (((struct sockaddr *)(sa))->sa_len - 1) | (sizeof(long) - 1) ) ) 1 + ( (((struct sockaddr *)(sa))->sa_len - 1) | (sizeof(ROUNDUP_TYPE) - 1) ) )
#endif #endif
quint32 sumUInt128(UInt128 value); quint32 sumUInt128(UInt128 value);
@ -186,11 +193,10 @@ void BsdHostDevice::getNeighbors(OstEmul::DeviceNeighborList *neighbors)
while (p < end) while (p < end)
{ {
const struct rt_msghdr *rtm = (const struct rt_msghdr*) p; const struct rt_msghdr *rtm = (const struct rt_msghdr*) p;
if (rtm->rtm_index == ifIndex_) {
const struct sockaddr_in *sin = (const struct sockaddr_in*)(rtm + 1); const struct sockaddr_in *sin = (const struct sockaddr_in*)(rtm + 1);
const struct sockaddr_dl *sdl = (const struct sockaddr_dl*) const struct sockaddr_dl *sdl = (const struct sockaddr_dl*)
((char*)sin + SA_SIZE(sin)); ((char*)sin + SA_SIZE(sin));
if (sdl->sdl_index == ifIndex_) {
OstEmul::ArpEntry *arp = neighbors->add_arp(); OstEmul::ArpEntry *arp = neighbors->add_arp();
arp->set_ip4(qFromBigEndian<quint32>(sin->sin_addr.s_addr)); arp->set_ip4(qFromBigEndian<quint32>(sin->sin_addr.s_addr));
arp->set_mac(qFromBigEndian<quint64>(LLADDR(sdl)) >> 16); arp->set_mac(qFromBigEndian<quint64>(LLADDR(sdl)) >> 16);
@ -217,16 +223,22 @@ void BsdHostDevice::getNeighbors(OstEmul::DeviceNeighborList *neighbors)
while (p < end) while (p < end)
{ {
const struct rt_msghdr *rtm = (const struct rt_msghdr*) p; const struct rt_msghdr *rtm = (const struct rt_msghdr*) p;
if (rtm->rtm_index == ifIndex_) {
const struct sockaddr_in6 *sin = (const struct sockaddr_in6*)(rtm + 1); const struct sockaddr_in6 *sin = (const struct sockaddr_in6*)(rtm + 1);
const struct sockaddr_dl *sdl = (const struct sockaddr_dl*) const struct sockaddr_dl *sdl = (const struct sockaddr_dl*)
((char*)sin + SA_SIZE(sin)); ((char*)sin + SA_SIZE(sin));
if (sdl->sdl_index == ifIndex_) {
#ifdef __KAME__
if (IN6_IS_ADDR_LINKLOCAL(&sin->sin6_addr)
|| IN6_IS_ADDR_MC_LINKLOCAL(&sin->sin6_addr)) {
// remove the embedded ifIndex in the 2nd hextet (u16)
const_cast<struct sockaddr_in6*>(sin)->sin6_addr.s6_addr[2] = 0;
const_cast<struct sockaddr_in6*>(sin)->sin6_addr.s6_addr[3] = 0;
#endif
}
OstEmul::NdpEntry *ndp = neighbors->add_ndp(); OstEmul::NdpEntry *ndp = neighbors->add_ndp();
ndp->mutable_ip6()->set_hi(qFromBigEndian<quint64>(sin->sin6_addr.s6_addr)); ndp->mutable_ip6()->set_hi(qFromBigEndian<quint64>(sin->sin6_addr.s6_addr));
ndp->mutable_ip6()->set_lo(qFromBigEndian<quint64>(sin->sin6_addr.s6_addr+8)); ndp->mutable_ip6()->set_lo(qFromBigEndian<quint64>(sin->sin6_addr.s6_addr+8));
ndp->set_mac(qFromBigEndian<quint64>(LLADDR(sdl)) >> 16); ndp->set_mac(qFromBigEndian<quint64>(LLADDR(sdl)) >> 16);
ndp->set_mac(qFromBigEndian<quint64>(LLADDR(sdl)) >> 16);
} }
p += rtm->rtm_msglen; p += rtm->rtm_msglen;
} }

View File

@ -46,10 +46,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#endif #endif
#ifndef SA_SIZE // For some reason MacOS doesn't define this while BSD does #ifndef SA_SIZE // For some reason MacOS doesn't define this while BSD does
// And the story of how to roundup is ugly - see
// https://github.com/FRRouting/frr/blob/master/zebra/kernel_socket.c
#ifdef __APPLE__
#define ROUNDUP_TYPE int
#else
#define ROUNDUP_TYPE long
#endif
#define SA_SIZE(sa) \ #define SA_SIZE(sa) \
( (!(sa) || ((struct sockaddr *)(sa))->sa_len == 0) ? \ ( (!(sa) || ((struct sockaddr *)(sa))->sa_len == 0) ? \
sizeof(long) : \ sizeof(ROUNDUP_TYPE) : \
1 + ( (((struct sockaddr *)(sa))->sa_len - 1) | (sizeof(long) - 1) ) ) 1 + ( (((struct sockaddr *)(sa))->sa_len - 1) | (sizeof(ROUNDUP_TYPE) - 1) ) )
#endif #endif
struct ifaddrs *BsdPort::addressList_{nullptr}; struct ifaddrs *BsdPort::addressList_{nullptr};
@ -240,8 +247,8 @@ void BsdPort::populateInterfaceInfo()
== UInt128(0,0)) // default route :: == UInt128(0,0)) // default route ::
{ {
sa = (struct sockaddr *)((char *)sa + SA_SIZE(sa)); sa = (struct sockaddr *)((char *)sa + SA_SIZE(sa));
gw6 = UInt128((quint8*) gw6 = UInt128((quint8*)(
((sockaddr_in6*)sa)->sin6_addr.s6_addr); // RTA_GW = 0x2 ((sockaddr_in6*)sa)->sin6_addr.s6_addr)); // RTA_GW = 0x2
} }
} }
} }

View File

@ -25,7 +25,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
#include <QHostAddress> #include <QHostAddress>
inline quint32 sumUInt128(UInt128 value) quint32 sumUInt128(UInt128 value)
{ {
quint8 *arr = value.toArray(); quint8 *arr = value.toArray();
quint32 sum = 0; quint32 sum = 0;