|
@@ -156,11 +156,14 @@ bool IncomingPacket::_doERROR(const RuntimeEnvironment *RR,const SharedPtr<Peer>
|
|
case Packet::ERROR_NEED_MEMBERSHIP_CERTIFICATE: {
|
|
case Packet::ERROR_NEED_MEMBERSHIP_CERTIFICATE: {
|
|
SharedPtr<Network> network(RR->node->network(at<uint64_t>(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD)));
|
|
SharedPtr<Network> network(RR->node->network(at<uint64_t>(ZT_PROTO_VERB_ERROR_IDX_PAYLOAD)));
|
|
if ((network)&&(network->recentlyAllowedOnNetwork(peer))) {
|
|
if ((network)&&(network->recentlyAllowedOnNetwork(peer))) {
|
|
- Packet outp(peer->address(),RR->identity.address(),Packet::VERB_NETWORK_CREDENTIALS);
|
|
|
|
- network->config().com.serialize(outp);
|
|
|
|
- outp.append((uint8_t)0);
|
|
|
|
- outp.armor(peer->key(),true);
|
|
|
|
- _path->send(RR,outp.data(),outp.size(),RR->node->now());
|
|
|
|
|
|
+ const uint64_t now = RR->node->now();
|
|
|
|
+ if (peer->rateGateComRequest(now)) {
|
|
|
|
+ Packet outp(peer->address(),RR->identity.address(),Packet::VERB_NETWORK_CREDENTIALS);
|
|
|
|
+ network->config().com.serialize(outp);
|
|
|
|
+ outp.append((uint8_t)0);
|
|
|
|
+ outp.armor(peer->key(),true);
|
|
|
|
+ _path->send(RR,outp.data(),outp.size(),now);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
} break;
|
|
} break;
|
|
|
|
|