From patchwork Sun Feb 23 08:05:19 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roi Dayan X-Patchwork-Id: 2050747 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=VSZqLvas; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) (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 4Z0xJL0NCVz1yJw for ; Sun, 23 Feb 2025 19:05:53 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 41A0240960; Sun, 23 Feb 2025 08:05:52 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id ah65wujhuGJw; Sun, 23 Feb 2025 08:05:50 +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 smtp2.osuosl.org 14574404FE Authentication-Results: smtp2.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=VSZqLvas Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp2.osuosl.org (Postfix) with ESMTPS id 14574404FE; Sun, 23 Feb 2025 08:05:50 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id E692CC0035; Sun, 23 Feb 2025 08:05:49 +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 4B217C0035 for ; Sun, 23 Feb 2025 08:05:46 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 300B560871 for ; Sun, 23 Feb 2025 08:05:46 +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 xZ9N1ryrPgRI for ; Sun, 23 Feb 2025 08:05:45 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2a01:111:f403:200a::625; helo=nam12-mw2-obe.outbound.protection.outlook.com; envelope-from=roid@nvidia.com; receiver= DMARC-Filter: OpenDMARC Filter v1.4.2 smtp3.osuosl.org 1B08E60690 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 1B08E60690 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=VSZqLvas Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on20625.outbound.protection.outlook.com [IPv6:2a01:111:f403:200a::625]) by smtp3.osuosl.org (Postfix) with ESMTPS id 1B08E60690 for ; Sun, 23 Feb 2025 08:05:44 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xMCWCX0D/Dhm8ytPB5HMGfL9U0gJnHQwTUKQ5V1dn2sEAdXr12sAsa2SieYbsf3SJDxhjm1RczkE2Z2pGSWnpBZdOrLEOO4hk6sZd3omIU5PrXNkbn3WZm+RGR8T0GDGQdtLEshOnfRbQ4F6r/WxTqxBiUYbAZFiaffqeUdKk37l03N8tTAH7zSL4SQs2GqDv36Ab3c/5XF8a8QOu80J5EpCBv7eaiCMbKS5ibKh1waSM4myHEidpgBx0J6jkYN3Z24X00edFW2yIQHL203m/9BzRr3X5E3Bk6tgbYJ3/wO2rQqcKJQiCNB7UWrrdq2KDmjSNsPPoCj/v4ByCsH/8A== 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=hhGlK2XIpB/m9f9dnDqIvvgqliCmgxjFv1Z+ViGymhg=; b=h6kZfcHam9d9nQPu8gnuKe2aY5hW/HBwPWAM8dLw+0+fhMpxj9u7mMiX3IF/0GybWZ5DggECu5RddBmmlKUeIuTx8+EY93ZDJ55JPFYOtnEErr9Fekv1iHDm+1uBn/GrX06LDfCu/sCQrkKotWeryH6MKfji+xpciKoelnM+PuTGcurYqIzwU096cvYjKQx4BLyTuYRHRWKd8YOfcPJGUbJgVfsG7nu+CCc4Uo50X3mGa5UuGY2dW+VGL6K1HFoj9zs6vGw3stc5FCE2hMxnFmAMhlNCUcKsswFRrCdGUxgHodLqHNG3zmMAmGg6nyEfOFWjo6jzQh/yQiO3Jdxw/w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.232) 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=hhGlK2XIpB/m9f9dnDqIvvgqliCmgxjFv1Z+ViGymhg=; b=VSZqLvasOXkfCk57/Kv7MLbyEsOcBPsZCmMPm4PwFqUYvYhvIPMnEXw4hNKTU2XAOWHrTbaY0x9NCnBAvnOgr4xw5ssEBknFugMVOK4myhK+4fwuPxR1sPa21UtBHnQMCEV/41YRLWEdjmJOZEUwGsdAUWHtg8DeoQz3AD4itCW57yYQQe8aZE9XB/Ghu4CF6itMDUrRKQIcAij6SqOqmYl31vkxz+sDqBT9PF/IBmd0erCoeWCzDtv9P8xMuVT5dSAqoWpfsW38P3Q46nzG8eSZe870Q9gICfqrqm1dYDroL+cNZL3vog/9+E4pD3Soj1RTjyD4ij2xxCJoMN6K3w== Received: from SJ0P220CA0001.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:41b::7) by IA1PR12MB8556.namprd12.prod.outlook.com (2603:10b6:208:452::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8466.19; Sun, 23 Feb 2025 08:05:37 +0000 Received: from SJ5PEPF000001F4.namprd05.prod.outlook.com (2603:10b6:a03:41b:cafe::f9) by SJ0P220CA0001.outlook.office365.com (2603:10b6:a03:41b::7) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.8466.19 via Frontend Transport; Sun, 23 Feb 2025 08:05:36 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.232) 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.232 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.232; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.232) by SJ5PEPF000001F4.mail.protection.outlook.com (10.167.242.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8466.11 via Frontend Transport; Sun, 23 Feb 2025 08:05:36 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by mail.nvidia.com (10.127.129.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Sun, 23 Feb 2025 00:05:27 -0800 Received: from drhqmail202.nvidia.com (10.126.190.181) by drhqmail201.nvidia.com (10.126.190.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.14; Sun, 23 Feb 2025 00:05:25 -0800 Received: from c-237-143-220-225.mtl.labs.mlnx (10.127.8.12) by mail.nvidia.com (10.126.190.181) with Microsoft SMTP Server id 15.2.1544.14 via Frontend Transport; Sun, 23 Feb 2025 00:05:23 -0800 From: Roi Dayan To: , Roi Dayan Date: Sun, 23 Feb 2025 10:05:19 +0200 Message-ID: <20250223080519.2721441-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: SJ5PEPF000001F4:EE_|IA1PR12MB8556:EE_ X-MS-Office365-Filtering-Correlation-Id: 6851d13f-702a-4c3f-2678-08dd53e0daa5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|1800799024|82310400026|36860700013; X-Microsoft-Antispam-Message-Info: Hs2Pq2R1WvuAK/hyefj4FoVwPzlQu7LmrEe/DPyLJGqiYQeQEXWaPcEyFJcsIbontIs8V5WO0mQWCxYTkDLVsXG7h5kN7BkTj7uQUndEI7F3H9wnbV2Krpzs/pZ9v03fw/wXk9B4z0dM8um6RVGV2XUpDOU9Yv0jokUsB28OGODfpBxNl2zCjHZvAjmam7zFJDNIPR8x0+JybjG9oEEuBQflpQDSjYKalTlUNYSI0uG6hlJHHy4XknLQ+w3twJJn7maD0PHZjleiAxn/KakkIgs3h5IPhmDtfHuoLfK8qA2VzMAQ8FuCsa/bAGMHBWeA1TZDK9duaHLafNi6qcr+tb2cp5WVg58jBfn7B2k89UNaeUUn5RRiTOTx/UE6rMENHmFEMpQCVGv9eym1pXpz/Iq7Y83ESovgzWG/Ke6ARoMnttjlHPkqn84ZqyWUIQ8SWkrmBIUflqPa25BlLjNx2bao4Ha7INrqBcvWuHQootL2WPalhnQdg18sEUs4Qa5TfK4ADnYnTQFG2iZm2QcfTW5wms2sc6/5IJ4xaWn/iDcFp8Q1RKENBaoPftJRzux0EEUHwchicwXFltkC4uz5K3UVxY3vDxOOwPkOu+bDCHcqGRZ/RLj9h3ZE8TB85YDf4CdcRn+QZmEJ9DNqIUPDV61TXQMiFLuDS+hVzToJ08prhCxzqw1UrJl/ipMFTU5Sag39UoE4TFsnYpOG20nH64MvxC1hJMj8SZI4Pbro8ByNTsIMPeIAhRF1VV2sN0V+Wm4g3MQslf8nXjvQEFwCfVJQxpgtUGi8EiRKe19EW+EkJMhLQd/ngzSHtIOAeMdcvTfs8xWw1QpAwOVvjHiRvvFWmqP8rpxrCL7NnGZ7F2qxquqX0vvcUgzaOXmkk1GvRs1Cr7+Ai8l7G2FjtBcwF7wsHAhW1gNwCgbJDEfsFkFB95o3MHEV8cSQ5zzScAsj4NISskatbPgE591aR2/6actqEAzZUW+fKrhqAmmSev4Mhq3JjL2c1q7LqUY0tpxn5cGlOtXTiKWV3cBrBPw11w5e9YLBso1qyzzVzG6ou4VWIkgE5//+nB5RqRvU9nKA0caKvUl61SEtBIONorbHQllg8OeSrHJdsR14bbiajK1bjTeWWmH9nFU30cchCoE2fONU/p78D87yfajzGsoBVjgDHZiVgp3PzG6IaKpwYBTUHr8acqGnBeA4CiCLnTuWQ/Dp61NA8oepr4hGoW1v9425t6jyRTs4h7q8118ze7EmROL3+7+vWbQ5E9EwHMgcy7mViMRPRs5dcDHjPkYpkHXuHqZ91exIGuwFFj8veSYu+XHJKGU4hxV68cz/1AZG2MH8J2PhlSbNHb+6VbVz5u1URFUdH3k00PDdoov6pTiUXs3N+pXAtLegnN9ocpRW5TbL/8H5mFQL9nmz7Gg0TpHk2qWPzQIdRbZBRDdgsTK4wblHGg4QRLtjwBt8BdA2fw3bR/A5mItcAc3VWdNCx63g1tsQD8Ck8LnSqX+IANw= X-Forefront-Antispam-Report: CIP:216.228.118.232; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc7edge1.nvidia.com; CAT:NONE; SFS:(13230040)(376014)(1800799024)(82310400026)(36860700013); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Feb 2025 08:05:36.2358 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6851d13f-702a-4c3f-2678-08dd53e0daa5 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.232]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: SJ5PEPF000001F4.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB8556 Subject: [ovs-dev] [PATCH v5] 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: , Cc: Maor Dickman , Ilya Maximets 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 [ { "static": true, "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 --- Notes: v5 - Forgot to remove the wrong string output of age static. - Added test case for static entry. The two testsuite case numbers are 1279 1282. v4 - Make sure not to set more entries than allocated in json output. - Fix json output to have either boolean static or integer age and not mix the types. v3 - Fix assert. No need to call json_destroy() after unixctl_command_reply_json() as it takes ownership of the allocated body. v2 - Fix sparse check error. - Add case checking fdb/show json output. ofproto/ofproto-dpif.c | 89 ++++++++++++++++++++++++++++++++++-------- tests/ofproto-dpif.at | 42 ++++++++++++++++++++ 2 files changed, 115 insertions(+), 16 deletions(-) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index bf43d5d4bc59..5d485fc6859c 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,82 @@ 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); + long long port; + + port = (OVS_FORCE long long) 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(json_entry, "static", json_boolean_create(true)); + } else { + json_object_put(json_entry, "age", json_integer_create(age)); + } + json_entries[i++] = json_entry; + + if (i >= num_entries) { + break; + } + } + ovs_rwlock_unlock(&ofproto->ml->rwlock); +done: + *fdb_entries = json_array_create(json_entries, i); +} + +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); + } 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 diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at index fa5f148b4c28..a0675cd55c66 100644 --- a/tests/ofproto-dpif.at +++ b/tests/ofproto-dpif.at @@ -7100,6 +7100,22 @@ AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/[[0-9]]\{1,\}$/?/'], [0], [d 1 0 50:54:00:00:00:06 ? ]) +dnl Check json output. +AT_CHECK([ovs-appctl --format json --pretty fdb/show br0 \ + | sed 's/"age": [[0-9]]\+/"age": ?/g'], [0], [dnl +[[ + { + "age": ?, + "mac": "50:54:00:00:00:05", + "port": 3, + "vlan": 0}, + { + "age": ?, + "mac": "50:54:00:00:00:06", + "port": 1, + "vlan": 0}]] +]) + # Trace a packet arrival that updates the first learned MAC entry. OFPROTO_TRACE( [ovs-dummy], @@ -7708,6 +7724,32 @@ AT_CHECK_UNQUOTED([ovs-appctl fdb/show br0 | sed 's/ *[[0-9]]\{1,\}$//' | grep - 2 0 50:54:00:00:02:02 static ]) +dnl Check json output. +AT_CHECK([ovs-appctl --format json --pretty fdb/show br0 \ + | sed 's/"age": [[0-9]]\+/"age": ?/g'], [0], [dnl +[[ + { + "age": ?, + "mac": "50:54:00:00:00:01", + "port": 1, + "vlan": 0}, + { + "age": ?, + "mac": "50:54:00:00:00:02", + "port": 2, + "vlan": 0}, + { + "mac": "50:54:00:00:01:01", + "port": 1, + "static": true, + "vlan": 0}, + { + "mac": "50:54:00:00:02:02", + "port": 2, + "static": true, + "vlan": 0}]] +]) + dnl Remove static mac entry. AT_CHECK([ovs-appctl fdb/del br0 0 50:54:00:00:01:01])