It almost builds!

This commit is contained in:
Adam Ierymenko 2020-03-17 16:27:31 -07:00
parent cdbb86b830
commit 83f830618f
No known key found for this signature in database
GPG key ID: C8877CF2D7A5D7F3
17 changed files with 110 additions and 206 deletions

View file

@ -344,8 +344,6 @@ extern "C" ZT_GoNode *ZT_GoNode_new(const char *workingPath,uintptr_t userPtr)
goHandleTapAddedMulticastGroup(gn,(ZT_GoTap *)t->second.get(),t->first,g->mac().toInt(),g->adi()); goHandleTapAddedMulticastGroup(gn,(ZT_GoTap *)t->second.get(),t->first,g->mac().toInt(),g->adi());
for(auto g=removed.begin();g!=removed.end();++g) for(auto g=removed.begin();g!=removed.end();++g)
goHandleTapRemovedMulticastGroup(gn,(ZT_GoTap *)t->second.get(),t->first,g->mac().toInt(),g->adi()); goHandleTapRemovedMulticastGroup(gn,(ZT_GoTap *)t->second.get(),t->first,g->mac().toInt(),g->adi());
t->second->syncRoutes();
} }
} }
} }
@ -477,17 +475,26 @@ extern "C" int ZT_GoNode_phyStartListen(ZT_GoNode *gn,const char *dev,const char
gnt.thr = std::thread([udpSock,gn,&gnt] { gnt.thr = std::thread([udpSock,gn,&gnt] {
struct sockaddr_in6 in6; struct sockaddr_in6 in6;
socklen_t salen; socklen_t salen;
char buf[16384];
while (gnt.run) { while (gnt.run) {
salen = sizeof(in6); salen = sizeof(in6);
int s = (int)recvfrom(udpSock,buf,sizeof(buf),0,reinterpret_cast<struct sockaddr *>(&in6),&salen); void *buf = ZT_getBuffer();
if (s > 0) { if (buf) {
gn->node->processWirePacket(&gnt,OSUtils::now(),(int64_t)udpSock,reinterpret_cast<const struct sockaddr_storage *>(&in6),buf,(unsigned int)s,&(gn->nextBackgroundTaskDeadline)); int s = (int)recvfrom(udpSock,buf,16384,0,reinterpret_cast<struct sockaddr *>(&in6),&salen);
} else { if (s > 0) {
// If something goes bad with this socket such as its interface vanishing, it ZT_Node_processWirePacket(
// will eventually be closed by higher level (Go) code. Until then prevent the reinterpret_cast<ZT_Node *>(gn->node),
// system from consuming too much CPU. nullptr,
std::this_thread::sleep_for(std::chrono::milliseconds(10)); OSUtils::now(),
(int64_t)udpSock,
reinterpret_cast<const struct sockaddr_storage *>(&in6),
buf,
(unsigned int)s,
1,
&(gn->nextBackgroundTaskDeadline));
} else {
ZT_freeBuffer(buf);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
} }
} }
}); });
@ -523,12 +530,26 @@ extern "C" int ZT_GoNode_phyStartListen(ZT_GoNode *gn,const char *dev,const char
gnt.thr = std::thread([udpSock,gn,&gnt] { gnt.thr = std::thread([udpSock,gn,&gnt] {
struct sockaddr_in in4; struct sockaddr_in in4;
socklen_t salen; socklen_t salen;
char buf[16384];
while (gnt.run) { while (gnt.run) {
salen = sizeof(in4); salen = sizeof(in4);
int s = (int)recvfrom(udpSock,buf,sizeof(buf),0,reinterpret_cast<struct sockaddr *>(&in4),&salen); void *buf = ZT_getBuffer();
if (s > 0) { if (buf) {
gn->node->processWirePacket(&gnt,OSUtils::now(),(int64_t)udpSock,reinterpret_cast<const struct sockaddr_storage *>(&in4),buf,(unsigned int)s,&(gn->nextBackgroundTaskDeadline)); int s = (int)recvfrom(udpSock,buf,sizeof(buf),0,reinterpret_cast<struct sockaddr *>(&in4),&salen);
if (s > 0) {
ZT_Node_processWirePacket(
reinterpret_cast<ZT_Node *>(gn->node),
nullptr,
OSUtils::now(),
(int64_t)udpSock,
reinterpret_cast<const struct sockaddr_storage *>(&in4),
buf,
(unsigned int)s,
1,
&(gn->nextBackgroundTaskDeadline));
} else {
ZT_freeBuffer(buf);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
} }
} }
}); });
@ -557,8 +578,19 @@ extern "C" int ZT_GoNode_phyStopListen(ZT_GoNode *gn,const char *dev,const char
static void tapFrameHandler(void *uptr,void *tptr,uint64_t nwid,const MAC &from,const MAC &to,unsigned int etherType,unsigned int vlanId,const void *data,unsigned int len) static void tapFrameHandler(void *uptr,void *tptr,uint64_t nwid,const MAC &from,const MAC &to,unsigned int etherType,unsigned int vlanId,const void *data,unsigned int len)
{ {
ZT_GoNode *const gn = reinterpret_cast<ZT_GoNode *>(uptr); ZT_Node_processVirtualNetworkFrame(
gn->node->processVirtualNetworkFrame(tptr,OSUtils::now(),nwid,from.toInt(),to.toInt(),etherType,vlanId,data,len,&(gn->nextBackgroundTaskDeadline)); reinterpret_cast<ZT_Node *>(reinterpret_cast<ZT_GoNode *>(uptr)->node),
tptr,
OSUtils::now(),
nwid,
from.toInt(),
to.toInt(),
etherType,
vlanId,
data,
len,
0,
&(reinterpret_cast<ZT_GoNode *>(uptr)->nextBackgroundTaskDeadline));
} }
extern "C" ZT_GoTap *ZT_GoNode_join(ZT_GoNode *gn,uint64_t nwid) extern "C" ZT_GoTap *ZT_GoNode_join(ZT_GoNode *gn,uint64_t nwid)
@ -662,47 +694,3 @@ extern "C" void ZT_GoTap_setMtu(ZT_GoTap *tap,unsigned int mtu)
{ {
reinterpret_cast<EthernetTap *>(tap)->setMtu(mtu); reinterpret_cast<EthernetTap *>(tap)->setMtu(mtu);
} }
extern "C" int ZT_GoTap_addRoute(ZT_GoTap *tap,int targetAf,const void *targetIp,int targetNetmaskBits,int viaAf,const void *viaIp,unsigned int metric)
{
InetAddress target,via;
switch(targetAf) {
case AF_INET:
target.set(targetIp,4,(unsigned int)targetNetmaskBits);
break;
case AF_INET6:
target.set(targetIp,16,(unsigned int)targetNetmaskBits);
break;
}
switch(viaAf) {
case AF_INET:
via.set(viaIp,4,0);
break;
case AF_INET6:
via.set(viaIp,16,0);
break;
}
return reinterpret_cast<EthernetTap *>(tap)->addRoute(target,via,metric);
}
extern "C" int ZT_GoTap_removeRoute(ZT_GoTap *tap,int targetAf,const void *targetIp,int targetNetmaskBits,int viaAf,const void *viaIp,unsigned int metric)
{
InetAddress target,via;
switch(targetAf) {
case AF_INET:
target.set(targetIp,4,(unsigned int)targetNetmaskBits);
break;
case AF_INET6:
target.set(targetIp,16,(unsigned int)targetNetmaskBits);
break;
}
switch(viaAf) {
case AF_INET:
via.set(viaIp,4,0);
break;
case AF_INET6:
via.set(viaIp,16,0);
break;
}
return reinterpret_cast<EthernetTap *>(tap)->removeRoute(target,via,metric);
}

View file

@ -80,10 +80,6 @@ void ZT_GoTap_setFriendlyName(ZT_GoTap *tap,const char *friendlyName);
void ZT_GoTap_setMtu(ZT_GoTap *tap,unsigned int mtu); void ZT_GoTap_setMtu(ZT_GoTap *tap,unsigned int mtu);
int ZT_GoTap_addRoute(ZT_GoTap *tap,int targetAf,const void *targetIp,int targetNetmaskBits,int viaAf,const void *viaIp,unsigned int metric);
int ZT_GoTap_removeRoute(ZT_GoTap *tap,int targetAf,const void *targetIp,int targetNetmaskBits,int viaAf,const void *viaIp,unsigned int metric);
/* Core self-tests that output results to stdout and return non-zero on failure. */ /* Core self-tests that output results to stdout and return non-zero on failure. */
int ZT_TestCrypto(); int ZT_TestCrypto();
int ZT_TestIdentity(); int ZT_TestIdentity();

View file

@ -158,66 +158,6 @@ func (t *nativeTap) AddMulticastGroupChangeHandler(handler func(bool, *Multicast
t.multicastGroupHandlersLock.Unlock() t.multicastGroupHandlersLock.Unlock()
} }
// AddRoute adds or updates a managed route on this tap's interface
func (t *nativeTap) AddRoute(r *Route) error {
rc := 0
if r != nil {
var via []byte
if r.Via != nil {
via = *r.Via
}
if len(r.Target.IP) == 4 {
mask, _ := r.Target.Mask.Size()
if len(via) == 4 {
rc = int(C.ZT_GoTap_addRoute(t.tap, syscall.AF_INET, unsafe.Pointer(&r.Target.IP[0]), C.int(mask), syscall.AF_INET, unsafe.Pointer(&via[0]), C.uint(r.Metric)))
} else {
rc = int(C.ZT_GoTap_addRoute(t.tap, syscall.AF_INET, unsafe.Pointer(&r.Target.IP[0]), C.int(mask), 0, nil, C.uint(r.Metric)))
}
} else if len(r.Target.IP) == 16 {
mask, _ := r.Target.Mask.Size()
if len(via) == 16 {
rc = int(C.ZT_GoTap_addRoute(t.tap, syscall.AF_INET6, unsafe.Pointer(&r.Target.IP[0]), C.int(mask), syscall.AF_INET6, unsafe.Pointer(&via[0]), C.uint(r.Metric)))
} else {
rc = int(C.ZT_GoTap_addRoute(t.tap, syscall.AF_INET6, unsafe.Pointer(&r.Target.IP[0]), C.int(mask), 0, nil, C.uint(r.Metric)))
}
}
}
if rc != 0 {
return fmt.Errorf("tap device error adding route: %d", rc)
}
return nil
}
// RemoveRoute removes a managed route on this tap's interface
func (t *nativeTap) RemoveRoute(r *Route) error {
rc := 0
if r != nil {
var via []byte
if r.Via != nil {
via = *r.Via
}
if len(r.Target.IP) == 4 {
mask, _ := r.Target.Mask.Size()
if len(via) == 4 {
rc = int(C.ZT_GoTap_removeRoute(t.tap, syscall.AF_INET, unsafe.Pointer(&r.Target.IP[0]), C.int(mask), syscall.AF_INET, unsafe.Pointer(&(via[0])), C.uint(r.Metric)))
} else {
rc = int(C.ZT_GoTap_removeRoute(t.tap, syscall.AF_INET, unsafe.Pointer(&r.Target.IP[0]), C.int(mask), 0, nil, C.uint(r.Metric)))
}
} else if len(r.Target.IP) == 16 {
mask, _ := r.Target.Mask.Size()
if len(via) == 16 {
rc = int(C.ZT_GoTap_removeRoute(t.tap, syscall.AF_INET6, unsafe.Pointer(&r.Target.IP[0]), C.int(mask), syscall.AF_INET6, unsafe.Pointer(&via[0]), C.uint(r.Metric)))
} else {
rc = int(C.ZT_GoTap_removeRoute(t.tap, syscall.AF_INET6, unsafe.Pointer(&r.Target.IP[0]), C.int(mask), 0, nil, C.uint(r.Metric)))
}
}
}
if rc != 0 {
return fmt.Errorf("tap device error removing route: %d", rc)
}
return nil
}
func handleTapMulticastGroupChange(gn unsafe.Pointer, nwid, mac C.uint64_t, adi C.uint32_t, added bool) { func handleTapMulticastGroupChange(gn unsafe.Pointer, nwid, mac C.uint64_t, adi C.uint32_t, added bool) {
go func() { go func() {
nodesByUserPtrLock.RLock() nodesByUserPtrLock.RLock()

View file

@ -341,7 +341,7 @@ func (n *Network) updateConfig(nc *NetworkConfig, ls *NetworkLocalSettings) {
wantManagedRoutes[k] = true wantManagedRoutes[k] = true
if _, have := haveManagedRoutes[k]; !have { if _, have := haveManagedRoutes[k]; !have {
n.node.infoLog.Printf("%.16x adding managed route %s", uint64(n.id), r.String()) n.node.infoLog.Printf("%.16x adding managed route %s", uint64(n.id), r.String())
_ = n.tap.AddRoute(&r) //TODO _ = n.tap.AddRoute(&r)
} }
} }
} }
@ -349,7 +349,7 @@ func (n *Network) updateConfig(nc *NetworkConfig, ls *NetworkLocalSettings) {
for k, r := range haveManagedRoutes { for k, r := range haveManagedRoutes {
if _, want := wantManagedRoutes[k]; !want { if _, want := wantManagedRoutes[k]; !want {
n.node.infoLog.Printf("%.16x removing managed route %s", uint64(n.id), r.String()) n.node.infoLog.Printf("%.16x removing managed route %s", uint64(n.id), r.String())
_ = n.tap.RemoveRoute(r) //TODO _ = n.tap.RemoveRoute(r)
} }
} }

View file

@ -56,18 +56,6 @@ const (
NetworkTypePrivate int = C.ZT_NETWORK_TYPE_PRIVATE NetworkTypePrivate int = C.ZT_NETWORK_TYPE_PRIVATE
NetworkTypePublic int = C.ZT_NETWORK_TYPE_PUBLIC NetworkTypePublic int = C.ZT_NETWORK_TYPE_PUBLIC
// CoreVersionMajor is the major version of the ZeroTier core
CoreVersionMajor int = C.ZEROTIER_ONE_VERSION_MAJOR
// CoreVersionMinor is the minor version of the ZeroTier core
CoreVersionMinor int = C.ZEROTIER_ONE_VERSION_MINOR
// CoreVersionRevision is the revision of the ZeroTier core
CoreVersionRevision int = C.ZEROTIER_ONE_VERSION_REVISION
// CoreVersionBuild is the build version of the ZeroTier core
CoreVersionBuild int = C.ZEROTIER_ONE_VERSION_BUILD
networkConfigOpUp int = C.ZT_VIRTUAL_NETWORK_CONFIG_OPERATION_UP networkConfigOpUp int = C.ZT_VIRTUAL_NETWORK_CONFIG_OPERATION_UP
networkConfigOpUpdate int = C.ZT_VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE networkConfigOpUpdate int = C.ZT_VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE
@ -82,8 +70,22 @@ var (
nodesByUserPtr = make(map[uintptr]*Node) nodesByUserPtr = make(map[uintptr]*Node)
nodesByUserPtrCtr = uintptr(0) nodesByUserPtrCtr = uintptr(0)
nodesByUserPtrLock sync.RWMutex nodesByUserPtrLock sync.RWMutex
CoreVersionMajor int
CoreVersionMinor int
CoreVersionRevision int
CoreVersionBuild int
) )
func init() {
var vMaj,vMin,vRev,vBuild C.int
C.ZT_version(&vMaj,&vMin,&vRev,&vBuild)
CoreVersionMajor = int(vMaj)
CoreVersionMinor = int(vMin)
CoreVersionRevision = int(vRev)
CoreVersionBuild = int(vBuild)
}
// Node is an instance of a virtual port on the global switch. // Node is an instance of a virtual port on the global switch.
type Node struct { type Node struct {
// networks contains networks we have joined, and networksByMAC by their local MAC address // networks contains networks we have joined, and networksByMAC by their local MAC address

View file

@ -46,10 +46,4 @@ type Tap interface {
// AddMulticastGroupChangeHandler registers a function to be called on multicast group subscribe or unsubscribe (first argument) // AddMulticastGroupChangeHandler registers a function to be called on multicast group subscribe or unsubscribe (first argument)
AddMulticastGroupChangeHandler(func(bool, *MulticastGroup)) AddMulticastGroupChangeHandler(func(bool, *MulticastGroup))
// AddRoute adds a route to this tap device via the system or other routing table
AddRoute(r *Route) error
// RemoveRoute removes a route from this tap device
RemoveRoute(r *Route) error
} }

View file

@ -2203,8 +2203,9 @@ ZT_SDK_API void ZT_Identity_delete(ZT_Identity *id);
* @param major Result: major version * @param major Result: major version
* @param minor Result: minor version * @param minor Result: minor version
* @param revision Result: revision * @param revision Result: revision
* @param build Result: build number
*/ */
ZT_SDK_API void ZT_version(int *major,int *minor,int *revision); ZT_SDK_API void ZT_version(int *major,int *minor,int *revision,int *build);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -1073,7 +1073,7 @@ enum ZT_ResultCode ZT_Node_setPhysicalPathConfiguration(ZT_Node *node,const stru
} }
} }
void ZT_version(int *major,int *minor,int *revision) void ZT_version(int *major,int *minor,int *revision,int *build)
{ {
if (major) if (major)
*major = ZEROTIER_VERSION_MAJOR; *major = ZEROTIER_VERSION_MAJOR;
@ -1081,6 +1081,8 @@ void ZT_version(int *major,int *minor,int *revision)
*minor = ZEROTIER_VERSION_MINOR; *minor = ZEROTIER_VERSION_MINOR;
if (revision) if (revision)
*revision = ZEROTIER_VERSION_REVISION; *revision = ZEROTIER_VERSION_REVISION;
if (build)
*build = ZEROTIER_VERSION_BUILD;
} }
} // extern "C" } // extern "C"

View file

@ -17,9 +17,9 @@
#ifndef ZT_OS_HPP #ifndef ZT_OS_HPP
#define ZT_OS_HPP #define ZT_OS_HPP
#include <cstdint> #include <stdint.h>
#include <cstdlib> #include <stdlib.h>
#include <cstring> #include <string.h>
#if defined(_WIN32) || defined(_WIN64) #if defined(_WIN32) || defined(_WIN64)
#ifdef _MSC_VER #ifdef _MSC_VER
@ -40,10 +40,22 @@
#include <sys/param.h> #include <sys/param.h>
#endif #endif
#ifdef SOCKET
#define ZT_SOCKET SOCKET
#else
#define ZT_SOCKET int
#endif
#ifdef INVALID_SOCKET
#define ZT_INVALID_SOCKET INVALID_SOCKET
#else
#define ZT_INVALID_SOCKET (-1)
#endif
#if !defined(__GNUC__) && (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1) || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2) || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || defined(__INTEL_COMPILER) || defined(__clang__)) #if !defined(__GNUC__) && (defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1) || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2) || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) || defined(__INTEL_COMPILER) || defined(__clang__))
#define __GNUC__ 3 #define __GNUC__ 3
#endif #endif
#ifdef __cplusplus
#if __cplusplus > 199711L #if __cplusplus > 199711L
#include <atomic> #include <atomic>
#ifndef __CPP11__ #ifndef __CPP11__
@ -58,6 +70,7 @@
#define constexpr ZT_INLINE #define constexpr ZT_INLINE
#define noexcept throw() #define noexcept throw()
#endif #endif
#endif
#ifdef __GNUC__ #ifdef __GNUC__
#ifndef ZT_DEBUG #ifndef ZT_DEBUG

View file

@ -4,7 +4,6 @@ project(zt_osdep)
set(src set(src
Arp.cpp Arp.cpp
EthernetTap.cpp EthernetTap.cpp
ManagedRoute.cpp
NeighborDiscovery.cpp NeighborDiscovery.cpp
OSUtils.cpp OSUtils.cpp
) )
@ -13,7 +12,6 @@ set(headers
Arp.hpp Arp.hpp
BlockingQueue.hpp BlockingQueue.hpp
EthernetTap.hpp EthernetTap.hpp
ManagedRoute.hpp
OSUtils.hpp OSUtils.hpp
Thread.hpp Thread.hpp
) )

View file

@ -18,7 +18,6 @@
#include "../node/MAC.hpp" #include "../node/MAC.hpp"
#include "../node/InetAddress.hpp" #include "../node/InetAddress.hpp"
#include "../node/MulticastGroup.hpp" #include "../node/MulticastGroup.hpp"
#include "ManagedRoute.hpp"
#include <string> #include <string>
#include <memory> #include <memory>
@ -57,35 +56,6 @@ public:
virtual void setFriendlyName(const char *friendlyName) = 0; virtual void setFriendlyName(const char *friendlyName) = 0;
virtual void scanMulticastGroups(std::vector<MulticastGroup> &added,std::vector<MulticastGroup> &removed) = 0; virtual void scanMulticastGroups(std::vector<MulticastGroup> &added,std::vector<MulticastGroup> &removed) = 0;
virtual void setMtu(unsigned int mtu) = 0; virtual void setMtu(unsigned int mtu) = 0;
ZT_INLINE int addRoute(const InetAddress &target,const InetAddress &via,const unsigned int metric)
{
const std::string dn(this->routingDeviceName());
const char *const dnp = (dn.length() > 0) ? dn.c_str() : (const char *)0;
std::lock_guard<std::mutex> l(_managedRoutes_l);
_managedRoutes[std::pair<InetAddress,unsigned int>(target,metric)] = std::shared_ptr<ManagedRoute>(new ManagedRoute(target,via,dnp));
return 0;
}
ZT_INLINE int removeRoute(const InetAddress &target,const InetAddress &via,const unsigned int metric)
{
std::lock_guard<std::mutex> l(_managedRoutes_l);
_managedRoutes.erase(std::pair<InetAddress,unsigned int>(target,metric));
return 0;
}
ZT_INLINE int syncRoutes()
{
std::lock_guard<std::mutex> l(_managedRoutes_l);
for(auto r=_managedRoutes.begin();r!=_managedRoutes.end();++r) {
r->second->sync();
}
return 0;
}
private:
std::map< std::pair<InetAddress,unsigned int>,std::shared_ptr<ManagedRoute> > _managedRoutes;
std::mutex _managedRoutes_l;
}; };
} // namespace ZeroTier } // namespace ZeroTier

