From patchwork Wed Jul 8 16:10:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Tu X-Patchwork-Id: 1325297 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.136; helo=silver.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=Uj2jOI/o; dkim-atps=neutral Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4B246m06pyz9sTQ for ; Thu, 9 Jul 2020 02:11:11 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 4F86B2C7D3; Wed, 8 Jul 2020 16:11:09 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id bCtUU9xb+3aX; Wed, 8 Jul 2020 16:11:06 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 32DC22C339; Wed, 8 Jul 2020 16:11:06 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 19F62C077B; Wed, 8 Jul 2020 16:11:06 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 27A99C0895 for ; Wed, 8 Jul 2020 16:11:05 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 11B8D87D42 for ; Wed, 8 Jul 2020 16:11:05 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id bDhsDPkiIgnG for ; Wed, 8 Jul 2020 16:11:03 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pf1-f196.google.com (mail-pf1-f196.google.com [209.85.210.196]) by fraxinus.osuosl.org (Postfix) with ESMTPS id 159C187D29 for ; Wed, 8 Jul 2020 16:11:03 +0000 (UTC) Received: by mail-pf1-f196.google.com with SMTP id i14so3680278pfu.13 for ; Wed, 08 Jul 2020 09:11:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HBRLVlkTTv5Yfmpz6Db/TexoFC6BCw11Ay4Y/rmCM8k=; b=Uj2jOI/oJG26ldZzzg2eDQzuXDQ38reYiopV/LDuN6ZZNyGYxeeokEgDcYXMbz3wYf U1rEwOqavQm/DFCh9VMLQ9R7ddjOu/qy2VtETz33rZmAsge9ncOUznJmMxEwhmcCFWZ4 hVSeRX61z87VutMhZ89DZ2fsBZoJpSNkuPzVIGPMz0EAPkC7imoDQTPB0E8bsEOemj1O mXY460gR3txRNWgtO0fqjvCegqP/EMXmFlaGlU3qEpzmvzof8ZkECMYIw5xeo4/LACA/ tO2HM6JtpfYX9uD3vpm99mPE1F2dKWVIRZoU5rbhikx25WqJODnbVHd00HFTpaqbOePX 0z1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HBRLVlkTTv5Yfmpz6Db/TexoFC6BCw11Ay4Y/rmCM8k=; b=mqNOIrH7tv3u8yJLxWblUvaN1n8C/WNNSa54OZkYPEeRATSNvb5MZBv5d+KfB79cJp T/XhraL3ZPpZiBltGJWmFFfOqIQhFaX56ygbwtsD0dSjkkfwKZjNT17SQOlCEoOeSXgf NMh0OohakVOnl+TDTJKuq7MKSWbfHjrqO+J5dKnUoyBvgcrWE8NXuZWul6hqYEAu4GWC sFZE0kSDxL4bBondBWAToPEDZNBsdc2krEjrcz5N1oO5N681PYCviySLd1JlGmTCpfsL qjUKffWkctZbqL+1VqsEmRH+LrqONLsrKsbM/4HGUok13mng8CAXsbnjTuZqRyCXBpeR 2gDg== X-Gm-Message-State: AOAM5322qea0hYDnfNwzcSiArrj4QbIL8c0f+sGEry5icJTh4cUOE13x NDoQGcTQzmoyCfB3UiUIzfF8fN/H+gE= X-Google-Smtp-Source: ABdhPJwutgXALhvzsMnv39V9/jG8LynEgse03FaCngIRjSbn1C6p12XcKNPhfKI/jg7wyW2tlaFGFA== X-Received: by 2002:a65:64d8:: with SMTP id t24mr51622389pgv.286.1594224662364; Wed, 08 Jul 2020 09:11:02 -0700 (PDT) Received: from sc9-mailhost2.vmware.com (c-76-21-95-192.hsd1.ca.comcast.net. [76.21.95.192]) by smtp.gmail.com with ESMTPSA id j2sm6597707pjy.1.2020.07.08.09.11.01 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 08 Jul 2020 09:11:01 -0700 (PDT) From: William Tu To: dev@openvswitch.org Date: Wed, 8 Jul 2020 09:10:34 -0700 Message-Id: <1594224636-42337-2-git-send-email-u9012063@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1594224636-42337-1-git-send-email-u9012063@gmail.com> References: <1594224636-42337-1-git-send-email-u9012063@gmail.com> Cc: Eli Britstein , Ilya Maximets Subject: [ovs-dev] [PATCH 1/3] netdev: Allow storing dpif type into netdev structure. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Ilya Maximets Storing of the dpif type of the owning datapath interface will allow us to easily distinguish, for example, userspace tunneling ports from the system ones. This is required in terms of HW offloading to avoid offloading of userspace flows to kernel interfaces that doesn't belong to userspace datapath, but have same dpif_port names. Signed-off-by: Ilya Maximets Acked-by: Eli Britstein Acked-by: Roni Bar Yanai Acked-by: Ophir Munk Signed-off-by: Eli Britstein Signed-off-by: William Tu --- lib/netdev-provider.h | 3 ++- lib/netdev.c | 16 ++++++++++++++++ lib/netdev.h | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h index d9503adb0fb6..73dce2fcab8d 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -96,7 +96,8 @@ struct netdev { /* Functions to control flow offloading. */ OVSRCU_TYPE(const struct netdev_flow_api *) flow_api; - struct netdev_hw_info hw_info; /* offload-capable netdev info */ + const char *dpif_type; /* Type of dpif this netdev belongs to. */ + struct netdev_hw_info hw_info; /* Offload-capable netdev info. */ }; static inline void diff --git a/lib/netdev.c b/lib/netdev.c index 90962eec66cf..91e91955c09b 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -1984,6 +1984,22 @@ netdev_get_class(const struct netdev *netdev) return netdev->netdev_class; } +/* Set the type of 'dpif' this 'netdev' belongs to. */ +void +netdev_set_dpif_type(struct netdev *netdev, const char *type) +{ + netdev->dpif_type = type; +} + +/* Returns the type of 'dpif' this 'netdev' belongs to. + * + * The caller must not free the returned value. */ +const char * +netdev_get_dpif_type(const struct netdev *netdev) +{ + return netdev->dpif_type; +} + /* Returns the netdev with 'name' or NULL if there is none. * * The caller must free the returned netdev with netdev_close(). */ diff --git a/lib/netdev.h b/lib/netdev.h index fdbe0e1f58c5..fb50730569ea 100644 --- a/lib/netdev.h +++ b/lib/netdev.h @@ -179,6 +179,8 @@ bool netdev_mtu_is_user_config(struct netdev *); int netdev_get_ifindex(const struct netdev *); int netdev_set_tx_multiq(struct netdev *, unsigned int n_txq); enum netdev_pt_mode netdev_get_pt_mode(const struct netdev *); +void netdev_set_dpif_type(struct netdev *, const char *); +const char *netdev_get_dpif_type(const struct netdev *); /* Packet reception. */ int netdev_rxq_open(struct netdev *, struct netdev_rxq **, int id); From patchwork Wed Jul 8 16:10:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Tu X-Patchwork-Id: 1325299 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.138; helo=whitealder.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=QWLv5mKr; dkim-atps=neutral Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4B246x6vwHz9sRK for ; Thu, 9 Jul 2020 02:11:21 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 443C188F82; Wed, 8 Jul 2020 16:11:20 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 6+1iLicyb0CU; Wed, 8 Jul 2020 16:11:14 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id CC12888FA1; Wed, 8 Jul 2020 16:11:14 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id A7C3CC077B; Wed, 8 Jul 2020 16:11:14 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from silver.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id CA954C016F for ; Wed, 8 Jul 2020 16:11:12 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id A50722C885 for ; Wed, 8 Jul 2020 16:11:12 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from silver.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Q4EWJXshgKSN for ; Wed, 8 Jul 2020 16:11:05 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pl1-f195.google.com (mail-pl1-f195.google.com [209.85.214.195]) by silver.osuosl.org (Postfix) with ESMTPS id C63052C345 for ; Wed, 8 Jul 2020 16:11:04 +0000 (UTC) Received: by mail-pl1-f195.google.com with SMTP id x11so18364843plo.7 for ; Wed, 08 Jul 2020 09:11:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bjTvczDtAXzopQFLumXt9rUpZ77Ni6qukdloVpKg5Jw=; b=QWLv5mKruOhPDD9wKrTrKCzD+44pp3cxjIYj6dSg1mNn5sXm+YZl4TfAWfT5m5A1ZD KKwvEL5szAO5S8F/dFzlticOHus9uQIHUFhngFRDGzhRL6SVGnOBJ7sbrqL71RGreGJm wrlQsIqd6AVf/8azjMhu9PxkZ6IJ71bK5RPHWpoEr+L1dNjCu/rNWWjds6sp1dTb5rzB IUmsDWMuZ5YNAvfyZv5GFNm/GzKH9xXxdEWijhDj39UCUjrenn4Qq3xpTkPWdaCdtKoY X2pR+Yd3oJYw/2ZaC+eDsdm5DK6tV+w4qWS+ukMf9kWh5zgk0uXYWDedR6XSTkylBnhV recw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bjTvczDtAXzopQFLumXt9rUpZ77Ni6qukdloVpKg5Jw=; b=FAzyijZ0eyL36t3WsCT3KiRMLJw/C0vJjKZOftFP5jDk6SiEe/SjrbYWzaD3RQ3/Eq 0x6yMTjXgIe+vy1aXwHPo1T3ah+PeQik6bPNjsxP5QpTw9ovaEvSmPAdzvPmOK8VG+66 P/cKbKARCPsPH5XFZCa7/NlmDZch72o5HK0eQH/fK1M5EMSBSysJniaLjjP2MNCN1TYT ILrL28a8urImSyYpPVgD4qRFuVu1B0bktkSZ5UR4RnMZg+E8BhwnYKkVHJoo/guPvlxG jMAlAL/EHHE9sGQy90Q5yEI/PkB/5ZcyoUjLCOoar6IQH4XLwdXMNtGQPgsZZubXnbTG E32g== X-Gm-Message-State: AOAM533kAHYmal9XPBJel9XXUlGm5s94K3f5rGx2+YSlrDj77s314xWQ 4eRxJ/+1pW9HeFwT5oEkjEAvuGh2QQc= X-Google-Smtp-Source: ABdhPJyEjoTRrzL3wLFWvMawmZ7lRsPE+QiihfObJR49ebdu10SFtdNlo5Eyr+y1dimc09BaSGiOJw== X-Received: by 2002:a17:90a:7185:: with SMTP id i5mr11103473pjk.170.1594224663460; Wed, 08 Jul 2020 09:11:03 -0700 (PDT) Received: from sc9-mailhost2.vmware.com (c-76-21-95-192.hsd1.ca.comcast.net. [76.21.95.192]) by smtp.gmail.com with ESMTPSA id j2sm6597707pjy.1.2020.07.08.09.11.02 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 08 Jul 2020 09:11:02 -0700 (PDT) From: William Tu To: dev@openvswitch.org Date: Wed, 8 Jul 2020 09:10:35 -0700 Message-Id: <1594224636-42337-3-git-send-email-u9012063@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1594224636-42337-1-git-send-email-u9012063@gmail.com> References: <1594224636-42337-1-git-send-email-u9012063@gmail.com> Cc: Eli Britstein , Ilya Maximets Subject: [ovs-dev] [PATCH 2/3] netdev-offload: Use dpif type instead of class. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Ilya Maximets There is no real difference between the 'class' and 'type' in the context of common lookup operations inside netdev-offload module because it only checks the value of pointers without using the value itself. However, 'type' has some meaning and can be used by offload provides on the initialization phase to check if this type of Flow API in pair with the netdev type could be used in particular datapath type. For example, this is needed to check if Linux flow API could be used for current tunneling vport because it could be used only if tunneling vport belongs to system datapath, i.e. has backing linux interface. This is needed to unblock tunneling offloads in userspace datapath with DPDK flow API. Signed-off-by: Ilya Maximets Acked-by: Eli Britstein Acked-by: Roni Bar Yanai Acked-by: Ophir Munk Signed-off-by: Eli Britstein Signed-off-by: William Tu --- lib/dpif-netdev.c | 15 +++++++------ lib/dpif-netlink.c | 23 ++++++++++--------- lib/dpif.c | 21 +++++++++-------- lib/netdev-offload-dpdk.c | 17 ++++++-------- lib/netdev-offload-tc.c | 3 ++- lib/netdev-offload.c | 52 +++++++++++++++++++++---------------------- lib/netdev-offload.h | 16 ++++++------- ofproto/ofproto-dpif-upcall.c | 5 ++--- 8 files changed, 76 insertions(+), 76 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index e037eab2adbe..2b374e3af97f 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2378,10 +2378,11 @@ static int mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd, struct dp_netdev_flow *flow) { - int ret = 0; - uint32_t mark = flow->mark; + const char *dpif_type_str = dpif_normalize_type(pmd->dp->class->type); struct cmap_node *mark_node = CONST_CAST(struct cmap_node *, &flow->mark_node); + uint32_t mark = flow->mark; + int ret = 0; cmap_remove(&flow_mark.mark_to_flow, mark_node, hash_int(mark, 0)); flow->mark = INVALID_FLOW_MARK; @@ -2394,7 +2395,7 @@ mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd, struct netdev *port; odp_port_t in_port = flow->flow.in_port.odp_port; - port = netdev_ports_get(in_port, pmd->dp->class); + port = netdev_ports_get(in_port, dpif_type_str); if (port) { /* Taking a global 'port_mutex' to fulfill thread safety * restrictions for the netdev-offload-dpdk module. */ @@ -2501,9 +2502,9 @@ static int dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) { struct dp_netdev_pmd_thread *pmd = offload->pmd; - const struct dpif_class *dpif_class = pmd->dp->class; struct dp_netdev_flow *flow = offload->flow; odp_port_t in_port = flow->flow.in_port.odp_port; + const char *dpif_type_str = dpif_normalize_type(pmd->dp->class->type); bool modification = offload->op == DP_NETDEV_FLOW_OFFLOAD_OP_MOD; struct offload_info info; struct netdev *port; @@ -2539,9 +2540,8 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) } } info.flow_mark = mark; - info.dpif_class = dpif_class; - port = netdev_ports_get(in_port, pmd->dp->class); + port = netdev_ports_get(in_port, dpif_type_str); if (!port || netdev_vport_is_vport_class(port->netdev_class)) { netdev_close(port); goto err_free; @@ -3154,7 +3154,8 @@ dpif_netdev_get_flow_offload_status(const struct dp_netdev *dp, return false; } - netdev = netdev_ports_get(netdev_flow->flow.in_port.odp_port, dp->class); + netdev = netdev_ports_get(netdev_flow->flow.in_port.odp_port, + dpif_normalize_type(dp->class->type)); if (!netdev) { return false; } diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 18322e879934..7da4fb54d94f 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -1120,6 +1120,7 @@ dpif_netlink_port_get_pid(const struct dpif *dpif_, odp_port_t port_no) static int dpif_netlink_flow_flush(struct dpif *dpif_) { + const char *dpif_type_str = dpif_normalize_type(dpif_type(dpif_)); const struct dpif_netlink *dpif = dpif_netlink_cast(dpif_); struct dpif_netlink_flow flow; @@ -1128,7 +1129,7 @@ dpif_netlink_flow_flush(struct dpif *dpif_) flow.dp_ifindex = dpif->dp_ifindex; if (netdev_is_flow_api_enabled()) { - netdev_ports_flow_flush(dpif_->dpif_class); + netdev_ports_flow_flush(dpif_type_str); } return dpif_netlink_flow_transact(&flow, NULL, NULL); @@ -1445,7 +1446,7 @@ start_netdev_dump(const struct dpif *dpif_, ovs_mutex_lock(&dump->netdev_lock); dump->netdev_current_dump = 0; dump->netdev_dumps - = netdev_ports_flow_dump_create(dpif_->dpif_class, + = netdev_ports_flow_dump_create(dpif_normalize_type(dpif_type(dpif_)), &dump->netdev_dumps_num, dump->up.terse); ovs_mutex_unlock(&dump->netdev_lock); @@ -2002,6 +2003,7 @@ dpif_netlink_operate__(struct dpif_netlink *dpif, static int parse_flow_get(struct dpif_netlink *dpif, struct dpif_flow_get *get) { + const char *dpif_type_str = dpif_normalize_type(dpif_type(&dpif->dpif)); struct dpif_flow *dpif_flow = get->flow; struct match match; struct nlattr *actions; @@ -2016,8 +2018,8 @@ parse_flow_get(struct dpif_netlink *dpif, struct dpif_flow_get *get) int err; ofpbuf_use_stack(&buf, &act_buf, sizeof act_buf); - err = netdev_ports_flow_get(dpif->dpif.dpif_class, &match, - &actions, get->ufid, &stats, &attrs, &buf); + err = netdev_ports_flow_get(dpif_type_str, &match, &actions, get->ufid, + &stats, &attrs, &buf); if (err) { return err; } @@ -2042,8 +2044,8 @@ parse_flow_get(struct dpif_netlink *dpif, struct dpif_flow_get *get) static int parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put) { + const char *dpif_type_str = dpif_normalize_type(dpif_type(&dpif->dpif)); static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); - const struct dpif_class *dpif_class = dpif->dpif.dpif_class; struct match match; odp_port_t in_port; const struct nlattr *nla; @@ -2065,7 +2067,7 @@ parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put) } in_port = match.flow.in_port.odp_port; - dev = netdev_ports_get(in_port, dpif_class); + dev = netdev_ports_get(in_port, dpif_type_str); if (!dev) { return EOPNOTSUPP; } @@ -2078,7 +2080,7 @@ parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put) odp_port_t out_port; out_port = nl_attr_get_odp_port(nla); - outdev = netdev_ports_get(out_port, dpif_class); + outdev = netdev_ports_get(out_port, dpif_type_str); if (!outdev) { err = EOPNOTSUPP; goto out; @@ -2094,7 +2096,6 @@ parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put) } } - info.dpif_class = dpif_class; info.tp_dst_port = dst_port; info.tunnel_csum_on = csum_on; info.recirc_id_shared_with_tc = (dpif->user_features @@ -2198,8 +2199,10 @@ try_send_to_netdev(struct dpif_netlink *dpif, struct dpif_op *op) break; } - err = netdev_ports_flow_del(dpif->dpif.dpif_class, del->ufid, - del->stats); + err = netdev_ports_flow_del( + dpif_normalize_type(dpif_type(&dpif->dpif)), + del->ufid, + del->stats); log_flow_del_message(&dpif->dpif, &this_module, del, 0); break; } diff --git a/lib/dpif.c b/lib/dpif.c index c529a93f1be0..7cac3a629e6d 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -347,6 +347,7 @@ do_open(const char *name, const char *type, bool create, struct dpif **dpifp) error = registered_class->dpif_class->open(registered_class->dpif_class, name, create, &dpif); if (!error) { + const char *dpif_type_str = dpif_normalize_type(dpif_type(dpif)); struct dpif_port_dump port_dump; struct dpif_port dpif_port; @@ -363,7 +364,7 @@ do_open(const char *name, const char *type, bool create, struct dpif **dpifp) err = netdev_open(dpif_port.name, dpif_port.type, &netdev); if (!err) { - netdev_ports_insert(netdev, dpif->dpif_class, &dpif_port); + netdev_ports_insert(netdev, dpif_type_str, &dpif_port); netdev_close(netdev); } else { VLOG_WARN("could not open netdev %s type %s: %s", @@ -427,14 +428,15 @@ dpif_create_and_open(const char *name, const char *type, struct dpif **dpifp) static void dpif_remove_netdev_ports(struct dpif *dpif) { - struct dpif_port_dump port_dump; - struct dpif_port dpif_port; + const char *dpif_type_str = dpif_normalize_type(dpif_type(dpif)); + struct dpif_port_dump port_dump; + struct dpif_port dpif_port; - DPIF_PORT_FOR_EACH (&dpif_port, &port_dump, dpif) { - if (!dpif_is_tap_port(dpif_port.type)) { - netdev_ports_remove(dpif_port.port_no, dpif->dpif_class); - } + DPIF_PORT_FOR_EACH (&dpif_port, &port_dump, dpif) { + if (!dpif_is_tap_port(dpif_port.type)) { + netdev_ports_remove(dpif_port.port_no, dpif_type_str); } + } } /* Closes and frees the connection to 'dpif'. Does not destroy the datapath @@ -597,12 +599,13 @@ dpif_port_add(struct dpif *dpif, struct netdev *netdev, odp_port_t *port_nop) if (!dpif_is_tap_port(netdev_get_type(netdev))) { + const char *dpif_type_str = dpif_normalize_type(dpif_type(dpif)); struct dpif_port dpif_port; dpif_port.type = CONST_CAST(char *, netdev_get_type(netdev)); dpif_port.name = CONST_CAST(char *, netdev_name); dpif_port.port_no = port_no; - netdev_ports_insert(netdev, dpif->dpif_class, &dpif_port); + netdev_ports_insert(netdev, dpif_type_str, &dpif_port); } } else { VLOG_WARN_RL(&error_rl, "%s: failed to add %s as port: %s", @@ -634,7 +637,7 @@ dpif_port_del(struct dpif *dpif, odp_port_t port_no, bool local_delete) } } - netdev_ports_remove(port_no, dpif->dpif_class); + netdev_ports_remove(port_no, dpif_normalize_type(dpif_type(dpif))); return error; } diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 26a75f0f282d..2facd1aebba7 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -860,15 +860,14 @@ add_port_id_action(struct flow_actions *actions, static int add_output_action(struct netdev *netdev, struct flow_actions *actions, - const struct nlattr *nla, - struct offload_info *info) + const struct nlattr *nla) { struct netdev *outdev; odp_port_t port; int ret = 0; port = nl_attr_get_odp_port(nla); - outdev = netdev_ports_get(port, info->dpif_class); + outdev = netdev_ports_get(port, netdev->dpif_type); if (outdev == NULL) { VLOG_DBG_RL(&rl, "Cannot find netdev for odp port %"PRIu32, port); return -1; @@ -1033,8 +1032,7 @@ static int parse_flow_actions(struct netdev *netdev, struct flow_actions *actions, struct nlattr *nl_actions, - size_t nl_actions_len, - struct offload_info *info) + size_t nl_actions_len) { struct nlattr *nla; size_t left; @@ -1042,7 +1040,7 @@ parse_flow_actions(struct netdev *netdev, add_count_action(actions); NL_ATTR_FOR_EACH_UNSAFE (nla, left, nl_actions, nl_actions_len) { if (nl_attr_type(nla) == OVS_ACTION_ATTR_OUTPUT) { - if (add_output_action(netdev, actions, nla, info)) { + if (add_output_action(netdev, actions, nla)) { return -1; } } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_DROP) { @@ -1084,8 +1082,7 @@ static struct rte_flow * netdev_offload_dpdk_actions(struct netdev *netdev, struct flow_patterns *patterns, struct nlattr *nl_actions, - size_t actions_len, - struct offload_info *info) + size_t actions_len) { const struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1 }; struct flow_actions actions = { .actions = NULL, .cnt = 0 }; @@ -1093,7 +1090,7 @@ netdev_offload_dpdk_actions(struct netdev *netdev, struct rte_flow_error error; int ret; - ret = parse_flow_actions(netdev, &actions, nl_actions, actions_len, info); + ret = parse_flow_actions(netdev, &actions, nl_actions, actions_len); if (ret) { goto out; } @@ -1123,7 +1120,7 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, } flow = netdev_offload_dpdk_actions(netdev, &patterns, nl_actions, - actions_len, info); + actions_len); if (!flow) { /* If we failed to offload the rule actions fallback to MARK+RSS * actions. diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c index e50e00f23ccb..2c9c6f4cae8b 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -1714,7 +1714,8 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, action = &flower.actions[flower.action_count]; if (nl_attr_type(nla) == OVS_ACTION_ATTR_OUTPUT) { odp_port_t port = nl_attr_get_odp_port(nla); - struct netdev *outdev = netdev_ports_get(port, info->dpif_class); + struct netdev *outdev = netdev_ports_get( + port, netdev_get_dpif_type(netdev)); if (!outdev) { VLOG_DBG_RL(&rl, "Can't find netdev for output port %d", port); diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c index ab97a292ebac..2da3bc701a61 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -383,11 +383,10 @@ static struct hmap ifindex_to_port OVS_GUARDED_BY(netdev_hmap_rwlock) = HMAP_INITIALIZER(&ifindex_to_port); struct port_to_netdev_data { - struct hmap_node portno_node; /* By (dpif_class, dpif_port.port_no). */ - struct hmap_node ifindex_node; /* By (dpif_class, ifindex). */ + struct hmap_node portno_node; /* By (dpif_type, dpif_port.port_no). */ + struct hmap_node ifindex_node; /* By (dpif_type, ifindex). */ struct netdev *netdev; struct dpif_port dpif_port; - const struct dpif_class *dpif_class; int ifindex; }; @@ -423,13 +422,13 @@ netdev_is_flow_api_enabled(void) } void -netdev_ports_flow_flush(const struct dpif_class *dpif_class) +netdev_ports_flow_flush(const char *dpif_type) { struct port_to_netdev_data *data; ovs_rwlock_rdlock(&netdev_hmap_rwlock); HMAP_FOR_EACH (data, portno_node, &port_to_netdev) { - if (data->dpif_class == dpif_class) { + if (netdev_get_dpif_type(data->netdev) == dpif_type) { netdev_flow_flush(data->netdev); } } @@ -437,8 +436,7 @@ netdev_ports_flow_flush(const struct dpif_class *dpif_class) } struct netdev_flow_dump ** -netdev_ports_flow_dump_create(const struct dpif_class *dpif_class, int *ports, - bool terse) +netdev_ports_flow_dump_create(const char *dpif_type, int *ports, bool terse) { struct port_to_netdev_data *data; struct netdev_flow_dump **dumps; @@ -447,7 +445,7 @@ netdev_ports_flow_dump_create(const struct dpif_class *dpif_class, int *ports, ovs_rwlock_rdlock(&netdev_hmap_rwlock); HMAP_FOR_EACH (data, portno_node, &port_to_netdev) { - if (data->dpif_class == dpif_class) { + if (netdev_get_dpif_type(data->netdev) == dpif_type) { count++; } } @@ -455,7 +453,7 @@ netdev_ports_flow_dump_create(const struct dpif_class *dpif_class, int *ports, dumps = count ? xzalloc(sizeof *dumps * count) : NULL; HMAP_FOR_EACH (data, portno_node, &port_to_netdev) { - if (data->dpif_class == dpif_class) { + if (netdev_get_dpif_type(data->netdev) == dpif_type) { if (netdev_flow_dump_create(data->netdev, &dumps[i], terse)) { continue; } @@ -471,15 +469,14 @@ netdev_ports_flow_dump_create(const struct dpif_class *dpif_class, int *ports, } int -netdev_ports_flow_del(const struct dpif_class *dpif_class, - const ovs_u128 *ufid, +netdev_ports_flow_del(const char *dpif_type, const ovs_u128 *ufid, struct dpif_flow_stats *stats) { struct port_to_netdev_data *data; ovs_rwlock_rdlock(&netdev_hmap_rwlock); HMAP_FOR_EACH (data, portno_node, &port_to_netdev) { - if (data->dpif_class == dpif_class + if (netdev_get_dpif_type(data->netdev) == dpif_type && !netdev_flow_del(data->netdev, ufid, stats)) { ovs_rwlock_unlock(&netdev_hmap_rwlock); return 0; @@ -491,7 +488,7 @@ netdev_ports_flow_del(const struct dpif_class *dpif_class, } int -netdev_ports_flow_get(const struct dpif_class *dpif_class, struct match *match, +netdev_ports_flow_get(const char *dpif_type, struct match *match, struct nlattr **actions, const ovs_u128 *ufid, struct dpif_flow_stats *stats, struct dpif_flow_attrs *attrs, struct ofpbuf *buf) @@ -500,7 +497,7 @@ netdev_ports_flow_get(const struct dpif_class *dpif_class, struct match *match, ovs_rwlock_rdlock(&netdev_hmap_rwlock); HMAP_FOR_EACH (data, portno_node, &port_to_netdev) { - if (data->dpif_class == dpif_class + if (netdev_get_dpif_type(data->netdev) == dpif_type && !netdev_flow_get(data->netdev, match, actions, ufid, stats, attrs, buf)) { ovs_rwlock_unlock(&netdev_hmap_rwlock); @@ -512,21 +509,21 @@ netdev_ports_flow_get(const struct dpif_class *dpif_class, struct match *match, } static uint32_t -netdev_ports_hash(odp_port_t port, const struct dpif_class *dpif_class) +netdev_ports_hash(odp_port_t port, const char *dpif_type) { - return hash_int(odp_to_u32(port), hash_pointer(dpif_class, 0)); + return hash_int(odp_to_u32(port), hash_pointer(dpif_type, 0)); } static struct port_to_netdev_data * -netdev_ports_lookup(odp_port_t port_no, const struct dpif_class *dpif_class) +netdev_ports_lookup(odp_port_t port_no, const char *dpif_type) OVS_REQ_RDLOCK(netdev_hmap_rwlock) { struct port_to_netdev_data *data; HMAP_FOR_EACH_WITH_HASH (data, portno_node, - netdev_ports_hash(port_no, dpif_class), + netdev_ports_hash(port_no, dpif_type), &port_to_netdev) { - if (data->dpif_class == dpif_class + if (netdev_get_dpif_type(data->netdev) == dpif_type && data->dpif_port.port_no == port_no) { return data; } @@ -535,7 +532,7 @@ netdev_ports_lookup(odp_port_t port_no, const struct dpif_class *dpif_class) } int -netdev_ports_insert(struct netdev *netdev, const struct dpif_class *dpif_class, +netdev_ports_insert(struct netdev *netdev, const char *dpif_type, struct dpif_port *dpif_port) { struct port_to_netdev_data *data; @@ -546,19 +543,20 @@ netdev_ports_insert(struct netdev *netdev, const struct dpif_class *dpif_class, } ovs_rwlock_wrlock(&netdev_hmap_rwlock); - if (netdev_ports_lookup(dpif_port->port_no, dpif_class)) { + if (netdev_ports_lookup(dpif_port->port_no, dpif_type)) { ovs_rwlock_unlock(&netdev_hmap_rwlock); return EEXIST; } data = xzalloc(sizeof *data); data->netdev = netdev_ref(netdev); - data->dpif_class = dpif_class; dpif_port_clone(&data->dpif_port, dpif_port); data->ifindex = ifindex; + netdev_set_dpif_type(netdev, dpif_type); + hmap_insert(&port_to_netdev, &data->portno_node, - netdev_ports_hash(dpif_port->port_no, dpif_class)); + netdev_ports_hash(dpif_port->port_no, dpif_type)); hmap_insert(&ifindex_to_port, &data->ifindex_node, ifindex); ovs_rwlock_unlock(&netdev_hmap_rwlock); @@ -568,13 +566,13 @@ netdev_ports_insert(struct netdev *netdev, const struct dpif_class *dpif_class, } struct netdev * -netdev_ports_get(odp_port_t port_no, const struct dpif_class *dpif_class) +netdev_ports_get(odp_port_t port_no, const char *dpif_type) { struct port_to_netdev_data *data; struct netdev *ret = NULL; ovs_rwlock_rdlock(&netdev_hmap_rwlock); - data = netdev_ports_lookup(port_no, dpif_class); + data = netdev_ports_lookup(port_no, dpif_type); if (data) { ret = netdev_ref(data->netdev); } @@ -584,13 +582,13 @@ netdev_ports_get(odp_port_t port_no, const struct dpif_class *dpif_class) } int -netdev_ports_remove(odp_port_t port_no, const struct dpif_class *dpif_class) +netdev_ports_remove(odp_port_t port_no, const char *dpif_type) { struct port_to_netdev_data *data; int ret = ENOENT; ovs_rwlock_wrlock(&netdev_hmap_rwlock); - data = netdev_ports_lookup(port_no, dpif_class); + data = netdev_ports_lookup(port_no, dpif_type); if (data) { dpif_port_destroy(&data->dpif_port); netdev_close(data->netdev); /* unref and possibly close */ diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index 87f5852c8d60..4c0ed2ae8a20 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -62,7 +62,6 @@ struct netdev_flow_dump { /* Flow offloading. */ struct offload_info { - const struct dpif_class *dpif_class; ovs_be16 tp_dst_port; /* Destination port for tunnel in SET action */ uint8_t tunnel_csum_on; /* Tunnel header with checksum */ @@ -105,22 +104,21 @@ bool netdev_is_flow_api_enabled(void); void netdev_set_flow_api_enabled(const struct smap *ovs_other_config); bool netdev_is_offload_rebalance_policy_enabled(void); -struct dpif_class; struct dpif_port; -int netdev_ports_insert(struct netdev *, const struct dpif_class *, +int netdev_ports_insert(struct netdev *, const char *dpif_type, struct dpif_port *); -struct netdev *netdev_ports_get(odp_port_t port, const struct dpif_class *); -int netdev_ports_remove(odp_port_t port, const struct dpif_class *); +struct netdev *netdev_ports_get(odp_port_t port, const char *dpif_type); +int netdev_ports_remove(odp_port_t port, const char *dpif_type); odp_port_t netdev_ifindex_to_odp_port(int ifindex); struct netdev_flow_dump **netdev_ports_flow_dump_create( - const struct dpif_class *, + const char *dpif_type, int *ports, bool terse); -void netdev_ports_flow_flush(const struct dpif_class *); -int netdev_ports_flow_del(const struct dpif_class *, const ovs_u128 *ufid, +void netdev_ports_flow_flush(const char *dpif_type); +int netdev_ports_flow_del(const char *dpif_type, const ovs_u128 *ufid, struct dpif_flow_stats *stats); -int netdev_ports_flow_get(const struct dpif_class *, struct match *match, +int netdev_ports_flow_get(const char *dpif_type, struct match *match, struct nlattr **actions, const ovs_u128 *ufid, struct dpif_flow_stats *stats, diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 920f29a6f36a..72751b9b3c8d 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -2501,8 +2501,7 @@ ukey_netdev_unref(struct udpif_key *ukey) static void ukey_to_flow_netdev(struct udpif *udpif, struct udpif_key *ukey) { - const struct dpif *dpif = udpif->dpif; - const struct dpif_class *dpif_class = dpif->dpif_class; + const char *dpif_type_str = dpif_normalize_type(dpif_type(udpif->dpif)); const struct nlattr *k; unsigned int left; @@ -2515,7 +2514,7 @@ ukey_to_flow_netdev(struct udpif *udpif, struct udpif_key *ukey) if (type == OVS_KEY_ATTR_IN_PORT) { ukey->in_netdev = netdev_ports_get(nl_attr_get_odp_port(k), - dpif_class); + dpif_type_str); } else if (type == OVS_KEY_ATTR_TUNNEL) { struct flow_tnl tnl; enum odp_key_fitness res; From patchwork Wed Jul 8 16:10:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Tu X-Patchwork-Id: 1325298 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.133; helo=hemlock.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=ffGYouOI; dkim-atps=neutral Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4B246n5HRcz9sRf for ; Thu, 9 Jul 2020 02:11:13 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 08F2189791; Wed, 8 Jul 2020 16:11:12 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 3+NRkvsDApT3; Wed, 8 Jul 2020 16:11:09 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id DAFEE8978A; Wed, 8 Jul 2020 16:11:09 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id BFFEEC077B; Wed, 8 Jul 2020 16:11:09 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id E5CF2C016F for ; Wed, 8 Jul 2020 16:11:07 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id D358088F47 for ; Wed, 8 Jul 2020 16:11:07 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id dpsEqZM+OHod for ; Wed, 8 Jul 2020 16:11:06 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-pg1-f193.google.com (mail-pg1-f193.google.com [209.85.215.193]) by whitealder.osuosl.org (Postfix) with ESMTPS id 7C7DF88F4C for ; Wed, 8 Jul 2020 16:11:05 +0000 (UTC) Received: by mail-pg1-f193.google.com with SMTP id g67so20995923pgc.8 for ; Wed, 08 Jul 2020 09:11:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=bNKXVuog5TDKqwxNf9NT/mAqauITOhUzTmJiMUw0JGA=; b=ffGYouOIwF3Leuk2fwlmANMXB3A3ESagC6KbXx7SaPnWGPY581ThsY7t8KT15jv6f9 PvUD3miNynCRr3oNiwdEZmEF9/xwCpo1mJ+SEdpaLuNiAYTv5XKhXG1oX8GdS2f8mVEp xV/FDosRlaNhspnncB4bYxpWiuzeLxCLrgqcFNUl0BfkIcEypPQwxfdFdcXScK97Qdn3 A8qjK7bURgXdjrO1C7dLFBpBxAfqFSsgruLoF8879d25cbeoy/wIwaS7079887onhfHP eNSH1du+GnKyhfiR0q1V34yjrXCyfJzVG4tCjmzk/GFJNLjhWw0X8CuM0FoolTlCLKAb 2tqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bNKXVuog5TDKqwxNf9NT/mAqauITOhUzTmJiMUw0JGA=; b=WmVlbl4Cz0WBbJR8dCthwGD3MoI/pVVPiQaOumROWY6svEk+XNKMy+Gg5BeYIg+kgP RwsibFmagMRaaKaRGmnXVlIZu3kLx2VeFm0/W/EZZEm1j/ARXXZtIFqItJA3yyfqGfi6 8tmDxEh+1mHxX6lWsRcKHxjpGjv1DZHpAJhxUq+It7OrPFS1wbj35EIi84huRDdiewO0 /XFLIBqWqMaibCSvw5sML8xmivU9ok64id/JFp5o1jkgfu5K2GG5HE0glGmlOPWvEl9q pPcbq5bM9CU8a5IOKvD1xNdi7wqzGHz+dDLkEjDxQiERWq2bJ1TizZyz+xnzAi8zyDu4 l+Bw== X-Gm-Message-State: AOAM531GEhNACBYmcT3Bbi1Ek81YwsCwrZU1T18sDeyh4NQTsHhCJOTD /ARzzz/l8JLYE2ENKD+BcEfO3O9CrdQ= X-Google-Smtp-Source: ABdhPJyvwdDsw0oxcF2QMaYcO6eEmoIilM5EAECUrIU4i2QHIr2yrXjzLtovt6QT6H+79yy++BtVzw== X-Received: by 2002:a63:e24d:: with SMTP id y13mr45329326pgj.248.1594224664514; Wed, 08 Jul 2020 09:11:04 -0700 (PDT) Received: from sc9-mailhost2.vmware.com (c-76-21-95-192.hsd1.ca.comcast.net. [76.21.95.192]) by smtp.gmail.com with ESMTPSA id j2sm6597707pjy.1.2020.07.08.09.11.03 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 08 Jul 2020 09:11:03 -0700 (PDT) From: William Tu To: dev@openvswitch.org Date: Wed, 8 Jul 2020 09:10:36 -0700 Message-Id: <1594224636-42337-4-git-send-email-u9012063@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1594224636-42337-1-git-send-email-u9012063@gmail.com> References: <1594224636-42337-1-git-send-email-u9012063@gmail.com> Cc: simon.horman@netronome.com, i.maximets@ovn.org, elibr@mellanox.com Subject: [ovs-dev] [PATCH 3/3] netdev-offload-tc: Add VxLAN encap support. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" The patch adds VxLAN encap tc-offload support. The userspace datapath, dpif-netdev, flow format differs than the kernel datapath in case of tunnel encap. Unlike kernel, the dpif-netdev does not use set and output action, but uses a single clone action with all the tunnel info nested inside. As an exmaple blow: actions:clone(tnl_push(tnl_port(5), header(size=50,type=4,eth(dst=06:1d:6e:a3:f1:61,src=26:df:25:f6:7b:4f,dl_type=0x0800), ipv4(src=172.31.1.100,dst=172.31.1.1,proto=17,tos=0,ttl=64,frag=0x4000), udp(src=0,dst=4789,csum=0x0), vxlan(flags=0x8000000,vni=0x0)),out_port(2) ), 3) The patch parses the above tunnel encap format and passes to the tc for offloading the VxLAN tunnel. Example of tc format: $ tc -s filter show dev ovs-p1 ingress filter protocol ip pref 3 flower chain 0 filter protocol ip pref 3 flower chain 0 handle 0x1 dst_mac 56:2a:1f:3c:bb:f2 src_mac 96:0c:a7:b0:60:a4 eth_type ipv4 ip_tos 0/0x3 ip_flags nofrag skip_hw not_in_hw action order 1: tunnel_key set src_ip 172.31.1.100 dst_ip 172.31.1.1 key_id 0 dst_port 4789 nocsum ttl 64 pipe index 2 ref 1 bind 1 installed 0 sec used 0 sec Action statistics: Sent 168 bytes 2 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 no_percpu action order 2: mirred (Egress Redirect to device ovs-p0) stolen index 2 ref 1 bind 1 installed 0 sec used 0 sec Action statistics: Sent 168 bytes 2 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 cookie b46e99079448ce581d0fe7a9853c0bb5 no_percpu Signed-off-by: William Tu --- lib/netdev-offload-tc.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c index 2c9c6f4cae8b..a1deeb2b3040 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -1114,6 +1114,118 @@ parse_put_flow_ct_action(struct tc_flower *flower, } static int +parse_put_tnl_header(struct tc_flower *flower OVS_UNUSED, + struct tc_action *action, + const struct ovs_action_push_tnl *data) +{ + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); + const struct eth_header *eth; + const struct udp_header *udp; + const void *l3; + const void *l4; + struct ds ds; + + ds_init(&ds); + eth = (const struct eth_header *)data->header; + l3 = eth + 1; + + if (eth->eth_type == htons(ETH_TYPE_IP)) { + const struct ip_header *ip = l3; + action->encap.ipv4.ipv4_src = get_16aligned_be32(&ip->ip_src); + action->encap.ipv4.ipv4_dst = get_16aligned_be32(&ip->ip_dst); + action->encap.ttl = ip->ip_ttl; + l4 = (ip + 1); + } else { + const struct ovs_16aligned_ip6_hdr *ip6 = l3; + memcpy(&action->encap.ipv6.ipv6_src, &ip6->ip6_src, + sizeof ip6->ip6_src); + memcpy(&action->encap.ipv6.ipv6_dst, &ip6->ip6_dst, + sizeof ip6->ip6_dst); + l4 = (ip6 + 1); + } + + udp = (const struct udp_header *) l4; + + if (data->tnl_type == OVS_VPORT_TYPE_VXLAN) { + const struct vxlanhdr *vxh; + + vxh = (const struct vxlanhdr *)(udp + 1); + action->encap.tp_src = udp->udp_src; + action->encap.tp_dst = udp->udp_dst; + action->encap.id_present = true; + action->encap.no_csum = true; + action->encap.id = be32_to_be64(get_16aligned_be32(&vxh->vx_vni) >> 8); + + ds_put_format(&ds, "vxlan(flags=0x%"PRIx32",vni=0x%"PRIx32")", + ntohl(get_16aligned_be32(&vxh->vx_flags)), + ntohl(get_16aligned_be32(&vxh->vx_vni)) >> 8); + VLOG_DBG_RL(&rl, "%s", ds_cstr(&ds)); + } else { + VLOG_DBG_RL(&rl, "unsupported tunnel type: %d", data->tnl_type); + return EOPNOTSUPP; + } + + ds_destroy(&ds); + return 0; +} + +static int +parse_put_flow_clone_action(struct tc_flower *flower, + const struct netdev *netdev, + const struct nlattr *clone, + size_t clone_len) +{ + static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); + struct tc_action *action; + const struct nlattr *ca; + size_t ca_left; + int err; + + NL_ATTR_FOR_EACH_UNSAFE (ca, ca_left, clone, clone_len) { + action = &flower->actions[flower->action_count]; + switch (nl_attr_type(ca)) { + case OVS_ACTION_ATTR_TUNNEL_PUSH: { + const struct ovs_action_push_tnl *tnl_push = nl_attr_get(ca); + + err = parse_put_tnl_header(flower, action, tnl_push); + if (err) { + return err; + } + action->type = TC_ACT_ENCAP; + flower->action_count++; + } + break; + case OVS_ACTION_ATTR_OUTPUT: { + struct netdev *outdev; + const char *outdev_type; + + odp_port_t port = nl_attr_get_odp_port(ca); + outdev = netdev_ports_get(port, netdev_get_dpif_type(netdev)); + if (!outdev) { + VLOG_DBG_RL(&rl, "Can't find netdev for output port " + "%d inside clone().", port); + return ENODEV; + } + outdev_type = netdev_get_type(outdev); + action->out.ifindex_out = netdev_get_ifindex(outdev); + action->out.ingress = is_internal_port(outdev_type); + netdev_close(outdev); + + action->type = TC_ACT_OUTPUT; + flower->action_count++; + } + break; + default: + VLOG_WARN_RL(&rl, "unsupported action %d inside clone()", + nl_attr_type(ca)); + return EOPNOTSUPP; + break; + } + } + return 0; +} + +static int parse_put_flow_set_masked_action(struct tc_flower *flower, struct tc_action *action, const struct nlattr *set, @@ -1789,6 +1901,15 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, action->chain = nl_attr_get_u32(nla); flower.action_count++; recirc_act = true; + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_CLONE) { + const struct nlattr *clone = nl_attr_get(nla); + const size_t clone_len = nl_attr_get_size(nla); + + err = parse_put_flow_clone_action(&flower, netdev, clone, + clone_len); + if (err) { + return err; + } } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_DROP) { action->type = TC_ACT_GOTO; action->chain = 0; /* 0 is reserved and not used by recirc. */