mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-06 20:43:44 +02:00
More tweaks to COM stuff.
This commit is contained in:
parent
e9da35bac3
commit
b5c01999b8
5 changed files with 43 additions and 35 deletions
|
@ -138,6 +138,11 @@ public:
|
||||||
*/
|
*/
|
||||||
ZT_INLINE int64_t timestamp() const noexcept { return _timestamp; }
|
ZT_INLINE int64_t timestamp() const noexcept { return _timestamp; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Maximum allowed difference between timestamps
|
||||||
|
*/
|
||||||
|
ZT_INLINE int64_t timestampMaxDelta() const noexcept { return _timestampMaxDelta; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Fingerprint of identity to which this cert was issued
|
* @return Fingerprint of identity to which this cert was issued
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -37,7 +37,7 @@ Membership::~Membership()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void Membership::pushCredentials(const RuntimeEnvironment *RR,void *tPtr,const int64_t now,const Identity &to,const NetworkConfig &nconf)
|
void Membership::pushCredentials(const RuntimeEnvironment *RR,void *tPtr,const int64_t now,const SharedPtr<Peer> &to,const NetworkConfig &nconf)
|
||||||
{
|
{
|
||||||
if (!nconf.com) // sanity check
|
if (!nconf.com) // sanity check
|
||||||
return;
|
return;
|
||||||
|
@ -50,7 +50,7 @@ void Membership::pushCredentials(const RuntimeEnvironment *RR,void *tPtr,const i
|
||||||
bool complete = false;
|
bool complete = false;
|
||||||
while (!complete) {
|
while (!complete) {
|
||||||
ph.packetId = Protocol::getPacketId();
|
ph.packetId = Protocol::getPacketId();
|
||||||
to.address().copyTo(ph.destination);
|
to->address().copyTo(ph.destination);
|
||||||
RR->identity.address().copyTo(ph.source);
|
RR->identity.address().copyTo(ph.source);
|
||||||
ph.flags = 0;
|
ph.flags = 0;
|
||||||
ph.verb = Protocol::VERB_NETWORK_CREDENTIALS;
|
ph.verb = Protocol::VERB_NETWORK_CREDENTIALS;
|
||||||
|
|
|
@ -60,36 +60,13 @@ public:
|
||||||
* @param to Peer identity
|
* @param to Peer identity
|
||||||
* @param nconf My network config
|
* @param nconf My network config
|
||||||
*/
|
*/
|
||||||
void pushCredentials(const RuntimeEnvironment *RR,void *tPtr,int64_t now,const Identity &to,const NetworkConfig &nconf);
|
void pushCredentials(const RuntimeEnvironment *RR,void *tPtr,int64_t now,const SharedPtr<Peer> &to,const NetworkConfig &nconf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Time we last pushed credentials to this member
|
* @return Time we last pushed credentials to this member
|
||||||
*/
|
*/
|
||||||
ZT_INLINE int64_t lastPushedCredentials() const noexcept { return _lastPushedCredentials; }
|
ZT_INLINE int64_t lastPushedCredentials() const noexcept { return _lastPushedCredentials; }
|
||||||
|
|
||||||
/**
|
|
||||||
* Check whether the peer represented by this Membership owns a given address
|
|
||||||
*
|
|
||||||
* @tparam Type of resource: InetAddress or MAC
|
|
||||||
* @param nconf Our network config
|
|
||||||
* @param r Resource to check
|
|
||||||
* @return True if this peer has a certificate of ownership for the given resource
|
|
||||||
*/
|
|
||||||
template<typename T>
|
|
||||||
ZT_INLINE bool peerOwnsAddress(const NetworkConfig &nconf,const T &r) const noexcept
|
|
||||||
{
|
|
||||||
if (_isUnspoofableAddress(nconf,r))
|
|
||||||
return true;
|
|
||||||
uint32_t *k = nullptr;
|
|
||||||
CertificateOfOwnership *v = nullptr;
|
|
||||||
Hashtable< uint32_t,CertificateOfOwnership >::Iterator i(*(const_cast< Hashtable< uint32_t,CertificateOfOwnership> *>(&_remoteCoos)));
|
|
||||||
while (i.next(k,v)) {
|
|
||||||
if (_isCredentialTimestampValid(nconf,*v)&&(v->owns(r)))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a remote member's tag (if we have it)
|
* Get a remote member's tag (if we have it)
|
||||||
*
|
*
|
||||||
|
@ -116,6 +93,29 @@ public:
|
||||||
*/
|
*/
|
||||||
static ZT_INLINE uint64_t credentialKey(const ZT_CredentialType &t,const uint32_t i) noexcept { return (((uint64_t)t << 32U) | (uint64_t)i); }
|
static ZT_INLINE uint64_t credentialKey(const ZT_CredentialType &t,const uint32_t i) noexcept { return (((uint64_t)t << 32U) | (uint64_t)i); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the peer represented by this Membership owns a given address
|
||||||
|
*
|
||||||
|
* @tparam Type of resource: InetAddress or MAC
|
||||||
|
* @param nconf Our network config
|
||||||
|
* @param r Resource to check
|
||||||
|
* @return True if this peer has a certificate of ownership for the given resource
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
ZT_INLINE bool peerOwnsAddress(const NetworkConfig &nconf,const T &r) const noexcept
|
||||||
|
{
|
||||||
|
if (_isUnspoofableAddress(nconf,r))
|
||||||
|
return true;
|
||||||
|
uint32_t *k = nullptr;
|
||||||
|
CertificateOfOwnership *v = nullptr;
|
||||||
|
Hashtable< uint32_t,CertificateOfOwnership >::Iterator i(*(const_cast< Hashtable< uint32_t,CertificateOfOwnership> *>(&_remoteCoos)));
|
||||||
|
while (i.next(k,v)) {
|
||||||
|
if (_isCredentialTimestampValid(nconf,*v)&&(v->owns(r)))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if our local COM agrees with theirs, with possible memo-ization.
|
* Check if our local COM agrees with theirs, with possible memo-ization.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1217,6 +1217,16 @@ Membership::AddCredentialResult Network::addCredential(void *tPtr,const Identity
|
||||||
return _memberships[coo.issuedTo()].addCredential(RR,tPtr,sourcePeerIdentity,_config,coo);
|
return _memberships[coo.issuedTo()].addCredential(RR,tPtr,sourcePeerIdentity,_config,coo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Network::pushCredentials(void *tPtr,const SharedPtr<Peer> &to,const int64_t now)
|
||||||
|
{
|
||||||
|
const int64_t tout = std::min(_config.credentialTimeMaxDelta,_config.com.timestampMaxDelta());
|
||||||
|
Mutex::Lock _l(_memberships_l);
|
||||||
|
Membership &m = _memberships[to->address()];
|
||||||
|
if (((now - m.lastPushedCredentials()) + 5000) >= tout) {
|
||||||
|
m.pushCredentials(RR,tPtr,now,to,_config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Network::destroy()
|
void Network::destroy()
|
||||||
{
|
{
|
||||||
_memberships_l.lock();
|
_memberships_l.lock();
|
||||||
|
|
|
@ -293,20 +293,13 @@ public:
|
||||||
Membership::AddCredentialResult addCredential(void *tPtr,const Identity &sourcePeerIdentity,const CertificateOfOwnership &coo);
|
Membership::AddCredentialResult addCredential(void *tPtr,const Identity &sourcePeerIdentity,const CertificateOfOwnership &coo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Push credentials if we haven't done so in a long time
|
* Push credentials to a peer if timeouts indicate that we should do so
|
||||||
*
|
*
|
||||||
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
|
* @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
|
||||||
* @param to Destination peer
|
* @param to Destination peer
|
||||||
* @param now Current time
|
* @param now Current time
|
||||||
*/
|
*/
|
||||||
ZT_INLINE void pushCredentialsIfNeeded(void *tPtr,const Identity &to,const int64_t now)
|
void pushCredentials(void *tPtr,const SharedPtr<Peer> &to,const int64_t now);
|
||||||
{
|
|
||||||
const int64_t tout = std::min(_config.credentialTimeMaxDelta,(int64_t)ZT_PEER_ACTIVITY_TIMEOUT);
|
|
||||||
Mutex::Lock _l(_memberships_l);
|
|
||||||
Membership &m = _memberships[to.address()];
|
|
||||||
if (((now - m.lastPushedCredentials()) + 5000) >= tout)
|
|
||||||
m.pushCredentials(RR,tPtr,now,to,_config);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy this network
|
* Destroy this network
|
||||||
|
|
Loading…
Add table
Reference in a new issue