From patchwork Mon Feb 20 10:05:27 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han Ding X-Patchwork-Id: 1744981 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::137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) (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 4PKyjS53fXz23j7 for ; Mon, 20 Feb 2023 21:05:48 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 64193414CD; Mon, 20 Feb 2023 10:05:46 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 64193414CD 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 5MFgM2R_u4Ky; Mon, 20 Feb 2023 10:05:45 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp4.osuosl.org (Postfix) with ESMTPS id EB04E414C6; Mon, 20 Feb 2023 10:05:43 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org EB04E414C6 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B5D06C0032; Mon, 20 Feb 2023 10:05:43 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 09726C002B for ; Mon, 20 Feb 2023 10:05:42 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id C535660D78 for ; Mon, 20 Feb 2023 10:05:41 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org C535660D78 X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id RW1GdITl4LR9 for ; Mon, 20 Feb 2023 10:05:40 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 2309760760 Received: from chinatelecom.cn (prt-mail.chinatelecom.cn [42.123.76.220]) by smtp3.osuosl.org (Postfix) with ESMTP id 2309760760 for ; Mon, 20 Feb 2023 10:05:38 +0000 (UTC) HMM_SOURCE_IP: 172.18.0.48:60376.154853673 HMM_ATTACHE_NUM: 0000 HMM_SOURCE_TYPE: SMTP Received: from clientip-10.133.8.238 (unknown [172.18.0.48]) by chinatelecom.cn (HERMES) with SMTP id 35D862800BF for ; Mon, 20 Feb 2023 18:05:28 +0800 (CST) X-189-SAVE-TO-SEND: handing@chinatelecom.cn Received: from ([10.133.8.238]) by app0024 with ESMTP id e1161adb337f4756a1749976bb2fbf1e for dev@openvswitch.org; Mon, 20 Feb 2023 18:05:33 CST X-Transaction-ID: e1161adb337f4756a1749976bb2fbf1e X-Real-From: handing@chinatelecom.cn X-Receive-IP: 10.133.8.238 X-MEDUSA-Status: 0 Date: Mon, 20 Feb 2023 18:05:27 +0800 From: "Han Ding" To: "dev@openvswitch.org" X-Priority: 3 X-GUID: D761BB71-242F-4580-8EB5-C8A5147FCAC0 X-Has-Attach: no X-Mailer: Foxmail 7.2.25.179[cn] Mime-Version: 1.0 Message-ID: <202302201805271248342@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 | 16 +++++++++++++--- ofproto/ofproto-dpif-xlate.c | 32 ++------------------------------ 2 files changed, 15 insertions(+), 33 deletions(-) -- 2.27.0 diff --git a/lib/flow.h b/lib/flow.h index c647ad83c..037deb6cd 100644 --- a/lib/flow.h +++ b/lib/flow.h @@ -1133,10 +1133,20 @@ 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 (!eth_addr_is_broadcast(FLOW_WC_GET_AND_MASK_WC(flow, wc, 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