From patchwork Thu Sep 16 22:16:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Bianconi X-Patchwork-Id: 1529085 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org 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=AsihwiQZ; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4H9WdP3kgBz9sPf for ; Fri, 17 Sep 2021 08:16:25 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 5468640815; Thu, 16 Sep 2021 22:16:23 +0000 (UTC) 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 P8eN1kr1jEKI; Thu, 16 Sep 2021 22:16:22 +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 4DE1B4014A; Thu, 16 Sep 2021 22:16:21 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0660BC000F; Thu, 16 Sep 2021 22:16:21 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 8A81DC000D for ; Thu, 16 Sep 2021 22:16:19 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 660E760611 for ; Thu, 16 Sep 2021 22:16:19 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp3.osuosl.org (amavisd-new); dkim=pass (1024-bit key) header.d=redhat.com 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 MAB_RsOyL91E for ; Thu, 16 Sep 2021 22:16:17 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by smtp3.osuosl.org (Postfix) with ESMTPS id 774DF6060E for ; Thu, 16 Sep 2021 22:16:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1631830576; 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; bh=cn0HNelql3k0/QLFuW39zrHDuwk7tGdO5aXMJz5aKrU=; b=AsihwiQZQHUQwB0kDwKjo9pEBWhF8cPDysukUs66vNoUDB0R44KBP0p8T4RHtjnFvW9nDi wa8YX7zpzu1XfpI6FCRv0EPtQw40d09LZ4ceOuo+iYnEaq1yFKXUuEvJ/WoQuCj7hPm0Zv IYSnbGXS8d47Vp9sAB6yxiT5iK2hk2Y= Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-485-bGkzCAPOPHSmY95EEz04nA-1; Thu, 16 Sep 2021 18:16:15 -0400 X-MC-Unique: bGkzCAPOPHSmY95EEz04nA-1 Received: by mail-ed1-f70.google.com with SMTP id n5-20020a05640206c500b003cf53f7cef2so4220848edy.12 for ; Thu, 16 Sep 2021 15:16:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=cn0HNelql3k0/QLFuW39zrHDuwk7tGdO5aXMJz5aKrU=; b=HhQ0ogJ6Lx79RZFt6QoAOjtB76ajrbRTZSpIZO+ugnBDIvdttEpGKkdU+UH38vV5iP +kGAp4d/yAS88M54Us9ZE6sPGN0sO8iZf1Pg2gV2JrBt2OXVU6RwC8U56RQngcjq1Md7 QvBiUETFJTsj2FTRQKAWaBb80sAN6+I9W0QFkbLwqza1CmEfSB6oOEFalDbRTr4tZVh1 9LOCm7IKDqSqTKIxSV4ucCygK42p6XmkmSspxqcEHm6y/cUCXUiIjnEre5iTVeI4lMld Smz+4+nlILNdDQjJuiiqyf1L4S2peRrX3/CQJayB0qDm8dfkoCDp5erXuw0JLi/wt8t8 yFdQ== X-Gm-Message-State: AOAM532OJKK0SuWJLMx5C3yWsrNHa5uALwQJoEcVy4FTx638CyaaWZNJ uBQanCK24kHQ+UTnpxO12VP9rRpXh4fOqRqiSI2gnYb4+dasBrpV201elsbgQ2bpwVBJ0Np3RqB om5uKzX1BB0O5sQM2++XKLZ9yPjCvjUX9RxJ1exAMOvY3QGpw5CrKT81+SpSeXHzgpbhU4pILDB DnJsmY X-Received: by 2002:a17:906:d1d6:: with SMTP id bs22mr8814254ejb.554.1631830573514; Thu, 16 Sep 2021 15:16:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw/cBjUnjgyniDfkSOtgPvEKWAIrn+oQcy1Np0rfkI13uIdPRjn6ubWea1OV289DwxCLDcT8Q== X-Received: by 2002:a17:906:d1d6:: with SMTP id bs22mr8814226ejb.554.1631830573201; Thu, 16 Sep 2021 15:16:13 -0700 (PDT) Received: from lore-desk.redhat.com (net-130-25-199-50.cust.vodafonedsl.it. [130.25.199.50]) by smtp.gmail.com with ESMTPSA id kv22sm1122203ejc.78.2021.09.16.15.16.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Sep 2021 15:16:12 -0700 (PDT) From: Lorenzo Bianconi To: ovs-dev@openvswitch.org Date: Fri, 17 Sep 2021 00:16:00 +0200 Message-Id: X-Mailer: git-send-email 2.31.1 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: dceara@redhat.com Subject: [ovs-dev] [PATCH v4 ovn] controller: add datapath meter capability check 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" Dump datapath meter capabilities before configuring meters in ovn-controller Signed-off-by: Lorenzo Bianconi --- Changes since v3: - add missing rconn_run_wait() and rconn_recv_wait() at the end of swconn for loop - cosmetics Changes since v2: - move meter capability logic in lib/features.c Changes since v1: - move rconn in ovn-controller to avoid concurrency issues --- controller/ovn-controller.c | 4 ++ include/ovn/features.h | 4 ++ lib/actions.c | 3 ++ lib/automake.mk | 1 + lib/features.c | 90 +++++++++++++++++++++++++++++++++++++ tests/ovn.at | 4 +- 6 files changed, 104 insertions(+), 2 deletions(-) diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c index 0031a1035..22cb4b956 100644 --- a/controller/ovn-controller.c +++ b/controller/ovn-controller.c @@ -3523,6 +3523,9 @@ main(int argc, char *argv[]) ovsrec_server_has_datapath_table(ovs_idl_loop.idl) ? &br_int_dp : NULL); + if (br_int) { + ovs_feature_support_init(br_int->name); + } /* Enable ACL matching for double tagged traffic. */ if (ovs_idl_txn) { @@ -3898,6 +3901,7 @@ loop_done: ovsdb_idl_loop_destroy(&ovs_idl_loop); ovsdb_idl_loop_destroy(&ovnsb_idl_loop); + ovs_feature_support_deinit(); free(ovs_remote); service_stop(); diff --git a/include/ovn/features.h b/include/ovn/features.h index c35d59b14..5259f2c69 100644 --- a/include/ovn/features.h +++ b/include/ovn/features.h @@ -28,12 +28,16 @@ */ enum ovs_feature_support_bits { OVS_CT_ZERO_SNAT_SUPPORT_BIT, + OVS_DP_METER_SUPPORT_BIT, }; enum ovs_feature_value { OVS_CT_ZERO_SNAT_SUPPORT = (1 << OVS_CT_ZERO_SNAT_SUPPORT_BIT), + OVS_DP_METER_SUPPORT = (1 << OVS_DP_METER_SUPPORT_BIT), }; +void ovs_feature_support_init(const char *br_name); +void ovs_feature_support_deinit(void); bool ovs_feature_is_supported(enum ovs_feature_value feature); bool ovs_feature_support_update(const struct smap *ovs_capabilities); diff --git a/lib/actions.c b/lib/actions.c index c572e88ae..7cf6be308 100644 --- a/lib/actions.c +++ b/lib/actions.c @@ -87,6 +87,9 @@ encode_start_controller_op(enum action_opcode opcode, bool pause, oc->max_len = UINT16_MAX; oc->reason = OFPR_ACTION; oc->pause = pause; + if (!ovs_feature_is_supported(OVS_DP_METER_SUPPORT)) { + meter_id = NX_CTLR_NO_METER; + } oc->meter_id = meter_id; struct action_header ah = { .opcode = htonl(opcode) }; diff --git a/lib/automake.mk b/lib/automake.mk index ddfe33948..9f9f447d5 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -2,6 +2,7 @@ lib_LTLIBRARIES += lib/libovn.la lib_libovn_la_LDFLAGS = \ $(OVS_LTINFO) \ -Wl,--version-script=$(top_builddir)/lib/libovn.sym \ + $(OVS_LIBDIR)/libopenvswitch.la \ $(AM_LDFLAGS) lib_libovn_la_SOURCES = \ lib/acl-log.c \ diff --git a/lib/features.c b/lib/features.c index fddf4c450..decb4d24c 100644 --- a/lib/features.c +++ b/lib/features.c @@ -18,7 +18,14 @@ #include #include "lib/util.h" +#include "lib/dirs.h" +#include "socket-util.h" +#include "lib/vswitch-idl.h" #include "openvswitch/vlog.h" +#include "openvswitch/ofpbuf.h" +#include "openvswitch/rconn.h" +#include "openvswitch/ofp-msgs.h" +#include "openvswitch/ofp-meter.h" #include "ovn/features.h" VLOG_DEFINE_THIS_MODULE(features); @@ -40,11 +47,15 @@ static uint32_t supported_ovs_features; static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 5); +/* ovs-vswitchd connection. */ +static struct rconn *swconn; + static bool ovs_feature_is_valid(enum ovs_feature_value feature) { switch (feature) { case OVS_CT_ZERO_SNAT_SUPPORT: + case OVS_DP_METER_SUPPORT: return true; default: return false; @@ -58,6 +69,81 @@ ovs_feature_is_supported(enum ovs_feature_value feature) return supported_ovs_features & feature; } +static bool +ovs_feature_get_openflow_cap(void) +{ + if (!swconn) { + return false; + } + + rconn_run(swconn); + if (!rconn_is_connected(swconn)) { + return false; + } + + bool ret = false; + /* dump datapath meter capabilities. */ + struct ofpbuf *msg = ofpraw_alloc(OFPRAW_OFPST13_METER_FEATURES_REQUEST, + rconn_get_version(swconn), 0); + rconn_send(swconn, msg, NULL); + for (int i = 0; i < 50; i++) { + msg = rconn_recv(swconn); + if (!msg) { + break; + } + + const struct ofp_header *oh = msg->data; + enum ofptype type; + ofptype_decode(&type, oh); + + if (type == OFPTYPE_METER_FEATURES_STATS_REPLY) { + struct ofputil_meter_features mf; + ofputil_decode_meter_features(oh, &mf); + + bool old_state = supported_ovs_features & OVS_DP_METER_SUPPORT; + bool new_state = mf.max_meters > 0; + + if (old_state != new_state) { + ret = true; + if (new_state) { + supported_ovs_features |= OVS_DP_METER_SUPPORT; + } else { + supported_ovs_features &= ~OVS_DP_METER_SUPPORT; + } + } + } + ofpbuf_delete(msg); + } + rconn_run_wait(swconn); + rconn_recv_wait(swconn); + + return ret; +} + +void +ovs_feature_support_init(const char *br_name) +{ + if (!swconn) { + swconn = rconn_create(5, 0, DSCP_DEFAULT, 1 << OFP15_VERSION); + } + + if (swconn && !rconn_is_connected(swconn)) { + char *target = xasprintf("unix:%s/%s.mgmt", ovs_rundir(), br_name); + if (strcmp(target, rconn_get_target(swconn))) { + VLOG_INFO("%s: connecting to switch", target); + rconn_connect(swconn, target, target); + } + free(target); + } +} + +void +ovs_feature_support_deinit(void) +{ + rconn_destroy(swconn); + swconn = NULL; +} + /* Returns 'true' if the set of tracked OVS features has been updated. */ bool ovs_feature_support_update(const struct smap *ovs_capabilities) @@ -69,6 +155,10 @@ ovs_feature_support_update(const struct smap *ovs_capabilities) ovs_capabilities = &empty_caps; } + if (ovs_feature_get_openflow_cap()) { + updated = true; + } + for (size_t i = 0; i < ARRAY_SIZE(all_ovs_features); i++) { enum ovs_feature_value value = all_ovs_features[i].value; const char *name = all_ovs_features[i].name; diff --git a/tests/ovn.at b/tests/ovn.at index 30625ec37..9e55c0d57 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -1529,9 +1529,9 @@ log(verdict=allow, severity=warning); log(name="test1", verdict=drop, severity=info); encodes as controller(userdata=00.00.00.07.00.00.00.00.01.06.74.65.73.74.31) log(verdict=drop, severity=info, meter="meter1"); - encodes as controller(userdata=00.00.00.07.00.00.00.00.01.06,meter_id=4) + encodes as controller(userdata=00.00.00.07.00.00.00.00.01.06) log(name="test1", verdict=drop, severity=info, meter="meter1"); - encodes as controller(userdata=00.00.00.07.00.00.00.00.01.06.74.65.73.74.31,meter_id=4) + encodes as controller(userdata=00.00.00.07.00.00.00.00.01.06.74.65.73.74.31) log(verdict=drop); formats as log(verdict=drop, severity=info); encodes as controller(userdata=00.00.00.07.00.00.00.00.01.06)