diff options
Diffstat (limited to 'node')
-rw-r--r-- | node/Node.hpp | 6 | ||||
-rw-r--r-- | node/Peer.cpp | 4 | ||||
-rw-r--r-- | node/Peer.hpp | 3 | ||||
-rw-r--r-- | node/Switch.cpp | 6 |
4 files changed, 11 insertions, 8 deletions
diff --git a/node/Node.hpp b/node/Node.hpp index 76dec50e..15295139 100644 --- a/node/Node.hpp +++ b/node/Node.hpp @@ -149,9 +149,10 @@ public: * @param addr Destination address * @param data Packet data * @param len Packet length + * @param ttl Desired TTL (default: 0 for unchanged/default TTL) * @return True if packet appears to have been sent */ - inline bool putPacket(const InetAddress &localAddress,const InetAddress &addr,const void *data,unsigned int len) + inline bool putPacket(const InetAddress &localAddress,const InetAddress &addr,const void *data,unsigned int len,unsigned int ttl = 0) { return (_wirePacketSendFunction( reinterpret_cast<ZT_Node *>(this), @@ -159,7 +160,8 @@ public: reinterpret_cast<const struct sockaddr_storage *>(&localAddress), reinterpret_cast<const struct sockaddr_storage *>(&addr), data, - len) == 0); + len, + ttl) == 0); } /** diff --git a/node/Peer.cpp b/node/Peer.cpp index 0e90b17d..de6f00c2 100644 --- a/node/Peer.cpp +++ b/node/Peer.cpp @@ -211,7 +211,7 @@ void Peer::received( } } -void Peer::sendHELLO(const RuntimeEnvironment *RR,const InetAddress &localAddr,const InetAddress &atAddress,uint64_t now) +void Peer::sendHELLO(const RuntimeEnvironment *RR,const InetAddress &localAddr,const InetAddress &atAddress,uint64_t now,unsigned int ttl) { // _lock not required here since _id is immutable and nothing else is accessed @@ -228,7 +228,7 @@ void Peer::sendHELLO(const RuntimeEnvironment *RR,const InetAddress &localAddr,c outp.armor(_key,false); // HELLO is sent in the clear RR->antiRec->logOutgoingZT(outp.data(),outp.size()); - RR->node->putPacket(localAddr,atAddress,outp.data(),outp.size()); + RR->node->putPacket(localAddr,atAddress,outp.data(),outp.size(),ttl); } bool Peer::doPingAndKeepalive(const RuntimeEnvironment *RR,uint64_t now,int inetAddressFamily) diff --git a/node/Peer.hpp b/node/Peer.hpp index bf627caf..7b8d18ea 100644 --- a/node/Peer.hpp +++ b/node/Peer.hpp @@ -170,8 +170,9 @@ public: * @param localAddr Local address * @param atAddress Destination address * @param now Current time + * @param ttl Desired IP TTL (default: 0 to leave alone) */ - void sendHELLO(const RuntimeEnvironment *RR,const InetAddress &localAddr,const InetAddress &atAddress,uint64_t now); + void sendHELLO(const RuntimeEnvironment *RR,const InetAddress &localAddr,const InetAddress &atAddress,uint64_t now,unsigned int ttl = 0); /** * Send pings or keepalives depending on configured timeouts diff --git a/node/Switch.cpp b/node/Switch.cpp index dcaf7ebd..74e2f4c6 100644 --- a/node/Switch.cpp +++ b/node/Switch.cpp @@ -435,7 +435,7 @@ void Switch::rendezvous(const SharedPtr<Peer> &peer,const InetAddress &localAddr { TRACE("sending NAT-t message to %s(%s)",peer->address().toString().c_str(),atAddr.toString().c_str()); const uint64_t now = RR->node->now(); - peer->sendHELLO(RR,localAddr,atAddr,now); + peer->sendHELLO(RR,localAddr,atAddr,now,2); // first attempt: send low-TTL packet to 'open' local NAT { Mutex::Lock _l(_contactQueue_m); _contactQueue.push_back(ContactQueueEntry(peer,now + ZT_NAT_T_TACTICAL_ESCALATION_DELAY,localAddr,atAddr)); @@ -509,8 +509,8 @@ unsigned long Switch::doTimerTasks(uint64_t now) if (qi->strategyIteration == 0) { // First strategy: send packet directly to destination qi->peer->sendHELLO(RR,qi->localAddr,qi->inaddr,now); - } else if (qi->strategyIteration <= 4) { - // Strategies 1-4: try escalating ports for symmetric NATs that remap sequentially + } else if (qi->strategyIteration <= 3) { + // Strategies 1-3: try escalating ports for symmetric NATs that remap sequentially InetAddress tmpaddr(qi->inaddr); int p = (int)qi->inaddr.port() + qi->strategyIteration; if (p < 0xffff) { |