|
@@ -80,7 +80,7 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR,void *tPtr)
|
|
|
if (!trusted) {
|
|
|
if (!dearmor(peer->key())) {
|
|
|
RR->t->incomingPacketMessageAuthenticationFailure(tPtr,_path,packetId(),sourceAddress,hops(),"invalid MAC");
|
|
|
- _path->recordPacket(false);
|
|
|
+ _path->recordInvalidPacket();
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
@@ -90,15 +90,15 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR,void *tPtr)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- _path->recordPacket(true);
|
|
|
-
|
|
|
const Packet::Verb v = verb();
|
|
|
switch(v) {
|
|
|
//case Packet::VERB_NOP:
|
|
|
default: // ignore unknown verbs, but if they pass auth check they are "received"
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),v,0,Packet::VERB_NOP,false,0);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),v,0,Packet::VERB_NOP,false,0);
|
|
|
return true;
|
|
|
case Packet::VERB_HELLO: return _doHELLO(RR,tPtr,true);
|
|
|
+ case Packet::VERB_ACK: return _doACK(RR,tPtr,peer);
|
|
|
+ case Packet::VERB_QOS_MEASUREMENT: return _doQOS_MEASUREMENT(RR,tPtr,peer);
|
|
|
case Packet::VERB_ERROR: return _doERROR(RR,tPtr,peer);
|
|
|
case Packet::VERB_OK: return _doOK(RR,tPtr,peer);
|
|
|
case Packet::VERB_WHOIS: return _doWHOIS(RR,tPtr,peer);
|
|
@@ -197,11 +197,55 @@ bool IncomingPacket::_doERROR(const RuntimeEnvironment *RR,void *tPtr,const Shar
|
|
|
default: break;
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_ERROR,inRePacketId,inReVerb,false,networkId);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_ERROR,inRePacketId,inReVerb,false,networkId);
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+bool IncomingPacket::_doACK(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer)
|
|
|
+{
|
|
|
+ /* Dissect incoming ACK packet. From this we can estimate current throughput of the path, establish known
|
|
|
+ * maximums and detect packet loss. */
|
|
|
+
|
|
|
+ if (RR->node->getMultipathMode() != ZT_MULTIPATH_NONE) {
|
|
|
+ int32_t ackedBytes;
|
|
|
+ memcpy(&ackedBytes, payload(), sizeof(int32_t));
|
|
|
+ _path->receivedAck(RR->node->now(), Utils::ntoh(ackedBytes));
|
|
|
+ }
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+bool IncomingPacket::_doQOS_MEASUREMENT(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer)
|
|
|
+{
|
|
|
+
|
|
|
+ /* Dissect incoming QoS packet. From this we can compute latency values and their variance.
|
|
|
+ * The latency variance is used as a measure of "jitter". */
|
|
|
+
|
|
|
+ if (RR->node->getMultipathMode() != ZT_MULTIPATH_NONE) {
|
|
|
+ if (payloadLength() < ZT_PATH_MAX_QOS_PACKET_SZ && payloadLength() > ZT_PATH_MIN_QOS_PACKET_SZ) {
|
|
|
+ const int64_t now = RR->node->now();
|
|
|
+ uint64_t rx_id[ZT_PATH_QOS_TABLE_SIZE];
|
|
|
+ uint8_t rx_ts[ZT_PATH_QOS_TABLE_SIZE];
|
|
|
+ char *begin = (char *)payload();
|
|
|
+ char *ptr = begin;
|
|
|
+ int count = 0;
|
|
|
+ int len = payloadLength();
|
|
|
+ // Read packet IDs and latency compensation intervals for each packet tracked by thie QoS packet
|
|
|
+ while (ptr < (begin + len)) {
|
|
|
+ memcpy((void*)&rx_id[count], ptr, sizeof(uint64_t));
|
|
|
+ rx_id[count] = Utils::ntoh(rx_id[count]);
|
|
|
+ ptr+=sizeof(uint64_t);
|
|
|
+ memcpy((void*)&rx_ts[count], ptr, sizeof(uint8_t));
|
|
|
+ ptr+=sizeof(uint8_t);
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+ _path->receivedQoS(now, count, rx_id, rx_ts);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
bool IncomingPacket::_doHELLO(const RuntimeEnvironment *RR,void *tPtr,const bool alreadyAuthenticated)
|
|
|
{
|
|
|
const int64_t now = RR->node->now();
|
|
@@ -398,7 +442,7 @@ bool IncomingPacket::_doHELLO(const RuntimeEnvironment *RR,void *tPtr,const bool
|
|
|
_path->send(RR,tPtr,outp.data(),outp.size(),now);
|
|
|
|
|
|
peer->setRemoteVersion(protoVersion,vMajor,vMinor,vRevision); // important for this to go first so received() knows the version
|
|
|
- peer->received(tPtr,_path,hops(),pid,Packet::VERB_HELLO,0,Packet::VERB_NOP,false,0);
|
|
|
+ peer->received(tPtr,_path,hops(),pid,payloadLength(),Packet::VERB_HELLO,0,Packet::VERB_NOP,false,0);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -448,8 +492,9 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,void *tPtr,const SharedP
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (!hops())
|
|
|
+ if (!hops() && (RR->node->getMultipathMode() != ZT_MULTIPATH_NONE)) {
|
|
|
_path->updateLatency((unsigned int)latency, RR->node->now());
|
|
|
+ }
|
|
|
|
|
|
peer->setRemoteVersion(vProto,vMajor,vMinor,vRevision);
|
|
|
|
|
@@ -510,7 +555,7 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,void *tPtr,const SharedP
|
|
|
default: break;
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_OK,inRePacketId,inReVerb,false,networkId);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_OK,inRePacketId,inReVerb,false,networkId);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -545,7 +590,7 @@ bool IncomingPacket::_doWHOIS(const RuntimeEnvironment *RR,void *tPtr,const Shar
|
|
|
_path->send(RR,tPtr,outp.data(),outp.size(),RR->node->now());
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_WHOIS,0,Packet::VERB_NOP,false,0);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_WHOIS,0,Packet::VERB_NOP,false,0);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -569,7 +614,7 @@ bool IncomingPacket::_doRENDEZVOUS(const RuntimeEnvironment *RR,void *tPtr,const
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_RENDEZVOUS,0,Packet::VERB_NOP,false,0);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_RENDEZVOUS,0,Packet::VERB_NOP,false,0);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -598,7 +643,7 @@ bool IncomingPacket::_doFRAME(const RuntimeEnvironment *RR,void *tPtr,const Shar
|
|
|
_sendErrorNeedCredentials(RR,tPtr,peer,nwid);
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_FRAME,0,Packet::VERB_NOP,trustEstablished,nwid);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_FRAME,0,Packet::VERB_NOP,trustEstablished,nwid);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -621,7 +666,7 @@ bool IncomingPacket::_doEXT_FRAME(const RuntimeEnvironment *RR,void *tPtr,const
|
|
|
if (!network->gate(tPtr,peer)) {
|
|
|
RR->t->incomingNetworkAccessDenied(tPtr,network,_path,packetId(),size(),peer->address(),Packet::VERB_EXT_FRAME,true);
|
|
|
_sendErrorNeedCredentials(RR,tPtr,peer,nwid);
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,false,nwid);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,false,nwid);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -633,7 +678,7 @@ bool IncomingPacket::_doEXT_FRAME(const RuntimeEnvironment *RR,void *tPtr,const
|
|
|
const uint8_t *const frameData = (const uint8_t *)field(comLen + ZT_PROTO_VERB_EXT_FRAME_IDX_PAYLOAD,frameLen);
|
|
|
|
|
|
if ((!from)||(from == network->mac())) {
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -644,19 +689,19 @@ bool IncomingPacket::_doEXT_FRAME(const RuntimeEnvironment *RR,void *tPtr,const
|
|
|
network->learnBridgeRoute(from,peer->address());
|
|
|
} else {
|
|
|
RR->t->incomingNetworkFrameDropped(tPtr,network,_path,packetId(),size(),peer->address(),Packet::VERB_EXT_FRAME,from,to,"bridging not allowed (remote)");
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
return true;
|
|
|
}
|
|
|
} else if (to != network->mac()) {
|
|
|
if (to.isMulticast()) {
|
|
|
if (network->config().multicastLimit == 0) {
|
|
|
RR->t->incomingNetworkFrameDropped(tPtr,network,_path,packetId(),size(),peer->address(),Packet::VERB_EXT_FRAME,from,to,"multicast disabled");
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
return true;
|
|
|
}
|
|
|
} else if (!network->config().permitsBridging(RR->identity.address())) {
|
|
|
RR->t->incomingNetworkFrameDropped(tPtr,network,_path,packetId(),size(),peer->address(),Packet::VERB_EXT_FRAME,from,to,"bridging not allowed (local)");
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
@@ -676,9 +721,9 @@ bool IncomingPacket::_doEXT_FRAME(const RuntimeEnvironment *RR,void *tPtr,const
|
|
|
_path->send(RR,tPtr,outp.data(),outp.size(),RR->node->now());
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,true,nwid);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,true,nwid);
|
|
|
} else {
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,false,nwid);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_EXT_FRAME,0,Packet::VERB_NOP,false,nwid);
|
|
|
}
|
|
|
|
|
|
return true;
|
|
@@ -698,7 +743,7 @@ bool IncomingPacket::_doECHO(const RuntimeEnvironment *RR,void *tPtr,const Share
|
|
|
outp.armor(peer->key(),true);
|
|
|
_path->send(RR,tPtr,outp.data(),outp.size(),RR->node->now());
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),pid,Packet::VERB_ECHO,0,Packet::VERB_NOP,false,0);
|
|
|
+ peer->received(tPtr,_path,hops(),pid,payloadLength(),Packet::VERB_ECHO,0,Packet::VERB_NOP,false,0);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -743,7 +788,7 @@ bool IncomingPacket::_doMULTICAST_LIKE(const RuntimeEnvironment *RR,void *tPtr,c
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_MULTICAST_LIKE,0,Packet::VERB_NOP,trustEstablished,(network) ? network->id() : 0);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_MULTICAST_LIKE,0,Packet::VERB_NOP,trustEstablished,(network) ? network->id() : 0);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -866,7 +911,7 @@ bool IncomingPacket::_doNETWORK_CREDENTIALS(const RuntimeEnvironment *RR,void *t
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_NETWORK_CREDENTIALS,0,Packet::VERB_NOP,trustEstablished,(network) ? network->id() : 0);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_NETWORK_CREDENTIALS,0,Packet::VERB_NOP,trustEstablished,(network) ? network->id() : 0);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -892,7 +937,7 @@ bool IncomingPacket::_doNETWORK_CONFIG_REQUEST(const RuntimeEnvironment *RR,void
|
|
|
_path->send(RR,tPtr,outp.data(),outp.size(),RR->node->now());
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hopCount,requestPacketId,Packet::VERB_NETWORK_CONFIG_REQUEST,0,Packet::VERB_NOP,false,nwid);
|
|
|
+ peer->received(tPtr,_path,hopCount,requestPacketId,payloadLength(),Packet::VERB_NETWORK_CONFIG_REQUEST,0,Packet::VERB_NOP,false,nwid);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -913,7 +958,7 @@ bool IncomingPacket::_doNETWORK_CONFIG(const RuntimeEnvironment *RR,void *tPtr,c
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_NETWORK_CONFIG,0,Packet::VERB_NOP,false,(network) ? network->id() : 0);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_NETWORK_CONFIG,0,Packet::VERB_NOP,false,(network) ? network->id() : 0);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -956,7 +1001,7 @@ bool IncomingPacket::_doMULTICAST_GATHER(const RuntimeEnvironment *RR,void *tPtr
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_MULTICAST_GATHER,0,Packet::VERB_NOP,trustEstablished,nwid);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_MULTICAST_GATHER,0,Packet::VERB_NOP,trustEstablished,nwid);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -982,7 +1027,7 @@ bool IncomingPacket::_doMULTICAST_FRAME(const RuntimeEnvironment *RR,void *tPtr,
|
|
|
if (!network->gate(tPtr,peer)) {
|
|
|
RR->t->incomingNetworkAccessDenied(tPtr,network,_path,packetId(),size(),peer->address(),Packet::VERB_MULTICAST_FRAME,true);
|
|
|
_sendErrorNeedCredentials(RR,tPtr,peer,nwid);
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,false,nwid);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,false,nwid);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -1006,19 +1051,19 @@ bool IncomingPacket::_doMULTICAST_FRAME(const RuntimeEnvironment *RR,void *tPtr,
|
|
|
|
|
|
if (network->config().multicastLimit == 0) {
|
|
|
RR->t->incomingNetworkFrameDropped(tPtr,network,_path,packetId(),size(),peer->address(),Packet::VERB_MULTICAST_FRAME,from,to.mac(),"multicast disabled");
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,false,nwid);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,false,nwid);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
if ((frameLen > 0)&&(frameLen <= ZT_MAX_MTU)) {
|
|
|
if (!to.mac().isMulticast()) {
|
|
|
RR->t->incomingPacketInvalid(tPtr,_path,packetId(),source(),hops(),Packet::VERB_MULTICAST_FRAME,"destination not multicast");
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
return true;
|
|
|
}
|
|
|
if ((!from)||(from.isMulticast())||(from == network->mac())) {
|
|
|
RR->t->incomingPacketInvalid(tPtr,_path,packetId(),source(),hops(),Packet::VERB_MULTICAST_FRAME,"invalid source MAC");
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -1032,7 +1077,7 @@ bool IncomingPacket::_doMULTICAST_FRAME(const RuntimeEnvironment *RR,void *tPtr,
|
|
|
network->learnBridgeRoute(from,peer->address());
|
|
|
} else {
|
|
|
RR->t->incomingNetworkFrameDropped(tPtr,network,_path,packetId(),size(),peer->address(),Packet::VERB_MULTICAST_FRAME,from,to.mac(),"bridging not allowed (remote)");
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,true,nwid); // trustEstablished because COM is okay
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
@@ -1055,10 +1100,10 @@ bool IncomingPacket::_doMULTICAST_FRAME(const RuntimeEnvironment *RR,void *tPtr,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,true,nwid);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,true,nwid);
|
|
|
} else {
|
|
|
_sendErrorNeedCredentials(RR,tPtr,peer,nwid);
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,false,nwid);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_MULTICAST_FRAME,0,Packet::VERB_NOP,false,nwid);
|
|
|
}
|
|
|
|
|
|
return true;
|
|
@@ -1070,7 +1115,7 @@ bool IncomingPacket::_doPUSH_DIRECT_PATHS(const RuntimeEnvironment *RR,void *tPt
|
|
|
|
|
|
// First, subject this to a rate limit
|
|
|
if (!peer->rateGatePushDirectPaths(now)) {
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_PUSH_DIRECT_PATHS,0,Packet::VERB_NOP,false,0);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_PUSH_DIRECT_PATHS,0,Packet::VERB_NOP,false,0);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -1094,7 +1139,7 @@ bool IncomingPacket::_doPUSH_DIRECT_PATHS(const RuntimeEnvironment *RR,void *tPt
|
|
|
case 4: {
|
|
|
const InetAddress a(field(ptr,4),4,at<uint16_t>(ptr + 4));
|
|
|
if (
|
|
|
- ((flags & ZT_PUSH_DIRECT_PATHS_FLAG_FORGET_PATH) == 0) && // not being told to forget
|
|
|
+ ((flags & ZT_PUSH_DIRECT_PATHS_FLAG_FORGET_PATH) == 0) && // not being told to forget
|
|
|
(!( ((flags & ZT_PUSH_DIRECT_PATHS_FLAG_CLUSTER_REDIRECT) == 0) && (peer->hasActivePathTo(now,a)) )) && // not already known
|
|
|
(RR->node->shouldUsePathForZeroTierTraffic(tPtr,peer->address(),_path->localSocket(),a)) ) // should use path
|
|
|
{
|
|
@@ -1108,7 +1153,7 @@ bool IncomingPacket::_doPUSH_DIRECT_PATHS(const RuntimeEnvironment *RR,void *tPt
|
|
|
case 6: {
|
|
|
const InetAddress a(field(ptr,16),16,at<uint16_t>(ptr + 16));
|
|
|
if (
|
|
|
- ((flags & ZT_PUSH_DIRECT_PATHS_FLAG_FORGET_PATH) == 0) && // not being told to forget
|
|
|
+ ((flags & ZT_PUSH_DIRECT_PATHS_FLAG_FORGET_PATH) == 0) && // not being told to forget
|
|
|
(!( ((flags & ZT_PUSH_DIRECT_PATHS_FLAG_CLUSTER_REDIRECT) == 0) && (peer->hasActivePathTo(now,a)) )) && // not already known
|
|
|
(RR->node->shouldUsePathForZeroTierTraffic(tPtr,peer->address(),_path->localSocket(),a)) ) // should use path
|
|
|
{
|
|
@@ -1123,7 +1168,7 @@ bool IncomingPacket::_doPUSH_DIRECT_PATHS(const RuntimeEnvironment *RR,void *tPt
|
|
|
ptr += addrLen;
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_PUSH_DIRECT_PATHS,0,Packet::VERB_NOP,false,0);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_PUSH_DIRECT_PATHS,0,Packet::VERB_NOP,false,0);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -1139,7 +1184,7 @@ bool IncomingPacket::_doUSER_MESSAGE(const RuntimeEnvironment *RR,void *tPtr,con
|
|
|
RR->node->postEvent(tPtr,ZT_EVENT_USER_MESSAGE,reinterpret_cast<const void *>(&um));
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_USER_MESSAGE,0,Packet::VERB_NOP,false,0);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_USER_MESSAGE,0,Packet::VERB_NOP,false,0);
|
|
|
|
|
|
return true;
|
|
|
}
|
|
@@ -1163,7 +1208,7 @@ bool IncomingPacket::_doREMOTE_TRACE(const RuntimeEnvironment *RR,void *tPtr,con
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- peer->received(tPtr,_path,hops(),packetId(),Packet::VERB_REMOTE_TRACE,0,Packet::VERB_NOP,false,0);
|
|
|
+ peer->received(tPtr,_path,hops(),packetId(),payloadLength(),Packet::VERB_REMOTE_TRACE,0,Packet::VERB_NOP,false,0);
|
|
|
|
|
|
return true;
|
|
|
}
|