From patchwork Fri Jul 12 02:26:49 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacob Tanenbaum X-Patchwork-Id: 1959652 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.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=SetJbtu7; dkim-atps=neutral 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=patchwork.ozlabs.org) 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 (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4WKwTm3jncz1xqc for ; Fri, 12 Jul 2024 12:27:08 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id B0FB9413DD; Fri, 12 Jul 2024 02:27:05 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id vL-Iv-r-xITe; Fri, 12 Jul 2024 02:27:03 +0000 (UTC) X-Comment: SPF check N/A for local connections - client-ip=2605:bc80:3010:104::8cd3:938; helo=lists.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver= DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 2AB264156C Authentication-Results: smtp4.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=SetJbtu7 Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp4.osuosl.org (Postfix) with ESMTPS id 2AB264156C; Fri, 12 Jul 2024 02:27:02 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id E2678C0A97; Fri, 12 Jul 2024 02:27:01 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 12562C0A96 for ; Fri, 12 Jul 2024 02:27:00 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id F00F984546 for ; Fri, 12 Jul 2024 02:26:59 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id kQdWhCrZQFo8 for ; Fri, 12 Jul 2024 02:26:58 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=170.10.129.124; helo=us-smtp-delivery-124.mimecast.com; envelope-from=jtanenba@redhat.com; receiver= DMARC-Filter: OpenDMARC Filter v1.4.2 smtp1.osuosl.org 5FDEF84535 Authentication-Results: smtp1.osuosl.org; dmarc=pass (p=none dis=none) header.from=redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 5FDEF84535 Authentication-Results: smtp1.osuosl.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=SetJbtu7 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp1.osuosl.org (Postfix) with ESMTPS id 5FDEF84535 for ; Fri, 12 Jul 2024 02:26:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1720751216; 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=Ab4gl5foHTeDdSA7+pcErDGve1Y/d+Y2kQPxAwXMVTc=; b=SetJbtu7Q44M4PAdZIfDbkkhesUDOl2sYA4kygJOKu6vDzIUqxUneuJGHCEQOaPjiHmKV7 p8tX2FB9ecUwrW22WLZxSud4LcI5oMsjiK6NXpUQe7d8OeUeAY9R/c3WWhLrbgWJ5EEx8M VBbXUpKS3rbn7+ypVOGFatea/7MZFgs= Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-137-YE_rBP0dN-CBIiNZiRwg3Q-1; Thu, 11 Jul 2024 22:26:54 -0400 X-MC-Unique: YE_rBP0dN-CBIiNZiRwg3Q-1 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 16B591955F29 for ; Fri, 12 Jul 2024 02:26:54 +0000 (UTC) Received: from jtanenba-thinkpadp16vgen1.boston.csb (unknown [10.22.9.115]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 8E27219560AE; Fri, 12 Jul 2024 02:26:52 +0000 (UTC) From: Jacob Tanenbaum To: dev@openvswitch.org Date: Thu, 11 Jul 2024 22:26:49 -0400 Message-ID: <20240712022649.479048-1-jtanenba@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [ovs-dev] [Patch ovn v5] Text respresntations for drop sampling. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Dumitru Ceara Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" Created a new column in the southbound database to hardcode a human readable description for flows. This first use is describing why the flow is dropping packets. The new column is called flow_desc and will create southbound database entries like this _uuid : 20f1897b-477e-47ae-a32c-c546d83ec097 actions : "sample(probability=65535,collector_set=123,obs_domain=1,obs_point=$cookie); /* drop */" controller_meter : [] external_ids : {source="northd.c:8721", stage-name=ls_in_l2_unknown} flow_desc : "No L2 destination" logical_datapath : [] logical_dp_group : ee3c3db5-98a2-4f34-8a84-409deae140a7 match : "outport == \"none\"" pipeline : ingress priority : 50 table_id : 27 tags : {} hash : 0 future work includes entering more flow_desc for more flows and adding flow_desc to the actions as a comment. Signed-off-by: Jacob Tanenbaum Suggested-by: Dumitru Ceara Reported-at: https://issues.redhat.com/browse/FDP-307 --- v1: initial version v2: correct commit message make the flow_desc a char* correct a typo in the ovn-sb.xml correct the test v3: rebase issue with NEWS file v4: remove options:debug_drop_domain_id="1" from testing as we do not depend on it v5: introduce string wrapper increment ovs-sb.ovsschema version correct the testing added descriptions to more dropped packets diff --git a/NEWS b/NEWS index 3e392ff08..0039b04be 100644 --- a/NEWS +++ b/NEWS @@ -38,6 +38,8 @@ Post v24.03.0 ability to disable "VXLAN mode" to extend available tunnel IDs space for datapaths from 4095 to 16711680. For more details see man ovn-nb(5) for mentioned option. + - Added a new column in the southbound database "flow_desc" to provide + human readable context to flows. OVN v24.03.0 - 01 Mar 2024 -------------------------- diff --git a/lib/ovn-util.h b/lib/ovn-util.h index f75b821b6..6f5334d27 100644 --- a/lib/ovn-util.h +++ b/lib/ovn-util.h @@ -466,6 +466,30 @@ void sorted_array_apply_diff(const struct sorted_array *a1, bool add), const void *arg); +/* A wrapper that holds strings */ +struct string_wrapper +{ + char *str; + bool owns_string; +}; + +static inline struct string_wrapper +string_wrapper_create(char *str, bool take_ownership) +{ + return (struct string_wrapper) { + .str = str, + .owns_string = take_ownership, + }; +} + +static inline void +string_wrapper_destroy(struct string_wrapper *s) +{ + if (s->owns_string) { + free(s->str); + } +} + /* Utilities around properly handling exit command. */ struct ovn_exit_args { struct unixctl_conn **conns; diff --git a/northd/lflow-mgr.c b/northd/lflow-mgr.c index b2c60b5de..c66181801 100644 --- a/northd/lflow-mgr.c +++ b/northd/lflow-mgr.c @@ -25,6 +25,7 @@ #include "debug.h" #include "lflow-mgr.h" #include "lib/ovn-parallel-hmap.h" +#include "lib/ovn-util.h" VLOG_DEFINE_THIS_MODULE(lflow_mgr); @@ -36,7 +37,7 @@ static void ovn_lflow_init(struct ovn_lflow *, struct ovn_datapath *od, uint16_t priority, char *match, char *actions, char *io_port, char *ctrl_meter, char *stage_hint, - const char *where); + const char *where, struct string_wrapper flow_desc); static struct ovn_lflow *ovn_lflow_find(const struct hmap *lflows, enum ovn_stage stage, uint16_t priority, const char *match, @@ -52,7 +53,7 @@ static struct ovn_lflow *do_ovn_lflow_add( const char *actions, const char *io_port, const char *ctrl_meter, const struct ovsdb_idl_row *stage_hint, - const char *where); + const char *where, struct string_wrapper flow_desc); static struct ovs_mutex *lflow_hash_lock(const struct hmap *lflow_table, @@ -173,6 +174,7 @@ struct ovn_lflow { * 'dpg_bitmap'. */ struct ovn_dp_group *dpg; /* Link to unique Sb datapath group. */ const char *where; + struct string_wrapper flow_desc; struct uuid sb_uuid; /* SB DB row uuid, specified by northd. */ struct ovs_list referenced_by; /* List of struct lflow_ref_node. */ @@ -659,7 +661,7 @@ lflow_table_add_lflow(struct lflow_table *lflow_table, const char *match, const char *actions, const char *io_port, const char *ctrl_meter, const struct ovsdb_idl_row *stage_hint, - const char *where, + const char *where, struct string_wrapper flow_desc, struct lflow_ref *lflow_ref) OVS_EXCLUDED(fake_hash_mutex) { @@ -679,7 +681,7 @@ lflow_table_add_lflow(struct lflow_table *lflow_table, do_ovn_lflow_add(lflow_table, od ? ods_size(od->datapaths) : dp_bitmap_len, hash, stage, priority, match, actions, - io_port, ctrl_meter, stage_hint, where); + io_port, ctrl_meter, stage_hint, where, flow_desc); if (lflow_ref) { struct lflow_ref_node *lrn = @@ -733,7 +735,8 @@ lflow_table_add_lflow_default_drop(struct lflow_table *lflow_table, { lflow_table_add_lflow(lflow_table, od, NULL, 0, stage, 0, "1", debug_drop_action(), NULL, NULL, NULL, - where, lflow_ref); + where, string_wrapper_create(NULL, false), + lflow_ref); } struct ovn_dp_group * @@ -856,7 +859,8 @@ static void ovn_lflow_init(struct ovn_lflow *lflow, struct ovn_datapath *od, size_t dp_bitmap_len, enum ovn_stage stage, uint16_t priority, char *match, char *actions, char *io_port, char *ctrl_meter, - char *stage_hint, const char *where) + char *stage_hint, const char *where, + struct string_wrapper flow_desc) { lflow->dpg_bitmap = bitmap_allocate(dp_bitmap_len); lflow->od = od; @@ -867,6 +871,7 @@ ovn_lflow_init(struct ovn_lflow *lflow, struct ovn_datapath *od, lflow->io_port = io_port; lflow->stage_hint = stage_hint; lflow->ctrl_meter = ctrl_meter; + lflow->flow_desc = flow_desc; lflow->dpg = NULL; lflow->where = where; lflow->sb_uuid = UUID_ZERO; @@ -946,6 +951,7 @@ ovn_lflow_destroy(struct lflow_table *lflow_table, struct ovn_lflow *lflow) free(lflow->io_port); free(lflow->stage_hint); free(lflow->ctrl_meter); + string_wrapper_destroy(&(lflow->flow_desc)); ovn_lflow_clear_dp_refcnts_map(lflow); struct lflow_ref_node *lrn; LIST_FOR_EACH_SAFE (lrn, ref_list_node, &lflow->referenced_by) { @@ -960,7 +966,7 @@ do_ovn_lflow_add(struct lflow_table *lflow_table, size_t dp_bitmap_len, const char *match, const char *actions, const char *io_port, const char *ctrl_meter, const struct ovsdb_idl_row *stage_hint, - const char *where) + const char *where, struct string_wrapper flow_desc) OVS_REQUIRES(fake_hash_mutex) { struct ovn_lflow *old_lflow; @@ -982,7 +988,8 @@ do_ovn_lflow_add(struct lflow_table *lflow_table, size_t dp_bitmap_len, xstrdup(match), xstrdup(actions), io_port ? xstrdup(io_port) : NULL, nullable_xstrdup(ctrl_meter), - ovn_lflow_hint(stage_hint), where); + ovn_lflow_hint(stage_hint), where, + flow_desc); if (parallelization_state != STATE_USE_PARALLELIZATION) { hmap_insert(&lflow_table->entries, &lflow->hmap_node, hash); @@ -1050,6 +1057,9 @@ sync_lflow_to_sb(struct ovn_lflow *lflow, sbrec_logical_flow_set_priority(sbflow, lflow->priority); sbrec_logical_flow_set_match(sbflow, lflow->match); sbrec_logical_flow_set_actions(sbflow, lflow->actions); + if (lflow->flow_desc.str != NULL) { + sbrec_logical_flow_set_flow_desc(sbflow, lflow->flow_desc.str); + } if (lflow->io_port) { struct smap tags = SMAP_INITIALIZER(&tags); smap_add(&tags, "in_out_port", lflow->io_port); diff --git a/northd/lflow-mgr.h b/northd/lflow-mgr.h index 83b087f47..9ea91f5a3 100644 --- a/northd/lflow-mgr.h +++ b/northd/lflow-mgr.h @@ -78,7 +78,8 @@ void lflow_table_add_lflow(struct lflow_table *, const struct ovn_datapath *, const char *actions, const char *io_port, const char *ctrl_meter, const struct ovsdb_idl_row *stage_hint, - const char *where, struct lflow_ref *); + const char *where, struct string_wrapper flow_desc, + struct lflow_ref *); void lflow_table_add_lflow_default_drop(struct lflow_table *, const struct ovn_datapath *, enum ovn_stage stage, @@ -91,20 +92,23 @@ void lflow_table_add_lflow_default_drop(struct lflow_table *, STAGE_HINT, LFLOW_REF) \ lflow_table_add_lflow(LFLOW_TABLE, OD, NULL, 0, STAGE, PRIORITY, MATCH, \ ACTIONS, IN_OUT_PORT, CTRL_METER, STAGE_HINT, \ - OVS_SOURCE_LOCATOR, LFLOW_REF) + OVS_SOURCE_LOCATOR, \ + string_wrapper_create(NULL, false), LFLOW_REF) #define ovn_lflow_add_with_hint(LFLOW_TABLE, OD, STAGE, PRIORITY, MATCH, \ ACTIONS, STAGE_HINT, LFLOW_REF) \ lflow_table_add_lflow(LFLOW_TABLE, OD, NULL, 0, STAGE, PRIORITY, MATCH, \ ACTIONS, NULL, NULL, STAGE_HINT, \ - OVS_SOURCE_LOCATOR, LFLOW_REF) + OVS_SOURCE_LOCATOR, \ + string_wrapper_create(NULL,false), LFLOW_REF) #define ovn_lflow_add_with_dp_group(LFLOW_TABLE, DP_BITMAP, DP_BITMAP_LEN, \ STAGE, PRIORITY, MATCH, ACTIONS, \ STAGE_HINT, LFLOW_REF) \ lflow_table_add_lflow(LFLOW_TABLE, NULL, DP_BITMAP, DP_BITMAP_LEN, STAGE, \ PRIORITY, MATCH, ACTIONS, NULL, NULL, STAGE_HINT, \ - OVS_SOURCE_LOCATOR, LFLOW_REF) + OVS_SOURCE_LOCATOR, \ + string_wrapper_create(NULL,false), LFLOW_REF) #define ovn_lflow_add_default_drop(LFLOW_TABLE, OD, STAGE, LFLOW_REF) \ lflow_table_add_lflow_default_drop(LFLOW_TABLE, OD, STAGE, \ @@ -126,13 +130,21 @@ void lflow_table_add_lflow_default_drop(struct lflow_table *, STAGE_HINT, LFLOW_REF) \ lflow_table_add_lflow(LFLOW_TABLE, OD, NULL, 0, STAGE, PRIORITY, MATCH, \ ACTIONS, IN_OUT_PORT, NULL, STAGE_HINT, \ - OVS_SOURCE_LOCATOR, LFLOW_REF) + OVS_SOURCE_LOCATOR, \ + string_wrapper_create(NULL,false), LFLOW_REF) #define ovn_lflow_add(LFLOW_TABLE, OD, STAGE, PRIORITY, MATCH, ACTIONS, \ LFLOW_REF) \ lflow_table_add_lflow(LFLOW_TABLE, OD, NULL, 0, STAGE, PRIORITY, MATCH, \ ACTIONS, NULL, NULL, NULL, OVS_SOURCE_LOCATOR, \ - LFLOW_REF) + string_wrapper_create(NULL, false), LFLOW_REF) + +#define ovn_lflow_add_with_desc(LFLOW_TABLE, OD, STAGE, PRIORITY, MATCH, \ + DESCRIPTION, LFLOW_REF) \ + lflow_table_add_lflow(LFLOW_TABLE, OD, NULL, 0, STAGE, PRIORITY, MATCH, \ + debug_drop_action(), NULL, NULL, NULL, \ + OVS_SOURCE_LOCATOR, \ + string_wrapper_create(DESCRIPTION, false), LFLOW_REF) #define ovn_lflow_metered(LFLOW_TABLE, OD, STAGE, PRIORITY, MATCH, ACTIONS, \ CTRL_METER, LFLOW_REF) \ @@ -186,4 +198,4 @@ dec_ovn_dp_group_ref(struct hmap *dp_groups, struct ovn_dp_group *dpg) } } -#endif /* LFLOW_MGR_H */ \ No newline at end of file +#endif /* LFLOW_MGR_H */ diff --git a/northd/northd.c b/northd/northd.c index 4353df07d..6a8c4cbc2 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -8756,8 +8756,9 @@ build_lswitch_lflows_l2_unknown(struct ovn_datapath *od, "outport = \""MC_UNKNOWN "\"; output;", lflow_ref); } else { - ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_UNKNOWN, 50, - "outport == \"none\"", debug_drop_action(), + ovn_lflow_add_with_desc(lflows, od, S_SWITCH_IN_L2_UNKNOWN, 50, + "outport == \"none\"", + "No L2 destination", lflow_ref); } ovn_lflow_add(lflows, od, S_SWITCH_IN_L2_UNKNOWN, 0, "1", diff --git a/ovn-sb.ovsschema b/ovn-sb.ovsschema index b6c051ae6..b512dc2a5 100644 --- a/ovn-sb.ovsschema +++ b/ovn-sb.ovsschema @@ -1,7 +1,7 @@ { "name": "OVN_Southbound", - "version": "20.34.0", - "cksum": "2786607656 31376", + "version": "20.35.0", + "cksum": "831370701 31501", "tables": { "SB_Global": { "columns": { @@ -116,7 +116,9 @@ "min": 0, "max": 1}}, "external_ids": { "type": {"key": "string", "value": "string", - "min": 0, "max": "unlimited"}}}, + "min": 0, "max": "unlimited"}}, + "flow_desc": {"type": {"key": {"type": "string"}, + "min": 0, "max": 1}}}, "isRoot": true}, "Logical_DP_Group": { "columns": { diff --git a/ovn-sb.xml b/ovn-sb.xml index 73a1be5ed..2703cb6ea 100644 --- a/ovn-sb.xml +++ b/ovn-sb.xml @@ -2913,6 +2913,11 @@ tcp.flags = RST; ovn-controller. + + Human-readable explanation of the flow, this is optional and used + to provide context for the given flow. + + Human-readable name for this flow's stage in the pipeline. diff --git a/ovs b/ovs index bf1b16364..4935e8932 160000 --- a/ovs +++ b/ovs @@ -1 +1 @@ -Subproject commit bf1b16364b3f01b0ff5f2f6e76842e666226a17b +Subproject commit 4935e893256af22620619dc4d94cd194271a1158 diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at index a389d1988..51fdd993e 100644 --- a/tests/ovn-northd.at +++ b/tests/ovn-northd.at @@ -12492,6 +12492,21 @@ AT_CHECK([grep -e "DHCP_RELAY_" lflows | sed 's/table=../table=??/'], [0], [dnl AT_CLEANUP ]) +OVN_FOR_EACH_NORTHD_NO_HV([ +AT_SETUP([check for flow_desc]) +ovn_start + +check ovn-nbctl -- set NB_Global . options:debug_drop_collector_set="123" +check ovn-nbctl ls-add ls1 + +check ovn-nbctl --wait=hv sync + +flow_desc=$(fetch_column Logical_flow flow_desc match='"outport == \"none\""') +AT_CHECK([test "$flow_desc" != ""]) + +AT_CLEANUP +]) + AT_SETUP([NB_Global and SB_Global incremental processing]) ovn_start