commit
13eed5f528
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user