From patchwork Wed Dec 26 08:50:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 1018613 X-Patchwork-Delegate: ian.stokes@intel.com 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="JK2R8IAr"; 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 43Pmwr3tyMz9s8J for ; Wed, 26 Dec 2018 19:54:04 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 86272E80; Wed, 26 Dec 2018 08:51:12 +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 0E633E24 for ; Wed, 26 Dec 2018 08:51:11 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 0C7BE1C0 for ; Wed, 26 Dec 2018 08:51:08 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20181226085107euoutp018a2f81a39b3a32105d414e30779cb0cf~z1eLjRCma0361203612euoutp01J for ; Wed, 26 Dec 2018 08:51:07 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20181226085107euoutp018a2f81a39b3a32105d414e30779cb0cf~z1eLjRCma0361203612euoutp01J DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1545814267; bh=3rWIi0Gt5J29znu+PM6i39ErbxJ+q0v1Jr+JECUW7mA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JK2R8IAr0fF4bpKq3IpD2NT2IPYbd7EYL8Wr2g8xZrhLAUuL4vRqe7zCbP8VtI1bc NhxwmOmk3pSMkVEZfHou1YTsCj7vS0PHlXEl23kNJZFmgtG0AUMwcR/jkGo6FEpULK GALEKjj9izWxEIcHG31FmwRoSTGLccWNLxksZbWE= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20181226085106eucas1p1e6193bf253d62f36624b1ee0205c4bc7~z1eK27J0c2056720567eucas1p11; Wed, 26 Dec 2018 08:51:06 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 9D.34.04441.AF0432C5; Wed, 26 Dec 2018 08:51:06 +0000 (GMT) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20181226085105eucas1p1bcf196ad2e639aa5b516a7a2a0d9f1a8~z1eJ2QWsX2280522805eucas1p18; Wed, 26 Dec 2018 08:51:05 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20181226085105eusmtrp1ef6649c2d5131aa2951eca1fc11b1f95~z1eJlw5lH3160831608eusmtrp1c; Wed, 26 Dec 2018 08:51:05 +0000 (GMT) X-AuditID: cbfec7f2-5c9ff70000001159-0a-5c2340fafef6 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 21.7B.04128.9F0432C5; Wed, 26 Dec 2018 08:51:05 +0000 (GMT) Received: from imaximets.rnd.samsung.ru (unknown [106.109.129.180]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20181226085104eusmtip2a7a3ef4a3dd4b36aa48d8b8b540bdd1e~z1eI5_EYU0919609196eusmtip2L; Wed, 26 Dec 2018 08:51:04 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org, Ian Stokes Date: Wed, 26 Dec 2018 11:50:41 +0300 Message-Id: <20181226085044.9311-7-i.maximets@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181226085044.9311-1-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpnleLIzCtJLcpLzFFi42LZduznOd1fDsoxBjtmyVpsmTaZ1eJK+092 i40Pz7JarD30gd1i0pQTjBZzPz1ntLg9x8vi6cVfzA4cHov3vGTyeDb9MJC4+Z/R4/2+q2we fVtWMXr8b77KGsAWxWWTkpqTWZZapG+XwJXRu+c6a8F33Yov34+wNzC+Uepi5OSQEDCR2HO2 hbWLkYtDSGAFo8TtZzeZIJwvjBKbZrxggXA+M0rcf7abCaZl0ds9UFXLGSXu3l4AVfWDUeL9 5essIFVsAjoSp1YfYQSxRQTsJKatagLrYBZ4BzTqxB2wUcICgRLN736zg9gsAqoSG7/2g8V5 BawkLu5azQKxTl5i9YYDzCA2p4C1xOmnPYwggyQEfrNJvDzwgxGiyEVi86uVUA3CEq+Ob2GH sGUkTk/ugYrXS9xveQnV3MEoMf3QP6iH7CW2vD4H1MABdJ6mxPpd+hBhR4l7mz6wgIQlBPgk brwVBAkzA5mTtk1nhgjzSnS0CUFUq0j8PricGcKWkrj57jPUBR4S9/dvhwZQH6PE0icfWCYw ys9CWLaAkXEVo3hqaXFuemqxYV5quV5xYm5xaV66XnJ+7iZGYPI4/e/4px2MXy8lHWIU4GBU 4uEN8FeKEWJNLCuuzD3EKMHBrCTC6/kZKMSbklhZlVqUH19UmpNafIhRmoNFSZy3muFBtJBA emJJanZqakFqEUyWiYNTqoFRQeOmp9hyxwu+ufUpi+ZqfDsUnbd0/ceOtGmhBvt/c2UFl+zu V3Oy7Kl9rLa14KDsF917tzcKH7wVHx4Zdc3PUurlV9euj9ocC2v+TrY9LHertadWOyRxjaLP VgsFiYPBZwq3Zpa3eF+rKVxy8skP5z8xl1u3JarZ9U8T4LZ4JHZtS/HBqAAlluKMREMt5qLi RACTCoL8GgMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrBLMWRmVeSWpSXmKPExsVy+t/xe7o/HZRjDJ7MEbfYMm0yq8WV9p/s FhsfnmW1WHvoA7vFpCknGC3mfnrOaHF7jpfF04u/mB04PBbvecnk8Wz6YSBx8z+jx/t9V9k8 +rasYvT433yVNYAtSs+mKL+0JFUhI7+4xFYp2tDCSM/Q0kLPyMRSz9DYPNbKyFRJ384mJTUn syy1SN8uQS+jd8911oLvuhVfvh9hb2B8o9TFyMkhIWAisejtHqYuRi4OIYGljBK9/56wQiSk JH78ugBlC0v8udbFBlH0jVGif9FHNpAEm4COxKnVRxhBbBEBB4nNdxezghQxC3xilDj3ZjYL SEJYwF/izqRnYA0sAqoSG7/2M4HYvAJWEhd3rWaB2CAvsXrDAWYQm1PAWuL00x6woUJANXMe bmCewMi3gJFhFaNIamlxbnpusZFecWJucWleul5yfu4mRmAobzv2c8sOxq53wYcYBTgYlXh4 f/goxQixJpYVV+YeYpTgYFYS4fX8DBTiTUmsrEotyo8vKs1JLT7EaAp01ERmKdHkfGCc5ZXE G5oamltYGpobmxubWSiJ8543qIwSEkhPLEnNTk0tSC2C6WPi4JRqYGwXPyiTprs7LH9L2sc3 s7c+9Xw0t2u6m0wij41h5ab6ucnzhX6wvC8S7t3JYFhrnMqykj1XZdHjw7sMr7Bx7dlkpyj+ u23t+r+5cj4mMhvdfaQz7u+7v9dNf+ErJQMB5sJNJka/XiU8FI069uKYK9cx+1uyU3YZ5Cxp MfhXeYn9tvfG5VJPg5VYijMSDbWYi4oTAZ/slYt7AgAA X-CMS-MailID: 20181226085105eucas1p1bcf196ad2e639aa5b516a7a2a0d9f1a8 X-Msg-Generator: CA X-RootMTR: 20181226085105eucas1p1bcf196ad2e639aa5b516a7a2a0d9f1a8 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20181226085105eucas1p1bcf196ad2e639aa5b516a7a2a0d9f1a8 References: <20181226085044.9311-1-i.maximets@samsung.com> 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: Shahaf Shuler , Flavio Leitner , Ilya Maximets Subject: [ovs-dev] [PATCH v3 6/9] netdev-dummy: Implement dummy put/del flow offload API. 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 Basic partial HWOL API for dummy interfaces. Signed-off-by: Ilya Maximets --- lib/netdev-dummy.c | 106 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 103 insertions(+), 3 deletions(-) diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 72b4f7adc..6ee3cbca8 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -29,6 +29,7 @@ #include "odp-util.h" #include "openvswitch/dynamic-string.h" #include "openvswitch/list.h" +#include "openvswitch/match.h" #include "openvswitch/ofp-print.h" #include "openvswitch/ofpbuf.h" #include "openvswitch/vlog.h" @@ -92,6 +93,13 @@ struct pkt_list_node { struct ovs_list list_node; }; +struct offloaded_flow { + struct hmap_node node; + ovs_u128 ufid; + struct match match; + uint32_t mark; +}; + /* Protects 'dummy_list'. */ static struct ovs_mutex dummy_list_mutex = OVS_MUTEX_INITIALIZER; @@ -124,6 +132,8 @@ struct netdev_dummy { struct in6_addr ipv6, ipv6_mask; struct ovs_list rxes OVS_GUARDED; /* List of child "netdev_rxq_dummy"s. */ + struct hmap offloaded_flows OVS_GUARDED; + /* The following properties are for dummy-pmd and they cannot be changed * when a device is running, so we remember the request and update them * next time netdev_dummy_reconfigure() is called. */ @@ -699,6 +709,7 @@ netdev_dummy_construct(struct netdev *netdev_) dummy_packet_conn_init(&netdev->conn); ovs_list_init(&netdev->rxes); + hmap_init(&netdev->offloaded_flows); ovs_mutex_unlock(&netdev->mutex); ovs_mutex_lock(&dummy_list_mutex); @@ -712,6 +723,7 @@ static void netdev_dummy_destruct(struct netdev *netdev_) { struct netdev_dummy *netdev = netdev_dummy_cast(netdev_); + struct offloaded_flow *off_flow; ovs_mutex_lock(&dummy_list_mutex); ovs_list_remove(&netdev->list_node); @@ -727,6 +739,11 @@ netdev_dummy_destruct(struct netdev *netdev_) dummy_packet_conn_close(&netdev->conn); netdev->conn.type = NONE; + HMAP_FOR_EACH_POP (off_flow, node, &netdev->offloaded_flows) { + free(off_flow); + } + hmap_destroy(&netdev->offloaded_flows); + ovs_mutex_unlock(&netdev->mutex); ovs_mutex_destroy(&netdev->mutex); } @@ -1388,8 +1405,88 @@ netdev_dummy_update_flags(struct netdev *netdev_, return error; } - -/* Helper functions. */ + +/* Flow offload API. */ +static uint32_t +netdev_dummy_flow_hash(const ovs_u128 *ufid) +{ + return ufid->u32[0]; +} + +static struct offloaded_flow * +find_offloaded_flow(const struct hmap *offloaded_flows, const ovs_u128 *ufid) +{ + uint32_t hash = netdev_dummy_flow_hash(ufid); + struct offloaded_flow *data; + + HMAP_FOR_EACH_WITH_HASH (data, node, hash, offloaded_flows) { + if (ovs_u128_equals(*ufid, data->ufid)) { + return data; + } + } + + return NULL; +} + +static int +netdev_dummy_flow_put(struct netdev *netdev, struct match *match, + struct nlattr *actions OVS_UNUSED, + size_t actions_len OVS_UNUSED, + const ovs_u128 *ufid, struct offload_info *info, + struct dpif_flow_stats *stats OVS_UNUSED) +{ + struct netdev_dummy *dev = netdev_dummy_cast(netdev); + struct offloaded_flow *off_flow; + + ovs_mutex_lock(&dev->mutex); + + off_flow = find_offloaded_flow(&dev->offloaded_flows, ufid); + if (!off_flow) { + /* Create new offloaded flow. */ + off_flow = xzalloc(sizeof *off_flow); + memcpy(&off_flow->ufid, ufid, sizeof *ufid); + hmap_insert(&dev->offloaded_flows, &off_flow->node, + netdev_dummy_flow_hash(ufid)); + } + + off_flow->mark = info->flow_mark; + memcpy(&off_flow->match, match, sizeof *match); + + /* As we have per-netdev 'offloaded_flows', we don't need to match + * the 'in_port' for received packets. This will also allow offloading for + * packets passed to 'receive' command without specifying the 'in_port'. */ + off_flow->match.wc.masks.in_port.odp_port = 0; + + ovs_mutex_unlock(&dev->mutex); + + return 0; +} + +static int +netdev_dummy_flow_del(struct netdev *netdev, const ovs_u128 *ufid, + struct dpif_flow_stats *stats OVS_UNUSED) +{ + struct netdev_dummy *dev = netdev_dummy_cast(netdev); + struct offloaded_flow *off_flow; + + ovs_mutex_lock(&dev->mutex); + + off_flow = find_offloaded_flow(&dev->offloaded_flows, ufid); + if (!off_flow) { + ovs_mutex_unlock(&dev->mutex); + return -1; + } + + hmap_remove(&dev->offloaded_flows, &off_flow->node); + free(off_flow); + + ovs_mutex_unlock(&dev->mutex); + return 0; +} + +#define DUMMY_FLOW_OFFLOAD_API \ + .flow_put = netdev_dummy_flow_put, \ + .flow_del = netdev_dummy_flow_del #define NETDEV_DUMMY_CLASS_COMMON \ .run = netdev_dummy_run, \ @@ -1423,7 +1520,8 @@ netdev_dummy_update_flags(struct netdev *netdev_, .rxq_dealloc = netdev_dummy_rxq_dealloc, \ .rxq_recv = netdev_dummy_rxq_recv, \ .rxq_wait = netdev_dummy_rxq_wait, \ - .rxq_drain = netdev_dummy_rxq_drain + .rxq_drain = netdev_dummy_rxq_drain, \ + DUMMY_FLOW_OFFLOAD_API static const struct netdev_class dummy_class = { NETDEV_DUMMY_CLASS_COMMON, @@ -1441,6 +1539,8 @@ static const struct netdev_class dummy_pmd_class = { .is_pmd = true, .reconfigure = netdev_dummy_reconfigure }; + +/* Helper functions. */ static void pkt_list_delete(struct ovs_list *l)