From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.7 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D2DD4C432C3 for ; Thu, 14 Nov 2019 10:57:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B7DF52070E for ; Thu, 14 Nov 2019 10:57:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727041AbfKNK5n (ORCPT ); Thu, 14 Nov 2019 05:57:43 -0500 Received: from mx2.suse.de ([195.135.220.15]:33316 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726142AbfKNK5l (ORCPT ); Thu, 14 Nov 2019 05:57:41 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 25E9CAD00; Thu, 14 Nov 2019 10:57:39 +0000 (UTC) From: Luis Henriques To: Jeff Layton , Sage Weil , Ilya Dryomov , "Yan, Zheng" Cc: ceph-devel@vger.kernel.org, linux-kernel@vger.kernel.org, Luis Henriques Subject: [RFC PATCH v2 1/4] ceph: add support for TYPE_MSGR2 address decode Date: Thu, 14 Nov 2019 10:57:33 +0000 Message-Id: <20191114105736.8636-2-lhenriques@suse.com> In-Reply-To: <20191114105736.8636-1-lhenriques@suse.com> References: <20191114105736.8636-1-lhenriques@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The new format actually includes two addresses: one the new messenger v2, and other for the legacy v1, which is the only one currently understood by kernel clients. Add code to pick the legacy address and ignore the v2 one. Signed-off-by: Luis Henriques --- include/linux/ceph/decode.h | 3 ++- net/ceph/decode.c | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/include/linux/ceph/decode.h b/include/linux/ceph/decode.h index 450384fe487c..2a2f07dfb39c 100644 --- a/include/linux/ceph/decode.h +++ b/include/linux/ceph/decode.h @@ -219,7 +219,8 @@ static inline void ceph_encode_timespec64(struct ceph_timespec *tv, * sockaddr_storage <-> ceph_sockaddr */ #define CEPH_ENTITY_ADDR_TYPE_NONE 0 -#define CEPH_ENTITY_ADDR_TYPE_LEGACY __cpu_to_le32(1) +#define CEPH_ENTITY_ADDR_TYPE_LEGACY __cpu_to_le32(1) /* legacy msgr1 */ +#define CEPH_ENTITY_ADDR_TYPE_MSGR2 __cpu_to_le32(2) /* msgr2 protocol */ static inline void ceph_encode_banner_addr(struct ceph_entity_addr *a) { diff --git a/net/ceph/decode.c b/net/ceph/decode.c index eea529595a7a..613a2bc6f805 100644 --- a/net/ceph/decode.c +++ b/net/ceph/decode.c @@ -67,16 +67,45 @@ ceph_decode_entity_addr_legacy(void **p, void *end, return ret; } +static int +ceph_decode_entity_addr_versioned_msgr2(void **p, void *end, + struct ceph_entity_addr *addr) +{ + struct ceph_entity_addr tmp_addr; + struct ceph_entity_addr *paddr = addr; + int ret = -EINVAL; + + ceph_decode_skip_32(p, end, bad); /* hard-coded '2' */ + ceph_decode_skip_8(p, end, bad); /* hard-coded '1' */ + + ret = ceph_decode_entity_addr_versioned(p, end, paddr); + if (ret) + goto bad; + /* If we already have a v1 address, simply skip over the other address */ + if (paddr->type == CEPH_ENTITY_ADDR_TYPE_LEGACY) + paddr = &tmp_addr; + + ceph_decode_skip_8(p, end, bad); /* hard-coded '1' */ + + ret = ceph_decode_entity_addr_versioned(p, end, paddr); + +bad: + return ret; +} + int ceph_decode_entity_addr(void **p, void *end, struct ceph_entity_addr *addr) { u8 marker; ceph_decode_8_safe(p, end, marker, bad); - if (marker == 1) + if (marker == CEPH_ENTITY_ADDR_TYPE_MSGR2) + return ceph_decode_entity_addr_versioned_msgr2(p, end, addr); + else if (marker == CEPH_ENTITY_ADDR_TYPE_LEGACY) return ceph_decode_entity_addr_versioned(p, end, addr); - else if (marker == 0) + else if (marker == CEPH_ENTITY_ADDR_TYPE_NONE) return ceph_decode_entity_addr_legacy(p, end, addr); + bad: return -EINVAL; }