summaryrefslogtreecommitdiff
path: root/node/IncomingPacket.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/IncomingPacket.hpp')
-rw-r--r--node/IncomingPacket.hpp125
1 files changed, 41 insertions, 84 deletions
diff --git a/node/IncomingPacket.hpp b/node/IncomingPacket.hpp
index cd0b7dcf..88f4f066 100644
--- a/node/IncomingPacket.hpp
+++ b/node/IncomingPacket.hpp
@@ -1,6 +1,6 @@
/*
* ZeroTier One - Network Virtualization Everywhere
- * Copyright (C) 2011-2016 ZeroTier, Inc. https://www.zerotier.com/
+ * Copyright (C) 2011-2018 ZeroTier, Inc. https://www.zerotier.com/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -14,6 +14,14 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * --
+ *
+ * You can be released from the requirements of the license by purchasing
+ * a commercial license. Buying such a license is mandatory as soon as you
+ * develop commercial closed-source software that incorporates or links
+ * directly against ZeroTier software without disclosing the source code
+ * of your own application.
*/
#ifndef ZT_INCOMINGPACKET_HPP
@@ -22,7 +30,7 @@
#include <stdexcept>
#include "Packet.hpp"
-#include "InetAddress.hpp"
+#include "Path.hpp"
#include "Utils.hpp"
#include "MulticastGroup.hpp"
#include "Peer.hpp"
@@ -56,16 +64,8 @@ class IncomingPacket : public Packet
public:
IncomingPacket() :
Packet(),
- _receiveTime(0),
- _localAddress(),
- _remoteAddress()
- {
- }
-
- IncomingPacket(const IncomingPacket &p)
+ _receiveTime(0)
{
- // All fields including InetAddress are memcpy'able
- memcpy(this,&p,sizeof(IncomingPacket));
}
/**
@@ -73,42 +73,31 @@ public:
*
* @param data Packet data
* @param len Packet length
- * @param localAddress Local interface address
- * @param remoteAddress Address from which packet came
+ * @param path Path over which packet arrived
* @param now Current time
* @throws std::out_of_range Range error processing packet
*/
- IncomingPacket(const void *data,unsigned int len,const InetAddress &localAddress,const InetAddress &remoteAddress,uint64_t now) :
+ IncomingPacket(const void *data,unsigned int len,const SharedPtr<Path> &path,int64_t now) :
Packet(data,len),
_receiveTime(now),
- _localAddress(localAddress),
- _remoteAddress(remoteAddress)
+ _path(path)
{
}
- inline IncomingPacket &operator=(const IncomingPacket &p)
- {
- // All fields including InetAddress are memcpy'able
- memcpy(this,&p,sizeof(IncomingPacket));
- return *this;
- }
-
/**
* Init packet-in-decode in place
*
* @param data Packet data
* @param len Packet length
- * @param localAddress Local interface address
- * @param remoteAddress Address from which packet came
+ * @param path Path over which packet arrived
* @param now Current time
* @throws std::out_of_range Range error processing packet
*/
- inline void init(const void *data,unsigned int len,const InetAddress &localAddress,const InetAddress &remoteAddress,uint64_t now)
+ inline void init(const void *data,unsigned int len,const SharedPtr<Path> &path,int64_t now)
{
copyFrom(data,len);
_receiveTime = now;
- _localAddress = localAddress;
- _remoteAddress = remoteAddress;
+ _path = path;
}
/**
@@ -118,76 +107,44 @@ public:
* about whether the packet was valid. A rejection is 'complete.'
*
* Once true is returned, this must not be called again. The packet's state
- * may no longer be valid. The only exception is deferred decoding. In this
- * case true is returned to indicate to the normal decode path that it is
- * finished with the packet. The packet will have added itself to the
- * deferred queue and will expect tryDecode() to be called one more time
- * with deferred set to true.
- *
- * Deferred decoding is performed by DeferredPackets.cpp and should not be
- * done elsewhere. Under deferred decoding packets only get one shot and
- * so the return value of tryDecode() is ignored.
+ * may no longer be valid.
*
* @param RR Runtime environment
- * @param deferred If true, this is a deferred decode and the return is ignored
+ * @param tPtr Thread pointer to be handed through to any callbacks called as a result of this call
* @return True if decoding and processing is complete, false if caller should try again
*/
- bool tryDecode(const RuntimeEnvironment *RR,bool deferred);
+ bool tryDecode(const RuntimeEnvironment *RR,void *tPtr);
/**
* @return Time of packet receipt / start of decode
*/
- inline uint64_t receiveTime() const throw() { return _receiveTime; }
-
- /**
- * Compute the Salsa20/12+SHA512 proof of work function
- *
- * @param difficulty Difficulty in bits (max: 64)
- * @param challenge Challenge string
- * @param challengeLength Length of challenge in bytes (max allowed: ZT_PROTO_MAX_PACKET_LENGTH)
- * @param result Buffer to fill with 16-byte result
- */
- static void computeSalsa2012Sha512ProofOfWork(unsigned int difficulty,const void *challenge,unsigned int challengeLength,unsigned char result[16]);
-
- /**
- * Verify the result of Salsa20/12+SHA512 proof of work
- *
- * @param difficulty Difficulty in bits (max: 64)
- * @param challenge Challenge bytes
- * @param challengeLength Length of challenge in bytes (max allowed: ZT_PROTO_MAX_PACKET_LENGTH)
- * @param proposedResult Result supplied by client
- * @return True if result is valid
- */
- static bool testSalsa2012Sha512ProofOfWorkResult(unsigned int difficulty,const void *challenge,unsigned int challengeLength,const unsigned char proposedResult[16]);
+ inline uint64_t receiveTime() const { return _receiveTime; }
private:
// These are called internally to handle packet contents once it has
// been authenticated, decrypted, decompressed, and classified.
- bool _doERROR(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doHELLO(const RuntimeEnvironment *RR,SharedPtr<Peer> &peer); // can be called with NULL peer, while all others cannot
- bool _doOK(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doWHOIS(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doRENDEZVOUS(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doFRAME(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doEXT_FRAME(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doECHO(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doMULTICAST_LIKE(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doNETWORK_MEMBERSHIP_CERTIFICATE(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doNETWORK_CONFIG_REQUEST(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doNETWORK_CONFIG_REFRESH(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doMULTICAST_GATHER(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doMULTICAST_FRAME(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doPUSH_DIRECT_PATHS(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doCIRCUIT_TEST(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doCIRCUIT_TEST_REPORT(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
- bool _doREQUEST_PROOF_OF_WORK(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer);
-
- // Send an ERROR_NEED_MEMBERSHIP_CERTIFICATE to a peer indicating that an updated cert is needed to communicate
- void _sendErrorNeedCertificate(const RuntimeEnvironment *RR,const SharedPtr<Peer> &peer,uint64_t nwid);
+ bool _doERROR(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doHELLO(const RuntimeEnvironment *RR,void *tPtr,const bool alreadyAuthenticated);
+ bool _doOK(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doWHOIS(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doRENDEZVOUS(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doFRAME(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doEXT_FRAME(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doECHO(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doMULTICAST_LIKE(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doNETWORK_CREDENTIALS(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doNETWORK_CONFIG_REQUEST(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doNETWORK_CONFIG(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doMULTICAST_GATHER(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doMULTICAST_FRAME(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doPUSH_DIRECT_PATHS(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doUSER_MESSAGE(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+ bool _doREMOTE_TRACE(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer);
+
+ void _sendErrorNeedCredentials(const RuntimeEnvironment *RR,void *tPtr,const SharedPtr<Peer> &peer,const uint64_t nwid);
uint64_t _receiveTime;
- InetAddress _localAddress;
- InetAddress _remoteAddress;
+ SharedPtr<Path> _path;
};
} // namespace ZeroTier