View file

@ -227,7 +227,7 @@ bool MacEthernetTap::addIp(const InetAddress &ip)
std::string cmd; std::string cmd;
cmd.push_back((char)ZT_MACETHERNETTAPAGENT_STDIN_CMD_IFCONFIG); cmd.push_back((char)ZT_MACETHERNETTAPAGENT_STDIN_CMD_IFCONFIG);
cmd.append((ip.ss_family == AF_INET6) ? "inet6" : "inet"); cmd.append((ip.family() == AF_INET6) ? "inet6" : "inet");
cmd.push_back(0); cmd.push_back(0);
cmd.append(ip.toString(tmp)); cmd.append(ip.toString(tmp));
cmd.push_back(0); cmd.push_back(0);
@ -252,7 +252,7 @@ bool MacEthernetTap::removeIp(const InetAddress &ip)
std::string cmd; std::string cmd;
cmd.push_back((char)ZT_MACETHERNETTAPAGENT_STDIN_CMD_IFCONFIG); cmd.push_back((char)ZT_MACETHERNETTAPAGENT_STDIN_CMD_IFCONFIG);
cmd.append((ip.ss_family == AF_INET6) ? "inet6" : "inet"); cmd.append((ip.family() == AF_INET6) ? "inet6" : "inet");
cmd.push_back(0); cmd.push_back(0);
cmd.append(ip.toString(tmp)); cmd.append(ip.toString(tmp));
cmd.push_back(0); cmd.push_back(0);
@ -307,8 +307,8 @@ void MacEthernetTap::put(const MAC &from,const MAC &to,unsigned int etherType,co
uint16_t l; uint16_t l;
if ((_agentStdin > 0)&&(len <= _mtu)&&(_enabled)) { if ((_agentStdin > 0)&&(len <= _mtu)&&(_enabled)) {
hdr[0] = ZT_MACETHERNETTAPAGENT_STDIN_CMD_PACKET; hdr[0] = ZT_MACETHERNETTAPAGENT_STDIN_CMD_PACKET;
to.copyTo(hdr + 1,6); to.copyTo(hdr + 1);
from.copyTo(hdr + 7,6); from.copyTo(hdr + 7);
hdr[13] = (unsigned char)((etherType >> 8) & 0xff); hdr[13] = (unsigned char)((etherType >> 8) & 0xff);
hdr[14] = (unsigned char)(etherType & 0xff); hdr[14] = (unsigned char)(etherType & 0xff);
l = (uint16_t)(len + 15); l = (uint16_t)(len + 15);
@ -339,7 +339,7 @@ void MacEthernetTap::scanMulticastGroups(std::vector<MulticastGroup> &added,std:
struct sockaddr_dl *in = (struct sockaddr_dl *)p->ifma_name; struct sockaddr_dl *in = (struct sockaddr_dl *)p->ifma_name;
struct sockaddr_dl *la = (struct sockaddr_dl *)p->ifma_addr; struct sockaddr_dl *la = (struct sockaddr_dl *)p->ifma_addr;
if ((la->sdl_alen == 6)&&(in->sdl_nlen <= _dev.length())&&(!memcmp(_dev.data(),in->sdl_data,in->sdl_nlen))) if ((la->sdl_alen == 6)&&(in->sdl_nlen <= _dev.length())&&(!memcmp(_dev.data(),in->sdl_data,in->sdl_nlen)))
newGroups.push_back(MulticastGroup(MAC(la->sdl_data + la->sdl_nlen,6),0)); newGroups.push_back(MulticastGroup(MAC((uint8_t *)(la->sdl_data + la->sdl_nlen)),0));
} }
p = p->ifma_next; p = p->ifma_next;
} }
@ -423,8 +423,8 @@ void MacEthernetTap::threadMain()
char *msg = agentReadBuf + 2; char *msg = agentReadBuf + 2;
if ((len > 14)&&(_enabled)) { if ((len > 14)&&(_enabled)) {
to.setTo(msg,6); to.setTo((uint8_t *)msg);
from.setTo(msg + 6,6); from.setTo((uint8_t *)(msg + 6));
_handler(_arg,(void *)0,_nwid,from,to,ntohs(((const uint16_t *)msg)[6]),0,(const void *)(msg + 14),(unsigned int)len - 14); _handler(_arg,(void *)0,_nwid,from,to,ntohs(((const uint16_t *)msg)[6]),0,(const void *)(msg + 14),(unsigned int)len - 14);
} }

