|
|
|
|
@ -148,6 +148,10 @@
|
|
|
|
|
|
|
|
|
|
// Field incides for parsing verbs -------------------------------------------
|
|
|
|
|
|
|
|
|
|
// Some verbs have variable-length fields. Those aren't fully defined here
|
|
|
|
|
// yet-- instead they are parsed using relative indexes in IncomingPacket.
|
|
|
|
|
// See their respective handler functions.
|
|
|
|
|
|
|
|
|
|
#define ZT_PROTO_VERB_HELLO_IDX_PROTOCOL_VERSION (ZT_PACKET_IDX_PAYLOAD) |
|
|
|
|
#define ZT_PROTO_VERB_HELLO_IDX_MAJOR_VERSION (ZT_PROTO_VERB_HELLO_IDX_PROTOCOL_VERSION + 1) |
|
|
|
|
#define ZT_PROTO_VERB_HELLO_IDX_MINOR_VERSION (ZT_PROTO_VERB_HELLO_IDX_MAJOR_VERSION + 1) |
|
|
|
|
@ -188,40 +192,41 @@
|
|
|
|
|
#define ZT_PROTO_VERB_EXT_FRAME_LEN_ETHERTYPE 2 |
|
|
|
|
#define ZT_PROTO_VERB_EXT_FRAME_IDX_PAYLOAD (ZT_PROTO_VERB_EXT_FRAME_IDX_ETHERTYPE + ZT_PROTO_VERB_EXT_FRAME_LEN_ETHERTYPE) |
|
|
|
|
|
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_DEPTH (ZT_PACKET_IDX_PAYLOAD) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_DEPTH 2 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_FIFO (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_DEPTH + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_DEPTH) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_FIFO 320 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_BLOOM (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_FIFO + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_FIFO) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_BLOOM 1024 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FLAGS (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_BLOOM + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_BLOOM) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_FLAGS 1 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX__START_OF_SIGNED_PORTION (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FLAGS) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_NETWORK_ID (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FLAGS + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_FLAGS) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_NETWORK_ID 8 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_BLOOM_NONCE (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_NETWORK_ID + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_NETWORK_ID) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_BLOOM_NONCE 2 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_PREFIX_BITS (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_BLOOM_NONCE + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_BLOOM_NONCE) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_PREFIX_BITS 1 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_PREFIX (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_PREFIX_BITS + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_PREFIX_BITS) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_PREFIX 1 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ORIGIN (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_PREFIX + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_PREFIX) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_ORIGIN 5 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ORIGIN_MCID (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ORIGIN + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_ORIGIN) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_ORIGIN_MCID 3 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_GUID (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ORIGIN) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_GUID 8 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_SOURCE_MAC (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ORIGIN_MCID + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_ORIGIN_MCID) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_SOURCE_MAC 6 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_DEST_MAC (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_SOURCE_MAC + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_SOURCE_MAC) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_DEST_MAC 6 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_DEST_ADI (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_DEST_MAC + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_DEST_MAC) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_DEST_ADI 4 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ETHERTYPE (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_DEST_ADI + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_DEST_ADI) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_ETHERTYPE 2 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FRAME_LEN (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ETHERTYPE + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_ETHERTYPE) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_LEN_FRAME_LEN 2 |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FRAME (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FRAME_LEN + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_FRAME_LEN) |
|
|
|
|
// P5_MULTICAST_FRAME is deprecated
|
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_PROPAGATION_DEPTH (ZT_PACKET_IDX_PAYLOAD) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_PROPAGATION_DEPTH 2 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_PROPAGATION_FIFO (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_DEPTH + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_DEPTH) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_PROPAGATION_FIFO 320 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_PROPAGATION_BLOOM (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_FIFO + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_FIFO) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_PROPAGATION_BLOOM 1024 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_FLAGS (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_BLOOM + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_BLOOM) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_FLAGS 1 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX__START_OF_SIGNED_PORTION (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FLAGS) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_NETWORK_ID (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FLAGS + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_FLAGS) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_NETWORK_ID 8 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_PROPAGATION_BLOOM_NONCE (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_NETWORK_ID + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_NETWORK_ID) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_PROPAGATION_BLOOM_NONCE 2 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_PROPAGATION_PREFIX_BITS (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_BLOOM_NONCE + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_BLOOM_NONCE) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_PROPAGATION_PREFIX_BITS 1 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_PROPAGATION_PREFIX (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_PREFIX_BITS + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_PREFIX_BITS) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_PROPAGATION_PREFIX 1 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_ORIGIN (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_PROPAGATION_PREFIX + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_PROPAGATION_PREFIX) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_ORIGIN 5 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_ORIGIN_MCID (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ORIGIN + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_ORIGIN) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_ORIGIN_MCID 3 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_GUID (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ORIGIN) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_GUID 8 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_SOURCE_MAC (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ORIGIN_MCID + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_ORIGIN_MCID) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_SOURCE_MAC 6 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_DEST_MAC (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_SOURCE_MAC + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_SOURCE_MAC) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_DEST_MAC 6 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_DEST_ADI (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_DEST_MAC + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_DEST_MAC) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_DEST_ADI 4 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_ETHERTYPE (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_DEST_ADI + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_DEST_ADI) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_ETHERTYPE 2 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_FRAME_LEN (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_ETHERTYPE + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_ETHERTYPE) |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_LEN_FRAME_LEN 2 |
|
|
|
|
#define ZT_PROTO_VERB_P5_MULTICAST_FRAME_IDX_FRAME (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FRAME_LEN + ZT_PROTO_VERB_MULTICAST_FRAME_LEN_FRAME_LEN) |
|
|
|
|
|
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_FLAGS_HAS_MEMBERSHIP_CERTIFICATE 0x01 |
|
|
|
|
|
|
|
|
|
@ -229,6 +234,18 @@
|
|
|
|
|
#define ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT_LEN (ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_NETWORK_ID + 8) |
|
|
|
|
#define ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT (ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT_LEN + 2) |
|
|
|
|
|
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_GATHER_IDX_NETWORK_ID (ZT_PACKET_IDX_PAYLOAD) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_GATHER_IDX_FLAGS (ZT_PROTO_VERB_MULTICAST_GATHER_IDX_NETWORK_ID + 8) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_GATHER_IDX_MAC (ZT_PROTO_VERB_MULTICAST_GATHER_IDX_FLAGS + 1) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_GATHER_IDX_ADI (ZT_PROTO_VERB_MULTICAST_GATHER_IDX_MAC + 6) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_GATHER_IDX_GATHER_LIMIT (ZT_PROTO_VERB_MULTICAST_GATHER_IDX_ADI + 4) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_GATHER_IDX_COM (ZT_PROTO_VERB_MULTICAST_GATHER_IDX_GATHER_LIMIT + 4) |
|
|
|
|
|
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_NETWORK_ID (ZT_PACKET_IDX_PAYLOAD) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FLAGS (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_NETWORK_ID + 8) |
|
|
|
|
#define ZT_PROTO_VERB_MULTICAST_FRAME_IDX_GATHER_LIMIT (ZT_PROTO_VERB_MULTICAST_FRAME_IDX_FLAGS + 1) |
|
|
|
|
// remainder are relative to offset after COM -- might do this with macros at some point
|
|
|
|
|
|
|
|
|
|
#define ZT_PROTO_VERB_HELLO__OK__IDX_TIMESTAMP (ZT_PROTO_VERB_OK_IDX_PAYLOAD) |
|
|
|
|
#define ZT_PROTO_VERB_HELLO__OK__IDX_PROTOCOL_VERSION (ZT_PROTO_VERB_HELLO__OK__IDX_TIMESTAMP + 8) |
|
|
|
|
#define ZT_PROTO_VERB_HELLO__OK__IDX_MAJOR_VERSION (ZT_PROTO_VERB_HELLO__OK__IDX_PROTOCOL_VERSION + 1) |
|
|
|
|
@ -665,16 +682,20 @@ public:
|
|
|
|
|
* <[6] MAC address of multicast group being queried> |
|
|
|
|
* <[4] 32-bit ADI for multicast group being queried> |
|
|
|
|
* <[4] 32-bit (suggested) max number of multicast peers desired or 0 for no limit> |
|
|
|
|
* [<[...] network membership certificate (optional)>] |
|
|
|
|
* [<[...] network certificate of membership if included>] |
|
|
|
|
* |
|
|
|
|
* Flags are: |
|
|
|
|
* 0x01 - network membership certificate is included |
|
|
|
|
* Flags: |
|
|
|
|
* 0x01 - Network certificate of membership is attached |
|
|
|
|
* |
|
|
|
|
* This message asks a peer for additional known endpoints that have |
|
|
|
|
* LIKEd a given multicast group. It's sent when the sender wishes |
|
|
|
|
* to send multicast but does not have the desired number of recipient |
|
|
|
|
* peers. |
|
|
|
|
* |
|
|
|
|
* A certificate of network membership can be included so that peers |
|
|
|
|
* can check network membership before responding. Without certificate |
|
|
|
|
* check any peer could probe multicast memberships on any network. |
|
|
|
|
* |
|
|
|
|
* OK response payload: |
|
|
|
|
* <[8] 64-bit network ID> |
|
|
|
|
* <[6] MAC address of multicast group being queried> |
|
|
|
|
@ -698,27 +719,30 @@ public:
|
|
|
|
|
|
|
|
|
|
/* Multicast frame:
|
|
|
|
|
* <[8] 64-bit network ID> |
|
|
|
|
* <[1] flags (currently unused, must be 0)> |
|
|
|
|
* <[4] 32-bit (suggested) gather limit or 0 for no gathering> |
|
|
|
|
* <[1] flags> |
|
|
|
|
* <[4] 32-bit (suggested) gather limit or 0 for no implicit gathering> |
|
|
|
|
* [<[...] network certificate of membership if included>] |
|
|
|
|
* <[4] 32-bit multicast ADI (note that this is out of order here -- it precedes MAC)> |
|
|
|
|
* <[6] destination MAC or all zero for destination node> |
|
|
|
|
* <[6] source MAC or all zero for node of origin> |
|
|
|
|
* <[2] 16-bit ethertype> |
|
|
|
|
* <[...] ethernet payload> |
|
|
|
|
* |
|
|
|
|
* Flags: |
|
|
|
|
* 0x01 - Network certificate of membership is attached |
|
|
|
|
* |
|
|
|
|
* This is similar to EXT_FRAME but carries a multicast, and is sent |
|
|
|
|
* out to recipients on a multicast list. |
|
|
|
|
* out to recipients on a multicast list. It may also specify a desired |
|
|
|
|
* number of multicast peers to gather, which is called "implicit |
|
|
|
|
* gathering." It is only allowed if certificate authentication permits |
|
|
|
|
* these peers to communicate on this network. |
|
|
|
|
* |
|
|
|
|
* (ADI precedes MAC here so that everything from destination MAC forward |
|
|
|
|
* could be treated as a raw Ethernet frame.) |
|
|
|
|
* |
|
|
|
|
* OK response payload: |
|
|
|
|
* <[1] flags> |
|
|
|
|
* [... same as OK(GATHER) if flag 0x01 is set ...] |
|
|
|
|
* |
|
|
|
|
* Flags in OK are 0x01 for "gathering results returned," which can be |
|
|
|
|
* sent if a gather limit is specified in the original FRAME and there |
|
|
|
|
* are known endpoints to gather. This way frames can also gather. |
|
|
|
|
* <[1] flags, 0x01 if implicit gathering results are included> |
|
|
|
|
* [... same as OK(MULTICAST_GATHER) payload if flag 0x01 is set ...] |
|
|
|
|
* |
|
|
|
|
* ERROR response payload: |
|
|
|
|
* <[6] multicast group MAC> |
|
|
|
|
|