From e6f9ab929df19ba667441b005ae2b9771922a92c Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Thu, 6 Dec 2018 12:47:58 -0800 Subject: More speed stuff. --- make-linux.mk | 2 +- node/C25519.cpp | 15 ++++++++------- node/Multicaster.cpp | 8 +++++--- node/Multicaster.hpp | 4 ++++ 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/make-linux.mk b/make-linux.mk index 66a6376a..90ec2aac 100644 --- a/make-linux.mk +++ b/make-linux.mk @@ -319,7 +319,7 @@ official: FORCE make -j4 ZT_OFFICIAL=1 all central-controller: FORCE - make -j4 LDLIBS="-L/usr/pgsql-10/lib/ -lpq" CXXFLAGS="-I/usr/pgsql-10/include -fPIC" DEFS="-DZT_CONTROLLER_USE_LIBPQ" ZT_OFFICIAL=1 ZT_USE_X64_ASM_ED25519=1 one + make -j4 LDLIBS="-L/usr/pgsql-10/lib/ -lpq" CXXFLAGS="-I/usr/pgsql-10/include -fPIC" DEFS="-DZT_CONTROLLER_USE_LIBPQ -DZT_CONTROLLER" ZT_OFFICIAL=1 ZT_USE_X64_ASM_ED25519=1 one central-controller-docker: central-controller docker build -t gcr.io/zerotier-central/ztcentral-controller:${TIMESTAMP} -f docker/Dockerfile . diff --git a/node/C25519.cpp b/node/C25519.cpp index e3d23dee..209ac445 100644 --- a/node/C25519.cpp +++ b/node/C25519.cpp @@ -2003,6 +2003,7 @@ extern "C" void ed25519_amd64_asm_sign(const unsigned char *sk,const unsigned ch namespace ZeroTier { +#ifdef ZT_CONTROLLER struct C25519CacheKey { uint64_t messageDigest[4]; @@ -2019,6 +2020,7 @@ struct C25519CacheValue static uint64_t _ed25519TimestampCounter = 0; static Hashtable _ed25519Cache; static Mutex _ed25519CacheLock; +#endif void C25519::agree(const C25519::Private &mine,const C25519::Public &their,void *keybuf,unsigned int keylen) { @@ -2041,6 +2043,7 @@ void C25519::sign(const C25519::Private &myPrivate,const C25519::Public &myPubli unsigned char digest[64]; // we sign the first 32 bytes of SHA-512(msg) SHA512::hash(digest,msg,len); +#ifdef ZT_CONTROLLER C25519CacheKey ck; ZT_FAST_MEMCPY(ck.messageDigest,digest,32); ZT_FAST_MEMCPY(ck.publicKey,myPublic.data + 32,32); @@ -2053,6 +2056,7 @@ void C25519::sign(const C25519::Private &myPrivate,const C25519::Public &myPubli ZT_FAST_MEMCPY(signature,cv->signature,ZT_C25519_SIGNATURE_LEN); return; } +#endif #ifdef ZT_USE_FAST_X64_ED25519 ed25519_amd64_asm_sign(myPrivate.data + 32,myPublic.data + 32,digest,(unsigned char *)signature); @@ -2100,13 +2104,7 @@ void C25519::sign(const C25519::Private &myPrivate,const C25519::Public &myPubli sig[32 + i] = s[i]; #endif -/* - Hashtable< Address,SharedPtr >::Iterator i(_peers); - Address *a = (Address *)0; - SharedPtr *p = (SharedPtr *)0; - while (i.next(a,p)) - _savePeer((void *)0,*p); -*/ +#ifdef ZT_CONTROLLER C25519CacheValue cvn; memcpy(cvn.signature,signature,ZT_C25519_SIGNATURE_LEN); { @@ -2126,6 +2124,7 @@ void C25519::sign(const C25519::Private &myPrivate,const C25519::Public &myPubli cvn.timestamp = ++_ed25519TimestampCounter; _ed25519Cache.set(ck,cvn); } +#endif } bool C25519::verify(const C25519::Public &their,const void *msg,unsigned int len,const void *signature) @@ -2136,6 +2135,7 @@ bool C25519::verify(const C25519::Public &their,const void *msg,unsigned int len if (!Utils::secureEq(sig + 64,digest,32)) return false; +#ifdef ZT_CONTROLLER C25519CacheKey ck; ZT_FAST_MEMCPY(ck.messageDigest,digest,32); ZT_FAST_MEMCPY(ck.publicKey,their.data + 32,32); @@ -2147,6 +2147,7 @@ bool C25519::verify(const C25519::Public &their,const void *msg,unsigned int len if (cv) { return Utils::secureEq(cv->signature,signature,ZT_C25519_SIGNATURE_LEN); } +#endif unsigned char t2[32]; ge25519 get1, get2; diff --git a/node/Multicaster.cpp b/node/Multicaster.cpp index b2a5a205..2b5fb041 100644 --- a/node/Multicaster.cpp +++ b/node/Multicaster.cpp @@ -444,15 +444,17 @@ void Multicaster::_add(void *tPtr,int64_t now,uint64_t nwid,const MulticastGroup if (member == RR->identity.address()) return; - for(std::vector::iterator m(gs.members.begin());m!=gs.members.end();++m) { + std::vector::iterator m(std::lower_bound(gs.members.begin(),gs.members.end(),member)); + if (m != gs.members.end()) { if (m->address == member) { m->timestamp = now; return; } + gs.members.insert(m,MulticastGroupMember(member,now)); + } else { + gs.members.push_back(MulticastGroupMember(member,now)); } - gs.members.push_back(MulticastGroupMember(member,now)); - for(std::list::iterator tx(gs.txQueue.begin());tx!=gs.txQueue.end();) { if (tx->atLimit()) gs.txQueue.erase(tx++); diff --git a/node/Multicaster.hpp b/node/Multicaster.hpp index e57f81fe..c6c2a209 100644 --- a/node/Multicaster.hpp +++ b/node/Multicaster.hpp @@ -203,6 +203,10 @@ private: MulticastGroupMember() {} MulticastGroupMember(const Address &a,uint64_t ts) : address(a),timestamp(ts) {} + inline bool operator<(const Address &a) const { return (address < a); } + inline bool operator==(const Address &a) const { return (address == a); } + inline bool operator!=(const Address &a) const { return (address != a); } + Address address; uint64_t timestamp; // time of last notification }; -- cgit v1.2.3