diff options
Diffstat (limited to 'src/handshake.h')
-rw-r--r-- | src/handshake.h | 84 |
1 files changed, 53 insertions, 31 deletions
diff --git a/src/handshake.h b/src/handshake.h index 7b5ebf3..34597ed 100644 --- a/src/handshake.h +++ b/src/handshake.h @@ -23,57 +23,72 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/** + \file src/handshake.h + + Functions and structures for composing and decomposing handshake packets +*/ + #pragma once #include "fastd.h" +/** + The type field of a handshake TLV record + + In the handshake packet, the type field will be 2 bytes wide and big endian +*/ typedef enum fastd_handshake_record_type { - RECORD_HANDSHAKE_TYPE = 0, - RECORD_REPLY_CODE, - RECORD_ERROR_DETAIL, - RECORD_FLAGS, - RECORD_MODE, - RECORD_PROTOCOL_NAME, - RECORD_PROTOCOL1, - RECORD_PROTOCOL2, - RECORD_PROTOCOL3, - RECORD_PROTOCOL4, - RECORD_PROTOCOL5, - RECORD_MTU, - RECORD_METHOD_NAME, - RECORD_VERSION_NAME, - RECORD_METHOD_LIST, - RECORD_TLV_MAC, - RECORD_MAX, + RECORD_HANDSHAKE_TYPE = 0, /**< the handshake type (initial, response or finish) */ + RECORD_REPLY_CODE, /**< The reply code */ + RECORD_ERROR_DETAIL, /**< The error detail code */ + RECORD_FLAGS, /**< The flags field */ + RECORD_MODE, /**< The mode field */ + RECORD_PROTOCOL_NAME, /**< The handshake protocol */ + RECORD_PROTOCOL1, /**< Protocol-specific value 1 */ + RECORD_PROTOCOL2, /**< Protocol-specific value 2 */ + RECORD_PROTOCOL3, /**< Protocol-specific value 3 */ + RECORD_PROTOCOL4, /**< Protocol-specific value 4 */ + RECORD_PROTOCOL5, /**< Protocol-specific value 5 */ + RECORD_MTU, /**< MTU field */ + RECORD_METHOD_NAME, /**< The default/chosen method */ + RECORD_VERSION_NAME, /**< The fastd version */ + RECORD_METHOD_LIST, /**< Zero-separated list of supported methods */ + RECORD_TLV_MAC, /**< Message authentication code of the TLV records */ + RECORD_MAX, /**< (Number of defined record types) */ } fastd_handshake_record_type_t; +/** The reply codes */ typedef enum fastd_reply_code { - REPLY_SUCCESS = 0, - REPLY_MANDATORY_MISSING, - REPLY_UNACCEPTABLE_VALUE, - REPLY_MAX, + REPLY_SUCCESS = 0, /**< The handshake was sucessfull */ + REPLY_MANDATORY_MISSING, /**< A required TLV field is missing */ + REPLY_UNACCEPTABLE_VALUE, /**< A TLV field has an invalid value */ + REPLY_MAX, /**< (Number of defined reply codes */ } fastd_reply_code_t; +/** The handshake packet structure (not including the initial packet type byte) */ typedef struct __attribute__((__packed__)) fastd_handshake_packet { - uint8_t rsv; - uint16_t tlv_len; - uint8_t tlv_data[]; + uint8_t rsv; /**< Reserved (must be 0) */ + uint16_t tlv_len; /**< Length of the TLV records (before fastd v11 this was always 0, which is interpreted as "the whole packet") */ + uint8_t tlv_data[]; /**< TLV record data */ } fastd_handshake_packet_t; +/** A record descriptor */ typedef struct fastd_handshake_record { - size_t length; - uint8_t *data; + size_t length; /**< The length of the value */ + uint8_t *data; /**< Points to the value of the TLV record */ } fastd_handshake_record_t; +/** Describes a handshake packet */ struct fastd_handshake { - uint8_t type; - const char *peer_version; - fastd_handshake_record_t records[RECORD_MAX]; - uint16_t tlv_len; - void *tlv_data; + uint8_t type; /**< The handshake type */ + const char *peer_version; /**< The fastd version of the peer */ + fastd_handshake_record_t records[RECORD_MAX]; /**< The TLV records of the handshake */ + uint16_t tlv_len; /**< The length of the TLV record data */ + void *tlv_data; /**< TLV record data */ }; @@ -83,16 +98,19 @@ fastd_buffer_t fastd_handshake_new_reply(uint8_t type, const fastd_method_info_t void fastd_handshake_handle(fastd_socket_t *sock, const fastd_peer_address_t *local_addr, const fastd_peer_address_t *remote_addr, fastd_peer_t *peer, fastd_buffer_t buffer); +/** Returns the TLV data of a handshake packet in a given buffer */ static inline void* fastd_handshake_tlv_data(const fastd_buffer_t *buffer) { fastd_handshake_packet_t *packet = buffer->data; return packet->tlv_data; } +/** Returns the length the TLV data of a handshake packet in a given buffer */ static inline uint16_t fastd_handshake_tlv_len(const fastd_buffer_t *buffer) { fastd_handshake_packet_t *packet = buffer->data; return ntohs(packet->tlv_len); } +/** Adds an uninitialized TLV record of given type and length to a handshake buffer */ static inline uint8_t* fastd_handshake_extend(fastd_buffer_t *buffer, fastd_handshake_record_type_t type, size_t len) { uint8_t *dst = buffer->data + buffer->len; @@ -112,12 +130,14 @@ static inline uint8_t* fastd_handshake_extend(fastd_buffer_t *buffer, fastd_hand return dst+4; } +/** Adds an TLV record of given type and length initialized with arbitraty data to a handshake buffer */ static inline void fastd_handshake_add(fastd_buffer_t *buffer, fastd_handshake_record_type_t type, size_t len, const void *data) { uint8_t *dst = fastd_handshake_extend(buffer, type, len); memcpy(dst, data, len); } +/** Adds an TLV record of given type and length initialized with zeros to a handshake buffer */ static inline uint8_t* fastd_handshake_add_zero(fastd_buffer_t *buffer, fastd_handshake_record_type_t type, size_t len) { uint8_t *dst = fastd_handshake_extend(buffer, type, len); @@ -125,12 +145,14 @@ static inline uint8_t* fastd_handshake_add_zero(fastd_buffer_t *buffer, fastd_ha return dst; } +/** Adds an uint8 TLV record of given type and value to a handshake buffer */ static inline void fastd_handshake_add_uint8(fastd_buffer_t *buffer, fastd_handshake_record_type_t type, uint8_t value) { uint8_t *dst = fastd_handshake_extend(buffer, type, 1); dst[0] = value; } +/** Adds an uint16 TLV record of given type and value to a handshake buffer */ static inline void fastd_handshake_add_uint16(fastd_buffer_t *buffer, fastd_handshake_record_type_t type, uint16_t value) { uint8_t *dst = fastd_handshake_extend(buffer, type, 2); |