From patchwork Fri Mar 22 12:58:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 1061131 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=samsung.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=samsung.com header.i=@samsung.com header.b="QtkQcBTd"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 44QkJk0GfPz9sWR for ; Fri, 22 Mar 2019 23:59:48 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 2E52B16D1; Fri, 22 Mar 2019 12:59:46 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id EA5E616C6 for ; Fri, 22 Mar 2019 12:58:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 9DA5B19B for ; Fri, 22 Mar 2019 12:58:49 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20190322125847euoutp023630e59236f3fbc69eca85ef483e0eec~OSU_Cl-XE1022710227euoutp02f for ; Fri, 22 Mar 2019 12:58:47 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20190322125847euoutp023630e59236f3fbc69eca85ef483e0eec~OSU_Cl-XE1022710227euoutp02f DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1553259527; bh=M0dUtOO7/+bf+LaifRg92tFj6uMmUQ2v7AdJxbV/U0I=; h=From:To:Cc:Subject:Date:References:From; b=QtkQcBTd8GLaJmwcSPNkUS7LZ8/iH5koPebcHCdHlf7cVYzBHDw07CCYsxasE9lf/ gXZzyCeXDN+ELllGhL0WD1bGxO9USDHmkr//u5wDNBsl2fMoph0fSdDuQp4rket81q wRH96AdACKGXHfek/mo6KjD7JMazDlyk8nZAlvuY= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20190322125846eucas1p16ecc13c0def8b955a0acfcb6487a24f8~OSU9qBGm40432004320eucas1p1a; Fri, 22 Mar 2019 12:58:46 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id BF.C4.04806.60CD49C5; Fri, 22 Mar 2019 12:58:46 +0000 (GMT) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20190322125846eucas1p1ec09a0bb281432edbc97040560f4bb59~OSU8zYss70432904329eucas1p1A; Fri, 22 Mar 2019 12:58:46 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20190322125845eusmtrp1fe44e8ad298e26b769619921ebf9bee7~OSU8lc-no1573015730eusmtrp1g; Fri, 22 Mar 2019 12:58:45 +0000 (GMT) X-AuditID: cbfec7f5-34dff700000012c6-53-5c94dc06e009 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 0E.63.04284.50CD49C5; Fri, 22 Mar 2019 12:58:45 +0000 (GMT) Received: from imaximets.rnd.samsung.ru (unknown [106.109.129.180]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20190322125845eusmtip2062de01c07a6daed13d09959d4aaa94a~OSU8PUa7b1614416144eusmtip2T; Fri, 22 Mar 2019 12:58:45 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org, Ben Pfaff Date: Fri, 22 Mar 2019 15:58:39 +0300 Message-Id: <20190322125839.28137-1-i.maximets@samsung.com> X-Mailer: git-send-email 2.17.1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrKIsWRmVeSWpSXmKPExsWy7djPc7psd6bEGDzaoWLxanIDo8WdKz/Z LK60/2S3mPvpOaMDi8ezm/8ZPZ5f62HxeL/vKptH35ZVjAEsUVw2Kak5mWWpRfp2CVwZny7e Yi74p1fx5bpMA+M3pS5GTg4JAROJk49WsHcxcnEICaxglDi16zc7SEJI4AujxOvDuRCJz4wS /X/OM8F0NC46zQZRtJxRouNaNkTRD0aJWQdnM4Mk2AR0JE6tPsIIYosANSyb+g2sgVkgSOLl yn9AGzg4hAWcJXYczQIJswioSizsec8CEuYVsJZY1ysPsUpeYvWGA8wg4yUENrBJ9N8/ygRS IyHgInHogBhEjbDEq+Nb2CFsGYnTk3tYIOx6ifstLxkhejsYJaYf+gd1v73EltfnwE5gFtCU WL9LHyLsKLFs7mJGiPF8EjfeCkIczCcxadt0Zogwr0RHmxBEtYrE74PLmSFsKYmb7z5DXeAh 8WL7XbBHhARiJb78DpjAKDcLYdUCRsZVjOKppcW56anFxnmp5XrFibnFpXnpesn5uZsYgZF9 +t/xrzsY9/1JOsQowMGoxMOr0Ts5Rog1say4MvcQowQHs5II765ooBBvSmJlVWpRfnxRaU5q 8SFGaQ4WJXHeaoYH0UIC6YklqdmpqQWpRTBZJg5OqQbGvG9TnvRdbm7OWz77iYNWYXlqUr7e Kfuj7iF/8t41y8mnLy8T9ZHYv1L40G7ftrNa15k4LjzZanpu1VXrmRtzD54VT7rknrztlMuu 2Ra3V68//bHLYGr7oouuetOkuVXNFqsc2D414OD7q3pcqzIPst1Ua5566k6twpSuB4E97wyW ML8+ka+6XomlOCPRUIu5qDgRAMICl1ToAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrDLMWRmVeSWpSXmKPExsVy+t/xe7qsd6bEGLTe0bV4NbmB0eLOlZ9s Flfaf7JbzP30nNGBxePZzf+MHs+v9bB4vN93lc2jb8sqxgCWKD2bovzSklSFjPziElulaEML Iz1DSws9IxNLPUNj81grI1MlfTublNSczLLUIn27BL2MTxdvMRf806v4cl2mgfGbUhcjJ4eE gIlE46LTbCC2kMBSRomWvfUQcSmJH78usELYwhJ/rnVB1XxjlPg9PwTEZhPQkTi1+ghjFyMH h4iAmcSWf5YgYWaBIImGqxtZQMLCAs4SO45mgYRZBFQlFva8BwvzClhLrOuVhxguL7F6wwHm CYw8CxgZVjGKpJYW56bnFhvqFSfmFpfmpesl5+duYgSG1LZjPzfvYLy0MfgQowAHoxIPr0Lb 5Bgh1sSy4srcQ4wSHMxKIry7ooFCvCmJlVWpRfnxRaU5qcWHGE2Bdk9klhJNzgeGe15JvKGp obmFpaG5sbmxmYWSOO95g8ooIYH0xJLU7NTUgtQimD4mDk6pBsbJWz5yOe/+dU/Mqrl8DneL 2bsyU5b1Iqena9tNtD1TWHXoqmBAYfzVvrKYDqU5bD9myl+65nf56Drrn3EHNWf9uf7/etjZ UulXpb5Vc0IvCc//1T5pghZ307fZhsxd3z/pRfTL95ewbFljy8Tieu20nvFidoWJ+svnvDjZ q/7Trsb/9PbkD5+VWIozEg21mIuKEwGfXyp3PwIAAA== X-CMS-MailID: 20190322125846eucas1p1ec09a0bb281432edbc97040560f4bb59 X-Msg-Generator: CA X-RootMTR: 20190322125846eucas1p1ec09a0bb281432edbc97040560f4bb59 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20190322125846eucas1p1ec09a0bb281432edbc97040560f4bb59 References: X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: Ilya Maximets Subject: [ovs-dev] [PATCH] bridge: Propagate patch port pairing errors to db. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Virtual ports like 'patch' ports that almost fully implemented on 'ofproto' layer could have internal to 'ofproto' statuses that could not be retrieved from 'netdev' or other layers. For example, in current implementation there is no way to get the patch port pairing status (i.e. if it has usable peer?). New 'ofproto-provider' API function 'vport_get_status' introduced to cover this gap. It allowes 'bridge' layer to retrive current status of ofproto virtual ports and propagate it to DB. For now we're only interested in pairing errors of 'patch' ports. That are propagated to the 'error' column of the 'Interface' table. Ex.: $ ovs-vsctl show ... Bridge "br1" ... Port "patch1" Interface "patch1" type: patch options: {peer="patch0"} error: "No usable peer 'patch0' exists in 'system' datapath." Bridge "br0" datapath_type: netdev ... Port "patch0" Interface "patch0" type: patch options: {peer="patch1"} error: "No usable peer 'patch1' exists in 'netdev' datapath." Signed-off-by: Ilya Maximets Acked-by: Eelco Chaudron --- ofproto/ofproto-dpif.c | 21 +++++++++++++++++++++ ofproto/ofproto-provider.h | 11 +++++++++++ ofproto/ofproto.c | 11 +++++++++++ ofproto/ofproto.h | 3 +++ vswitchd/bridge.c | 13 +++++++++++++ 5 files changed, 59 insertions(+) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 21dd54bab..f0d387ccd 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -3767,6 +3767,26 @@ port_get_stats(const struct ofport *ofport_, struct netdev_stats *stats) return error; } +static int +vport_get_status(const struct ofport *ofport_, char **errp) +{ + struct ofport_dpif *ofport = ofport_dpif_cast(ofport_); + char *peer_name; + + if (!netdev_vport_is_patch(ofport->up.netdev) || ofport->peer) { + return 0; + } + + peer_name = netdev_vport_patch_peer(ofport->up.netdev); + if (!peer_name) { + return 0; + } + *errp = xasprintf("No usable peer '%s' exists in '%s' datapath.", + peer_name, ofport->up.ofproto->type); + free(peer_name); + return EINVAL; +} + static int port_get_lacp_stats(const struct ofport *ofport_, struct lacp_slave_stats *stats) { @@ -6045,6 +6065,7 @@ const struct ofproto_class ofproto_dpif_class = { port_del, port_set_config, port_get_stats, + vport_get_status, port_dump_start, port_dump_next, port_dump_done, diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h index d1a87a59e..eb62a8fb3 100644 --- a/ofproto/ofproto-provider.h +++ b/ofproto/ofproto-provider.h @@ -1076,6 +1076,17 @@ struct ofproto_class { int (*port_get_stats)(const struct ofport *port, struct netdev_stats *stats); + /* Get status of the virtual port (ex. tunnel, patch). + * + * Returns '0' if 'port' is not a virtual port or has no errors. + * Otherwise, stores the error string in '*errp' and returns positive errno + * value. The caller is responsible for freeing '*errp' (with free()). + * + * This function may be a null pointer if the ofproto implementation does + * not support any virtual ports or their states. + */ + int (*vport_get_status)(const struct ofport *port, char **errp); + /* Port iteration functions. * * The client might not be entirely in control of the ports within an diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c index 40780e276..2b33ee382 100644 --- a/ofproto/ofproto.c +++ b/ofproto/ofproto.c @@ -2627,6 +2627,17 @@ ofproto_port_get_stats(const struct ofport *port, struct netdev_stats *stats) return error; } +int +ofproto_vport_get_status(const struct ofproto *ofproto, ofp_port_t ofp_port, + char **errp) +{ + struct ofport *ofport = ofproto_get_port(ofproto, ofp_port); + + return (ofport && ofproto->ofproto_class->vport_get_status) + ? ofproto->ofproto_class->vport_get_status(ofport, errp) + : EOPNOTSUPP; +} + static int update_port(struct ofproto *ofproto, const char *name) { diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h index 50208d481..510ace103 100644 --- a/ofproto/ofproto.h +++ b/ofproto/ofproto.h @@ -317,6 +317,9 @@ void ofproto_port_set_config(struct ofproto *, ofp_port_t ofp_port, const struct smap *cfg); int ofproto_port_get_stats(const struct ofport *, struct netdev_stats *stats); +int ofproto_vport_get_status(const struct ofproto *, ofp_port_t ofp_port, + char **errp); + int ofproto_port_query_by_name(const struct ofproto *, const char *devname, struct ofproto_port *); diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index a427b0122..48d8c4de1 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -2256,11 +2256,24 @@ static void iface_refresh_ofproto_status(struct iface *iface) { int current; + int error; + char *errp = NULL; if (iface_is_synthetic(iface)) { return; } + error = ofproto_vport_get_status(iface->port->bridge->ofproto, + iface->ofp_port, &errp); + if (error && error != EOPNOTSUPP) { + /* Need to verify to avoid race with transaction from + * 'bridge_reconfigure' that clears errors explicitly. */ + ovsrec_interface_verify_error(iface->cfg); + ovsrec_interface_set_error(iface->cfg, + errp ? errp : ovs_strerror(error)); + free(errp); + } + current = ofproto_port_is_lacp_current(iface->port->bridge->ofproto, iface->ofp_port); if (current >= 0) {