summaryrefslogtreecommitdiff
path: root/node/Packet.hpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-10-06 17:56:47 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-10-06 17:56:47 -0700
commit876aa0883d66340960381ec6388c55b23e5d2b5e (patch)
tree918e1246e2cb98fe74037ff083dcceb475bc6802 /node/Packet.hpp
parent36db5865e7ab4ed92ede99f10835fba40e9b9fd8 (diff)
parent477feee8a3fbc84d00c2939b5fc8a9bbf19af2ca (diff)
downloadinfinitytier-876aa0883d66340960381ec6388c55b23e5d2b5e.tar.gz
infinitytier-876aa0883d66340960381ec6388c55b23e5d2b5e.zip
Merge branch 'adamierymenko-dev' into netcon
Diffstat (limited to 'node/Packet.hpp')
-rw-r--r--node/Packet.hpp134
1 files changed, 120 insertions, 14 deletions
diff --git a/node/Packet.hpp b/node/Packet.hpp
index fa377964..409762c7 100644
--- a/node/Packet.hpp
+++ b/node/Packet.hpp
@@ -553,10 +553,10 @@ public:
* address that require re-establishing connectivity.
*
* Destination address types and formats (not all of these are used now):
- * 0 - None -- no destination address data present
- * 1 - Ethernet address -- format: <[6] Ethernet MAC>
- * 4 - 6-byte IPv4 UDP address/port -- format: <[4] IP>, <[2] port>
- * 6 - 18-byte IPv6 UDP address/port -- format: <[16] IP>, <[2] port>
+ * 0x00 - None -- no destination address data present
+ * 0x01 - Ethernet address -- format: <[6] Ethernet MAC>
+ * 0x04 - 6-byte IPv4 UDP address/port -- format: <[4] IP>, <[2] port>
+ * 0x06 - 18-byte IPv6 UDP address/port -- format: <[16] IP>, <[2] port>
*
* OK payload:
* <[8] timestamp (echoed from original HELLO)>
@@ -904,7 +904,120 @@ public:
*
* OK and ERROR are not generated.
*/
- VERB_PUSH_DIRECT_PATHS = 16
+ VERB_PUSH_DIRECT_PATHS = 16,
+
+ /* Source-routed circuit test message:
+ * <[5] address of originator of circuit test>
+ * <[2] 16-bit flags>
+ * <[8] 64-bit timestamp>
+ * <[8] 64-bit test ID (arbitrary, set by tester)>
+ * <[2] 16-bit originator credential length (includes type)>
+ * [[1] originator credential type (for authorizing test)]
+ * [[...] originator credential]
+ * <[2] 16-bit length of additional fields>
+ * [[...] additional fields]
+ * [ ... end of signed portion of request ... ]
+ * <[2] 16-bit length of signature of request>
+ * <[...] signature of request by originator>
+ * <[2] 16-bit previous hop credential length (including type)>
+ * [[1] previous hop credential type]
+ * [[...] previous hop credential]
+ * <[...] next hop(s) in path>
+ *
+ * Flags:
+ * 0x01 - Report back to originator at middle hops
+ * 0x02 - Report back to originator at last hop
+ *
+ * Originator credential types:
+ * 0x01 - 64-bit network ID for which originator is controller
+ *
+ * Previous hop credential types:
+ * 0x01 - Certificate of network membership
+ *
+ * Path record format:
+ * <[1] 8-bit flags (unused, must be zero)>
+ * <[1] 8-bit breadth (number of next hops)>
+ * <[...] one or more ZeroTier addresses of next hops>
+ *
+ * The circuit test allows a device to send a message that will traverse
+ * the network along a specified path, with each hop optionally reporting
+ * back to the tester via VERB_CIRCUIT_TEST_REPORT.
+ *
+ * Each circuit test packet includes a digital signature by the originator
+ * of the request, as well as a credential by which that originator claims
+ * authorization to perform the test. Currently this signature is ed25519,
+ * but in the future flags might be used to indicate an alternative
+ * algorithm. For example, the originator might be a network controller.
+ * In this case the test might be authorized if the recipient is a member
+ * of a network controlled by it, and if the previous hop(s) are also
+ * members. Each hop may include its certificate of network membership.
+ *
+ * Circuit test paths consist of a series of records. When a node receives
+ * an authorized circuit test, it:
+ *
+ * (1) Reports back to circuit tester as flags indicate
+ * (2) Reads and removes the next hop from the packet's path
+ * (3) Sends the packet along to next hop(s), if any.
+ *
+ * It is perfectly legal for a path to contain the same hop more than
+ * once. In fact, this can be a very useful test to determine if a hop
+ * can be reached bidirectionally and if so what that connectivity looks
+ * like.
+ *
+ * The breadth field in source-routed path records allows a hop to forward
+ * to more than one recipient, allowing the tester to specify different
+ * forms of graph traversal in a test.
+ *
+ * There is no hard limit to the number of hops in a test, but it is
+ * practically limited by the maximum size of a (possibly fragmented)
+ * ZeroTier packet.
+ *
+ * Support for circuit tests is optional. If they are not supported, the
+ * node should respond with an UNSUPPORTED_OPERATION error. If a circuit
+ * test request is not authorized, it may be ignored or reported as
+ * an INVALID_REQUEST. No OK messages are generated, but TEST_REPORT
+ * messages may be sent (see below).
+ *
+ * ERROR packet format:
+ * <[8] 64-bit timestamp (echoed from original>
+ * <[8] 64-bit test ID (echoed from original)>
+ */
+ VERB_CIRCUIT_TEST = 17,
+
+ /* Circuit test hop report:
+ * <[8] 64-bit timestamp (from original test)>
+ * <[8] 64-bit test ID (from original test)>
+ * <[8] 64-bit reporter timestamp (reporter's clock, 0 if unspec)>
+ * <[1] 8-bit vendor ID (set to 0, currently unused)>
+ * <[1] 8-bit reporter protocol version>
+ * <[1] 8-bit reporter major version>
+ * <[1] 8-bit reporter minor version>
+ * <[2] 16-bit reporter revision>
+ * <[2] 16-bit reporter OS/platform>
+ * <[2] 16-bit reporter architecture>
+ * <[2] 16-bit error code (set to 0, currently unused)>
+ * <[8] 64-bit report flags (set to 0, currently unused)>
+ * <[8] 64-bit source packet ID>
+ * <[1] 8-bit source packet hop count (ZeroTier hop count)>
+ * <[...] local wire address on which packet was received>
+ * <[...] remote wire address from which packet was received>
+ * <[2] 16-bit length of additional fields>
+ * <[...] additional fields>
+ * <[1] 8-bit number of next hops (breadth)>
+ * <[...] next hop information>
+ *
+ * Next hop information record format:
+ * <[5] ZeroTier address of next hop>
+ * <[...] current best direct path address, if any, 0 if none>
+ *
+ * Circuit test reports can be sent by hops in a circuit test to report
+ * back results. They should include information about the sender as well
+ * as about the paths to which next hops are being sent.
+ *
+ * If a test report is received and no circuit test was sent, it should be
+ * ignored. This message generates no OK or ERROR response.
+ */
+ VERB_CIRCUIT_TEST_REPORT = 18
};
/**
@@ -940,19 +1053,12 @@ public:
ERROR_UNWANTED_MULTICAST = 8
};
- /**
- * @param v Verb
- * @return String representation (e.g. HELLO, OK)
- */
+#ifdef ZT_TRACE
static const char *verbString(Verb v)
throw();
-
- /**
- * @param e Error code
- * @return String error name
- */
static const char *errorString(ErrorCode e)
throw();
+#endif
template<unsigned int C2>
Packet(const Buffer<C2> &b) :