From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 4361C2BB9B for ; Wed, 17 Apr 2019 15:56:41 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8qAEO0kl_Frg for ; Wed, 17 Apr 2019 15:56:40 -0400 (EDT) Received: from smtpng2.m.smailru.net (smtpng2.m.smailru.net [94.100.179.3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 560472B9B6 for ; Wed, 17 Apr 2019 15:56:40 -0400 (EDT) From: Vladislav Shpilevoy Subject: [tarantool-patches] [PATCH 2/4] swim: extract binary ip/port into a separate struct Date: Wed, 17 Apr 2019 22:56:35 +0300 Message-Id: <86e84b69ecdd3ddd8e8abcb0f0b3818ba8d73d86.1555530516.git.v.shpilevoy@tarantool.org> In-Reply-To: References: In-Reply-To: References: Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-Help: List-Unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-Subscribe: List-Owner: List-post: List-Archive: To: tarantool-patches@freelists.org Cc: kostja@tarantool.org At this moment there are two binary structures in the SWIM protocol carrying an address: swim_member_passport and swim_meta_header_bin - one address in each. This code duplication was not formidable enough to stimulate creation of a separate address structure. But forthcoming indirect messages protocol extensions will add 2 new cases of encoding a binary address. It triggered this patch to reduce code duplication. Part of #3234 --- src/lib/swim/swim_proto.c | 51 ++++++++++++++++++++++++++---------- src/lib/swim/swim_proto.h | 55 +++++++++++++++++++++++---------------- 2 files changed, 70 insertions(+), 36 deletions(-) diff --git a/src/lib/swim/swim_proto.c b/src/lib/swim/swim_proto.c index cd9dd195b..ce52faf1b 100644 --- a/src/lib/swim/swim_proto.c +++ b/src/lib/swim/swim_proto.c @@ -168,6 +168,31 @@ swim_check_inaddr_not_empty(const struct sockaddr_in *addr, const char *prefix, return -1; } +/** + * Create a binary address structure. It requires explicit IP and + * port keys specification since the keys depend on the component + * employing the address. + */ +static inline void +swim_inaddr_bin_create(struct swim_inaddr_bin *bin, uint8_t ip_key, + uint8_t port_key) +{ + assert(mp_sizeof_uint(ip_key) == 1 && mp_sizeof_uint(port_key) == 1); + bin->k_addr = ip_key; + bin->m_addr = 0xce; + bin->k_port = port_key; + bin->m_port = 0xcd; +} + +/** Fill already created @a bin with a real inet address. */ +static inline void +swim_inaddr_bin_fill(struct swim_inaddr_bin *bin, + const struct sockaddr_in *addr) +{ + bin->v_addr = mp_bswap_u32(ntohl(addr->sin_addr.s_addr)); + bin->v_port = mp_bswap_u16(ntohs(addr->sin_port)); +} + void swim_member_def_create(struct swim_member_def *def) { @@ -343,12 +368,12 @@ swim_anti_entropy_header_bin_create(struct swim_anti_entropy_header_bin *header, void swim_passport_bin_create(struct swim_passport_bin *passport) { - passport->m_header = 0x85; + int map_size = 3 + SWIM_INADDR_BIN_SIZE; + assert(mp_sizeof_map(map_size) == 1); + passport->m_header = 0x80 | map_size; passport->k_status = SWIM_MEMBER_STATUS; - passport->k_addr = SWIM_MEMBER_ADDRESS; - passport->m_addr = 0xce; - passport->k_port = SWIM_MEMBER_PORT; - passport->m_port = 0xcd; + swim_inaddr_bin_create(&passport->addr, SWIM_MEMBER_ADDRESS, + SWIM_MEMBER_PORT); passport->k_uuid = SWIM_MEMBER_UUID; passport->m_uuid = 0xc4; passport->m_uuid_len = UUID_LEN; @@ -363,8 +388,7 @@ swim_passport_bin_fill(struct swim_passport_bin *passport, enum swim_member_status status, uint64_t incarnation) { passport->v_status = status; - passport->v_addr = mp_bswap_u32(ntohl(addr->sin_addr.s_addr)); - passport->v_port = mp_bswap_u16(ntohs(addr->sin_port)); + swim_inaddr_bin_fill(&passport->addr, addr); memcpy(passport->v_uuid, uuid, UUID_LEN); passport->v_incarnation = mp_bswap_u64(incarnation); } @@ -382,16 +406,15 @@ void swim_meta_header_bin_create(struct swim_meta_header_bin *header, const struct sockaddr_in *src) { - header->m_header = 0x83; + int map_size = 1 + SWIM_INADDR_BIN_SIZE; + assert(mp_sizeof_map(map_size) == 1); + header->m_header = 0x80 | map_size; header->k_version = SWIM_META_TARANTOOL_VERSION; header->m_version = 0xce; header->v_version = mp_bswap_u32(tarantool_version_id()); - header->k_addr = SWIM_META_SRC_ADDRESS; - header->m_addr = 0xce; - header->v_addr = mp_bswap_u32(ntohl(src->sin_addr.s_addr)); - header->k_port = SWIM_META_SRC_PORT; - header->m_port = 0xcd; - header->v_port = mp_bswap_u16(ntohs(src->sin_port)); + swim_inaddr_bin_create(&header->src_addr, SWIM_META_SRC_ADDRESS, + SWIM_META_SRC_PORT); + swim_inaddr_bin_fill(&header->src_addr, src); } int diff --git a/src/lib/swim/swim_proto.h b/src/lib/swim/swim_proto.h index c6ff4539d..db366f729 100644 --- a/src/lib/swim/swim_proto.h +++ b/src/lib/swim/swim_proto.h @@ -232,6 +232,35 @@ swim_failure_detection_def_decode(struct swim_failure_detection_def *def, /** {{{ Anti-entropy component */ +enum { + /** + * Number of keys in the address binary structure. + * Structures storing an address should use this size so + * as to correctly encode MessagePack map header. + */ + SWIM_INADDR_BIN_SIZE = 2, +}; + +/** + * Binary inet address structure. It contains two fields at this + * moment - IP and port encoded as usual numbers. It means that + * after mp_decode_uint() it is necessary to use htonl/htons() + * functions to assign the values to struct sockaddr_in. + */ +struct PACKED swim_inaddr_bin { + /** mp_encode_uint(address key) */ + uint8_t k_addr; + /** mp_encode_uint(ntohl(addr.sin_addr.s_addr)) */ + uint8_t m_addr; + uint32_t v_addr; + + /** mp_encode_uint(port key) */ + uint8_t k_port; + /** mp_encode_uint(ntohs(addr.sin_port)) */ + uint8_t m_port; + uint16_t v_port; +}; + /** * Attributes of each record of a broadcasted member table. Just * the same as some of struct swim_member attributes. @@ -279,17 +308,8 @@ struct PACKED swim_passport_bin { /** mp_encode_uint(enum member_status) */ uint8_t v_status; - /** mp_encode_uint(SWIM_MEMBER_ADDRESS) */ - uint8_t k_addr; - /** mp_encode_uint(addr.sin_addr.s_addr) */ - uint8_t m_addr; - uint32_t v_addr; - - /** mp_encode_uint(SWIM_MEMBER_PORT) */ - uint8_t k_port; - /** mp_encode_uint(addr.sin_port) */ - uint8_t m_port; - uint16_t v_port; + /** SWIM_MEMBER_ADDRESS and SWIM_MEMBER_PORT. */ + struct swim_inaddr_bin addr; /** mp_encode_uint(SWIM_MEMBER_UUID) */ uint8_t k_uuid; @@ -386,17 +406,8 @@ struct PACKED swim_meta_header_bin { uint8_t m_version; uint32_t v_version; - /** mp_encode_uint(SWIM_META_SRC_ADDRESS) */ - uint8_t k_addr; - /** mp_encode_uint(addr.sin_addr.s_addr) */ - uint8_t m_addr; - uint32_t v_addr; - - /** mp_encode_uint(SWIM_META_SRC_PORT) */ - uint8_t k_port; - /** mp_encode_uint(addr.sin_port) */ - uint8_t m_port; - uint16_t v_port; + /** SWIM_META_SRC_ADDRESS and SWIM_META_SRC_PORT. */ + struct swim_inaddr_bin src_addr; }; /** Initialize meta section. */ -- 2.17.2 (Apple Git-113)