From patchwork Mon Oct 29 12:49:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 990184 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="oBDXM5nu"; 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 42kDyk1pLJz9s3Z for ; Mon, 29 Oct 2018 23:52:30 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id EBFD12C72; Mon, 29 Oct 2018 12:50:01 +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 D35502C6D for ; Mon, 29 Oct 2018 12:50:00 +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 2C8147E8 for ; Mon, 29 Oct 2018 12:50:00 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20181029124958euoutp0288ab2939fac6bc5871efe3ce550e77b2~iFUK7LGhh1679916799euoutp02Y; Mon, 29 Oct 2018 12:49:58 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20181029124958euoutp0288ab2939fac6bc5871efe3ce550e77b2~iFUK7LGhh1679916799euoutp02Y DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1540817398; bh=u89IcTbte/pdbkUPanpkDyEoOAz0z14JMJ1dWJeOTAM=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=oBDXM5nuRDHraegEBmyAgjDk40eOei62MUGLZFfmjFQFiBHMxbAgvdAGiqhKBYTku 1/+1xpVgOoZwU+5J/3aRfnZNS9r5xtH6SHx5IX87LH80DUQ0uOwNg/hC51O82Bjm5S XJDs8PxIDL3pbtqnAXNLqNgbuU1/RqN3l5HwhwzA= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20181029124958eucas1p1d394947fe9a58a4ca69ca69565c95187~iFUKYIs6w3273432734eucas1p1s; Mon, 29 Oct 2018 12:49:58 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id FC.8E.04441.5F107DB5; Mon, 29 Oct 2018 12:49:57 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20181029124957eucas1p2a85a856297ffd91d3f79da1ee7fcaafe~iFUJp3oY03134831348eucas1p2U; Mon, 29 Oct 2018 12:49:57 +0000 (GMT) X-AuditID: cbfec7f2-5e3ff70000001159-4e-5bd701f593d3 Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 55.FD.04128.5F107DB5; Mon, 29 Oct 2018 12:49:57 +0000 (GMT) Received: from imaximets.rnd.samsung.ru ([106.109.129.180]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0PHD00EQH2AI7G60@eusync3.samsung.com>; Mon, 29 Oct 2018 12:49:57 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org Date: Mon, 29 Oct 2018 15:49:23 +0300 Message-id: <20181029124926.12199-7-i.maximets@samsung.com> X-Mailer: git-send-email 2.17.1 In-reply-to: <20181029124926.12199-1-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrBIsWRmVeSWpSXmKPExsWy7djP87rfGK9HGywVstgybTKrxatF55kt rrT/ZLfY+PAsq8XcT88ZLW7P8bJ4evEXs0XLkp1MDhweN/7dYvNYvOclk8ez6YeZPG5sP83q 8ezmf0aPvi2rGD3+N19lDWCP4rJJSc3JLEst0rdL4Mo4ddiv4Ltuxbaud+wNjG+Uuhg5OSQE TCQ6d7WxdDFycQgJrGCUmP/qL5TzmVHiQO8hZpiqS4dmMUIkljFK7Ht3gQnCaWaSOPb6ISNI FZuAjsSp1UfAbBEBaYnXvW9YQYqYBSYySbz9eYENJCEs4CMxb/tysCIWAVWJXb1LmUBsXgFr ib1P/7FCrJOXWL3hANhqTgEbief3+9lABkkIzGGTeHP4JNRNLhJ9OxZB2cISr45vYYewZSQu T+5mgbDrJe63vGSEaO5glJh+6B8TRMJeYsvrc2ANzAJ8EpO2TQcaxAEU55XoaBOCKPGQuHB2 AhvEm/2MEvcubWCdwCi5gJFhFaN4amlxbnpqsWFearlecWJucWleul5yfu4mRmB8nv53/NMO xq+Xkg4xCnAwKvHwPuC+Fi3EmlhWXJl7iFGCg1lJhPfVWaAQb0piZVVqUX58UWlOavEhRmkO FiVx3mXzNkYLCaQnlqRmp6YWpBbBZJk4OKUaGPe3TbQs37P34LpZ0V2Vv5dc/O3PM2PH9NTY oCSX7jztJ9x8d8wyp1hf5LqU9Kt7xozzO/RVzz2ILprnNOXGval9HDHztkWLhaiGclm8XMvt 7ZHss3PxYXk9vtWrvb8mRGguDJzXaJ3pO2GL8Wb25XfuB59ZVrewrGmi6+ZcY7GAhcebxJmS vZRYijMSDbWYi4oTAaGr7k7LAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprGLMWRmVeSWpSXmKPExsVy+t/xq7pfGa9HG8x8IGuxZdpkVotXi84z W1xp/8lusfHhWVaLuZ+eM1rcnuNl8fTiL2aLliU7mRw4PG78u8XmsXjPSyaPZ9MPM3nc2H6a 1ePZzf+MHn1bVjF6/G++yhrAHsVlk5Kak1mWWqRvl8CVceqwX8F33YptXe/YGxjfKHUxcnJI CJhIXDo0i7GLkYtDSGAJo8Shp2uZIJxWJokJe9uZQarYBHQkTq0+wghiiwhIS7zufcMKUsQs MJlJYklLE1iRsICPxLzty8GKWARUJXb1LmUCsXkFrCX2Pv3HCrFOXmL1hgNg9ZwCNhLP7/ez gdhCQDWrPs5lnsDIs4CRYRWjSGppcW56brGRXnFibnFpXrpecn7uJkZgaG079nPLDsaud8GH GAU4GJV4eB9wX4sWYk0sK67MPcQowcGsJML76ixQiDclsbIqtSg/vqg0J7X4EKM0B4uSOO95 g8ooIYH0xJLU7NTUgtQimCwTB6dUA6NL1oOahxtnxjx6sIHf1Nwu8MnqziWNEpkf407KxYh0 y8Us/ZoiKxD+trljBsuTIxv8lt3OCg7/PSm5+O4+XW+1Vu0peW37foQFLuCJXy7fkePx4EhR zqHZpXM3mDos5ZHcqFlTcP3LzKrfQbP6eUR5lBuvbohLeWJ/y/KJVc/mGk4r431LpimxFGck GmoxFxUnAgBh4cFBKQIAAA== X-CMS-MailID: 20181029124957eucas1p2a85a856297ffd91d3f79da1ee7fcaafe X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20181029124957eucas1p2a85a856297ffd91d3f79da1ee7fcaafe References: <20181029124926.12199-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 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 23817d121..7163ab47c 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); } @@ -1389,8 +1406,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, \ @@ -1424,7 +1521,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, @@ -1442,6 +1540,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)