mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-05 03:53:44 +02:00
Build fixes.
This commit is contained in:
parent
a1193f0e30
commit
a925e2d783
5 changed files with 44 additions and 39 deletions
|
@ -25,7 +25,6 @@
|
||||||
#else
|
#else
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <net/if_dl.h>
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
14
node/AES.cpp
14
node/AES.cpp
|
@ -468,7 +468,11 @@ void AES::GMAC::finish(uint8_t tag[16]) noexcept
|
||||||
|
|
||||||
// AES-CTR ------------------------------------------------------------------------------------------------------------
|
// AES-CTR ------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
static __attribute__((__target__("sse4,avx,avx2,vaes,avx512f"))) void p_aesCtrInnerVAES512(unsigned int &len,uint64_t &c0,uint64_t &c1,const uint8_t *&in,uint8_t *&out,const __m128i *const k) noexcept
|
#ifdef ZT_AES_AESNI
|
||||||
|
|
||||||
|
static
|
||||||
|
__attribute__((__target__("sse4,avx,avx2,vaes,avx512f")))
|
||||||
|
void p_aesCtrInnerVAES512(unsigned int &len,uint64_t &c0,uint64_t &c1,const uint8_t *&in,uint8_t *&out,const __m128i *const k) noexcept
|
||||||
{
|
{
|
||||||
const __m512i kk0 = _mm512_broadcast_i32x4(k[0]);
|
const __m512i kk0 = _mm512_broadcast_i32x4(k[0]);
|
||||||
const __m512i kk1 = _mm512_broadcast_i32x4(k[1]);
|
const __m512i kk1 = _mm512_broadcast_i32x4(k[1]);
|
||||||
|
@ -515,7 +519,9 @@ static __attribute__((__target__("sse4,avx,avx2,vaes,avx512f"))) void p_aesCtrIn
|
||||||
} while (len >= 64);
|
} while (len >= 64);
|
||||||
}
|
}
|
||||||
|
|
||||||
static __attribute__((__target__("sse4,avx,avx2,vaes"))) void p_aesCtrInnerVAES256(unsigned int &len,uint64_t &c0,uint64_t &c1,const uint8_t *&in,uint8_t *&out,const __m128i *const k) noexcept
|
static
|
||||||
|
__attribute__((__target__("sse4,avx,avx2,vaes")))
|
||||||
|
void p_aesCtrInnerVAES256(unsigned int &len,uint64_t &c0,uint64_t &c1,const uint8_t *&in,uint8_t *&out,const __m128i *const k) noexcept
|
||||||
{
|
{
|
||||||
const __m256i kk0 = _mm256_broadcastsi128_si256(k[0]);
|
const __m256i kk0 = _mm256_broadcastsi128_si256(k[0]);
|
||||||
const __m256i kk1 = _mm256_broadcastsi128_si256(k[1]);
|
const __m256i kk1 = _mm256_broadcastsi128_si256(k[1]);
|
||||||
|
@ -681,6 +687,8 @@ static void p_aesCtrInner128(unsigned int &len,uint64_t &c0,uint64_t &c1,const u
|
||||||
} while (len >= 64);
|
} while (len >= 64);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
void AES::CTR::crypt(const void *const input,unsigned int len) noexcept
|
void AES::CTR::crypt(const void *const input,unsigned int len) noexcept
|
||||||
{
|
{
|
||||||
const uint8_t *in = reinterpret_cast<const uint8_t *>(input);
|
const uint8_t *in = reinterpret_cast<const uint8_t *>(input);
|
||||||
|
@ -733,7 +741,7 @@ void AES::CTR::crypt(const void *const input,unsigned int len) noexcept
|
||||||
_len = totalLen + len;
|
_len = totalLen + len;
|
||||||
|
|
||||||
if (likely(len >= 64)) {
|
if (likely(len >= 64)) {
|
||||||
if (Utils::CPUID.vaes) { // is only true if AVX is also present
|
if (Utils::CPUID.vaes) {
|
||||||
if ((!Utils::CPUID.avx512f)||((len < 1024))) {
|
if ((!Utils::CPUID.avx512f)||((len < 1024))) {
|
||||||
p_aesCtrInnerVAES256(len,c0,c1,in,out,k);
|
p_aesCtrInnerVAES256(len,c0,c1,in,out,k);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -36,6 +36,7 @@ namespace Utils {
|
||||||
CPUIDRegisters::CPUIDRegisters() noexcept
|
CPUIDRegisters::CPUIDRegisters() noexcept
|
||||||
{
|
{
|
||||||
uint32_t eax,ebx,ecx,edx;
|
uint32_t eax,ebx,ecx,edx;
|
||||||
|
|
||||||
#ifdef __WINDOWS__
|
#ifdef __WINDOWS__
|
||||||
int regs[4];
|
int regs[4];
|
||||||
__cpuid(regs,1);
|
__cpuid(regs,1);
|
||||||
|
@ -50,11 +51,17 @@ CPUIDRegisters::CPUIDRegisters() noexcept
|
||||||
: "a"(1),"c"(0)
|
: "a"(1),"c"(0)
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rdrand = ((ecx & (1U << 30U)) != 0);
|
rdrand = ((ecx & (1U << 30U)) != 0);
|
||||||
aes = ( ((ecx & (1U << 25U)) != 0) && ((ecx & (1U << 19U)) != 0) && ((ecx & (1U << 1U)) != 0) );
|
aes = ( ((ecx & (1U << 25U)) != 0) && ((ecx & (1U << 19U)) != 0) && ((ecx & (1U << 1U)) != 0) );
|
||||||
avx = ((ecx & (1U << 25U)) != 0);
|
avx = ((ecx & (1U << 25U)) != 0);
|
||||||
|
|
||||||
#ifdef __WINDOWS__
|
#ifdef __WINDOWS__
|
||||||
TODO
|
__cpuid(regs,7);
|
||||||
|
eax = (uint32_t)regs[0];
|
||||||
|
ebx = (uint32_t)regs[1];
|
||||||
|
ecx = (uint32_t)regs[2];
|
||||||
|
edx = (uint32_t)regs[3];
|
||||||
#else
|
#else
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"cpuid"
|
"cpuid"
|
||||||
|
@ -62,6 +69,7 @@ TODO
|
||||||
: "a"(7),"c"(0)
|
: "a"(7),"c"(0)
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
vaes = aes && avx && ((ecx & (1U << 9U)) != 0);
|
vaes = aes && avx && ((ecx & (1U << 9U)) != 0);
|
||||||
vpclmulqdq = aes && avx && ((ecx & (1U << 10U)) != 0);
|
vpclmulqdq = aes && avx && ((ecx & (1U << 10U)) != 0);
|
||||||
avx2 = avx && ((ebx & (1U << 5U)) != 0);
|
avx2 = avx && ((ebx & (1U << 5U)) != 0);
|
||||||
|
|
56
node/VL1.cpp
56
node/VL1.cpp
|
@ -16,12 +16,13 @@
|
||||||
#include "Node.hpp"
|
#include "Node.hpp"
|
||||||
#include "Topology.hpp"
|
#include "Topology.hpp"
|
||||||
#include "VL2.hpp"
|
#include "VL2.hpp"
|
||||||
|
#include "AES.hpp"
|
||||||
#include "Salsa20.hpp"
|
#include "Salsa20.hpp"
|
||||||
#include "LZ4.hpp"
|
#include "LZ4.hpp"
|
||||||
#include "Poly1305.hpp"
|
#include "Poly1305.hpp"
|
||||||
|
#include "SHA512.hpp"
|
||||||
#include "Identity.hpp"
|
#include "Identity.hpp"
|
||||||
#include "SelfAwareness.hpp"
|
#include "SelfAwareness.hpp"
|
||||||
#include "SHA512.hpp"
|
|
||||||
#include "Peer.hpp"
|
#include "Peer.hpp"
|
||||||
#include "Path.hpp"
|
#include "Path.hpp"
|
||||||
#include "Expect.hpp"
|
#include "Expect.hpp"
|
||||||
|
@ -40,6 +41,7 @@ struct p_SalsaPolyCopyFunction
|
||||||
Salsa20 s20;
|
Salsa20 s20;
|
||||||
Poly1305 poly1305;
|
Poly1305 poly1305;
|
||||||
unsigned int hdrRemaining;
|
unsigned int hdrRemaining;
|
||||||
|
|
||||||
ZT_INLINE p_SalsaPolyCopyFunction(const void *salsaKey, const void *salsaIv) :
|
ZT_INLINE p_SalsaPolyCopyFunction(const void *salsaKey, const void *salsaIv) :
|
||||||
s20(salsaKey, salsaIv),
|
s20(salsaKey, salsaIv),
|
||||||
poly1305(),
|
poly1305(),
|
||||||
|
@ -69,6 +71,7 @@ struct p_PolyCopyFunction
|
||||||
{
|
{
|
||||||
Poly1305 poly1305;
|
Poly1305 poly1305;
|
||||||
unsigned int hdrRemaining;
|
unsigned int hdrRemaining;
|
||||||
|
|
||||||
ZT_INLINE p_PolyCopyFunction(const void *salsaKey, const void *salsaIv) :
|
ZT_INLINE p_PolyCopyFunction(const void *salsaKey, const void *salsaIv) :
|
||||||
poly1305(),
|
poly1305(),
|
||||||
hdrRemaining(ZT_PROTO_PACKET_ENCRYPTED_SECTION_START)
|
hdrRemaining(ZT_PROTO_PACKET_ENCRYPTED_SECTION_START)
|
||||||
|
@ -100,7 +103,7 @@ VL1::VL1(const RuntimeEnvironment *renv) :
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void VL1::onRemotePacket(void *const tPtr, const int64_t localSocket, const InetAddress &fromAddr, SharedPtr<Buf> &data, const unsigned int len)
|
void VL1::onRemotePacket(void *const tPtr, const int64_t localSocket, const InetAddress &fromAddr, SharedPtr<Buf> &data, const unsigned int len) noexcept
|
||||||
{
|
{
|
||||||
const SharedPtr<Path> path(RR->topology->path(localSocket, fromAddr));
|
const SharedPtr<Path> path(RR->topology->path(localSocket, fromAddr));
|
||||||
const int64_t now = RR->node->now();
|
const int64_t now = RR->node->now();
|
||||||
|
@ -112,18 +115,6 @@ void VL1::onRemotePacket(void *const tPtr, const int64_t localSocket, const Inet
|
||||||
// for valid data packets. This may allow the compiler to generate very slightly
|
// for valid data packets. This may allow the compiler to generate very slightly
|
||||||
// faster code for that path.
|
// faster code for that path.
|
||||||
|
|
||||||
/*
|
|
||||||
* Packet format:
|
|
||||||
* <[8] 64-bit packet ID / crypto IV>
|
|
||||||
* <[5] destination ZT address>
|
|
||||||
* <[5] source ZT address>
|
|
||||||
* <[1] outer visible flags, cipher, and hop count (bits: FFCCHHH)>
|
|
||||||
* <[8] 64-bit MAC (or trusted path ID in trusted path mode)>
|
|
||||||
* [... -- begin encryption envelope -- ...]
|
|
||||||
* <[1] inner envelope flags (MS 3 bits) and verb (LS 5 bits)>
|
|
||||||
* [... verb-specific payload ...]
|
|
||||||
*/
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (unlikely(len < ZT_PROTO_MIN_FRAGMENT_LENGTH))
|
if (unlikely(len < ZT_PROTO_MIN_FRAGMENT_LENGTH))
|
||||||
return;
|
return;
|
||||||
|
@ -132,7 +123,7 @@ void VL1::onRemotePacket(void *const tPtr, const int64_t localSocket, const Inet
|
||||||
const uint64_t packetId = Utils::loadAsIsEndian<uint64_t>(data->unsafeData + ZT_PROTO_PACKET_ID_INDEX);
|
const uint64_t packetId = Utils::loadAsIsEndian<uint64_t>(data->unsafeData + ZT_PROTO_PACKET_ID_INDEX);
|
||||||
|
|
||||||
static_assert((ZT_PROTO_PACKET_DESTINATION_INDEX + ZT_ADDRESS_LENGTH) < ZT_PROTO_MIN_FRAGMENT_LENGTH, "overflow");
|
static_assert((ZT_PROTO_PACKET_DESTINATION_INDEX + ZT_ADDRESS_LENGTH) < ZT_PROTO_MIN_FRAGMENT_LENGTH, "overflow");
|
||||||
Address destination(data->unsafeData + ZT_PROTO_PACKET_DESTINATION_INDEX);
|
const Address destination(data->unsafeData + ZT_PROTO_PACKET_DESTINATION_INDEX);
|
||||||
if (destination != RR->identity.address()) {
|
if (destination != RR->identity.address()) {
|
||||||
m_relay(tPtr, path, destination, data, len);
|
m_relay(tPtr, path, destination, data, len);
|
||||||
return;
|
return;
|
||||||
|
@ -419,7 +410,7 @@ void VL1::onRemotePacket(void *const tPtr, const int64_t localSocket, const Inet
|
||||||
// This is rate limited by virtue of the retry rate limit timer.
|
// This is rate limited by virtue of the retry rate limit timer.
|
||||||
if (pktSize <= 0)
|
if (pktSize <= 0)
|
||||||
pktSize = pktv.mergeCopy(*pkt);
|
pktSize = pktv.mergeCopy(*pkt);
|
||||||
if (pktSize >= ZT_PROTO_MIN_PACKET_LENGTH) {
|
if (likely(pktSize >= ZT_PROTO_MIN_PACKET_LENGTH)) {
|
||||||
ZT_SPEW("authentication failed or no peers match, queueing WHOIS for %s", source.toString().c_str());
|
ZT_SPEW("authentication failed or no peers match, queueing WHOIS for %s", source.toString().c_str());
|
||||||
bool sendPending;
|
bool sendPending;
|
||||||
{
|
{
|
||||||
|
@ -464,23 +455,22 @@ void VL1::m_sendPendingWhois(void *tPtr, int64_t now)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toSend.empty())
|
if (!toSend.empty()) {
|
||||||
return;
|
const SharedPtr<SymmetricKey> key(root->key());
|
||||||
|
uint8_t outp[ZT_DEFAULT_UDP_MTU - ZT_PROTO_MIN_PACKET_LENGTH];
|
||||||
const SharedPtr<SymmetricKey> key(root->key());
|
Vector<Address>::iterator a(toSend.begin());
|
||||||
uint8_t outp[ZT_DEFAULT_UDP_MTU - ZT_PROTO_MIN_PACKET_LENGTH];
|
while (a != toSend.end()) {
|
||||||
Vector<Address>::iterator a(toSend.begin());
|
const uint64_t packetId = key->nextMessage(RR->identity.address(), root->address());
|
||||||
while (a != toSend.end()) {
|
int p = Protocol::newPacket(outp, packetId, root->address(), RR->identity.address(), Protocol::VERB_WHOIS);
|
||||||
const uint64_t packetId = key->nextMessage(RR->identity.address(), root->address());
|
while ((a != toSend.end()) && (p < (sizeof(outp) - ZT_ADDRESS_LENGTH))) {
|
||||||
int p = Protocol::newPacket(outp, packetId, root->address(), RR->identity.address(), Protocol::VERB_WHOIS);
|
a->copyTo(outp + p);
|
||||||
while ((a != toSend.end()) && (p < (sizeof(outp) - ZT_ADDRESS_LENGTH))) {
|
++a;
|
||||||
a->copyTo(outp + p);
|
p += ZT_ADDRESS_LENGTH;
|
||||||
++a;
|
}
|
||||||
p += ZT_ADDRESS_LENGTH;
|
Protocol::armor(outp, p, key, root->cipher());
|
||||||
|
RR->expect->sending(packetId, now);
|
||||||
|
root->send(tPtr, now, outp, p, rootPath);
|
||||||
}
|
}
|
||||||
Protocol::armor(outp, p, key, root->cipher());
|
|
||||||
RR->expect->sending(packetId, now);
|
|
||||||
root->send(tPtr, now, outp, p, rootPath);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -708,7 +698,7 @@ bool VL1::m_OK(void *tPtr, const uint64_t packetId, const unsigned int auth, con
|
||||||
}
|
}
|
||||||
|
|
||||||
const int64_t now = RR->node->now();
|
const int64_t now = RR->node->now();
|
||||||
if (!RR->expect->expecting(inRePacketId, now)) {
|
if (unlikely(!RR->expect->expecting(inRePacketId, now))) {
|
||||||
RR->t->incomingPacketDropped(tPtr, 0x4c1f1ff8, packetId, 0, identityFromPeerPtr(peer), path->address(), 0, Protocol::VERB_OK, ZT_TRACE_PACKET_DROP_REASON_REPLY_NOT_EXPECTED);
|
RR->t->incomingPacketDropped(tPtr, 0x4c1f1ff8, packetId, 0, identityFromPeerPtr(peer), path->address(), 0, Protocol::VERB_OK, ZT_TRACE_PACKET_DROP_REASON_REPLY_NOT_EXPECTED);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ public:
|
||||||
* @param data Packet data
|
* @param data Packet data
|
||||||
* @param len Packet length
|
* @param len Packet length
|
||||||
*/
|
*/
|
||||||
void onRemotePacket(void *tPtr,int64_t localSocket,const InetAddress &fromAddr,SharedPtr<Buf> &data,unsigned int len);
|
void onRemotePacket(void *tPtr,int64_t localSocket,const InetAddress &fromAddr,SharedPtr<Buf> &data,unsigned int len) noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const RuntimeEnvironment *RR;
|
const RuntimeEnvironment *RR;
|
||||||
|
|
Loading…
Add table
Reference in a new issue