From patchwork Thu Apr 26 16:32:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Petr Machata X-Patchwork-Id: 10366377 X-Patchwork-Delegate: idosch@idosch.org Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 2D4D960542 for ; Thu, 26 Apr 2018 16:33:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1E1DC286F6 for ; Thu, 26 Apr 2018 16:33:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 12968289B2; Thu, 26 Apr 2018 16:33:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, MAILING_LIST_MULTI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 7B0C428CEF for ; Thu, 26 Apr 2018 16:33:14 +0000 (UTC) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 40X2gD6fXyzF255 for ; Fri, 27 Apr 2018 02:33:12 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=mellanox.com Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=Mellanox.com header.i=@Mellanox.com header.b="hxLZJAaw"; dkim-atps=neutral X-Original-To: linux-mlxsw@lists.ozlabs.org Delivered-To: linux-mlxsw@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=mellanox.com (client-ip=104.47.0.64; helo=eur01-he1-obe.outbound.protection.outlook.com; envelope-from=petrm@mellanox.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=mellanox.com Authentication-Results: lists.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=Mellanox.com header.i=@Mellanox.com header.b="hxLZJAaw"; dkim-atps=neutral Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01on0064.outbound.protection.outlook.com [104.47.0.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 40X2g9016jzF25Q for ; Fri, 27 Apr 2018 02:33:08 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=A3f8uj+mw9XNzQ2WKEgiNpOn5yyhKxfbfyuecEeyu64=; b=hxLZJAawspdtddybSWI66ULGoaXBeAZSoaGLCtZaFL3ynACF5NVjlMRjcpHQprrTYVtlH6ZqANfqik5QNgL6tD3FwDSevg1piiT5WRF871qyZFxbkeRkPl1Qhz5dMaGh8xGs+RhUJ0C2p643vHlobEUWxY4M61dh0vQD23y/RH0= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=petrm@mellanox.com; Received: from t540p (78.45.160.211) by VI1PR05MB4191.eurprd05.prod.outlook.com (2603:10a6:803:4e::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.696.15; Thu, 26 Apr 2018 16:32:58 +0000 From: Petr Machata To: Subject: [PATCH net-next mlxsw v2 5/6] mlxsw: Respin SPAN on switchdev events In-Reply-To: References: Message-Id: <119fda687c12f4491ab70c9383e9f7ee4b9fc2c4.1524759641.git.petrm@mellanox.com> Date: Thu, 26 Apr 2018 18:32:54 +0200 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 X-Originating-IP: [78.45.160.211] X-ClientProxiedBy: VI1P18901CA0013.EURP189.PROD.OUTLOOK.COM (2603:10a6:801::23) To VI1PR05MB4191.eurprd05.prod.outlook.com (2603:10a6:803:4e::17) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(2017052603328)(7153060)(7193020); SRVR:VI1PR05MB4191; X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB4191; 3:ufgYAnIPkMB3fCWIMEo4mql/t0QZtgYFauq1JOP+GXS35yliNWuPk0RwP99CYSGYsQjxWIQRIK/PrpHU679/3RtI0yFYkuUbYDnRkce6qHkRl20p4lzLMx6jZTCDmAhZ5GnL2rFsymyx0CDYMWa932O8iq352/uc3BNSGNUjk9j/PrM5mTp2+FypuwgXCCLT7I/5/sbKGY2RbvkyqvcC6JccvxD0B9J7TVosFBtTpD7L/eKFM6LtpOCGwDO2OLeZ; 25:SftisYPjW7tdN/4qBtLdI+dYklwpDnaOvkiRXYMUChF6zhslXc74BxKgscUbYSz8HxxuCv5VpVAoLHQs1Cn5QZ7miMvR5Zbfz8etlXRDJzRYzcoHEjMwdIPpkB1siMc2/AYrNuTA9mijtRXM0Y1P4hKLO6qxGIpUAP8ZtmlYnPzaK82u9Ap7mS/pm/APEMafQr8XyXLuRMx1QCbepNQrd0HBEJ23/DhcSMpYPqN1QTr7f+JIq6WtsdFWCo5JHoaePW18shXwKtTTpYfecByjt/w/tBLK9iwKlVQNgTG3Mz+6G1tddpcjkiyaG57/YK+U9RccrQu2VWByNN6mEO21fw==; 31:3FWRygf2ttsLEKVC1jd01hkyHclm9pSWKij13eGQ3v77mraXkY3R3T/bDflBhrC+OxiiEJRMR8xnBKsNyVGc3Hc4AJOuXbNe3bINxQzZQRbwNFKRrH83MRtY8CtXhrlLd4aPvUYfjFHg3cyFtuzrShOTwJck9r6OQYGVMITboyfrmvayvDsKBVmmBGr7t6l5V6jNxUL/NJVvtgAiyM5rbJUGWx33w5Yn6lsYU+Of2Ik= X-MS-TrafficTypeDiagnostic: VI1PR05MB4191: X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB4191; 20:kraYb4xMhYatbRgIhOU1lhWRjXUyemji4fhHzCQGAUPb8MvbMgy8KA49f7BPzLDtkwUqgNEkunQz/YfxYUbJiN24RCaNZX240YBFUBH+o2vLXXYpbNjY9pbIC+abGXUU5rg7umI/YSvteqA6k25I80mesO9sCFqlSqT+5NiC4SBz1Xg7jSEuYt/55o+aXeQ3d6kqGb8EhItAaRoSIOGEwzEU7+k6FikxeUOabOyPxZJ1WGDnkImpKqkBlpbWuwO9Bc12+gO+ELyBfzO2erRxhPnP7PMArG5OTdyP2T/P+jjGCtJQUhPYxrn8B1b2q1Potvs2fsBcby7VbgIgh28Fh+YlBTxxwacwu8FNCvu/KXdEfdArgud+Iw72KiKbZbRr+ZvY2Qlo4jDLfG140YcTa16JCafvND/NvChfTf7tMhAK6fxU3J8ZfXRoHZrx1ed/VliNpohkQN0PiYHiZXuA6N66vn3OINTnYjRkN5PlrktqgQk7N9i34n36A1/Tqyxx; 4:Py19YZSegoe0AOIGl+SalXO9/KG7AUu6msHZ7CJleSc9KXn1nplSUl+rDPtigpQjFYgyxReo5UoXbKRpHWjZJlGBmzRTBPDbQZd18xBq61XZCGbDIdBL60DeCHqJsj3xmDYGPbNDmxbEgVqNo9FvoPj33feMQwKT8WCStqqgCBz5dQQ/MmRu53ME69E9J2dgJ/0zKNT1iyHSV9YXzn8VGb53koJZ51g7u5o1TsLJuPoI3XigpzDu8yvFLtf4vLiqT5/+/nn74UgaBsRHD/FavQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3002001)(3231232)(944501410)(52105095)(6055026)(6041310)(20161123562045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123558120)(6072148)(201708071742011); SRVR:VI1PR05MB4191; BCL:0; PCL:0; RULEID:; SRVR:VI1PR05MB4191; X-Forefront-PRVS: 0654257CF5 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(376002)(39380400002)(346002)(366004)(396003)(39860400002)(199004)(189003)(2616005)(106356001)(66066001)(5660300001)(476003)(53936002)(26005)(6916009)(305945005)(97736004)(86362001)(486006)(48376002)(50466002)(6666003)(105586002)(107886003)(956004)(3846002)(11346002)(16526019)(446003)(478600001)(2351001)(6496006)(6116002)(386003)(2906002)(25786009)(4326008)(7736002)(68736007)(8936002)(36756003)(51416003)(52116002)(81156014)(8676002)(6486002)(58126008)(118296001)(81166006)(59450400001)(16586007)(316002)(47776003)(76176011); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB4191; H:t540p; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR05MB4191; 23:72EuTy44ZfSnPF2zT0gLleoB22lJTN9Ekit3wWDum?= =?us-ascii?Q?lxZpHhCNiovIOzePPviARsnMiRcflUlwbTvWzKFjeHKdHS3SpdwEJKTq+++k?= =?us-ascii?Q?1oytM/40FMc84EY530m/BOh4m77nxT9Oy2eyFzQkC/OMUjQ1KB6XpYu6F8b2?= =?us-ascii?Q?b3sH2h0trXfYxDVUzz0f5PlNpD48APCPJXsi8IqlROiGYx3tzR+Le6U8wqi3?= =?us-ascii?Q?sgB2ImUHgeUbBxGkccyE2lk1O3K0rTJ4wS/RiQ/+WjA1k0dP9AEz4SMmErsM?= =?us-ascii?Q?/ZtDkINLgOqv+FNxKQF9fnG7rpmIRowqTwX6xK+Zf8Z4HdZWE9yHGwKp6Smh?= =?us-ascii?Q?Og8PVRhPgP0dnrgy4R+Y9su9zD+WCX9arIGK/LQf6A8aCqSrr0CUIdcrz/36?= =?us-ascii?Q?/kQCEOyC5tiUajdXMqc+GNjKgueKGCfjJO/Mo1Cb/a/hjm39mWYzapc95kMp?= =?us-ascii?Q?bWbxkGwFNuA0/3vQPl1eseYQxI4Etz608WaSoSv2Yx8BsN6BWlIWA1O/Vzlo?= =?us-ascii?Q?WFIXAIDVY827Fw9TXIg+hyQTSsKy6eFS7gvOml/SxAnsDxABGZmYVTllfIwi?= =?us-ascii?Q?xKoo5ZmvMoyQisXThOHRDBxYMqiUJoXC0p7opCBw5JUqSFBpVSg/lqmrbewW?= =?us-ascii?Q?4ifjceybhQtaxNji0WfTh9Egfn7HBaGK7TSJk/p0XivWnX6cDXPgz8WBigD5?= =?us-ascii?Q?5tENc2xziywfh7X3rX+KGWFSOyIGdoWxe7NT5o60T+f48+Oi7fHo4uuDj0oe?= =?us-ascii?Q?xJ5Owi/9Ro8kM9tIJ0JSgFOj/UwPEGYkMy7KKY2KK6IfYyHGXGrEDzdb28f2?= =?us-ascii?Q?snS1Nxh4DnlNZrrp9ZL2/6YAaRdaai4+LVGrfbqd1KyEJ75laLepTkML5WES?= =?us-ascii?Q?iHueyaEupyWOmORzhoeukI7rr7M+QB0Vqu/xzEUoHJu+PgcaWecBuLRjsiRp?= =?us-ascii?Q?thYqz45J+KCRD/gKSPiq1iD/WjQX0g8FsnkV7CHlaZ9WjffM6HymsukvzVcb?= =?us-ascii?Q?/LfYlbPB3nu28hYlbnQL3k7L1d/aSmvn1NSTM/FIyr12TeP5jcTeXsQw5mBr?= =?us-ascii?Q?hMRuOQHlHec6Bmrg9rAuAYs8h3BWwZWFvPjEMmF/T/DiQ8zgZ3KirUAZXakO?= =?us-ascii?Q?CJHTP/ojuytJFCr3hdvXaTylo5AjQdo5QrpLEaenuA00x/2W532W/jgsHWkH?= =?us-ascii?Q?dhd4hGXOaSrRdNRcwFWx1/i+2CFlrmyvJQhW/MrNh9g7xg9+KqVwiL2Kw=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Antispam-Message-Info: BNYsRAzLRnxwwT9WSrsapLCl236FG1RoyDHTgUYdbioTu1sdW0nKS9sPnU14mMcNCLcuqdWwqrh7kA19yxrKTHaRj2QQEPq2snjuWkDv3QL8rxs1euqX/yjQXxQ1vpta21zAEFCpgpYBhMvAH78lcEn5f8yPLC9icxwGK/i9JuESppK4wk1TzrNubcHyxGaq X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB4191; 6:c7eplw3ZaIlMP3n6D775Yo9qbOySW21Cj+Y2F/tryEclI6xJbNjXcCRSWYEXWp24Hw/qPvxAv+0Bx9kc/XTpnuMDWl2/Z2LYhXEsyKMev+v2ZbZoH5Dpk9+NHfnUkSE2ZaY8+mObGqGoawEAwy5gx3o7vh7sacvGD6h0meyDGl19qMGPhccY+YATs558pkvVxEMSVrY8Kd38DpIcvVKUp1S1OnLt+IlEPJgctK2gLnhldbgTDIOFHEKMBym6aEMcoFGUQ4aV+Sp3h//qQc2MOAfwftDHsIumRMiu4lyUnrS8JXS6lT+G4NcM9P++Q/J0OVZ3pEw7pHi0IlzPBY7Giq68BeDZFvJvHwKrrFweEw7Lvgc52Vhx27TRdOOW5MDvL76XVrdnHDDFJLiM01dPJhyJ5ClJDMGXl5CapYDTvj1inmUeavFERm2kQXyZFTIOd1/RyLbny2lDvTZc5swVmQ==; 5:kHeHxBf40rojXJecexbGkyLUfadpJ8U3YB88NYwmfXWyTOijehtb7UmOdEbNfQ8vzOKY2Z62NQYrdrS9aeMM+RrM71RJszBPPY2hLgsojqbdXoEkzn9Mm5rzlp8wIdbMx8OdLWf0JnUN/ObkXeWWx4WcugD4oHTPfenRqwFXXFA=; 24:SlTF+9BA3CuxrBOdAc6jcq/M6r2qQbQCKd2StGa5b5RlhWiz4NXMdYHwkAX41fdAnVRrOPDbfPwJFo37V0c/BPqhVW623cZBH41MPATY79I= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB4191; 7:PKhZQmjNMEAxIlDq7L1NPxMi9XPW5GMjpAfa2uhz3OkP6xgOb42orOPP0gJecyIpSRXmM4HGK04AdL5CGxMwRIAQDm1ngqjL/DiBonmhikUklFCPqj9K8r2w4484yz6OATY6hzTf/hLxxWMLAmvxkzHZdzmVyxNpL7x/fvhkVLaBM2mTdxep61Ix8xHi5zhK5PlZ4nEzHgKKynDEc/GeqodSRuz97IRsfkHxnziRR4Pb7ct9iWW6RcyUO+G8YUYk X-MS-Office365-Filtering-Correlation-Id: cb6da028-1b92-4bad-1b23-08d5ab935f4a X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Apr 2018 16:32:58.9402 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: cb6da028-1b92-4bad-1b23-08d5ab935f4a X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB4191 X-BeenThere: linux-mlxsw@lists.ozlabs.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: mlxsw driver development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-internal@mellanox.com Errors-To: linux-mlxsw-bounces+patchwork-linux-mlxsw=patchwork.kernel.org@lists.ozlabs.org Sender: "Linux-mlxsw" X-Virus-Scanned: ClamAV using ClamSMTP Changes to switchdev artifact can make a SPAN entry offloadable or unoffloadable. To that end: - Listen to SWITCHDEV_FDB_*_TO_BRIDGE notifications in addition to the *_TO_DEVICE ones, to catch whatever activity is sent to the bridge (likely by mlxsw itself). On each FDB notification, respin SPAN to reconcile it with the FDB changes. - Also respin on switchdev port attribute changes (which currently covers changes to STP state of ports) and port object additions and removals. Signed-off-by: Petr Machata --- .../ethernet/mellanox/mlxsw/spectrum_switchdev.c | 63 ++++++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c index db4aea0..1af99fe 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c @@ -49,6 +49,7 @@ #include #include +#include "spectrum_span.h" #include "spectrum_router.h" #include "spectrum_switchdev.h" #include "spectrum.h" @@ -923,6 +924,9 @@ static int mlxsw_sp_port_attr_set(struct net_device *dev, break; } + if (switchdev_trans_ph_commit(trans)) + mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp); + return err; } @@ -1647,18 +1651,57 @@ mlxsw_sp_port_mrouter_update_mdb(struct mlxsw_sp_port *mlxsw_sp_port, } } +struct mlxsw_sp_span_respin_work { + struct work_struct work; + struct mlxsw_sp *mlxsw_sp; +}; + +static void mlxsw_sp_span_respin_work(struct work_struct *work) +{ + struct mlxsw_sp_span_respin_work *respin_work = + container_of(work, struct mlxsw_sp_span_respin_work, work); + + rtnl_lock(); + mlxsw_sp_span_respin(respin_work->mlxsw_sp); + rtnl_unlock(); + kfree(respin_work); +} + +static void mlxsw_sp_span_respin_schedule(struct mlxsw_sp *mlxsw_sp) +{ + struct mlxsw_sp_span_respin_work *respin_work; + + respin_work = kzalloc(sizeof(*respin_work), GFP_ATOMIC); + if (!respin_work) + return; + + INIT_WORK(&respin_work->work, mlxsw_sp_span_respin_work); + respin_work->mlxsw_sp = mlxsw_sp; + + mlxsw_core_schedule_work(&respin_work->work); +} + static int mlxsw_sp_port_obj_add(struct net_device *dev, const struct switchdev_obj *obj, struct switchdev_trans *trans) { struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev); + const struct switchdev_obj_port_vlan *vlan; int err = 0; switch (obj->id) { case SWITCHDEV_OBJ_ID_PORT_VLAN: - err = mlxsw_sp_port_vlans_add(mlxsw_sp_port, - SWITCHDEV_OBJ_PORT_VLAN(obj), - trans); + vlan = SWITCHDEV_OBJ_PORT_VLAN(obj); + err = mlxsw_sp_port_vlans_add(mlxsw_sp_port, vlan, trans); + + if (switchdev_trans_ph_commit(trans)) { + /* The event is emitted before the changes are actually + * applied to the bridge. Therefore schedule the respin + * call for later, so that the respin logic sees the + * updated bridge state. + */ + mlxsw_sp_span_respin_schedule(mlxsw_sp_port->mlxsw_sp); + } break; case SWITCHDEV_OBJ_ID_PORT_MDB: err = mlxsw_sp_port_mdb_add(mlxsw_sp_port, @@ -1809,6 +1852,8 @@ static int mlxsw_sp_port_obj_del(struct net_device *dev, break; } + mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp); + return err; } @@ -2236,8 +2281,16 @@ static void mlxsw_sp_switchdev_event_work(struct work_struct *work) fdb_info = &switchdev_work->fdb_info; mlxsw_sp_port_fdb_set(mlxsw_sp_port, fdb_info, false); break; + case SWITCHDEV_FDB_ADD_TO_BRIDGE: /* fall through */ + case SWITCHDEV_FDB_DEL_TO_BRIDGE: + /* These events are only used to potentially update an existing + * SPAN mirror. + */ + break; } + mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp); + out: rtnl_unlock(); kfree(switchdev_work->fdb_info.addr); @@ -2266,7 +2319,9 @@ static int mlxsw_sp_switchdev_event(struct notifier_block *unused, switch (event) { case SWITCHDEV_FDB_ADD_TO_DEVICE: /* fall through */ - case SWITCHDEV_FDB_DEL_TO_DEVICE: + case SWITCHDEV_FDB_DEL_TO_DEVICE: /* fall through */ + case SWITCHDEV_FDB_ADD_TO_BRIDGE: /* fall through */ + case SWITCHDEV_FDB_DEL_TO_BRIDGE: memcpy(&switchdev_work->fdb_info, ptr, sizeof(switchdev_work->fdb_info)); switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);