From patchwork Tue Nov 13 12:12:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 997056 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="lr+Jornr"; 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 42vRS21QVgz9sDF for ; Tue, 13 Nov 2018 23:16:18 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id A7641AC7; Tue, 13 Nov 2018 12:12:58 +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 A6327A67 for ; Tue, 13 Nov 2018 12:12:57 +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 05B94224 for ; Tue, 13 Nov 2018 12:12:57 +0000 (UTC) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20181113121255euoutp02fa01edb4277403b44dcddf912e1d03b5~mrfGhoyEX0367503675euoutp02a for ; Tue, 13 Nov 2018 12:12:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20181113121255euoutp02fa01edb4277403b44dcddf912e1d03b5~mrfGhoyEX0367503675euoutp02a DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1542111175; bh=u89IcTbte/pdbkUPanpkDyEoOAz0z14JMJ1dWJeOTAM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lr+Jornrgl7BsihfU8IRwJ66OfkjBwZ4PtUXQhEsnoyCwMTSW4pZRXCGgD0vyJ5Ce hN0CJ55NDc0Sc7kp+5eWDHI/rVYI6NoX7Trim+aPBPRffh2Kk5QZTFIVeR/Ij3y+TI dQsjpgbRyrYCTTuhs4saozzfLi8GgS7QlZogT/ng= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20181113121254eucas1p1b7a762362602d46798abb43f9fb7a2ab~mrfF12LKZ0680806808eucas1p1k; Tue, 13 Nov 2018 12:12:54 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id AC.F7.04441.6CFBAEB5; Tue, 13 Nov 2018 12:12:54 +0000 (GMT) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20181113121253eucas1p15b6cc3c614d237fd9fa07eb4511052d0~mrfE4ja640871008710eucas1p1a; Tue, 13 Nov 2018 12:12:53 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20181113121253eusmtrp28b4d6e0ddb7d228fc52e5f5d8066303c~mrfEp59e02687426874eusmtrp28; Tue, 13 Nov 2018 12:12:53 +0000 (GMT) X-AuditID: cbfec7f2-5e3ff70000001159-7e-5beabfc6d985 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 0C.DC.04128.5CFBAEB5; Tue, 13 Nov 2018 12:12:53 +0000 (GMT) Received: from imaximets.rnd.samsung.ru (unknown [106.109.129.180]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20181113121253eusmtip102d2005971c6ca12daec07e45c09152a~mrfEAkWcz1152111521eusmtip1d; Tue, 13 Nov 2018 12:12:52 +0000 (GMT) From: Ilya Maximets To: ovs-dev@openvswitch.org, Ian Stokes Date: Tue, 13 Nov 2018 15:12:25 +0300 Message-Id: <20181113121228.17650-7-i.maximets@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181113121228.17650-1-i.maximets@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA0WSe0hTYRjG+3Z23NlwcZyCbxaIy5JCXYLYiaQbBodulFBgI2zqQSVvbd4L MvI6zDuuLCvUWKlhipmKpU6boqRoXpOYQjo3TchLauaWx2P03+993ue9fXwEJinGnYjwqFhG GaWIkNqI+A369X4PfatZfqStyI2qLy7EKXNZP0YNZawLqNqpzzg10ZrNpwqKuhFVumhE1MTT c9T0wG+MSq1o4p0S0WOWrzZ0eYuJR89oOnj02PtenJ4ZtyLaOJLNp3PqKxFtfTCMXyaui3xD mIjweEYpO3FTFNbTcSlm1SOxQb0gSEHzUjUSEkB6Q0mpTqBGIkJCvkJQXjHH54JlBJULrzEu WEJQM2TF1YjYLulKceB0LYICbaWAbSUh1xBYOl1ZtiHdoaeqE7HsQB4D9agasQUY2cADw7wB YxP25BWYfFO63ZRPHoCnhWdZFJPHYaPMh9vOGaretm27haQv3Dc8smHbAPlMAJsDjXzO5AeZ 2jKcY3swd9ULON4H1qbnPI7vgSHVhLjiTAQanWUncRLq5/oE7GCMPAQ1zTJOPg2z+X927t0N Yz/sWBnbwoIGDcbJYshMl3BuV9ho12IcO8H4wtLOBjRUfM/dedxcBL8y2rE85Fzyf9gLhCqR IxOnigxlVF5RTIKnShGpiosK9QyOjqxDW7+l19K12IhWBoN0iCSQ1FbcrTHJJbgiXpUUqUNA YFIHcZO3WS4RhyiSkhlldKAyLoJR6dBegi91FN/ZNSmXkKGKWOYWw8Qwyn9ZHiF0SkEBaWui RH3nQM1tNKv7maWfbq7L0LjkfzFqdZNC/82P6fH4mYv+1/rKZOCbkDXjYAgw2n5YHRFe1UvD tU+qp8IrRDdm8hRoNFjj/s5o2vPQ5W6L24WgkNFlP8b+ZVehPND8KXF/kmwl/nyanU/cnPOg Z7Dd8OOjybWD3TkHv1VL+aowhddhTKlS/AVDHGhAKQMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrOLMWRmVeSWpSXmKPExsVy+t/xu7pH97+KNti3Tstiy7TJrBavFp1n trjS/pPdYuPDs6wWt/f3sFhMmnKC0WLup+eMFrfneFk8vfiL2aJlyU4mBy6PG/9usXks3vOS yePZ9MNMHje2n2b1eHbzP6PH82s9LB59W1YxevxvvsoawBGlZ1OUX1qSqpCRX1xiqxRtaGGk Z2hpoWdkYqlnaGwea2VkqqRvZ5OSmpNZllqkb5egl3HqsF/Bd92KbV3v2BsY3yh1MXJwSAiY SBxvEOli5OIQEljKKLFl/nr2LkZOoLiUxI9fF1ghbGGJP9e62EBsIYFvjBKbLxaC2GwCOhKn Vh9hBLFFBKwl1n3fyAIyiFlgD5PEkV3vwZqFBfwlPjybwA6yjEVAVWLOZFcQkxeo/vciM4jx 8hKrNxxgBrE5BWwkGu/PgFplLbF/Xy/bBEa+BYwMqxhFUkuLc9Nzi430ihNzi0vz0vWS83M3 MQIDfduxn1t2MHa9Cz7EKMDBqMTDe2L6y2gh1sSy4srcQ4wSHMxKIrw7TV5FC/GmJFZWpRbl xxeV5qQWH2I0BTppIrOUaHI+MArzSuINTQ3NLSwNzY3Njc0slMR5zxtURgkJpCeWpGanphak FsH0MXFwSjUwrkjO/SOsabdn5RXNM9ZfbazkPe4kcKuLnQ1er5tyIiN9sdM9383zZTjNmJKP l3P0LjLIMeOT3R9VsnBSE0PRR8aVS56Hsc9zvrvmYWWt/O87fOcve83S+21QGFHpx/A1ue14 yywbj2d9Pxa9V983aUVx8CKb240tXz2+T/p/5OKarM2NL8oslFiKMxINtZiLihMBB3rwIYoC AAA= X-CMS-MailID: 20181113121253eucas1p15b6cc3c614d237fd9fa07eb4511052d0 X-Msg-Generator: CA X-RootMTR: 20181113121253eucas1p15b6cc3c614d237fd9fa07eb4511052d0 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20181113121253eucas1p15b6cc3c614d237fd9fa07eb4511052d0 References: <20181113121228.17650-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 v2 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)