Merge branch 'dev' into dev-low-bandwidth

This commit is contained in:
Joseph Henry 2022-12-05 13:26:57 -08:00
commit 4100615cd6
18 changed files with 178 additions and 2714 deletions

View File

@ -1,50 +1,7 @@
local registry = "084037375216.dkr.ecr.us-east-2.amazonaws.com";
local targets = [ local targets = [
// { "os": "linux", "name": "sid", "isas": [ "386", "armv7", "amd64", "arm64", "mips64le", "ppc64le", "s390x", "riscv64" ], "events": [ "push", "tag", "custom" ] },
// Render these into .drone.yaml by running "make drone"
//
{ "os": "linux", "name": "el9", "isas": [ "amd64", "arm64", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "el8", "isas": [ "amd64", "arm64", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "el7", "isas": [ "amd64", "ppc64le"], "events": [ "tag" ] },
{ "os": "linux", "name": "el6", "isas": [ "amd64" ], "events": [ "tag" ] },
{ "os": "linux", "name": "amzn2", "isas": [ "amd64", "arm64" ], "events": [ "tag" ] },
{ "os": "linux", "name": "fc37", "isas": [ "amd64", "arm64", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "fc36", "isas": [ "amd64", "arm64", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "fc35", "isas": [ "amd64", "arm64", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "jammy", "isas": [ "amd64", "arm64", "armv7", "riscv64", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "focal", "isas": [ "amd64", "arm64", "armv7", "riscv64", "ppc64le" ], "events": [ "tag" ] },
{ "os": "linux", "name": "bionic", "isas": [ "amd64", "arm64", "386", "ppc64le", "s390x" ], "events": ["tag" ] },
{ "os": "linux", "name": "xenial", "isas": [ "amd64", "arm64", "386" ], "events": [ "tag" ] },
{ "os": "linux", "name": "sid", "isas": [ "386", "amd64", "arm64", "riscv64", "mips64le", "ppc64le", "s390x" ], "events": [ "push", "tag" ] },
{ "os": "linux", "name": "bookworm", "isas": [ "amd64", "arm64", "armv7", "386", "mips64le", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "bullseye", "isas": [ "amd64", "arm64", "armv7", "386", "mips64le", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "buster", "isas": [ "amd64", "arm64", "armv7", "386", "mips64le", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "stretch", "isas": [ "amd64", "arm64", "386" ], "events": [ "tag" ] },
// { "os": "windows", "name": "win2k19", "isas": [ "amd64" ], "events": ["push", "tag" ] }
];
local master_targets = [
//
// Render these into .drone.yaml by running "make drone"
//
{ "os": "linux", "name": "el9", "isas": [ "amd64", "arm64", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "el8", "isas": [ "amd64", "arm64", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "el7", "isas": [ "amd64", "ppc64le"], "events": [ "tag" ] },
{ "os": "linux", "name": "el6", "isas": [ "amd64" ], "events": [ "tag" ] },
{ "os": "linux", "name": "amzn2", "isas": [ "amd64", "arm64" ], "events": [ "tag" ] },
{ "os": "linux", "name": "fc37", "isas": [ "amd64", "arm64", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "fc36", "isas": [ "amd64", "arm64", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "fc35", "isas": [ "amd64", "arm64", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "jammy", "isas": [ "amd64", "arm64", "armv7", "riscv64", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "focal", "isas": [ "amd64", "arm64", "armv7", "riscv64", "ppc64le" ], "events": [ "tag" ] },
{ "os": "linux", "name": "bionic", "isas": [ "amd64", "arm64", "386", "ppc64le", "s390x" ], "events": ["tag" ] },
{ "os": "linux", "name": "xenial", "isas": [ "amd64", "arm64", "386" ], "events": [ "tag" ] },
{ "os": "linux", "name": "sid", "isas": [ "386", "amd64", "arm64", "riscv64", "mips64le", "ppc64le", "s390x" ], "events": [ "push", "tag" ] },
{ "os": "linux", "name": "bookworm", "isas": [ "amd64", "arm64", "armv7", "386", "mips64le", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "bullseye", "isas": [ "amd64", "arm64", "armv7", "386", "mips64le", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "buster", "isas": [ "amd64", "arm64", "armv7", "386", "mips64le", "ppc64le", "s390x" ], "events": [ "tag" ] },
{ "os": "linux", "name": "stretch", "isas": [ "amd64", "arm64", "386" ], "events": [ "tag" ] },
// { "os": "windows", "name": "win2k19", "isas": [ "amd64" ], "events": ["push", "tag" ] }
]; ];
local Build(platform, os, isa, events) = { local Build(platform, os, isa, events) = {
@ -56,27 +13,18 @@ local Build(platform, os, isa, events) = {
"steps": [ "steps": [
{ {
"name": "build", "name": "build",
"image": "registry.sean.farm/honda-builder", "image": registry + "/honda-builder",
"commands": [ "./ci/scripts/build.sh " + platform + " " + isa + " " + "100.0.0+${DRONE_COMMIT_SHA:0:8}" + " " + "${DRONE_BUILD_EVENT}" ] "commands": [
}, "aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin " + registry,
{ "./ci/scripts/build.sh " + platform + " " + isa + " " + "100.0.0+${DRONE_COMMIT_SHA:0:8}" + " " + "${DRONE_BUILD_EVENT}"
"name": "list", ]
"image": "registry.sean.farm/honda-builder",
"commands": [ "ls -la " + platform ]
}, },
// { // {
// "name": "notify-mattermost", // "name": "list",
// "image": "registry.sean.farm/mattermost-notify", // "image": registry + "/honda-builder",
// "environment": { // "commands": [ "ls -la " + platform ]
// "token": { "from_secret": "mattermost-token" }, // },
// "host": { "from_secret": "mattermost-host" },
// "channel": { "from_secret": "mattermost-channel" },
// "maxRetry": 3,
// },
// "when": { "status": [ "failure" ] }
// }
], ],
"image_pull_secrets": [ "dockerconfigjson" ],
[ if isa == "arm64" || isa == "armv7" then "platform" ]: { os: os, arch: "arm64" }, [ if isa == "arm64" || isa == "armv7" then "platform" ]: { os: os, arch: "arm64" },
"trigger": { "event": events } "trigger": { "event": events }
}; };

2565
.drone.yml

File diff suppressed because it is too large Load Diff

View File

@ -32,7 +32,7 @@ Note that releases are coming few and far between because most of our dev effort
# 2022-04-25 -- Version 1.8.9 # 2022-04-25 -- Version 1.8.9
* Fixed a long-standing and strange bug that was causing sporadic "phantom" packet authentication failures. Not a security problem but could be behind spordaic reports of link failures under some conditions. * Fixed a long-standing and strange bug that was causing sporadic "phantom" packet authentication failures. Not a security problem but could be behind sporadic reports of link failures under some conditions.
* Fized a memory leak in SSO/OIDC support. * Fized a memory leak in SSO/OIDC support.
* Fixed SSO/OIDC display error on CLI. * Fixed SSO/OIDC display error on CLI.
* Fixed a bug causing nodes to sometimes fail to push certs to each other (primarily affects SSO/OIDC use cases). * Fixed a bug causing nodes to sometimes fail to push certs to each other (primarily affects SSO/OIDC use cases).

View File

@ -1,5 +1,5 @@
ARG PLATFORM ARG PLATFORM
FROM registry.sean.farm/${PLATFORM}-builder as stage FROM 084037375216.dkr.ecr.us-east-2.amazonaws.com/${PLATFORM}-builder as stage
WORKDIR /work/build WORKDIR /work/build
COPY . . COPY . .
RUN make debian RUN make debian

5
ci/Dockerfile.none Normal file
View File

@ -0,0 +1,5 @@
ARG PLATFORM
FROM 084037375216.dkr.ecr.us-east-2.amazonaws.com/${PLATFORM}-builder as stage
WORKDIR /work
COPY . .
RUN make

View File

@ -1,5 +1,5 @@
ARG PLATFORM ARG PLATFORM
FROM registry.sean.farm/${PLATFORM}-builder as stage FROM 084037375216.dkr.ecr.us-east-2.amazonaws.com/${PLATFORM}-builder as stage
WORKDIR /root/rpmbuild/BUILD WORKDIR /root/rpmbuild/BUILD
COPY . . COPY . .
RUN make redhat RUN make redhat

View File

@ -8,6 +8,9 @@ export VERSION=$3
export EVENT=$4 export EVENT=$4
case $PLATFORM in case $PLATFORM in
sid)
export PKGFMT=none
;;
el*|fc*|amzn*) el*|fc*|amzn*)
export PKGFMT=rpm export PKGFMT=rpm
;; ;;
@ -15,22 +18,21 @@ case $PLATFORM in
export PKGFMT=deb export PKGFMT=deb
esac esac
# OSX #
# x86_64-apple-darwin # Allow user to drop in custom Dockerfile for PLATFORM
# aarch64-apple-darwin #
# Windows if [ -f "ci/Dockerfile.${PLATFORM}" ]; then
# x86_64-pc-windows-msvc export DOCKERFILE="ci/Dockerfile.${PLATFORM}"
# i686-pc-windows-msvc else
# aarch64-pc-windows-msvc export DOCKERFILE="ci/Dockerfile.${PKGFMT}"
fi
# Linux #
# i686-unknown-linux-gnu # Rust sometimes gets confused about where it's running.
# x86_64-unknown-linux-gnu # Normally, the build images will have Rust pre-baked.
# arm-unknown-linux-gnueabi ? # Pass RUST_TRIPLET for convenience when using a custom Dockerfile
# arm-unknown-linux-gnueabihf ? #
# armv7-unknown-linux-gnueabihf
#
case $ZT_ISA in case $ZT_ISA in
386) 386)
@ -41,13 +43,9 @@ case $ZT_ISA in
export DOCKER_ARCH=amd64 export DOCKER_ARCH=amd64
export RUST_TRIPLET=x86_64-unknown-linux-gnu export RUST_TRIPLET=x86_64-unknown-linux-gnu
;; ;;
armv6) armv7)
export DOCKER_ARCH=arm/v6
export RUST_TRIPLET=arm-unknown-linux-gnueabi
;;
armv7)
export DOCKER_ARCH=arm/v7 export DOCKER_ARCH=arm/v7
export RUST_TRIPLET=arm-unknown-linux-gnueabihf export RUST_TRIPLET=armv7-unknown-linux-gnueabihf
;; ;;
arm64) arm64)
export DOCKER_ARCH=arm64/v8 export DOCKER_ARCH=arm64/v8
@ -60,7 +58,7 @@ case $ZT_ISA in
ppc64le) ppc64le)
export DOCKER_ARCH=ppc64le export DOCKER_ARCH=ppc64le
export RUST_TRIPLET=powerpc64le-unknown-linux-gnu export RUST_TRIPLET=powerpc64le-unknown-linux-gnu
;; ;;
mips64le) mips64le)
export DOCKER_ARCH=mips64le export DOCKER_ARCH=mips64le
export RUST_TRIPLET=mips64el-unknown-linux-gnuabi64 export RUST_TRIPLET=mips64el-unknown-linux-gnuabi64
@ -69,17 +67,15 @@ case $ZT_ISA in
export DOCKER_ARCH=s390x export DOCKER_ARCH=s390x
export RUST_TRIPLET=s390x-unknown-linux-gnu export RUST_TRIPLET=s390x-unknown-linux-gnu
;; ;;
*) *)
echo "ERROR: could not determine architecture settings. PLEASE FIX ME" echo "ERROR: could not determine architecture settings. PLEASE FIX ME"
exit 1 exit 1
;; ;;
esac esac
if [ -f "ci/Dockerfile.${PLATFORM}" ]; then #
export DOCKERFILE="ci/Dockerfile.${PLATFORM}" # Print debug info
else #
export DOCKERFILE="ci/Dockerfile.${PKGFMT}"
fi
echo "#~~~~~~~~~~~~~~~~~~~~" echo "#~~~~~~~~~~~~~~~~~~~~"
echo "$0 variables:" echo "$0 variables:"
@ -94,23 +90,37 @@ echo "PWD: ${PWD}"
echo "DOCKERFILE: ${DOCKERFILE}" echo "DOCKERFILE: ${DOCKERFILE}"
echo "#~~~~~~~~~~~~~~~~~~~~" echo "#~~~~~~~~~~~~~~~~~~~~"
if [ ${EVENT} == "push" ]; then #
make munge_rpm zerotier-one.spec VERSION=${VERSION} # Munge RPM and Deb
make munge_deb debian/changelog VERSION=${VERSION} #
if [ ${PKGFMT} != "none" ] && [ ${EVENT} != "tag" ]; then
make munge_rpm zerotier-one.spec VERSION=${VERSION}
make munge_deb debian/changelog VERSION=${VERSION}
fi fi
export DOCKER_BUILDKIT=1 #
docker run --privileged --rm tonistiigi/binfmt --install all # Assemble buildx arguments
#
# docker pull --platform linux/${DOCKER_ARCH} registry.sean.farm/${PLATFORM}-builder build_args=(
--no-cache
--build-arg PLATFORM=${PLATFORM}
--build-arg RUST_TRIPLET=${RUST_TRIPLET}
--build-arg DOCKER_ARCH=${DOCKER_ARCH}
--platform linux/${DOCKER_ARCH}
-f ${DOCKERFILE}
-t build
.
)
docker buildx build \ if [ ${PKGFMT} != "none" ]; then
--build-arg PLATFORM="${PLATFORM}" \ build_args+=("--output type=local,dest=.")
--build-arg RUST_TRIPLET="${RUST_TRIPLET}" \ build_args+=("--target export")
--build-arg DOCKER_ARCH="${DOCKER_ARCH}" \ fi
--platform linux/${DOCKER_ARCH} \
-f ${DOCKERFILE} \ #
-t build \ # Do build
. \ #
--output type=local,dest=. \
--target export docker buildx build ${build_args[@]}

View File

@ -1208,7 +1208,7 @@ typedef struct
bool ssoEnabled; bool ssoEnabled;
/** /**
* SSO verison * SSO version
*/ */
uint64_t ssoVersion; uint64_t ssoVersion;
@ -2066,7 +2066,7 @@ ZT_SDK_API int ZT_Node_sendUserMessage(ZT_Node *node,void *tptr,uint64_t dest,ui
* NetworkConfigMaster base class in node/. No type checking is performed, * NetworkConfigMaster base class in node/. No type checking is performed,
* so a pointer to anything else will result in a crash. * so a pointer to anything else will result in a crash.
* *
* @param node ZertTier One node * @param node ZeroTier One node
* @param networkConfigMasterInstance Instance of NetworkConfigMaster C++ class or NULL to disable * @param networkConfigMasterInstance Instance of NetworkConfigMaster C++ class or NULL to disable
* @return OK (0) or error code if a fatal error condition has occurred * @return OK (0) or error code if a fatal error condition has occurred
*/ */

View File

@ -5,7 +5,7 @@ ZeroTier One SDK - Android JNI Wrapper
Building Building
----- -----
Reqires: Requires:
* JDK * JDK
* ANT * ANT

View File

@ -1,66 +0,0 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ZeroTierOneJNI
LOCAL_C_INCLUDES := \
$(ZT1)/include \
$(ZT1)/node \
$(ZT1)/osdep
LOCAL_LDLIBS := -llog
# LOCAL_CFLAGS := -g
APP_UNIFIED_HEADERS := true
LOCAL_CFLAGS := -DZT_USE_MINIUPNPC
ifeq ($(TARGET_ARCH_ABI),x86_64)
LOCAL_CXXFLAGS := -maes -mpclmul -msse3 -msse4.1
endif
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
LOCAL_ARM_NEON := true
LOCAL_CXXFLAGS := -march=armv8-a+crypto -mfloat-abi=softfp -mfpu=neon -maes -isystem $NDK/sysroot/usr/include/$TRIPLE
endif
# ZeroTierOne SDK source files
LOCAL_SRC_FILES := \
$(ZT1)/node/AES.cpp \
$(ZT1)/node/AES_aesni.cpp \
$(ZT1)/node/AES_armcrypto.cpp \
$(ZT1)/node/Bond.cpp \
$(ZT1)/node/C25519.cpp \
$(ZT1)/node/Capability.cpp \
$(ZT1)/node/CertificateOfMembership.cpp \
$(ZT1)/node/CertificateOfOwnership.cpp \
$(ZT1)/node/Identity.cpp \
$(ZT1)/node/IncomingPacket.cpp \
$(ZT1)/node/InetAddress.cpp \
$(ZT1)/node/Membership.cpp \
$(ZT1)/node/Multicaster.cpp \
$(ZT1)/node/Network.cpp \
$(ZT1)/node/NetworkConfig.cpp \
$(ZT1)/node/Node.cpp \
$(ZT1)/node/OutboundMulticast.cpp \
$(ZT1)/node/Packet.cpp \
$(ZT1)/node/Path.cpp \
$(ZT1)/node/Peer.cpp \
$(ZT1)/node/Poly1305.cpp \
$(ZT1)/node/Revocation.cpp \
$(ZT1)/node/Salsa20.cpp \
$(ZT1)/node/SelfAwareness.cpp \
$(ZT1)/node/SHA512.cpp \
$(ZT1)/node/Switch.cpp \
$(ZT1)/node/Tag.cpp \
$(ZT1)/node/Topology.cpp \
$(ZT1)/node/Trace.cpp \
$(ZT1)/node/Utils.cpp \
$(ZT1)/osdep/OSUtils.cpp
# JNI Files
LOCAL_SRC_FILES += \
com_zerotierone_sdk_Node.cpp \
ZT_jniarray.cpp \
ZT_jniutils.cpp \
ZT_jnilookup.cpp
include $(BUILD_SHARED_LIBRARY)

View File

@ -1,5 +0,0 @@
# NDK_TOOLCHAIN_VERSION := clang3.5
APP_STL := c++_static
APP_CPPFLAGS := -Wall -fstack-protector -fexceptions -fno-strict-aliasing -frtti -Wno-deprecated-register -DZT_NO_TYPE_PUNNING=1 -DZT_SSO_SUPPORTED=0 -DOMIT_JSON_SUPPORT=1
APP_PLATFORM := android-21
APP_ABI := all

View File

@ -573,7 +573,26 @@ namespace {
return true; return true;
} }
struct sockaddr_storage nullAddress = {0}; //
// was:
// struct sockaddr_storage nullAddress = {0};
//
// but was getting this warning:
// warning: suggest braces around initialization of subobject
//
// when building ZeroTierOne
//
struct sockaddr_storage nullAddress;
//
// It is possible to assume knowledge about internals of sockaddr_storage and construct
// correct 0-initializer, but it is simpler to just treat sockaddr_storage as opaque and
// use memset here to fill with 0
//
// This is also done in InetAddress.hpp for InetAddress
//
memset(&nullAddress, 0, sizeof(sockaddr_storage));
jobject remoteAddressObj = NULL; jobject remoteAddressObj = NULL;
if(memcmp(remoteAddress, &nullAddress, sizeof(sockaddr_storage)) != 0) if(memcmp(remoteAddress, &nullAddress, sizeof(sockaddr_storage)) != 0)

View File

@ -18,6 +18,7 @@
#include <cmath> #include <cmath>
#include <cstdio> #include <cstdio>
#include <string> #include <string>
#include <cinttypes> // for PRId64, etc. macros
namespace ZeroTier { namespace ZeroTier {
@ -546,7 +547,7 @@ int32_t Bond::generateQoSPacket(int pathIdx, int64_t now, char* qosBuffer)
std::map<uint64_t, uint64_t>::iterator it = _paths[pathIdx].qosStatsIn.begin(); std::map<uint64_t, uint64_t>::iterator it = _paths[pathIdx].qosStatsIn.begin();
int i = 0; int i = 0;
int numRecords = std::min(_paths[pathIdx].packetsReceivedSinceLastQoS, ZT_QOS_TABLE_SIZE); int numRecords = std::min(_paths[pathIdx].packetsReceivedSinceLastQoS, ZT_QOS_TABLE_SIZE);
// debug("numRecords=%3d, packetsReceivedSinceLastQoS=%3d, _paths[pathIdx].qosStatsIn.size()=%3lu", numRecords, _paths[pathIdx].packetsReceivedSinceLastQoS, _paths[pathIdx].qosStatsIn.size()); // debug("numRecords=%3d, packetsReceivedSinceLastQoS=%3d, _paths[pathIdx].qosStatsIn.size()=%3zu", numRecords, _paths[pathIdx].packetsReceivedSinceLastQoS, _paths[pathIdx].qosStatsIn.size());
while (i < numRecords && it != _paths[pathIdx].qosStatsIn.end()) { while (i < numRecords && it != _paths[pathIdx].qosStatsIn.end()) {
uint64_t id = it->first; uint64_t id = it->first;
memcpy(qosBuffer, &id, sizeof(uint64_t)); memcpy(qosBuffer, &id, sizeof(uint64_t));
@ -582,7 +583,7 @@ bool Bond::assignFlowToBondedPath(SharedPtr<Flow>& flow, int64_t now, bool reass
int nextBestQualIdx = ZT_MAX_PEER_NETWORK_PATHS; int nextBestQualIdx = ZT_MAX_PEER_NETWORK_PATHS;
if (reassign) { if (reassign) {
log("attempting to re-assign out-flow %04x previously on idx %d (%u / %lu flows)", flow->id, flow->assignedPath, _paths[_realIdxMap[flow->assignedPath]].assignedFlowCount, _flows.size()); log("attempting to re-assign out-flow %04x previously on idx %d (%u / %zu flows)", flow->id, flow->assignedPath, _paths[_realIdxMap[flow->assignedPath]].assignedFlowCount, _flows.size());
} }
else { else {
debug("attempting to assign flow for the first time"); debug("attempting to assign flow for the first time");
@ -607,7 +608,7 @@ bool Bond::assignFlowToBondedPath(SharedPtr<Flow>& flow, int64_t now, bool reass
continue; continue;
} }
if (! _paths[_realIdxMap[bondedIdx]].shouldAvoid && randomLinkCapacity <= _paths[_realIdxMap[bondedIdx]].relativeLinkCapacity) { if (! _paths[_realIdxMap[bondedIdx]].shouldAvoid && randomLinkCapacity <= _paths[_realIdxMap[bondedIdx]].relativeLinkCapacity) {
// debug(" assign out-flow %04x to link %s (%u / %lu flows)", flow->id, pathToStr(_paths[_realIdxMap[bondedIdx]].p).c_str(), _paths[_realIdxMap[bondedIdx]].assignedFlowCount, _flows.size()); // debug(" assign out-flow %04x to link %s (%u / %zu flows)", flow->id, pathToStr(_paths[_realIdxMap[bondedIdx]].p).c_str(), _paths[_realIdxMap[bondedIdx]].assignedFlowCount, _flows.size());
break; // Acceptable -- No violation of quality spec break; // Acceptable -- No violation of quality spec
} }
if (_paths[_realIdxMap[bondedIdx]].relativeQuality > bestQuality) { if (_paths[_realIdxMap[bondedIdx]].relativeQuality > bestQuality) {
@ -636,7 +637,7 @@ bool Bond::assignFlowToBondedPath(SharedPtr<Flow>& flow, int64_t now, bool reass
} }
flow->assignPath(_abPathIdx, now); flow->assignPath(_abPathIdx, now);
} }
log("assign out-flow %04x to link %s (%u / %lu flows)", flow->id, pathToStr(_paths[flow->assignedPath].p).c_str(), _paths[flow->assignedPath].assignedFlowCount, _flows.size()); log("assign out-flow %04x to link %s (%u / %zu flows)", flow->id, pathToStr(_paths[flow->assignedPath].p).c_str(), _paths[flow->assignedPath].assignedFlowCount, _flows.size());
return true; return true;
} }
@ -660,7 +661,7 @@ SharedPtr<Bond::Flow> Bond::createFlow(int pathIdx, int32_t flowId, unsigned cha
if (pathIdx != ZT_MAX_PEER_NETWORK_PATHS) { if (pathIdx != ZT_MAX_PEER_NETWORK_PATHS) {
flow->assignPath(pathIdx, now); flow->assignPath(pathIdx, now);
_paths[pathIdx].assignedFlowCount++; _paths[pathIdx].assignedFlowCount++;
debug("assign in-flow %04x to link %s (%u / %lu)", flow->id, pathToStr(_paths[pathIdx].p).c_str(), _paths[pathIdx].assignedFlowCount, _flows.size()); debug("assign in-flow %04x to link %s (%u / %zu)", flow->id, pathToStr(_paths[pathIdx].p).c_str(), _paths[pathIdx].assignedFlowCount, _flows.size());
} }
/** /**
* Add a flow when no path was provided. This means that it is an outgoing packet * Add a flow when no path was provided. This means that it is an outgoing packet
@ -680,7 +681,7 @@ void Bond::forgetFlowsWhenNecessary(uint64_t age, bool oldest, int64_t now)
if (age) { // Remove by specific age if (age) { // Remove by specific age
while (it != _flows.end()) { while (it != _flows.end()) {
if (it->second->age(now) > age) { if (it->second->age(now) > age) {
debug("forget flow %04x (age %llu) (%u / %lu)", it->first, (unsigned long long)it->second->age(now), _paths[it->second->assignedPath].assignedFlowCount, (_flows.size() - 1)); debug("forget flow %04x (age %" PRId64 ") (%u / %zu)", it->first, it->second->age(now), _paths[it->second->assignedPath].assignedFlowCount, (_flows.size() - 1));
_paths[it->second->assignedPath].assignedFlowCount--; _paths[it->second->assignedPath].assignedFlowCount--;
it = _flows.erase(it); it = _flows.erase(it);
} }
@ -699,7 +700,7 @@ void Bond::forgetFlowsWhenNecessary(uint64_t age, bool oldest, int64_t now)
++it; ++it;
} }
if (oldestFlow != _flows.end()) { if (oldestFlow != _flows.end()) {
debug("forget oldest flow %04x (age %llu) (total flows: %lu)", oldestFlow->first, (unsigned long long)oldestFlow->second->age(now), (unsigned long)(_flows.size() - 1)); debug("forget oldest flow %04x (age %" PRId64 ") (total flows: %zu)", oldestFlow->first, oldestFlow->second->age(now), _flows.size() - 1);
_paths[oldestFlow->second->assignedPath].assignedFlowCount--; _paths[oldestFlow->second->assignedPath].assignedFlowCount--;
_flows.erase(oldestFlow); _flows.erase(oldestFlow);
} }
@ -824,7 +825,7 @@ void Bond::sendACK(void* tPtr, int pathIdx, int64_t localSocket, const InetAddre
bytesToAck += it->second; bytesToAck += it->second;
++it; ++it;
} }
debug("sending ACK of %d bytes on path %s (table size = %d)", bytesToAck, pathToStr(_paths[pathIdx].p).c_str(), _paths[pathIdx].ackStatsIn.size()); debug("sending ACK of %d bytes on path %s (table size = %zu)", bytesToAck, pathToStr(_paths[pathIdx].p).c_str(), _paths[pathIdx].ackStatsIn.size());
outp.append<uint32_t>(bytesToAck); outp.append<uint32_t>(bytesToAck);
if (atAddress) { if (atAddress) {
outp.armor(_peer->key(), false, _peer->aesKeysIfSupported()); outp.armor(_peer->key(), false, _peer->aesKeysIfSupported());
@ -1919,7 +1920,7 @@ std::string Bond::pathToStr(const SharedPtr<Path>& path)
SharedPtr<Link> link = getLink(path); SharedPtr<Link> link = getLink(path);
if (link) { if (link) {
std::string ifnameStr = std::string(link->ifname()); std::string ifnameStr = std::string(link->ifname());
snprintf(fullPathStr, 384, "%.16llx-%s/%s", (unsigned long long)(path->localSocket()), ifnameStr.c_str(), pathStr); snprintf(fullPathStr, 384, "%.16" PRIx64 "-%s/%s", path->localSocket(), ifnameStr.c_str(), pathStr);
return std::string(fullPathStr); return std::string(fullPathStr);
} }
} }
@ -1935,11 +1936,11 @@ void Bond::dumpPathStatus(int64_t now, int pathIdx)
std::string aliveOrDead = _paths[pathIdx].alive ? std::string("alive") : std::string("dead"); std::string aliveOrDead = _paths[pathIdx].alive ? std::string("alive") : std::string("dead");
std::string eligibleOrNot = _paths[pathIdx].eligible ? std::string("eligible") : std::string("ineligible"); std::string eligibleOrNot = _paths[pathIdx].eligible ? std::string("eligible") : std::string("ineligible");
std::string bondedOrNot = _paths[pathIdx].bonded ? std::string("bonded") : std::string("unbonded"); std::string bondedOrNot = _paths[pathIdx].bonded ? std::string("bonded") : std::string("unbonded");
log("path[%2u] --- %5s (in %7lld, out: %7lld), %10s, %8s, flows=%-6u lat=%-8.3f pdv=%-7.3f err=%-6.4f loss=%-6.4f qual=%-6.4f --- (%s) spare=%d", log("path[%2u] --- %5s (in %7" PRId64 ", out: %7" PRId64 "), %10s, %8s, flows=%-6u lat=%-8.3f pdv=%-7.3f err=%-6.4f loss=%-6.4f qual=%-6.4f --- (%s) spare=%d",
pathIdx, pathIdx,
aliveOrDead.c_str(), aliveOrDead.c_str(),
static_cast<long long int>(_paths[pathIdx].p->age(now)), _paths[pathIdx].p->age(now),
static_cast<long long int>(_paths[pathIdx].p->_lastOut == 0 ? 0 : now - _paths[pathIdx].p->_lastOut), _paths[pathIdx].p->_lastOut == 0 ? static_cast<int64_t>(0) : now - _paths[pathIdx].p->_lastOut,
eligibleOrNot.c_str(), eligibleOrNot.c_str(),
bondedOrNot.c_str(), bondedOrNot.c_str(),
_paths[pathIdx].assignedFlowCount, _paths[pathIdx].assignedFlowCount,
@ -1963,13 +1964,13 @@ void Bond::dumpInfo(int64_t now, bool force)
_lastSummaryDump = now; _lastSummaryDump = now;
float overhead = (_overheadBytes / (timeSinceLastDump / 1000.0f) / 1000.0f); float overhead = (_overheadBytes / (timeSinceLastDump / 1000.0f) / 1000.0f);
_overheadBytes = 0; _overheadBytes = 0;
log("bond: bp=%d, fi=%d, mi=%d, ud=%d, dd=%d, flows=%lu, leaf=%d, overhead=%f KB/s, links=(%d/%d)", log("bond: bp=%d, fi=%" PRIu64 ", mi=%d, ud=%d, dd=%d, flows=%zu, leaf=%d, overhead=%f KB/s, links=(%d/%d)",
_policy, _policy,
_failoverInterval, _failoverInterval,
_monitorInterval, _monitorInterval,
_upDelay, _upDelay,
_downDelay, _downDelay,
(unsigned long)_flows.size(), _flows.size(),
_isLeaf, _isLeaf,
overhead, overhead,
_numAliveLinks, _numAliveLinks,

View File

@ -194,7 +194,7 @@ public:
*/ */
inline unsigned int preferenceRank() const inline unsigned int preferenceRank() const
{ {
// This causes us to rank paths in order of IP scope rank (see InetAdddress.hpp) but // This causes us to rank paths in order of IP scope rank (see InetAddress.hpp) but
// within each IP scope class to prefer IPv6 over IPv4. // within each IP scope class to prefer IPv6 over IPv4.
return ( ((unsigned int)_ipScope << 1) | (unsigned int)(_addr.ss_family == AF_INET6) ); return ( ((unsigned int)_ipScope << 1) | (unsigned int)(_addr.ss_family == AF_INET6) );
} }

View File

@ -313,6 +313,13 @@ class Binder {
#else #else
const bool gotViaProc = false; const bool gotViaProc = false;
#endif #endif
//
// prevent:
// warning: unused variable 'gotViaProc'
//
(void)gotViaProc;
#if ! (defined(ZT_SDK) || defined(__ANDROID__)) // getifaddrs() freeifaddrs() not available on Android #if ! (defined(ZT_SDK) || defined(__ANDROID__)) // getifaddrs() freeifaddrs() not available on Android
if (! gotViaProc) { if (! gotViaProc) {
struct ifaddrs* ifatbl = (struct ifaddrs*)0; struct ifaddrs* ifatbl = (struct ifaddrs*)0;

View File

@ -43,6 +43,10 @@
#include "OSUtils.hpp" #include "OSUtils.hpp"
#ifdef __GCC__
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
namespace ZeroTier { namespace ZeroTier {
unsigned int OSUtils::ztsnprintf(char *buf,unsigned int len,const char *fmt,...) unsigned int OSUtils::ztsnprintf(char *buf,unsigned int len,const char *fmt,...)

View File

@ -667,7 +667,7 @@ static int testPacket()
std::cout << "(compressed: " << complen << ", decompressed: " << a.size() << ") "; std::cout << "(compressed: " << complen << ", decompressed: " << a.size() << ") ";
if (a != b) { if (a != b) {
std::cout << "FAIL (compresssion)" << std::endl; std::cout << "FAIL (compression)" << std::endl;
return -1; return -1;
} }

View File

@ -1401,7 +1401,7 @@ public:
/* Note: this is kind of restricted in what it'll take. It does not support /* Note: this is kind of restricted in what it'll take. It does not support
* URL encoding, and /'s in URL args will screw it up. But the only URL args * URL encoding, and /'s in URL args will screw it up. But the only URL args
* it really uses in ?jsonp=funcionName, and otherwise it just takes simple * it really uses in ?jsonp=functionName, and otherwise it just takes simple
* paths to simply-named resources. */ * paths to simply-named resources. */
if (!ps.empty()) { if (!ps.empty()) {
std::size_t qpos = ps[ps.size() - 1].find('?'); std::size_t qpos = ps[ps.size() - 1].find('?');
@ -2112,7 +2112,7 @@ public:
// bondingPolicy cannot be used with allowTcpFallbackRelay // bondingPolicy cannot be used with allowTcpFallbackRelay
_allowTcpFallbackRelay = OSUtils::jsonBool(settings["allowTcpFallbackRelay"],true); _allowTcpFallbackRelay = OSUtils::jsonBool(settings["allowTcpFallbackRelay"],true);
#ifdef ZT_TCP_FALLBACK_RELAY #ifdef ZT_TCP_FALLBACK_RELAY
_fallbackRelayAddress = InetAddress(OSUtils::jsonString("tcpFallbackRelay", ZT_TCP_FALLBACK_RELAY).c_str()); _fallbackRelayAddress = InetAddress(OSUtils::jsonString(settings["tcpFallbackRelay"], ZT_TCP_FALLBACK_RELAY).c_str());
#endif #endif
_primaryPort = (unsigned int)OSUtils::jsonInt(settings["primaryPort"],(uint64_t)_primaryPort) & 0xffff; _primaryPort = (unsigned int)OSUtils::jsonInt(settings["primaryPort"],(uint64_t)_primaryPort) & 0xffff;
_allowSecondaryPort = OSUtils::jsonBool(settings["allowSecondaryPort"],true); _allowSecondaryPort = OSUtils::jsonBool(settings["allowSecondaryPort"],true);