From patchwork Wed Feb 12 08:47:51 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roi Dayan X-Patchwork-Id: 2046073 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" (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=UClVk2BE; dkim-atps=neutral Authentication-Results: legolas.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=patchwork.ozlabs.org) 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 ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4YtBmX5yKSz1ycc for ; Wed, 12 Feb 2025 19:48:28 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id AAE4C405D2; Wed, 12 Feb 2025 08:48:28 +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 goYPFsSzs_U1; Wed, 12 Feb 2025 08:48:27 +0000 (UTC) X-Comment: SPF check N/A for local connections - client-ip=140.211.9.56; helo=lists.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver= DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 06F424050C Authentication-Results: smtp4.osuosl.org; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=UClVk2BE Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id 06F424050C; Wed, 12 Feb 2025 08:48:27 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id A1439C0612; Wed, 12 Feb 2025 08:48:26 +0000 (UTC) X-Original-To: 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 51034C059E for ; Wed, 12 Feb 2025 08:48:25 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 326E16085D for ; Wed, 12 Feb 2025 08:48:25 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id L8Uel3d4Y_P6 for ; Wed, 12 Feb 2025 08:48:24 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2a01:111:f403:2412::60d; helo=nam10-mw2-obe.outbound.protection.outlook.com; envelope-from=roid@nvidia.com; receiver= DMARC-Filter: OpenDMARC Filter v1.4.2 smtp3.osuosl.org 27EC66078A Authentication-Results: smtp3.osuosl.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 27EC66078A Authentication-Results: smtp3.osuosl.org; dkim=pass (2048-bit key, unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=UClVk2BE Received: from NAM10-MW2-obe.outbound.protection.outlook.com (mail-mw2nam10on2060d.outbound.protection.outlook.com [IPv6:2a01:111:f403:2412::60d]) by smtp3.osuosl.org (Postfix) with ESMTPS id 27EC66078A for ; Wed, 12 Feb 2025 08:48:23 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=faEOWqgE5MFs1s9Do0z1/r7/mcvshVtWdMxdgY+n2j53eXve8z61PsMqKsFe4pAfr4jZjz6sH+B9cvEb396QA0Qr773KijVk46IK8xIhk5rb4zSFn+sH9B/tn/I/Hhz4qYwtlUl7xBF8Mn9hnaDBbX15p51EQV4trPWSjfAYodpeSJ/lpxuj3gFNu6IjHWJNgmH7MYri/2+WZwR2FQL0HJae2P8708dTKq4ee/S4BdMyi8k7zNlqVHPy/ogD3WLF+Uw/9R7WSzOeq94CcmpfNcWs/o7Hka1sjJXYvlw3/qnOLa9kvfX+98DFZbbqSNv/vIt384t3aMVfux30P5zx8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=uhg5CSIW6hWpqoxvjP1vxbeJQABh62q9ilKbWs3/JOU=; b=cuX8pzTDk+R7MGZZeIx72e8HxWHVbjdHPm7Jip9Sm5k2xxi62tutcg4BprmWqk5ayCWkKOAbgALFgXC82GJ2DJmbd8EcebyUwLIMcXTCZCh6YdJNjDPQrTUWPNrsFELYG/OvN3JLe1CblBSn3XTNW2lVWa6wODE08WrvWYPumxGwnVFtRkCvTzZd1C1TrOWArdD/aBKcq4ogxPfh7VkCKwe5JvG/rv0djwyCRG6t52VGgpntykzPFdOVpqeVUsltp1Gk534SazeYmprjnJDiVrZY8Mx5NQr7iho/kWs1cV89eDqMnvm6IxGoqDtk+UCDXiKc2dXR2xk4d8JYbmh5sA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.233) smtp.rcpttodomain=openvswitch.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=uhg5CSIW6hWpqoxvjP1vxbeJQABh62q9ilKbWs3/JOU=; b=UClVk2BEAvRJXvskwXob0pZk3tDeeLM98ser/G+8xVFBatT9zYhLK1xRYNXoluNDs4vNFwYytB4x1SfZc2F15xBDSVYt9Z4tPYaY7499qB/HjU7InLbFwsQmBeltD/bCcR+6puWQhUWVdCOLs0TdXkGUnXzILdIojvheyuSMkHqmL57PGXbcO3YnBY+9jJJ1PWgS2ouuot7H37hhmCjUBhHSwq+VbyfrfpT4NDViF+/BHASuKfvtzyLYGgzAZ/h26nfTYlUyY/RQqRFmlAnlEhJRz6OFoXecV0pe26J7Y++k8WnqPxxRDIhKFgpiZA+JAb+hxNikFsoBImG9zTOC+A== Received: from BN9PR03CA0172.namprd03.prod.outlook.com (2603:10b6:408:f4::27) by MN0PR12MB6102.namprd12.prod.outlook.com (2603:10b6:208:3ca::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.11; Wed, 12 Feb 2025 08:48:18 +0000 Received: from BL02EPF00021F68.namprd02.prod.outlook.com (2603:10b6:408:f4:cafe::a5) by BN9PR03CA0172.outlook.office365.com (2603:10b6:408:f4::27) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8398.31 via Frontend Transport; Wed, 12 Feb 2025 08:48:17 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.233) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.233 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.233; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.233) by BL02EPF00021F68.mail.protection.outlook.com (10.167.249.4) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8445.10 via Frontend Transport; Wed, 12 Feb 2025 08:48:16 +0000 Received: from drhqmail203.nvidia.com (10.126.190.182) by mail.nvidia.com (10.127.129.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Wed, 12 Feb 2025 00:48:05 -0800 Received: from drhqmail203.nvidia.com (10.126.190.182) by drhqmail203.nvidia.com (10.126.190.182) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.14; Wed, 12 Feb 2025 00:48:04 -0800 Received: from c-237-143-220-225.mtl.labs.mlnx (10.127.8.12) by mail.nvidia.com (10.126.190.182) with Microsoft SMTP Server id 15.2.1544.14 via Frontend Transport; Wed, 12 Feb 2025 00:48:03 -0800 To: , Roi Dayan Date: Wed, 12 Feb 2025 10:47:51 +0200 Message-ID: <20250212084751.307720-1-roid@nvidia.com> X-Mailer: git-send-email 2.18.2 MIME-Version: 1.0 X-NV-OnPremToCloud: AnonymousSubmission X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL02EPF00021F68:EE_|MN0PR12MB6102:EE_ X-MS-Office365-Filtering-Correlation-Id: 6147241b-a8c6-49bb-8bbb-08dd4b41fe4e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|36860700013|376014|82310400026|1800799024; X-Microsoft-Antispam-Message-Info: LIKsXNYfRaHwWkg9YHQN1ZFdrT6Lc9tdcbbFCH1kf8ezASmrOUJRkJN3FsQw1jzGm4ekEYz/Q5j0TTb+wzd/A6VBbgfZkBtjGw2PSxMgo1TK6ubF3TAZtw8BLqM02vB7tjAQkxifmaDfVNcmwmLT36CuviEbwGvRIvUNAq75ldle8JgoYKo4WtTTUMcp6Xp6y9yS7wbGICGebCDYlY2iQLGvokLBhFwTOAfWsFhL4U98ZlACTmCC+pgD2oALu0lDH/SYe5kJ2/4LeSRwkgPrJKwl50ogCuU4UDqh4RfVPyyTGGsMENC3meFl8vAWALgeTH3W9sR1dH12SvbTQsmL8tdryLXdAImdFiDs6/kaSaXxJs+61vmW679DwcXkBMbjoHxsaVEG/EpmkA+MTPdaVdGGujxBc2Trs0w+jni3jZ5TlD2+RVfcc5+Y2jiyobHahXeUlirpmUaYsq3tZskMjRLQv6xJArTy9hir4laj8xSNASRQrL6oZgiVd03zU4p7jJShtJ6RLpsd2JfxS1QJXU3T/U+MxAlQZb+EP6X+3o6eKd2ATFxHvSVICujcnWh0fwvltz9PbQkprVDLQSmNgCsPCASQnx2N8H5Vheosh0kd1AKW3zTHCF+zFEI1L31JcuVlP34QTAgkJuYDIS2Cq6mOWjoxeouOih9yqaGtJJi+IUpenqN0+GzJ/aaJcG//uYNf9vKYY+0a8nhWCAUe56ZWN5PAuXH2xuxHpDsJ/Th2eCheKws9PWK4OnpZue/fGGnNSRRUmX4wizbD5fnKfLyf2WtruevonRwbeD/VmwNtkOwQSPWUybEzrfYe9zCirFzlD+DuCSYnHF8l5f9+H2C3PrPn5vz6FjnfkyqfGX6lMJOMurzuWD73AdOHGkXT/RFAZhqIK+977/n6Ff/uphpXqmpnw4o5uQbZW9Az+w24UuPBQQQzgvCZCHNtPG3h0IaLHu50Yt5J+7VgaCbRRHM4AcZ+MeNzPVsECpdGB41DMNGv0n678Q8+PpkyVytmFwv9OF2qFyCOjivo+bX1he6HL10raCk9lDZFgEkbH1u2b+wzGLIG7hCO+Pm9aaoXpEs0ujZ2efL4jieHVeBZqgf29xzbXcfTWbJ3nGRBkNunZO9JBxZvPtTrF5m1LtsxOeTGYmRIC1KhBUN+rg04T1NpALyMz/8nQOj4yfxvKI2a7n4V2y/HssDHzzRi3Q/0sLfwkce+4IlHoITzOq1VjWI/hbM1dBx7RSQOfFNmzn5G5PrqogPIsAJgPkABgPA35Pv+2QiGWU8GVrW5yVzbsMsbTK6td8qe/Fucs0exEUKsBQHAuj2VWFKD6t/e4Gmqwoon1VTfB5pcS18pYXKeBsn0WAQ9yRTewcXiZBFufJgqn0LBD+lxisBos/VfEir6Wo9yEpsDs/F7Zzm36BQla59jF1kW1hE3h+enDLAjeCk4L2SZsFXrZ1ZCmtcrw7Z3cSTed6+Y4x2BkqqkMi9btqFonIyi56Bx0T0LrHIXVyU= X-Forefront-Antispam-Report: CIP:216.228.118.233; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc7edge2.nvidia.com; CAT:NONE; SFS:(13230040)(36860700013)(376014)(82310400026)(1800799024); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Feb 2025 08:48:16.6121 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6147241b-a8c6-49bb-8bbb-08dd4b41fe4e X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.118.233]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BL02EPF00021F68.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN0PR12MB6102 Subject: [ovs-dev] [PATCH] ofproto: Add JSON output for 'fdb/show' command. 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: , X-Patchwork-Original-From: Roi Dayan via dev From: Roi Dayan Reply-To: Roi Dayan Cc: Maor Dickman Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Dima Chumak The 'fdb/show' command now supports machine-readable JSON output in addition to the plain-text output for humans. An example would be: ovs-appctl --format=json --pretty fdb/show br-phy [ { "age": "static", "mac": "e4:8c:07:08:00:02", "port": 2, "vlan": 0 }, { "age": 14, "mac": "e4:8c:07:08:00:03", "port": 3, "vlan": 0 } ] Signed-off-by: Dima Chumak Acked-by: Roi Dayan --- ofproto/ofproto-dpif.c | 86 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 70 insertions(+), 16 deletions(-) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index bf43d5d4bc59..b6228f91765a 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -6151,20 +6151,12 @@ ofbundle_get_a_port(const struct ofbundle *bundle) } static void -ofproto_unixctl_fdb_show(struct unixctl_conn *conn, int argc OVS_UNUSED, - const char *argv[], void *aux OVS_UNUSED) +ofproto_unixctl_fdb_show_text(const struct ofproto_dpif *ofproto, + struct ds *ds) { - struct ds ds = DS_EMPTY_INITIALIZER; - const struct ofproto_dpif *ofproto; const struct mac_entry *e; - ofproto = ofproto_dpif_lookup_by_name(argv[1]); - if (!ofproto) { - unixctl_command_reply_error(conn, "no such bridge"); - return; - } - - ds_put_cstr(&ds, " port VLAN MAC Age\n"); + ds_put_cstr(ds, " port VLAN MAC Age\n"); ovs_rwlock_rdlock(&ofproto->ml->rwlock); LIST_FOR_EACH (e, lru_node, &ofproto->ml->lrus) { struct ofbundle *bundle = mac_entry_get_port(ofproto->ml, e); @@ -6173,17 +6165,79 @@ ofproto_unixctl_fdb_show(struct unixctl_conn *conn, int argc OVS_UNUSED, ofputil_port_to_string(ofbundle_get_a_port(bundle)->up.ofp_port, NULL, name, sizeof name); - ds_put_format(&ds, "%5s %4d "ETH_ADDR_FMT" ", + ds_put_format(ds, "%5s %4d "ETH_ADDR_FMT" ", name, e->vlan, ETH_ADDR_ARGS(e->mac)); if (MAC_ENTRY_AGE_STATIC_ENTRY == age) { - ds_put_format(&ds, "static\n"); + ds_put_format(ds, "static\n"); } else { - ds_put_format(&ds, "%3d\n", age); + ds_put_format(ds, "%3d\n", age); } } ovs_rwlock_unlock(&ofproto->ml->rwlock); - unixctl_command_reply(conn, ds_cstr(&ds)); - ds_destroy(&ds); +} + +static void +ofproto_unixctl_fdb_show_json(const struct ofproto_dpif *ofproto, + struct json **fdb_entries) +{ + size_t num_entries = hmap_count(&ofproto->ml->table); + struct json **json_entries = NULL; + const struct mac_entry *entry; + int i = 0; + + if (!num_entries) { + goto done; + } + + json_entries = xmalloc(num_entries * sizeof *json_entries); + ovs_rwlock_rdlock(&ofproto->ml->rwlock); + LIST_FOR_EACH (entry, lru_node, &ofproto->ml->lrus) { + struct ofbundle *bundle = mac_entry_get_port(ofproto->ml, entry); + struct json *json_entry = json_object_create(); + int age = mac_entry_age(ofproto->ml, entry); + ofp_port_t port; + + port = ofbundle_get_a_port(bundle)->up.ofp_port; + json_object_put(json_entry, "port", json_integer_create(port)); + json_object_put(json_entry, "vlan", json_integer_create(entry->vlan)); + json_object_put_format(json_entry, "mac", ETH_ADDR_FMT, + ETH_ADDR_ARGS(entry->mac)); + if (MAC_ENTRY_AGE_STATIC_ENTRY == age) { + json_object_put_string(json_entry, "age", "static"); + } else { + json_object_put(json_entry, "age", json_integer_create(age)); + } + json_entries[i++] = json_entry; + } + ovs_rwlock_unlock(&ofproto->ml->rwlock); +done: + *fdb_entries = json_array_create(json_entries, num_entries); +} + +static void +ofproto_unixctl_fdb_show(struct unixctl_conn *conn, int argc OVS_UNUSED, + const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) +{ + const struct ofproto_dpif *ofproto = ofproto_dpif_lookup_by_name(argv[1]); + + if (!ofproto) { + unixctl_command_reply_error(conn, "no such bridge"); + return; + } + + if (unixctl_command_get_output_format(conn) == UNIXCTL_OUTPUT_FMT_JSON) { + struct json *fdb_entries; + + ofproto_unixctl_fdb_show_json(ofproto, &fdb_entries); + unixctl_command_reply_json(conn, fdb_entries); + json_destroy(fdb_entries); + } else { + struct ds ds = DS_EMPTY_INITIALIZER; + + ofproto_unixctl_fdb_show_text(ofproto, &ds); + unixctl_command_reply(conn, ds_cstr(&ds)); + ds_destroy(&ds); + } } static void