View file

@ -487,7 +487,7 @@ bool MacKextEthernetTap::addIp(const InetAddress &ip)
long cpid = (long)vfork(); long cpid = (long)vfork();
if (cpid == 0) { if (cpid == 0) {
char tmp[128]; char tmp[128];
::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),(ip.ss_family == AF_INET6) ? "inet6" : "inet",ip.toString(tmp),"alias",(const char *)0); ::execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),(ip.family() == AF_INET6) ? "inet6" : "inet",ip.toString(tmp),"alias",(const char *)0);
::_exit(-1); ::_exit(-1);
} else if (cpid > 0) { } else if (cpid > 0) {
int exitcode = -1; int exitcode = -1;
@ -508,7 +508,7 @@ bool MacKextEthernetTap::removeIp(const InetAddress &ip)
long cpid = (long)vfork(); long cpid = (long)vfork();
if (cpid == 0) { if (cpid == 0) {
char tmp[128]; char tmp[128];
execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),(ip.ss_family == AF_INET6) ? "inet6" : "inet",ip.toIpString(tmp),"-alias",(const char *)0); execl("/sbin/ifconfig","/sbin/ifconfig",_dev.c_str(),(ip.family() == AF_INET6) ? "inet6" : "inet",ip.toIpString(tmp),"-alias",(const char *)0);
_exit(-1); _exit(-1);
} else if (cpid > 0) { } else if (cpid > 0) {
int exitcode = -1; int exitcode = -1;
@ -562,8 +562,8 @@ void MacKextEthernetTap::put(const MAC &from,const MAC &to,unsigned int etherTyp
{ {
char putBuf[ZT_MAX_MTU + 64]; char putBuf[ZT_MAX_MTU + 64];
if ((_fd > 0)&&(len <= _mtu)&&(_enabled)) { if ((_fd > 0)&&(len <= _mtu)&&(_enabled)) {
to.copyTo(putBuf,6); to.copyTo((uint8_t *)putBuf);
from.copyTo(putBuf + 6,6); from.copyTo((uint8_t *)(putBuf + 6));
*((uint16_t *)(putBuf + 12)) = htons((uint16_t)etherType); *((uint16_t *)(putBuf + 12)) = htons((uint16_t)etherType);
memcpy(putBuf + 14,data,len); memcpy(putBuf + 14,data,len);
len += 14; len += 14;
@ -592,7 +592,7 @@ void MacKextEthernetTap::scanMulticastGroups(std::vector<MulticastGroup> &added,
struct sockaddr_dl *in = (struct sockaddr_dl *)p->ifma_name; struct sockaddr_dl *in = (struct sockaddr_dl *)p->ifma_name;
struct sockaddr_dl *la = (struct sockaddr_dl *)p->ifma_addr; struct sockaddr_dl *la = (struct sockaddr_dl *)p->ifma_addr;
if ((la->sdl_alen == 6)&&(in->sdl_nlen <= _dev.length())&&(!memcmp(_dev.data(),in->sdl_data,in->sdl_nlen))) if ((la->sdl_alen == 6)&&(in->sdl_nlen <= _dev.length())&&(!memcmp(_dev.data(),in->sdl_data,in->sdl_nlen)))
newGroups.push_back(MulticastGroup(MAC(la->sdl_data + la->sdl_nlen,6),0)); newGroups.push_back(MulticastGroup(MAC((uint8_t *)(la->sdl_data + la->sdl_nlen)),0));
} }
p = p->ifma_next; p = p->ifma_next;
} }
@ -673,8 +673,8 @@ void MacKextEthernetTap::threadMain()
r = _mtu + 14; r = _mtu + 14;
if (_enabled) { if (_enabled) {
to.setTo(getBuf,6); to.setTo((uint8_t *)getBuf);
from.setTo(getBuf + 6,6); from.setTo((uint8_t *)(getBuf + 6));
unsigned int etherType = ntohs(((const uint16_t *)getBuf)[6]); unsigned int etherType = ntohs(((const uint16_t *)getBuf)[6]);
// TODO: VLAN support // TODO: VLAN support
_handler(_arg,(void *)0,_nwid,from,to,etherType,0,(const void *)(getBuf + 14),r - 14); _handler(_arg,(void *)0,_nwid,from,to,etherType,0,(const void *)(getBuf + 14),r - 14);

View file

@ -124,7 +124,7 @@ struct _neighbor_advertisement {
memset(target, 0, sizeof(target)); memset(target, 0, sizeof(target));
} }
void calculateChecksum(const sockaddr_storage &sourceIp, const sockaddr_storage &destIp) { void calculateChecksum(const sockaddr_storage &sourceIp, const InetAddress &destIp) {
_pseudo_header ph; _pseudo_header ph;
memset(&ph, 0, sizeof(_pseudo_header)); memset(&ph, 0, sizeof(_pseudo_header));
const sockaddr_in6 *src = (const sockaddr_in6*)&sourceIp; const sockaddr_in6 *src = (const sockaddr_in6*)&sourceIp;
@ -180,7 +180,7 @@ sockaddr_storage NeighborDiscovery::processIncomingND(const uint8_t *nd, unsigne
// assert(sizeof(_neighbor_advertisement) == 32); // assert(sizeof(_neighbor_advertisement) == 32);
const uint64_t now = OSUtils::now(); const uint64_t now = OSUtils::now();
sockaddr_storage ip = {0}; InetAddress ip;
if (len >= sizeof(_neighbor_solicitation) && nd[0] == 0x87) { if (len >= sizeof(_neighbor_solicitation) && nd[0] == 0x87) {
// respond to Neighbor Solicitation request for local address // respond to Neighbor Solicitation request for local address
@ -190,12 +190,12 @@ sockaddr_storage NeighborDiscovery::processIncomingND(const uint8_t *nd, unsigne
_NDEntry *targetEntry = _cache.get(targetAddress); _NDEntry *targetEntry = _cache.get(targetAddress);
if (targetEntry && targetEntry->local) { if (targetEntry && targetEntry->local) {
_neighbor_advertisement adv; _neighbor_advertisement adv;
targetEntry->mac.copyTo(adv.option.mac, 6); targetEntry->mac.copyTo(adv.option.mac);
memcpy(adv.target, solicitation.target, 16); memcpy(adv.target, solicitation.target, 16);
adv.calculateChecksum(localIp, targetAddress); adv.calculateChecksum(localIp, targetAddress);
memcpy(response, &adv, sizeof(_neighbor_advertisement)); memcpy(response, &adv, sizeof(_neighbor_advertisement));
responseLen = sizeof(_neighbor_advertisement); responseLen = sizeof(_neighbor_advertisement);
responseDest.setTo(solicitation.option.mac, 6); responseDest.setTo(solicitation.option.mac);
} }
} else if (len >= sizeof(_neighbor_advertisement) && nd[0] == 0x88) { } else if (len >= sizeof(_neighbor_advertisement) && nd[0] == 0x88) {
_neighbor_advertisement adv; _neighbor_advertisement adv;
@ -204,7 +204,7 @@ sockaddr_storage NeighborDiscovery::processIncomingND(const uint8_t *nd, unsigne
_NDEntry *queryEntry = _cache.get(responseAddress); _NDEntry *queryEntry = _cache.get(responseAddress);
if(queryEntry && !queryEntry->local && (now - queryEntry->lastQuerySent <= ZT_ND_QUERY_MAX_TTL)) { if(queryEntry && !queryEntry->local && (now - queryEntry->lastQuerySent <= ZT_ND_QUERY_MAX_TTL)) {
queryEntry->lastResponseReceived = now; queryEntry->lastResponseReceived = now;
queryEntry->mac.setTo(adv.option.mac, 6); queryEntry->mac.setTo(adv.option.mac);
ip = responseAddress; ip = responseAddress;
} }
} }
@ -212,8 +212,8 @@ sockaddr_storage NeighborDiscovery::processIncomingND(const uint8_t *nd, unsigne
if ((now - _lastCleaned) >= ZT_ND_EXPIRE) { if ((now - _lastCleaned) >= ZT_ND_EXPIRE) {
_lastCleaned = now; _lastCleaned = now;
Hashtable<InetAddress, _NDEntry>::Iterator i(_cache); Hashtable<InetAddress, _NDEntry>::Iterator i(_cache);
InetAddress *k = NULL; InetAddress *k = nullptr;
_NDEntry *v = NULL; _NDEntry *v = nullptr;
while (i.next(k, v)) { while (i.next(k, v)) {
if(!v->local && (now - v->lastResponseReceived) >= ZT_ND_EXPIRE) { if(!v->local && (now - v->lastResponseReceived) >= ZT_ND_EXPIRE) {
_cache.erase(*k); _cache.erase(*k);
@ -221,7 +221,7 @@ sockaddr_storage NeighborDiscovery::processIncomingND(const uint8_t *nd, unsigne
} }
} }
return ip; return *reinterpret_cast<sockaddr_storage *>(&ip);
} }
MAC NeighborDiscovery::query(const MAC &localMac, const sockaddr_storage &localIp, const sockaddr_storage &targetIp, uint8_t *query, unsigned int &queryLen, MAC &queryDest) MAC NeighborDiscovery::query(const MAC &localMac, const sockaddr_storage &localIp, const sockaddr_storage &targetIp, uint8_t *query, unsigned int &queryLen, MAC &queryDest)
@ -241,7 +241,7 @@ MAC NeighborDiscovery::query(const MAC &localMac, const sockaddr_storage &localI
_neighbor_solicitation ns; _neighbor_solicitation ns;
memcpy(ns.target, targetAddress.rawIpData(), 16); memcpy(ns.target, targetAddress.rawIpData(), 16);
localMac.copyTo(ns.option.mac, 6); localMac.copyTo(ns.option.mac);
ns.calculateChecksum(localIp, targetIp); ns.calculateChecksum(localIp, targetIp);
if (e.mac) { if (e.mac) {
queryDest = e.mac; queryDest = e.mac;

View file

@ -352,7 +352,7 @@ uint64_t OSUtils::jsonInt(const nlohmann::json &jv,const uint64_t dfl)
return (uint64_t)jv; return (uint64_t)jv;
} else if (jv.is_string()) { } else if (jv.is_string()) {
std::string s = jv; std::string s = jv;
return Utils::strToU64(s.c_str()); return (uint64_t)strtoull(s.c_str(),nullptr,10);
} else if (jv.is_boolean()) { } else if (jv.is_boolean()) {
return ((bool)jv ? 1ULL : 0ULL); return ((bool)jv ? 1ULL : 0ULL);
} }