More tweaks to COM stuff.

This commit is contained in:
Adam Ierymenko 2020-03-25 14:10:26 -07:00
parent e9da35bac3
commit b5c01999b8
No known key found for this signature in database
GPG key ID: C8877CF2D7A5D7F3
5 changed files with 43 additions and 35 deletions

View file

@ -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
*/ */

View file

@ -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;

View file

@ -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.
* *

View file

@ -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();

View file

@ -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