From patchwork Wed Nov 25 09:59:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Bianconi X-Patchwork-Id: 1405972 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.137; helo=fraxinus.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=OhNxWTRS; dkim-atps=neutral Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CgxGG5H7Xz9sSf for ; Wed, 25 Nov 2020 21:00:22 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 4DA7786C3E; Wed, 25 Nov 2020 10:00:21 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 7D645Iksd-42; Wed, 25 Nov 2020 10:00:18 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by fraxinus.osuosl.org (Postfix) with ESMTP id 166A786BFE; Wed, 25 Nov 2020 10:00:15 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id EB78BC0052; Wed, 25 Nov 2020 10:00:14 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id C17F9C0052 for ; Wed, 25 Nov 2020 10:00:12 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 9454686BA5 for ; Wed, 25 Nov 2020 10:00:12 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id AejVA12ZPz1L for ; Wed, 25 Nov 2020 10:00:11 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by fraxinus.osuosl.org (Postfix) with ESMTPS id A441186BA8 for ; Wed, 25 Nov 2020 10:00:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1606298410; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RJ7BrNPtm0qzga3v80+/hG8ZlCTsd8dbnqnlLdora7E=; b=OhNxWTRS6OIV/h5r2h/Xmq0Rvp3FsA6yOgNbHXqvV4hoRKPEC2/3RhWzAZj6YsmGZx5zID Xs54qy2WnhMOD/aiZMVhNasHKYgx5M65cRWebLboUjQHO1ghV10bClqh9HFRDI7+4OYSLa Hf93GBmdKjDpTTB8+gzUG2XXIOTQrp0= Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-211-nveJMLtBM6WO3X6HLXfsCw-1; Wed, 25 Nov 2020 04:59:56 -0500 X-MC-Unique: nveJMLtBM6WO3X6HLXfsCw-1 Received: by mail-ed1-f71.google.com with SMTP id b68so840043edf.9 for ; Wed, 25 Nov 2020 01:59:56 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=RJ7BrNPtm0qzga3v80+/hG8ZlCTsd8dbnqnlLdora7E=; b=DwHFxZF+gEral2aZ5PLP3vNNep1TsKE6qQ/PKoj4LZmTw1IyyXHWr+S87MwvpyedBi gpJdBz9zxRp/OTm//3MXprPpflmEJMQaFCIc8iumgeZ5Ttu8WIi8kelztLN0MIaWYhAI TpbbhocoRbZCcR6YrOKcyw9Quw7cPthRGynGnbaKRzVAHtV/yoLCMNuTWPZB7L0wd+Qu QmXqOgvn6/FwiDt8WJUUpRPbj0ApsqFHgwD8WiBMbSJkRdH7oSA57dTHOUy5yegDtmB+ GPq74MuXdSiaJoMhFpfvPXLCoDjKC2X2mVsXCYViKJCVXG4tP8AGdOClpEVkc9P6UWEu LtvA== X-Gm-Message-State: AOAM531ecdkxLygLKV6d19njAQgMgzZ5qM/2Kz4vrI110DaYvbHITmpp HRL0qVUgoEy9G2BtqkO8Nb/+ucN/whnkHoX5PDWVa6kYJyXgsldbKxQr4zzpBy6EfKhcauWUNQG HKKPtxkrMZFCdYPBNlkJd66zF32aWnC8GiQHfMfWvGZEvKCTQDKF7U62UOf4eNptO2qCfDfcPbK s= X-Received: by 2002:a17:906:d784:: with SMTP id pj4mr2402758ejb.78.1606298395114; Wed, 25 Nov 2020 01:59:55 -0800 (PST) X-Google-Smtp-Source: ABdhPJzMh8T3V7ZqETHY+k5LTLmELjs7txPiJKpOuttkSZIAhsbY4n0OX2nqK+8RxWGoAVI/f3QRTg== X-Received: by 2002:a17:906:d784:: with SMTP id pj4mr2402749ejb.78.1606298394812; Wed, 25 Nov 2020 01:59:54 -0800 (PST) Received: from lore-desk.redhat.com ([151.66.8.153]) by smtp.gmail.com with ESMTPSA id g13sm936862edy.7.2020.11.25.01.59.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Nov 2020 01:59:54 -0800 (PST) From: Lorenzo Bianconi To: dev@openvswitch.org Date: Wed, 25 Nov 2020 10:59:41 +0100 Message-Id: X-Mailer: git-send-email 2.28.0 In-Reply-To: References: MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lorenzo.bianconi@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Cc: trozet@redhat.com Subject: [ovs-dev] [PATCH ovn 4/4] bfp: support demand mode on rx side 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" Introduce rx demand mode support according to RFC5880 [0]. Demand mode on tx side is not supported yet https://tools.ietf.org/html/rfc5880 Signed-off-by: Lorenzo Bianconi --- controller/pinctrl.c | 104 +++++++++++++++++++++++++++---------------- 1 file changed, 66 insertions(+), 38 deletions(-) diff --git a/controller/pinctrl.c b/controller/pinctrl.c index c46a19ca2..89b632058 100644 --- a/controller/pinctrl.c +++ b/controller/pinctrl.c @@ -331,7 +331,7 @@ static void bfd_monitor_send_msg(struct rconn *swconn, long long int *bfd_time) OVS_REQUIRES(pinctrl_mutex); static void pinctrl_handle_bfd_msg(struct rconn *swconn, const struct flow *ip_flow, - struct dp_packet *pkt_in, const struct match *md) + struct dp_packet *pkt_in) OVS_REQUIRES(pinctrl_mutex); static void bfd_monitor_run(const struct sbrec_bfd_table *bfd_table, struct ovsdb_idl_index *sbrec_port_binding_by_name, @@ -2981,7 +2981,7 @@ process_packet_in(struct rconn *swconn, const struct ofp_header *msg) case ACTION_OPCODE_BFD_MSG: ovs_mutex_lock(&pinctrl_mutex); - pinctrl_handle_bfd_msg(swconn, &headers, &packet, &pin.flow_metadata); + pinctrl_handle_bfd_msg(swconn, &headers, &packet); ovs_mutex_unlock(&pinctrl_mutex); break; @@ -6401,6 +6401,8 @@ struct bfd_entry { uint32_t local_min_rx; uint32_t remote_min_rx; + bool remote_demand_mode; + uint8_t local_mult; int64_t port_key; @@ -6482,7 +6484,8 @@ bfd_monitor_wait(long long int timeout) } static void -bfd_monitor_put_bfd_msg(struct bfd_entry *entry, struct dp_packet *packet) +bfd_monitor_put_bfd_msg(struct bfd_entry *entry, struct dp_packet *packet, + bool final) { struct udp_header *udp; struct bfd_msg *msg; @@ -6513,13 +6516,54 @@ bfd_monitor_put_bfd_msg(struct bfd_entry *entry, struct dp_packet *packet) msg->vers_diag = (BFD_VERSION << 5); msg->mult = entry->local_mult; msg->length = BFD_PACKET_LEN; - msg->flags = entry->state << 6; + msg->flags = final ? BFD_FLAG_FINAL : 0; + msg->flags |= entry->state << 6; msg->my_disc = entry->local_disc; msg->your_disc = entry->remote_disc; msg->min_tx = htonl(entry->local_min_tx * 1000); msg->min_rx = htonl(entry->local_min_rx * 1000); } +static void +pinctrl_send_bfd_tx_msg(struct rconn *swconn, struct bfd_entry *entry, + bool final) +{ + uint64_t packet_stub[256 / 8]; + struct dp_packet packet; + dp_packet_use_stub(&packet, packet_stub, sizeof packet_stub); + bfd_monitor_put_bfd_msg(entry, &packet, final); + + uint64_t ofpacts_stub[4096 / 8]; + struct ofpbuf ofpacts = OFPBUF_STUB_INITIALIZER(ofpacts_stub); + + /* Set MFF_LOG_DATAPATH and MFF_LOG_INPORT. */ + uint32_t dp_key = entry->metadata; + uint32_t port_key = entry->port_key; + put_load(dp_key, MFF_LOG_DATAPATH, 0, 64, &ofpacts); + put_load(port_key, MFF_LOG_INPORT, 0, 32, &ofpacts); + put_load(1, MFF_LOG_FLAGS, MLF_LOCAL_ONLY_BIT, 1, &ofpacts); + struct ofpact_resubmit *resubmit = ofpact_put_RESUBMIT(&ofpacts); + resubmit->in_port = OFPP_CONTROLLER; + resubmit->table_id = OFTABLE_LOG_INGRESS_PIPELINE; + + struct ofputil_packet_out po = { + .packet = dp_packet_data(&packet), + .packet_len = dp_packet_size(&packet), + .buffer_id = UINT32_MAX, + .ofpacts = ofpacts.data, + .ofpacts_len = ofpacts.size, + }; + + match_set_in_port(&po.flow_metadata, OFPP_CONTROLLER); + enum ofp_version version = rconn_get_version(swconn); + enum ofputil_protocol proto = + ofputil_protocol_from_ofp_version(version); + queue_msg(swconn, ofputil_encode_packet_out(&po, proto)); + dp_packet_uninit(&packet); + ofpbuf_uninit(&ofpacts); +} + + static bool bpf_monitor_need_update(void) { @@ -6570,40 +6614,11 @@ bfd_monitor_send_msg(struct rconn *swconn, long long int *bfd_time) goto next; } - uint64_t packet_stub[256 / 8]; - struct dp_packet packet; - dp_packet_use_stub(&packet, packet_stub, sizeof packet_stub); - bfd_monitor_put_bfd_msg(entry, &packet); - - uint64_t ofpacts_stub[4096 / 8]; - struct ofpbuf ofpacts = OFPBUF_STUB_INITIALIZER(ofpacts_stub); - - /* Set MFF_LOG_DATAPATH and MFF_LOG_INPORT. */ - uint32_t dp_key = entry->metadata; - uint32_t port_key = entry->port_key; - put_load(dp_key, MFF_LOG_DATAPATH, 0, 64, &ofpacts); - put_load(port_key, MFF_LOG_INPORT, 0, 32, &ofpacts); - put_load(1, MFF_LOG_FLAGS, MLF_LOCAL_ONLY_BIT, 1, &ofpacts); - struct ofpact_resubmit *resubmit = ofpact_put_RESUBMIT(&ofpacts); - resubmit->in_port = OFPP_CONTROLLER; - resubmit->table_id = OFTABLE_LOG_INGRESS_PIPELINE; - - struct ofputil_packet_out po = { - .packet = dp_packet_data(&packet), - .packet_len = dp_packet_size(&packet), - .buffer_id = UINT32_MAX, - .ofpacts = ofpacts.data, - .ofpacts_len = ofpacts.size, - }; - - match_set_in_port(&po.flow_metadata, OFPP_CONTROLLER); - enum ofp_version version = rconn_get_version(swconn); - enum ofputil_protocol proto = - ofputil_protocol_from_ofp_version(version); - queue_msg(swconn, ofputil_encode_packet_out(&po, proto)); - dp_packet_uninit(&packet); - ofpbuf_uninit(&ofpacts); + if (entry->remote_demand_mode) { + goto next; + } + pinctrl_send_bfd_tx_msg(swconn, entry, false); unsigned long tx_timeout = MAX(entry->local_min_tx, entry->remote_min_rx); tx_timeout -= random_range((tx_timeout * 25) / 100); @@ -6660,6 +6675,10 @@ pinctrl_check_bfd_msg(const struct flow *ip_flow, struct dp_packet *pkt_in) return false; } + if ((flags & BFD_FLAG_FINAL) && (flags & BFD_FLAG_POLL)) { + return false; + } + enum bfd_state peer_state = msg->flags >> 6; if (peer_state >= BFD_STATE_INIT && !msg->your_disc) { return false; @@ -6670,7 +6689,7 @@ pinctrl_check_bfd_msg(const struct flow *ip_flow, struct dp_packet *pkt_in) static void pinctrl_handle_bfd_msg(struct rconn *swconn, const struct flow *ip_flow, - struct dp_packet *pkt_in, const struct match *md) + struct dp_packet *pkt_in) OVS_REQUIRES(pinctrl_mutex) { if (!pinctrl_check_bfd_msg(ip_flow, pkt_in)) { @@ -6740,6 +6759,15 @@ pinctrl_handle_bfd_msg(struct rconn *swconn, const struct flow *ip_flow, break; } + if (entry->state == BFD_STATE_UP && + (msg->flags & BFD_FLAG_DEMAND)) { + entry->remote_demand_mode = true; + } + + if (msg->flags & BFD_FLAG_POLL) { + pinctrl_send_bfd_tx_msg(swconn, entry, true); + } + out: /* let's try to bacth db updates */ if (change_state) {