From patchwork Fri Feb 17 15:27:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han Ding X-Patchwork-Id: 1744328 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PJG0311tWz23j7 for ; Sat, 18 Feb 2023 02:27:31 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id B3BB94105B; Fri, 17 Feb 2023 15:27:28 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org B3BB94105B X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Oek7ADkCXgIA; Fri, 17 Feb 2023 15:27:27 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp2.osuosl.org (Postfix) with ESMTPS id D389F40530; Fri, 17 Feb 2023 15:27:26 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org D389F40530 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 9C9C6C0032; Fri, 17 Feb 2023 15:27:26 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 454EAC002B for ; Fri, 17 Feb 2023 15:27:25 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 185B341BA8 for ; Fri, 17 Feb 2023 15:27:25 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 185B341BA8 X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id NjeiVAAZTAR3 for ; Fri, 17 Feb 2023 15:27:22 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org A4A4641BA6 Received: from chinatelecom.cn (prt-mail.chinatelecom.cn [42.123.76.219]) by smtp4.osuosl.org (Postfix) with ESMTP id A4A4641BA6 for ; Fri, 17 Feb 2023 15:27:21 +0000 (UTC) HMM_SOURCE_IP: 172.18.0.218:52055.561095417 HMM_ATTACHE_NUM: 0000 HMM_SOURCE_TYPE: SMTP Received: from clientip-114.241.9.172 (unknown [172.18.0.218]) by chinatelecom.cn (HERMES) with SMTP id 5BF9F2800AF for ; Fri, 17 Feb 2023 23:27:08 +0800 (CST) X-189-SAVE-TO-SEND: handing@chinatelecom.cn Received: from ([114.241.9.172]) by app0025 with ESMTP id fb5b991bbb204d418336f6758f58ed08 for dev@openvswitch.org; Fri, 17 Feb 2023 23:27:11 CST X-Transaction-ID: fb5b991bbb204d418336f6758f58ed08 X-Real-From: handing@chinatelecom.cn X-Receive-IP: 114.241.9.172 X-MEDUSA-Status: 0 Date: Fri, 17 Feb 2023 23:27:08 +0800 From: "Han Ding" To: dev X-Priority: 3 X-GUID: CFFDFDDF-F013-4002-AD15-A8175EA0C8CF X-Has-Attach: no X-Mailer: Foxmail 7.2.25.179[cn] Mime-Version: 1.0 Message-ID: <202302172327072723271@chinatelecom.cn> X-Content-Filtered-By: Mailman/MimeDel 2.1.15 Subject: [ovs-dev] [PATCH v4] ofproto-dpif-xlate: Remove repeated function for judge garp X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" Function is_gratuitous_arp() and function is_garp() are all used to judge whether the flow is gratuitous arp. It is not necessary to use two functions to do the same thing and just keep one. Gratuitous ARP message is a generally link-level broadcast messages and carry the same IP in sender and target fields. This patch add the check in function is_garp() whether the arp is a broadcast message and whether the arp is an arp request or an arp reply. Signed-off-by: Han Ding --- Notes: v2: - Add the check whether the ARP packet is a broadcast message in is_garp(). v3: - Add the check whether the packet is an arp request or an arp reply in is_garp(). v4: - Add description of differences between patch versions - Use WC_MASK_FIELD() macro instead of memset. lib/flow.h | 19 +++++++++++++++++-- ofproto/ofproto-dpif-xlate.c | 32 ++------------------------------ 2 files changed, 19 insertions(+), 32 deletions(-) -- 2.27.0 diff --git a/lib/flow.h b/lib/flow.h index c647ad83c..9294a1b24 100644 --- a/lib/flow.h +++ b/lib/flow.h @@ -1133,8 +1133,23 @@ static inline bool is_garp(const struct flow *flow, struct flow_wildcards *wc) { if (is_arp(flow)) { - return (FLOW_WC_GET_AND_MASK_WC(flow, wc, nw_src) == - FLOW_WC_GET_AND_MASK_WC(flow, wc, nw_dst)); + if (wc) { + WC_MASK_FIELD(wc, dl_dst); + } + + if (!eth_addr_is_broadcast(flow->dl_dst)) { + return false; + } + + if (wc) { + WC_MASK_FIELD(wc, nw_proto); + } + + if (flow->nw_proto == ARP_OP_REQUEST || + flow->nw_proto == ARP_OP_REPLY) { + return (FLOW_WC_GET_AND_MASK_WC(flow, wc, nw_src) == + FLOW_WC_GET_AND_MASK_WC(flow, wc, nw_dst)); + } } return false; diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index a9cf3cbee..b3c13f6bf 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -2543,34 +2543,6 @@ output_normal(struct xlate_ctx *ctx, const struct xbundle *out_xbundle, memcpy(&ctx->xin->flow.vlans, &old_vlans, sizeof(old_vlans)); } -/* A VM broadcasts a gratuitous ARP to indicate that it has resumed after - * migration. Older Citrix-patched Linux DomU used gratuitous ARP replies to - * indicate this; newer upstream kernels use gratuitous ARP requests. */ -static bool -is_gratuitous_arp(const struct flow *flow, struct flow_wildcards *wc) -{ - if (flow->dl_type != htons(ETH_TYPE_ARP)) { - return false; - } - - memset(&wc->masks.dl_dst, 0xff, sizeof wc->masks.dl_dst); - if (!eth_addr_is_broadcast(flow->dl_dst)) { - return false; - } - - memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto); - if (flow->nw_proto == ARP_OP_REPLY) { - return true; - } else if (flow->nw_proto == ARP_OP_REQUEST) { - memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src); - memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst); - - return flow->nw_src == flow->nw_dst; - } else { - return false; - } -} - /* Determines whether packets in 'flow' within 'xbridge' should be forwarded or * dropped. Returns true if they may be forwarded, false if they should be * dropped. @@ -2619,7 +2591,7 @@ is_admissible(struct xlate_ctx *ctx, struct xport *in_port, mac = mac_learning_lookup(xbridge->ml, flow->dl_src, vlan); if (mac && mac_entry_get_port(xbridge->ml, mac) != in_xbundle->ofbundle - && (!is_gratuitous_arp(flow, ctx->wc) + && (!is_garp(flow, ctx->wc) || mac_entry_is_grat_arp_locked(mac))) { ovs_rwlock_unlock(&xbridge->ml->rwlock); xlate_report(ctx, OFT_DETAIL, @@ -3062,7 +3034,7 @@ xlate_normal(struct xlate_ctx *ctx) } /* Learn source MAC. */ - bool is_grat_arp = is_gratuitous_arp(flow, wc); + bool is_grat_arp = is_garp(flow, wc); if (ctx->xin->allow_side_effects && flow->packet_type == htonl(PT_ETH) && in_port && in_port->pt_mode != NETDEV_PT_LEGACY_L3