From patchwork Mon Jan 20 15:08:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226028 X-Patchwork-Delegate: i.maximets@samsung.com 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.137; helo=fraxinus.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=mellanox.com Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 481Zpf30LKz9sSK for ; Tue, 21 Jan 2020 02:10:02 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id D6CAE85C00; Mon, 20 Jan 2020 15:10:00 +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 ZdHJJg10bjPB; Mon, 20 Jan 2020 15:09:56 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by fraxinus.osuosl.org (Postfix) with ESMTP id 63C0485D3D; Mon, 20 Jan 2020 15:09:15 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 4A4A3C1D8B; Mon, 20 Jan 2020 15:09:15 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 6F875C0176 for ; Mon, 20 Jan 2020 15:09:02 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 6C58587866 for ; Mon, 20 Jan 2020 15:09:02 +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 EA3PV6D6gPEZ for ; Mon, 20 Jan 2020 15:08:57 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by hemlock.osuosl.org (Postfix) with ESMTP id 1931A874C5 for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:43 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hUp013116; Mon, 20 Jan 2020 17:08:43 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:06 +0000 Message-Id: <20200120150830.16262-2-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 01/25] 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 --- 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 22f4cde33..64e5ae99e 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -94,7 +94,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 f95b19af4..66eef674c 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -1961,6 +1961,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 fdbe0e1f5..fb5073056 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 Mon Jan 20 15:08:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226037 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481ZqJ4wSZz9sRk for ; Tue, 21 Jan 2020 02:10:36 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 31548204D1; Mon, 20 Jan 2020 15:10:35 +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 n-47pt-SSiID; Mon, 20 Jan 2020 15:10:23 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id BCA3022703; Mon, 20 Jan 2020 15:09:13 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id A2E2DC1D8E; Mon, 20 Jan 2020 15:09:13 +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 DEC07C1D89 for ; Mon, 20 Jan 2020 15:09:00 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id C81B7858B6 for ; Mon, 20 Jan 2020 15:09:00 +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 j3GCN2eAtVq4 for ; Mon, 20 Jan 2020 15:08:56 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by fraxinus.osuosl.org (Postfix) with ESMTP id 19293857C1 for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:43 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hUq013116; Mon, 20 Jan 2020 17:08:43 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:07 +0000 Message-Id: <20200120150830.16262-3-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 02/25] 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 --- 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 | 51 +++++++++++++++++++++---------------------- lib/netdev-offload.h | 16 ++++++-------- ofproto/ofproto-dpif-upcall.c | 5 ++--- 8 files changed, 76 insertions(+), 75 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 3be41014e..abd07992b 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2273,10 +2273,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; @@ -2289,7 +2290,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. */ @@ -2396,9 +2397,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; @@ -2434,9 +2435,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; @@ -3048,7 +3048,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 d865c0bdb..9384aa565 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -1114,6 +1114,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; @@ -1122,7 +1123,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); @@ -1439,7 +1440,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); ovs_mutex_unlock(&dump->netdev_lock); } @@ -1993,6 +1994,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; @@ -2007,8 +2009,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; } @@ -2033,8 +2035,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; @@ -2056,7 +2058,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; } @@ -2069,7 +2071,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; @@ -2085,7 +2087,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 @@ -2184,8 +2185,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 9d9c716c1..8264bb5ee 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 1ae8230fa..3c4e51e29 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -825,15 +825,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; @@ -974,8 +973,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; @@ -983,7 +981,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) { @@ -1017,8 +1015,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 }; @@ -1026,7 +1023,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; } @@ -1056,7 +1053,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 4988dadc3..d57265f84 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -1632,7 +1632,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 32eab5910..82b163e8e 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -382,11 +382,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; }; @@ -422,13 +421,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); } } @@ -436,7 +435,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) +netdev_ports_flow_dump_create(const char *dpif_type, int *ports) { struct port_to_netdev_data *data; struct netdev_flow_dump **dumps; @@ -445,7 +444,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++; } } @@ -453,7 +452,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])) { continue; } @@ -469,15 +468,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; @@ -489,7 +487,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) @@ -498,7 +496,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); @@ -510,21 +508,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; } @@ -533,7 +531,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; @@ -544,19 +542,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); @@ -566,13 +565,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); } @@ -582,13 +581,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 cd6dfdfff..66ab75f82 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 */ @@ -101,21 +100,20 @@ 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); -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 409286ab1..becdb55e7 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -2511,8 +2511,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; @@ -2525,7 +2524,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 Mon Jan 20 15:08:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226013 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Znd5Lz6z9sRk for ; Tue, 21 Jan 2020 02:09:09 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 2B3D4878D1; Mon, 20 Jan 2020 15:09:08 +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 7v4HE6h-z7p0; Mon, 20 Jan 2020 15:09:03 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 4D8A387699; Mon, 20 Jan 2020 15:08:54 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 2B0BCC1D88; Mon, 20 Jan 2020 15:08:54 +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 9FAC2C0176 for ; Mon, 20 Jan 2020 15:08:52 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 883428583C for ; Mon, 20 Jan 2020 15:08:52 +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 sMF5cJRa3A0T for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by whitealder.osuosl.org (Postfix) with ESMTP id 11B51856CB for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:44 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hUr013116; Mon, 20 Jan 2020 17:08:43 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:08 +0000 Message-Id: <20200120150830.16262-4-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 03/25] netdev-offload: Allow offloading to netdev without ifindex. 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 Virtual interfaces like vports or dpdk vhost-user ports has no proper ifindex, but could support some kind of offloading. This is a prerequisite for tunneling vport offloading 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 --- lib/netdev-offload.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c index 82b163e8e..1612fe6b8 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -537,10 +537,6 @@ netdev_ports_insert(struct netdev *netdev, const char *dpif_type, struct port_to_netdev_data *data; int ifindex = netdev_get_ifindex(netdev); - if (ifindex < 0) { - return ENODEV; - } - ovs_rwlock_wrlock(&netdev_hmap_rwlock); if (netdev_ports_lookup(dpif_port->port_no, dpif_type)) { ovs_rwlock_unlock(&netdev_hmap_rwlock); @@ -550,13 +546,18 @@ netdev_ports_insert(struct netdev *netdev, const char *dpif_type, data = xzalloc(sizeof *data); data->netdev = netdev_ref(netdev); dpif_port_clone(&data->dpif_port, dpif_port); - data->ifindex = ifindex; + + if (ifindex >= 0) { + data->ifindex = ifindex; + hmap_insert(&ifindex_to_port, &data->ifindex_node, ifindex); + } else { + data->ifindex = -1; + } netdev_set_dpif_type(netdev, dpif_type); hmap_insert(&port_to_netdev, &data->portno_node, netdev_ports_hash(dpif_port->port_no, dpif_type)); - hmap_insert(&ifindex_to_port, &data->ifindex_node, ifindex); ovs_rwlock_unlock(&netdev_hmap_rwlock); netdev_init_flow_api(netdev); @@ -592,7 +593,9 @@ netdev_ports_remove(odp_port_t port_no, const char *dpif_type) dpif_port_destroy(&data->dpif_port); netdev_close(data->netdev); /* unref and possibly close */ hmap_remove(&port_to_netdev, &data->portno_node); - hmap_remove(&ifindex_to_port, &data->ifindex_node); + if (data->ifindex >= 0) { + hmap_remove(&ifindex_to_port, &data->ifindex_node); + } free(data); ret = 0; } From patchwork Mon Jan 20 15:08:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226020 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Znz2fbNz9sS9 for ; Tue, 21 Jan 2020 02:09:27 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id DCAB020454; Mon, 20 Jan 2020 15:09:25 +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 wp2aIuxj7YOr; Mon, 20 Jan 2020 15:09:20 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 24B5420490; Mon, 20 Jan 2020 15:09:01 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id F2DA1C1D8B; Mon, 20 Jan 2020 15:09:00 +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 13525C0174 for ; Mon, 20 Jan 2020 15:08:56 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id F3E3C81B74 for ; Mon, 20 Jan 2020 15:08:55 +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 ncaDUXrS-pkr for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by whitealder.osuosl.org (Postfix) with ESMTP id 176F385BDF for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:44 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hUs013116; Mon, 20 Jan 2020 17:08:44 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:09 +0000 Message-Id: <20200120150830.16262-5-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 04/25] netdev-offload: Disallow offloading to unrelated tunneling vports. 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 'linux_tc' flow API suitable only for tunneling vports with backing linux interfaces. DPDK flow API is not suitable for such ports. With this change we could drop vport restriction from dpif-netdev. This is a prerequisite for enabling vport offloading in DPDK. Signed-off-by: Ilya Maximets Acked-by: Eli Britstein Acked-by: Roni Bar Yanai Acked-by: Ophir Munk Signed-off-by: Eli Britstein --- lib/dpif-netdev.c | 3 +-- lib/netdev-offload-dpdk.c | 8 ++++++++ lib/netdev-offload-tc.c | 8 ++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index abd07992b..7f1671084 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2437,8 +2437,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) info.flow_mark = mark; port = netdev_ports_get(in_port, dpif_type_str); - if (!port || netdev_vport_is_vport_class(port->netdev_class)) { - netdev_close(port); + if (!port) { goto err_free; } /* Taking a global 'port_mutex' to fulfill thread safety restrictions for diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 3c4e51e29..61b45a1bd 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -22,6 +22,7 @@ #include "dpif-netdev.h" #include "netdev-offload-provider.h" #include "netdev-provider.h" +#include "netdev-vport.h" #include "openvswitch/match.h" #include "openvswitch/vlog.h" #include "packets.h" @@ -1224,6 +1225,13 @@ netdev_offload_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid, static int netdev_offload_dpdk_init_flow_api(struct netdev *netdev) { + if (netdev_vport_is_vport_class(netdev->netdev_class) + && !strcmp(netdev_get_dpif_type(netdev), "system")) { + VLOG_DBG("%s: vport belongs to the system datapath. Skipping.", + netdev_get_name(netdev)); + return EOPNOTSUPP; + } + return netdev_dpdk_flow_api_supported(netdev) ? 0 : EOPNOTSUPP; } diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c index d57265f84..9013bc33b 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -31,6 +31,7 @@ #include "netdev-linux.h" #include "netdev-offload-provider.h" #include "netdev-provider.h" +#include "netdev-vport.h" #include "netlink.h" #include "netlink-socket.h" #include "odp-netlink.h" @@ -1905,6 +1906,13 @@ netdev_tc_init_flow_api(struct netdev *netdev) int ifindex; int error; + if (netdev_vport_is_vport_class(netdev->netdev_class) + && strcmp(netdev_get_dpif_type(netdev), "system")) { + VLOG_DBG("%s: vport doesn't belong to the system datapath. Skipping.", + netdev_get_name(netdev)); + return EOPNOTSUPP; + } + ifindex = netdev_get_ifindex(netdev); if (ifindex < 0) { VLOG_INFO("init: failed to get ifindex for %s: %s", From patchwork Mon Jan 20 15:08:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226031 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Zps2vzgz9sRk for ; Tue, 21 Jan 2020 02:10:13 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id DFFF42262F; Mon, 20 Jan 2020 15:10:11 +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 e7mv5FLwHyaD; Mon, 20 Jan 2020 15:10:06 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 06745207A9; Mon, 20 Jan 2020 15:09:11 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id D396BC1D89; Mon, 20 Jan 2020 15:09:10 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id AE555C1D85 for ; Mon, 20 Jan 2020 15:08:57 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 96D948750A for ; Mon, 20 Jan 2020 15:08:57 +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 trw5J9VI0KZs for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by hemlock.osuosl.org (Postfix) with ESMTP id 160A38739D for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:44 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hUt013116; Mon, 20 Jan 2020 17:08:44 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:10 +0000 Message-Id: <20200120150830.16262-6-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 05/25] dpif-netdev: Add mega ufid in flow add log 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" As offload is done using the mega ufid of a flow, for better debugability, add it in the log message. Signed-off-by: Eli Britstein Reviewed-by: Roni Bar Yanai --- lib/dpif-netdev.c | 2 ++ tests/dpif-netdev.at | 2 ++ tests/ofproto-macros.at | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 7f1671084..8e6b14d35 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -3378,6 +3378,8 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd, ds_put_cstr(&ds, "flow_add: "); odp_format_ufid(ufid, &ds); + ds_put_cstr(&ds, " mega_"); + odp_format_ufid(&flow->mega_ufid, &ds); ds_put_cstr(&ds, " "); odp_flow_format(key_buf.data, key_buf.size, mask_buf.data, mask_buf.size, diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at index 0aeb4e788..bda1f6707 100644 --- a/tests/dpif-netdev.at +++ b/tests/dpif-netdev.at @@ -13,6 +13,7 @@ strip_timers () { strip_xout () { sed ' + s/mega_ufid:[-0-9a-f]* // s/ufid:[-0-9a-f]* // s/used:[0-9]*\.[0-9]*/used:0.0/ s/actions:.*/actions: / @@ -23,6 +24,7 @@ strip_xout () { strip_xout_keep_actions () { sed ' + s/mega_ufid:[-0-9a-f]* // s/ufid:[-0-9a-f]* // s/used:[0-9]*\.[0-9]*/used:0.0/ s/packets:[0-9]*/packets:0/ diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at index b2b17eed3..87f9ae280 100644 --- a/tests/ofproto-macros.at +++ b/tests/ofproto-macros.at @@ -131,7 +131,8 @@ strip_duration () { # Strips 'ufid:...' from output, to make it easier to compare. # (ufids are random.) strip_ufid () { - sed 's/ufid:[[-0-9a-f]]* //' + sed 's/mega_ufid:[[-0-9a-f]]* // + s/ufid:[[-0-9a-f]]* //' } m4_divert_pop([PREPARE_TESTS]) From patchwork Mon Jan 20 15:08:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226030 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Zpk6C6jz9sRk for ; Tue, 21 Jan 2020 02:10:06 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 33D55875D9; Mon, 20 Jan 2020 15:10:05 +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 rsn5xc-YGP7t; Mon, 20 Jan 2020 15:09:57 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id A0AFE855D9; Mon, 20 Jan 2020 15:09:14 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 870F5C1D8D; Mon, 20 Jan 2020 15:09:14 +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 DE903C1D88 for ; Mon, 20 Jan 2020 15:09:00 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id C8811858B8 for ; Mon, 20 Jan 2020 15:09:00 +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 7y0DKiTVwivI for ; Mon, 20 Jan 2020 15:08:56 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by fraxinus.osuosl.org (Postfix) with ESMTP id 18623857BE for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:44 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hUu013116; Mon, 20 Jan 2020 17:08:44 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:11 +0000 Message-Id: <20200120150830.16262-7-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 06/25] netdev-offload-dpdk: Remove pre-validate of patterns function 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 function of adding patterns by requested matches checks that it consumed all the required matches, and err if not. This nullify the purpose of the validation function. Future supported matches will only change the pattern parsing code. Signed-off-by: Eli Britstein Reviewed-by: Roni Bar Yanai --- lib/netdev-offload-dpdk.c | 134 ++++++++++++++++++---------------------------- 1 file changed, 52 insertions(+), 82 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 61b45a1bd..523b5a1bb 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -560,10 +560,22 @@ free_flow_actions(struct flow_actions *actions) static int parse_flow_match(struct flow_patterns *patterns, - const struct match *match) + struct match *match) { uint8_t *next_proto_mask = NULL; + struct flow *consumed_masks; uint8_t proto = 0; + int ret = 0; + + consumed_masks = &match->wc.masks; + + memset(&consumed_masks->in_port, 0, sizeof consumed_masks->in_port); + if (match->flow.recirc_id != 0) { + ret = -1; + goto out; + } + consumed_masks->recirc_id = 0; + consumed_masks->packet_type = 0; /* Eth */ if (!eth_addr_is_zero(match->wc.masks.dl_src) || @@ -581,6 +593,9 @@ parse_flow_match(struct flow_patterns *patterns, memcpy(&mask->src, &match->wc.masks.dl_src, sizeof mask->src); mask->type = match->wc.masks.dl_type; + memset(&consumed_masks->dl_dst, 0, sizeof consumed_masks->dl_dst); + memset(&consumed_masks->dl_src, 0, sizeof consumed_masks->dl_src); + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_ETH, spec, mask); } else { /* @@ -592,6 +607,7 @@ parse_flow_match(struct flow_patterns *patterns, */ add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_ETH, NULL, NULL); } + consumed_masks->dl_type = 0; /* VLAN */ if (match->wc.masks.vlans[0].tci && match->flow.vlans[0].tci) { @@ -608,6 +624,7 @@ parse_flow_match(struct flow_patterns *patterns, add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_VLAN, spec, mask); } + memset(&consumed_masks->vlans[0], 0, sizeof consumed_masks->vlans[0]); /* IP v4 */ if (match->flow.dl_type == htons(ETH_TYPE_IP)) { @@ -628,6 +645,12 @@ parse_flow_match(struct flow_patterns *patterns, mask->hdr.src_addr = match->wc.masks.nw_src; mask->hdr.dst_addr = match->wc.masks.nw_dst; + consumed_masks->nw_tos = 0; + consumed_masks->nw_ttl = 0; + consumed_masks->nw_proto = 0; + consumed_masks->nw_src = 0; + consumed_masks->nw_dst = 0; + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_IPV4, spec, mask); /* Save proto for L4 protocol setup. */ @@ -635,6 +658,8 @@ parse_flow_match(struct flow_patterns *patterns, mask->hdr.next_proto_id; next_proto_mask = &mask->hdr.next_proto_id; } + /* ignore mask match for now */ + consumed_masks->nw_frag = 0; if (proto != IPPROTO_ICMP && proto != IPPROTO_UDP && proto != IPPROTO_SCTP && proto != IPPROTO_TCP && @@ -642,12 +667,14 @@ parse_flow_match(struct flow_patterns *patterns, match->wc.masks.tp_dst || match->wc.masks.tcp_flags)) { VLOG_DBG("L4 Protocol (%u) not supported", proto); - return -1; + ret = -1; + goto out; } if ((match->wc.masks.tp_src && match->wc.masks.tp_src != OVS_BE16_MAX) || (match->wc.masks.tp_dst && match->wc.masks.tp_dst != OVS_BE16_MAX)) { - return -1; + ret = -1; + goto out; } if (proto == IPPROTO_TCP) { @@ -666,6 +693,10 @@ parse_flow_match(struct flow_patterns *patterns, mask->hdr.data_off = ntohs(match->wc.masks.tcp_flags) >> 8; mask->hdr.tcp_flags = ntohs(match->wc.masks.tcp_flags) & 0xff; + consumed_masks->tp_src = 0; + consumed_masks->tp_dst = 0; + consumed_masks->tcp_flags = 0; + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_TCP, spec, mask); /* proto == TCP and ITEM_TYPE_TCP, thus no need for proto match. */ @@ -684,6 +715,9 @@ parse_flow_match(struct flow_patterns *patterns, mask->hdr.src_port = match->wc.masks.tp_src; mask->hdr.dst_port = match->wc.masks.tp_dst; + consumed_masks->tp_src = 0; + consumed_masks->tp_dst = 0; + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_UDP, spec, mask); /* proto == UDP and ITEM_TYPE_UDP, thus no need for proto match. */ @@ -702,6 +736,9 @@ parse_flow_match(struct flow_patterns *patterns, mask->hdr.src_port = match->wc.masks.tp_src; mask->hdr.dst_port = match->wc.masks.tp_dst; + consumed_masks->tp_src = 0; + consumed_masks->tp_dst = 0; + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_SCTP, spec, mask); /* proto == SCTP and ITEM_TYPE_SCTP, thus no need for proto match. */ @@ -720,6 +757,9 @@ parse_flow_match(struct flow_patterns *patterns, mask->hdr.icmp_type = (uint8_t) ntohs(match->wc.masks.tp_src); mask->hdr.icmp_code = (uint8_t) ntohs(match->wc.masks.tp_dst); + consumed_masks->tp_src = 0; + consumed_masks->tp_dst = 0; + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_ICMP, spec, mask); /* proto == ICMP and ITEM_TYPE_ICMP, thus no need for proto match. */ @@ -730,7 +770,14 @@ parse_flow_match(struct flow_patterns *patterns, add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_END, NULL, NULL); - return 0; + if (!is_all_zeros(consumed_masks, sizeof *consumed_masks)) { + VLOG_DBG_RL(&rl, + "Cannot match all matches. dl_type=0x%04x", + ntohs(match->flow.dl_type)); + ret = -1; + } +out: + return ret; } static void @@ -1037,7 +1084,7 @@ out: static int netdev_offload_dpdk_add_flow(struct netdev *netdev, - const struct match *match, + struct match *match, struct nlattr *nl_actions, size_t actions_len, const ovs_u128 *ufid, @@ -1077,78 +1124,6 @@ out: return ret; } -/* - * Check if any unsupported flow patterns are specified. - */ -static int -netdev_offload_dpdk_validate_flow(const struct match *match) -{ - struct match match_zero_wc; - const struct flow *masks = &match->wc.masks; - - /* Create a wc-zeroed version of flow. */ - match_init(&match_zero_wc, &match->flow, &match->wc); - - if (!is_all_zeros(&match_zero_wc.flow.tunnel, - sizeof match_zero_wc.flow.tunnel)) { - goto err; - } - - if (masks->metadata || masks->skb_priority || - masks->pkt_mark || masks->dp_hash) { - goto err; - } - - /* recirc id must be zero. */ - if (match_zero_wc.flow.recirc_id) { - goto err; - } - - if (masks->ct_state || masks->ct_nw_proto || - masks->ct_zone || masks->ct_mark || - !ovs_u128_is_zero(masks->ct_label)) { - goto err; - } - - if (masks->conj_id || masks->actset_output) { - goto err; - } - - /* Unsupported L2. */ - if (!is_all_zeros(masks->mpls_lse, sizeof masks->mpls_lse)) { - goto err; - } - - /* Unsupported L3. */ - if (masks->ipv6_label || masks->ct_nw_src || masks->ct_nw_dst || - !is_all_zeros(&masks->ipv6_src, sizeof masks->ipv6_src) || - !is_all_zeros(&masks->ipv6_dst, sizeof masks->ipv6_dst) || - !is_all_zeros(&masks->ct_ipv6_src, sizeof masks->ct_ipv6_src) || - !is_all_zeros(&masks->ct_ipv6_dst, sizeof masks->ct_ipv6_dst) || - !is_all_zeros(&masks->nd_target, sizeof masks->nd_target) || - !is_all_zeros(&masks->nsh, sizeof masks->nsh) || - !is_all_zeros(&masks->arp_sha, sizeof masks->arp_sha) || - !is_all_zeros(&masks->arp_tha, sizeof masks->arp_tha)) { - goto err; - } - - /* If fragmented, then don't HW accelerate - for now. */ - if (match_zero_wc.flow.nw_frag) { - goto err; - } - - /* Unsupported L4. */ - if (masks->igmp_group_ip4 || masks->ct_tp_src || masks->ct_tp_dst) { - goto err; - } - - return 0; - -err: - VLOG_ERR("cannot HW accelerate this flow due to unsupported protocols"); - return -1; -} - static int netdev_offload_dpdk_destroy_flow(struct netdev *netdev, const ovs_u128 *ufid, @@ -1192,11 +1167,6 @@ netdev_offload_dpdk_flow_put(struct netdev *netdev, struct match *match, } } - ret = netdev_offload_dpdk_validate_flow(match); - if (ret < 0) { - return ret; - } - if (stats) { memset(stats, 0, sizeof *stats); } From patchwork Mon Jan 20 15:08:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226021 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Zp372L6z9sS9 for ; Tue, 21 Jan 2020 02:09:31 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 27D3285DBB; Mon, 20 Jan 2020 15:09:30 +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 f811dTBtxnvb; Mon, 20 Jan 2020 15:09:22 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 30D0685FC4; Mon, 20 Jan 2020 15:09:06 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 1C162C1D88; Mon, 20 Jan 2020 15:09: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 DB8EAC0174 for ; Mon, 20 Jan 2020 15:08:56 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id CBBE585775 for ; Mon, 20 Jan 2020 15:08:56 +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 kSkjoQkuJoAf for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by fraxinus.osuosl.org (Postfix) with ESMTP id 10A4A85754 for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:44 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hUv013116; Mon, 20 Jan 2020 17:08:44 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:12 +0000 Message-Id: <20200120150830.16262-8-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 07/25] netdev-offload-dpdk: Add IPv6 pattern matching 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" Add support for IPv6 pattern matching for offloading flows. Signed-off-by: Eli Britstein Reviewed-by: Roni Bar Yanai --- Documentation/howto/dpdk.rst | 2 +- NEWS | 1 + lib/netdev-offload-dpdk.c | 76 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/Documentation/howto/dpdk.rst b/Documentation/howto/dpdk.rst index be950d7ce..8a0eee80c 100644 --- a/Documentation/howto/dpdk.rst +++ b/Documentation/howto/dpdk.rst @@ -385,7 +385,7 @@ The validated NICs are: Supported protocols for hardware offload matches are: - L2: Ethernet, VLAN -- L3: IPv4 +- L3: IPv4, IPv6 - L4: TCP, UDP, SCTP, ICMP Supported actions for hardware offload are: diff --git a/NEWS b/NEWS index c6d3b6053..4a23ce1b5 100644 --- a/NEWS +++ b/NEWS @@ -31,6 +31,7 @@ Post-v2.12.0 * Add hardware offload support for output, drop, set of MAC, IPv4 and TCP/UDP ports actions (experimental). * Add experimental support for TSO. + * Add hardware offload support for matching IPv6 protocol. - RSTP: * The rstp_statistics column in Port table will only be updated every stats-update-interval configured in Open_vSwitch table. diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 523b5a1bb..633add2e6 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -16,6 +16,8 @@ */ #include +#include +#include #include #include "cmap.h" @@ -322,6 +324,42 @@ dump_flow_pattern(struct ds *s, const struct rte_flow_item *item) } else { ds_put_cstr(s, " Mask = null\n"); } + } else if (item->type == RTE_FLOW_ITEM_TYPE_IPV6) { + const struct rte_flow_item_ipv6 *ipv6_spec = item->spec; + const struct rte_flow_item_ipv6 *ipv6_mask = item->mask; + + char src_addr_str[INET6_ADDRSTRLEN]; + char dst_addr_str[INET6_ADDRSTRLEN]; + + ds_put_cstr(s, "rte flow ipv6 pattern:\n"); + if (ipv6_spec) { + ipv6_string_mapped(src_addr_str, + (struct in6_addr *)&ipv6_spec->hdr.src_addr); + ipv6_string_mapped(dst_addr_str, + (struct in6_addr *)&ipv6_spec->hdr.dst_addr); + + ds_put_format(s, " Spec: vtc_flow=%#"PRIx32", proto=%"PRIu8"," + " hlim=%"PRIu8", src=%s, dst=%s\n", + ntohl(ipv6_spec->hdr.vtc_flow), ipv6_spec->hdr.proto, + ipv6_spec->hdr.hop_limits, src_addr_str, + dst_addr_str); + } else { + ds_put_cstr(s, " Spec = null\n"); + } + if (ipv6_mask) { + ipv6_string_mapped(src_addr_str, + (struct in6_addr *)&ipv6_mask->hdr.src_addr); + ipv6_string_mapped(dst_addr_str, + (struct in6_addr *)&ipv6_mask->hdr.dst_addr); + + ds_put_format(s, " Mask: vtc_flow=%#"PRIx32", proto=%#"PRIx8"," + " hlim=%#"PRIx8", src=%s, dst=%s\n", + ntohl(ipv6_mask->hdr.vtc_flow), ipv6_mask->hdr.proto, + ipv6_mask->hdr.hop_limits, src_addr_str, + dst_addr_str); + } else { + ds_put_cstr(s, " Mask = null\n"); + } } else { ds_put_format(s, "unknown rte flow pattern (%d)\n", item->type); } @@ -661,6 +699,44 @@ parse_flow_match(struct flow_patterns *patterns, /* ignore mask match for now */ consumed_masks->nw_frag = 0; + /* IP v6 */ + if (match->flow.dl_type == htons(ETH_TYPE_IPV6)) { + struct rte_flow_item_ipv6 *spec, *mask; + + spec = xzalloc(sizeof *spec); + mask = xzalloc(sizeof *mask); + + spec->hdr.proto = match->flow.nw_proto; + spec->hdr.hop_limits = match->flow.nw_ttl; + spec->hdr.vtc_flow = htonl((uint32_t)match->flow.nw_tos << + RTE_IPV6_HDR_TC_SHIFT); + memcpy(spec->hdr.src_addr, &match->flow.ipv6_src, + sizeof spec->hdr.src_addr); + memcpy(spec->hdr.dst_addr, &match->flow.ipv6_dst, + sizeof spec->hdr.dst_addr); + + mask->hdr.proto = match->wc.masks.nw_proto; + mask->hdr.hop_limits = match->wc.masks.nw_ttl; + mask->hdr.vtc_flow = htonl((uint32_t)match->wc.masks.nw_tos << + RTE_IPV6_HDR_TC_SHIFT); + memcpy(mask->hdr.src_addr, &match->wc.masks.ipv6_src, + sizeof mask->hdr.src_addr); + memcpy(mask->hdr.dst_addr, &match->wc.masks.ipv6_dst, + sizeof mask->hdr.dst_addr); + + consumed_masks->nw_proto = 0; + consumed_masks->nw_ttl = 0; + consumed_masks->nw_tos = 0; + memset(&consumed_masks->ipv6_src, 0, sizeof consumed_masks->ipv6_src); + memset(&consumed_masks->ipv6_dst, 0, sizeof consumed_masks->ipv6_dst); + + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_IPV6, spec, mask); + + /* Save proto for L4 protocol setup */ + proto = spec->hdr.proto & mask->hdr.proto; + next_proto_mask = &mask->hdr.proto; + } + if (proto != IPPROTO_ICMP && proto != IPPROTO_UDP && proto != IPPROTO_SCTP && proto != IPPROTO_TCP && (match->wc.masks.tp_src || From patchwork Mon Jan 20 15:08:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226029 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Zpg5sFhz9sSL for ; Tue, 21 Jan 2020 02:10:03 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 342DD204EE; Mon, 20 Jan 2020 15:10:02 +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 ml7lPJiDgkYC; Mon, 20 Jan 2020 15:09:57 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id F18EA204FB; Mon, 20 Jan 2020 15:09:08 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id CE6BAC1D8B; Mon, 20 Jan 2020 15:09:08 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 4310FC0174 for ; Mon, 20 Jan 2020 15:08:57 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 28E7A8750A for ; Mon, 20 Jan 2020 15:08:57 +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 2SaSsHhOqtwF for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by hemlock.osuosl.org (Postfix) with ESMTP id 136008731A for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:44 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hUw013116; Mon, 20 Jan 2020 17:08:44 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:13 +0000 Message-Id: <20200120150830.16262-9-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 08/25] netdev-offload-dpdk: Support offload of clone tnl_push/output actions 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" Signed-off-by: Eli Britstein Reviewed-by: Oz Shlomo --- Documentation/howto/dpdk.rst | 1 + NEWS | 4 ++-- lib/netdev-offload-dpdk.c | 57 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/Documentation/howto/dpdk.rst b/Documentation/howto/dpdk.rst index 8a0eee80c..d1f8685f2 100644 --- a/Documentation/howto/dpdk.rst +++ b/Documentation/howto/dpdk.rst @@ -395,6 +395,7 @@ Supported actions for hardware offload are: - Modification of Ethernet (mod_dl_src/mod_dl_dst). - Modification of IPv4 (mod_nw_src/mod_nw_dst/mod_nw_ttl). - Modification of TCP/UDP (mod_tp_src/mod_tp_dst). +- Clone/output (tnl_push and output) for encapsulating over a tunnel. Further Reading --------------- diff --git a/NEWS b/NEWS index 4a23ce1b5..c9b6b62d6 100644 --- a/NEWS +++ b/NEWS @@ -28,8 +28,8 @@ Post-v2.12.0 * DPDK ring ports (dpdkr) are deprecated and will be removed in next releases. * Add support for DPDK 19.11. - * Add hardware offload support for output, drop, set of MAC, IPv4 and - TCP/UDP ports actions (experimental). + * Add hardware offload support for output, drop, set of MAC, IPv4, + TCP/UDP ports and tunnel push-output actions (experimental). * Add experimental support for TSO. * Add hardware offload support for matching IPv6 protocol. - RSTP: diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 633add2e6..d25ae52e2 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -459,6 +459,17 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) } else { ds_put_format(s, " Set-%s-tcp/udp-port = null\n", dirstr); } + } else if (actions->type == RTE_FLOW_ACTION_TYPE_RAW_ENCAP) { + const struct rte_flow_action_raw_encap *raw_encap = actions->conf; + + ds_put_cstr(s, "rte flow raw-encap action:\n"); + if (raw_encap) { + ds_put_format(s, " Raw-encap: size=%ld\n", raw_encap->size); + ds_put_format(s, " Raw-encap: encap=\n"); + ds_put_hex_dump(s, raw_encap->data, raw_encap->size, 0, false); + } else { + ds_put_cstr(s, " Raw-encap = null\n"); + } } else { ds_put_format(s, "unknown rte flow action (%d)\n", actions->type); } @@ -1093,6 +1104,44 @@ parse_set_actions(struct flow_actions *actions, return 0; } +static int +parse_clone_actions(struct netdev *netdev, + struct flow_actions *actions, + const struct nlattr *clone_actions, + const size_t clone_actions_len) +{ + const struct nlattr *ca; + unsigned int cleft; + + NL_ATTR_FOR_EACH_UNSAFE (ca, cleft, clone_actions, clone_actions_len) { + int clone_type = nl_attr_type(ca); + + if (clone_type == OVS_ACTION_ATTR_TUNNEL_PUSH) { + const struct ovs_action_push_tnl *tnl_push = nl_attr_get(ca); + struct rte_flow_action_raw_encap *raw_encap = + xzalloc(sizeof *raw_encap); + + raw_encap->data = (uint8_t *)tnl_push->header; + raw_encap->preserve = NULL; + raw_encap->size = tnl_push->header_len; + + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_RAW_ENCAP, + raw_encap); + } else if (clone_type == OVS_ACTION_ATTR_OUTPUT) { + if (add_output_action(netdev, actions, ca)) { + return -1; + } + } else { + VLOG_DBG_RL(&rl, + "Unsupported nested action inside clone(), " + "action type: %d", clone_type); + return -1; + } + } + + return 0; +} + static int parse_flow_actions(struct netdev *netdev, struct flow_actions *actions, @@ -1120,6 +1169,14 @@ parse_flow_actions(struct netdev *netdev, masked)) { return -1; } + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_CLONE) { + const struct nlattr *clone_actions = nl_attr_get(nla); + size_t clone_actions_len = nl_attr_get_size(nla); + + if (parse_clone_actions(netdev, actions, clone_actions, + clone_actions_len)) { + return -1; + } } else { VLOG_DBG_RL(&rl, "Unsupported action type %d", nl_attr_type(nla)); return -1; From patchwork Mon Jan 20 15:08:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226022 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Zp82Fjsz9sS9 for ; Tue, 21 Jan 2020 02:09:36 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id CB80F2049D; Mon, 20 Jan 2020 15:09:34 +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 4NzVCY8EbacR; Mon, 20 Jan 2020 15:09:29 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 54813204A2; Mon, 20 Jan 2020 15:09:03 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 245FEC1D85; Mon, 20 Jan 2020 15:09:03 +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 6A0D0C0176 for ; Mon, 20 Jan 2020 15:08:56 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 629CA81B7D for ; Mon, 20 Jan 2020 15:08:56 +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 3eSpW87-2h79 for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by whitealder.osuosl.org (Postfix) with ESMTP id 1628385BCE for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:44 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hUx013116; Mon, 20 Jan 2020 17:08:44 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:14 +0000 Message-Id: <20200120150830.16262-10-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 09/25] netdev-offload-dpdk: Support tnl/push using vxlan encap attribute 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" For DPDK, there is the RAW_ENCAP attribute which gets raw buffer of the encapsulation header. For specific protocol, such as vxlan, there is a more specific attribute, VXLAN_ENCAP, which gets the parsed fields of the outer header. In case tunnel type is vxlan, parse the header and use the specific attribute, with fallback to RAW_ENCAP. Signed-off-by: Eli Britstein Reviewed-by: Roni Bar Yanai --- lib/netdev-offload-dpdk.c | 123 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 121 insertions(+), 2 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index d25ae52e2..c80f07e77 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -360,6 +360,25 @@ dump_flow_pattern(struct ds *s, const struct rte_flow_item *item) } else { ds_put_cstr(s, " Mask = null\n"); } + } else if (item->type == RTE_FLOW_ITEM_TYPE_VXLAN) { + const struct rte_flow_item_vxlan *vxlan_spec = item->spec; + const struct rte_flow_item_vxlan *vxlan_mask = item->mask; + + ds_put_cstr(s, "rte flow vxlan pattern:\n"); + if (vxlan_spec) { + ds_put_format(s, " Spec: flags=0x%x, vni=%d\n", + vxlan_spec->flags, + ntohl(*(ovs_be32 *)vxlan_spec->vni) >> 8); + } else { + ds_put_cstr(s, " Spec = null\n"); + } + if (vxlan_mask) { + ds_put_format(s, " Mask: flags=0x%x, vni=0x%06x\n", + vxlan_mask->flags, + ntohl(*(ovs_be32 *)vxlan_mask->vni) >> 8); + } else { + ds_put_cstr(s, " Mask = null\n"); + } } else { ds_put_format(s, "unknown rte flow pattern (%d)\n", item->type); } @@ -470,6 +489,14 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) } else { ds_put_cstr(s, " Raw-encap = null\n"); } + } else if (actions->type == RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP) { + const struct rte_flow_action_vxlan_encap *vxlan_encap = actions->conf; + const struct rte_flow_item *items = vxlan_encap->definition; + + ds_put_cstr(s, "rte flow vxlan-encap action:\n"); + while (items && items->type != RTE_FLOW_ITEM_TYPE_END) { + dump_flow_pattern(s, items++); + } } else { ds_put_format(s, "unknown rte flow action (%d)\n", actions->type); } @@ -1104,6 +1131,93 @@ parse_set_actions(struct flow_actions *actions, return 0; } +/* Maximum number of items in struct rte_flow_action_vxlan_encap. + * ETH / IPv4(6) / UDP / VXLAN / END + */ +#define ACTION_VXLAN_ENCAP_ITEMS_NUM 5 + +static int +add_vxlan_encap_action(struct flow_actions *actions, + const void *header) +{ + const struct eth_header *eth; + const struct udp_header *udp; + struct vxlan_data { + struct rte_flow_action_vxlan_encap conf; + struct rte_flow_item items[0]; + } *vxlan_data; + BUILD_ASSERT_DECL(offsetof(struct vxlan_data, conf) == 0); + const void *vxlan; + const void *l3; + const void *l4; + int field; + + vxlan_data = xzalloc(sizeof *vxlan_data + + sizeof(struct rte_flow_item) * + ACTION_VXLAN_ENCAP_ITEMS_NUM); + field = 0; + + eth = header; + /* Ethernet */ + vxlan_data->items[field].type = RTE_FLOW_ITEM_TYPE_ETH; + vxlan_data->items[field].spec = eth; + vxlan_data->items[field].mask = &rte_flow_item_eth_mask; + field++; + + l3 = eth + 1; + /* IP */ + if (eth->eth_type == htons(ETH_TYPE_IP)) { + /* IPv4 */ + const struct ip_header *ip = l3; + + vxlan_data->items[field].type = RTE_FLOW_ITEM_TYPE_IPV4; + vxlan_data->items[field].spec = ip; + vxlan_data->items[field].mask = &rte_flow_item_ipv4_mask; + + if (ip->ip_proto != IPPROTO_UDP) { + goto err; + } + l4 = (ip + 1); + } else if (eth->eth_type == htons(ETH_TYPE_IPV6)) { + const struct ovs_16aligned_ip6_hdr *ip6 = l3; + + vxlan_data->items[field].type = RTE_FLOW_ITEM_TYPE_IPV6; + vxlan_data->items[field].spec = ip6; + vxlan_data->items[field].mask = &rte_flow_item_ipv6_mask; + + if (ip6->ip6_nxt != IPPROTO_UDP) { + goto err; + } + l4 = (ip6 + 1); + } else { + goto err; + } + field++; + + udp = (const struct udp_header *)l4; + vxlan_data->items[field].type = RTE_FLOW_ITEM_TYPE_UDP; + vxlan_data->items[field].spec = udp; + vxlan_data->items[field].mask = &rte_flow_item_udp_mask; + field++; + + vxlan = (udp + 1); + vxlan_data->items[field].type = RTE_FLOW_ITEM_TYPE_VXLAN; + vxlan_data->items[field].spec = vxlan; + vxlan_data->items[field].mask = &rte_flow_item_vxlan_mask; + field++; + + vxlan_data->items[field].type = RTE_FLOW_ITEM_TYPE_END; + + vxlan_data->conf.definition = vxlan_data->items; + + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP, vxlan_data); + + return 0; +err: + free(vxlan_data); + return -1; +} + static int parse_clone_actions(struct netdev *netdev, struct flow_actions *actions, @@ -1118,9 +1232,14 @@ parse_clone_actions(struct netdev *netdev, if (clone_type == OVS_ACTION_ATTR_TUNNEL_PUSH) { const struct ovs_action_push_tnl *tnl_push = nl_attr_get(ca); - struct rte_flow_action_raw_encap *raw_encap = - xzalloc(sizeof *raw_encap); + struct rte_flow_action_raw_encap *raw_encap; + + if (tnl_push->tnl_type == OVS_VPORT_TYPE_VXLAN && + !add_vxlan_encap_action(actions, tnl_push->header)) { + continue; + } + raw_encap = xzalloc(sizeof *raw_encap); raw_encap->data = (uint8_t *)tnl_push->header; raw_encap->preserve = NULL; raw_encap->size = tnl_push->header_len; From patchwork Mon Jan 20 15:08:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226034 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Zq60ly9z9sRk for ; Tue, 21 Jan 2020 02:10:26 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 95EA9226FC; Mon, 20 Jan 2020 15:10:24 +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 Os56-3pZABg0; Mon, 20 Jan 2020 15:10:17 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id DA3E8226D0; Mon, 20 Jan 2020 15:09:12 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 97725C1D8F; Mon, 20 Jan 2020 15:09:12 +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 64D5BC1D88 for ; Mon, 20 Jan 2020 15:08:58 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 52E44857E2 for ; Mon, 20 Jan 2020 15:08:58 +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 00u2LhFL4FO8 for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by fraxinus.osuosl.org (Postfix) with ESMTP id 1278785755 for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:44 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hV0013116; Mon, 20 Jan 2020 17:08:44 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:15 +0000 Message-Id: <20200120150830.16262-11-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 10/25] dpif-netdev: Make mark allocation public API 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: Ophir Munk Refactor mark allocation to offload layer, with API to be used by upper layers (dpif-netdev), as a pre-step towards allocating marks by offload layer. Co-authored-by: Eli Britstein Signed-off-by: Ophir Munk Reviewed-by: Roni Bar Yanai Signed-off-by: Eli Britstein --- lib/dpif-netdev.c | 33 +++------------------------------ lib/netdev-offload.c | 33 +++++++++++++++++++++++++++++++++ lib/netdev-offload.h | 4 ++++ 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 8e6b14d35..bd937f300 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2146,9 +2146,6 @@ dp_netdev_pmd_find_dpcls(struct dp_netdev_pmd_thread *pmd, return cls; } -#define MAX_FLOW_MARK (UINT32_MAX - 1) -#define INVALID_FLOW_MARK (UINT32_MAX) - struct megaflow_to_mark_data { const struct cmap_node node; ovs_u128 mega_ufid; @@ -2158,7 +2155,6 @@ struct megaflow_to_mark_data { struct flow_mark { struct cmap megaflow_to_mark; struct cmap mark_to_flow; - struct id_pool *pool; }; static struct flow_mark flow_mark = { @@ -2166,29 +2162,6 @@ static struct flow_mark flow_mark = { .mark_to_flow = CMAP_INITIALIZER, }; -static uint32_t -flow_mark_alloc(void) -{ - uint32_t mark; - - if (!flow_mark.pool) { - /* Haven't initiated yet, do it here */ - flow_mark.pool = id_pool_create(0, MAX_FLOW_MARK); - } - - if (id_pool_alloc_id(flow_mark.pool, &mark)) { - return mark; - } - - return INVALID_FLOW_MARK; -} - -static void -flow_mark_free(uint32_t mark) -{ - id_pool_free_id(flow_mark.pool, mark); -} - /* associate megaflow with a mark, which is a 1:1 mapping */ static void megaflow_to_mark_associate(const ovs_u128 *mega_ufid, uint32_t mark) @@ -2300,7 +2273,7 @@ mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd, netdev_close(port); } - flow_mark_free(mark); + netdev_offload_flow_mark_free(mark); VLOG_DBG("Freed flow mark %u\n", mark); megaflow_to_mark_disassociate(&flow->mega_ufid); @@ -2429,7 +2402,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) return 0; } - mark = flow_mark_alloc(); + mark = netdev_offload_flow_mark_alloc(); if (mark == INVALID_FLOW_MARK) { VLOG_ERR("Failed to allocate flow mark!\n"); } @@ -2462,7 +2435,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) err_free: if (!modification) { - flow_mark_free(mark); + netdev_offload_flow_mark_free(mark); } else { mark_to_flow_disassociate(pmd, flow); } diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c index 1612fe6b8..008c46d50 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -33,6 +33,7 @@ #include "openvswitch/dynamic-string.h" #include "fatal-signal.h" #include "hash.h" +#include "id-pool.h" #include "openvswitch/list.h" #include "netdev-offload-provider.h" #include "netdev-provider.h" @@ -59,6 +60,8 @@ VLOG_DEFINE_THIS_MODULE(netdev_offload); static bool netdev_flow_api_enabled = false; +static struct id_pool *mark_pool = NULL; +static struct ovs_mutex mark_pool_mutex = OVS_MUTEX_INITIALIZER; /* Protects 'netdev_flow_apis'. */ static struct ovs_mutex netdev_flow_api_provider_mutex = OVS_MUTEX_INITIALIZER; @@ -279,6 +282,36 @@ netdev_flow_del(struct netdev *netdev, const ovs_u128 *ufid, : EOPNOTSUPP; } +#define MAX_FLOW_MARK (UINT32_MAX - 1) + +uint32_t +netdev_offload_flow_mark_alloc(void) +{ + uint32_t mark; + + ovs_mutex_lock(&mark_pool_mutex); + if (!mark_pool) { + /* Haven't initiated yet, do it here */ + mark_pool = id_pool_create(0, MAX_FLOW_MARK); + } + + if (id_pool_alloc_id(mark_pool, &mark)) { + ovs_mutex_unlock(&mark_pool_mutex); + return mark; + } + + ovs_mutex_unlock(&mark_pool_mutex); + return INVALID_FLOW_MARK; +} + +void +netdev_offload_flow_mark_free(uint32_t mark) +{ + ovs_mutex_lock(&mark_pool_mutex); + id_pool_free_id(mark_pool, mark); + ovs_mutex_unlock(&mark_pool_mutex); +} + int netdev_init_flow_api(struct netdev *netdev) { diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index 66ab75f82..b5488d00e 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -75,6 +75,8 @@ struct offload_info { uint32_t flow_mark; }; +#define INVALID_FLOW_MARK (UINT32_MAX) + int netdev_flow_flush(struct netdev *); int netdev_flow_dump_create(struct netdev *, struct netdev_flow_dump **dump); int netdev_flow_dump_destroy(struct netdev_flow_dump *); @@ -119,6 +121,8 @@ int netdev_ports_flow_get(const char *dpif_type, struct match *match, struct dpif_flow_stats *stats, struct dpif_flow_attrs *attrs, struct ofpbuf *buf); +uint32_t netdev_offload_flow_mark_alloc(void); +void netdev_offload_flow_mark_free(uint32_t mark); #ifdef __cplusplus } From patchwork Mon Jan 20 15:08:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226019 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Znw04xnz9sRk for ; Tue, 21 Jan 2020 02:09:23 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 4C8F52047D; Mon, 20 Jan 2020 15:09:22 +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 BjDI5GtswHtK; Mon, 20 Jan 2020 15:09:17 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 3A0FF20485; Mon, 20 Jan 2020 15:09:00 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 2D815C1D88; Mon, 20 Jan 2020 15:09:00 +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 C47D9C0174 for ; Mon, 20 Jan 2020 15:08:55 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id B1A1E1FEED for ; Mon, 20 Jan 2020 15:08:55 +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 wq2JdhiHYrKL for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by silver.osuosl.org (Postfix) with ESMTP id 16AB820426 for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:44 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hV1013116; Mon, 20 Jan 2020 17:08:44 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:16 +0000 Message-Id: <20200120150830.16262-12-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 11/25] netdev-offload: Don't use zero flow mark 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" Zero flow mark is used to indicate the HW to remove the mark. A packet marked with zero mark is received in SW without a mark at all, so it cannot be used as a valid mark. Change the pool range to fix it. Fixes: 241bad15d99a ("dpif-netdev: associate flow with a mark id") Signed-off-by: Eli Britstein Reviewed-by: Roni Bar Yanai --- lib/netdev-offload.c | 2 +- lib/netdev-offload.h | 2 +- tests/dpif-netdev.at | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c index 008c46d50..3469b71c6 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -292,7 +292,7 @@ netdev_offload_flow_mark_alloc(void) ovs_mutex_lock(&mark_pool_mutex); if (!mark_pool) { /* Haven't initiated yet, do it here */ - mark_pool = id_pool_create(0, MAX_FLOW_MARK); + mark_pool = id_pool_create(1, MAX_FLOW_MARK); } if (id_pool_alloc_id(mark_pool, &mark)) { diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index b5488d00e..25ff308df 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -75,7 +75,7 @@ struct offload_info { uint32_t flow_mark; }; -#define INVALID_FLOW_MARK (UINT32_MAX) +#define INVALID_FLOW_MARK 0 int netdev_flow_flush(struct netdev *); int netdev_flow_dump_create(struct netdev *, struct netdev_flow_dump **dump); diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at index bda1f6707..8f4c5bd70 100644 --- a/tests/dpif-netdev.at +++ b/tests/dpif-netdev.at @@ -395,7 +395,7 @@ skb_priority(0),skb_mark(0),ct_state(0),ct_zone(0),ct_mark(0),ct_label(0),recirc # Check that flow successfully offloaded. OVS_WAIT_UNTIL([grep "succeed to add netdev flow" ovs-vswitchd.log]) AT_CHECK([filter_hw_flow_install < ovs-vswitchd.log | strip_xout], [0], [dnl -p1: flow put[[create]]: flow match: recirc_id=0,eth,ip,in_port=1,vlan_tci=0x0000,nw_frag=no, mark: 0 +p1: flow put[[create]]: flow match: recirc_id=0,eth,ip,in_port=1,vlan_tci=0x0000,nw_frag=no, mark: 1 ]) # Check that datapath flow installed successfully. AT_CHECK([filter_flow_install < ovs-vswitchd.log | strip_xout], [0], [dnl @@ -406,7 +406,7 @@ recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(frag=no), a # Check for succesfull packet matching with installed offloaded flow. AT_CHECK([filter_hw_packet_netdev_dummy < ovs-vswitchd.log | strip_xout], [0], [dnl -p1: packet: ip,vlan_tci=0x0000,dl_src=00:06:07:08:09:0a,dl_dst=00:01:02:03:04:05,nw_src=127.0.0.1,nw_dst=127.0.0.1,nw_proto=0,nw_tos=0,nw_ecn=0,nw_ttl=64 matches with flow: recirc_id=0,eth,ip,vlan_tci=0x0000,nw_frag=no with mark: 0 +p1: packet: ip,vlan_tci=0x0000,dl_src=00:06:07:08:09:0a,dl_dst=00:01:02:03:04:05,nw_src=127.0.0.1,nw_dst=127.0.0.1,nw_proto=0,nw_tos=0,nw_ecn=0,nw_ttl=64 matches with flow: recirc_id=0,eth,ip,vlan_tci=0x0000,nw_frag=no with mark: 1 ]) ovs-appctl revalidator/wait @@ -423,7 +423,7 @@ recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(frag=no), p # Check that flow successfully deleted from HW. OVS_WAIT_UNTIL([grep "succeed to delete netdev flow" ovs-vswitchd.log]) AT_CHECK([filter_hw_flow_del < ovs-vswitchd.log | strip_xout], [0], [dnl -p1: flow del: mark: 0 +p1: flow del: mark: 1 ]) OVS_VSWITCHD_STOP AT_CLEANUP]) @@ -462,7 +462,7 @@ packet_type(ns=0,id=0),eth(src=00:06:07:08:09:0a,dst=00:01:02:03:04:05),eth_type # Check that flow successfully offloaded. OVS_WAIT_UNTIL([grep "succeed to add netdev flow" ovs-vswitchd.log]) AT_CHECK([filter_hw_flow_install < ovs-vswitchd.log | strip_xout], [0], [dnl -p1: flow put[[create]]: flow match: recirc_id=0,eth,udp,in_port=1,dl_vlan=99,dl_vlan_pcp=7,nw_src=127.0.0.1,nw_frag=no,tp_dst=82, mark: 0 +p1: flow put[[create]]: flow match: recirc_id=0,eth,udp,in_port=1,dl_vlan=99,dl_vlan_pcp=7,nw_src=127.0.0.1,nw_frag=no,tp_dst=82, mark: 1 ]) # Check that datapath flow installed successfully. AT_CHECK([filter_flow_install < ovs-vswitchd.log | strip_xout], [0], [dnl @@ -474,7 +474,7 @@ recirc_id(0),in_port(1),packet_type(ns=0,id=0),eth_type(0x8100),vlan(vid=99,pcp= # Check for succesfull packet matching with installed offloaded flow. AT_CHECK([filter_hw_packet_netdev_dummy < ovs-vswitchd.log | strip_xout], [0], [dnl p1: packet: udp,dl_vlan=99,dl_vlan_pcp=7,vlan_tci1=0x0000,dl_src=00:06:07:08:09:0a,dl_dst=00:01:02:03:04:05,nw_src=127.0.0.1,nw_dst=127.0.0.1,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=81,tp_dst=82 dnl -matches with flow: recirc_id=0,eth,udp,dl_vlan=99,dl_vlan_pcp=7,nw_src=127.0.0.1,nw_frag=no,tp_dst=82 with mark: 0 +matches with flow: recirc_id=0,eth,udp,dl_vlan=99,dl_vlan_pcp=7,nw_src=127.0.0.1,nw_frag=no,tp_dst=82 with mark: 1 ]) ovs-appctl revalidator/wait @@ -492,7 +492,7 @@ packets:1, bytes:64, used:0.0s, actions:set(ipv4(src=192.168.0.7)),set(udp(dst=3 # Check that flow successfully deleted from HW. OVS_WAIT_UNTIL([grep "succeed to delete netdev flow" ovs-vswitchd.log]) AT_CHECK([filter_hw_flow_del < ovs-vswitchd.log | strip_xout], [0], [dnl -p1: flow del: mark: 0 +p1: flow del: mark: 1 ]) # Check that ip address and udp port were correctly modified in output packets. From patchwork Mon Jan 20 15:08:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226015 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Znh6Zhbz9sRk for ; Tue, 21 Jan 2020 02:09:12 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id E30C520464; Mon, 20 Jan 2020 15:09:10 +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 KnXa3pKQUK9Z; Mon, 20 Jan 2020 15:08:59 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id D61A61FEED; Mon, 20 Jan 2020 15:08:56 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id BF517C0176; Mon, 20 Jan 2020 15:08:56 +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 00DDFC0174 for ; Mon, 20 Jan 2020 15:08:55 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id F15B42045C for ; Mon, 20 Jan 2020 15:08:54 +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 yaiRHlrEYCDi for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by silver.osuosl.org (Postfix) with ESMTP id 16B1B2043E for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:44 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hV2013116; Mon, 20 Jan 2020 17:08:44 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:17 +0000 Message-Id: <20200120150830.16262-13-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 12/25] netdev-offload-dpdk: Introduce map APIs for table id and miss context 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" Different vports are differentiated in HW by different tables, as in the SW model. As such we need to map to table ids. Also, as this offload involves multiple tables, a miss might occur in the target table. In such case we need to recover the packet and continue in SW. Introduce a mapping for a miss context for that. Signed-off-by: Eli Britstein Reviewed-by: Roni Bar Yanai --- lib/netdev-offload-dpdk.c | 267 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 267 insertions(+) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index c80f07e77..fc890b915 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -29,6 +29,8 @@ #include "openvswitch/vlog.h" #include "packets.h" #include "uuid.h" +#include "id-pool.h" +#include "odp-util.h" VLOG_DEFINE_THIS_MODULE(netdev_offload_dpdk); static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(100, 5); @@ -125,6 +127,271 @@ ufid_to_rte_flow_disassociate(const ovs_u128 *ufid) UUID_ARGS((struct uuid *) ufid)); } +/* A generic data structure used for mapping data to id and id to data. The + * elements are reference coutned. As changes are done only from the single + * offload thread, no locks are required. + * "name" and "dump_context_data" are used for log messages. + * "d2i_hmap" is the data-to-id map. + * "i2d_hmap" is the id-to-data map. + * "id_alloc" is used to allocate an id for a new data. + * "id_free" is used to free an id for the last data release. + * "data_size" is the size of the data in the elements. + */ +struct context_metadata { + const char *name; + struct ds *(*dump_context_data)(struct ds *s, void *data); + struct hmap d2i_hmap; + struct hmap i2d_hmap; + uint32_t (*id_alloc)(void); + void (*id_free)(uint32_t id); + size_t data_size; +}; + +struct context_data { + struct hmap_node d2i_node; + struct hmap_node i2d_node; + void *data; + uint32_t id; + uint32_t refcnt; +}; + +static int +get_context_data_id_by_data(struct context_metadata *md, + struct context_data *data_req, + uint32_t *id) +{ + struct context_data *data_cur; + size_t dhash, ihash; + struct ds s; + + ds_init(&s); + dhash = hash_bytes(data_req->data, md->data_size, 0); + HMAP_FOR_EACH_WITH_HASH (data_cur, d2i_node, dhash, &md->d2i_hmap) { + if (!memcmp(data_req->data, data_cur->data, md->data_size)) { + data_cur->refcnt++; + VLOG_DBG_RL(&rl, + "%s: %s: '%s', refcnt=%d, id=%d", __func__, md->name, + ds_cstr(md->dump_context_data(&s, data_cur->data)), + data_cur->refcnt, data_cur->id); + ds_destroy(&s); + *id = data_cur->id; + return 0; + } + } + + data_cur = xzalloc(sizeof *data_cur); + if (!data_cur) { + goto err; + } + data_cur->data = xmalloc(md->data_size); + if (!data_cur->data) { + goto err_data_alloc; + } + memcpy(data_cur->data, data_req->data, md->data_size); + data_cur->refcnt = 1; + data_cur->id = md->id_alloc(); + if (data_cur->id == 0) { + goto err_id_alloc; + } + hmap_insert(&md->d2i_hmap, &data_cur->d2i_node, dhash); + ihash = hash_add(0, data_cur->id); + hmap_insert(&md->i2d_hmap, &data_cur->i2d_node, ihash); + VLOG_DBG_RL(&rl, "%s: %s: '%s', refcnt=%d, id=%d", __func__, md->name, + ds_cstr(md->dump_context_data(&s, data_cur->data)), + data_cur->refcnt, data_cur->id); + *id = data_cur->id; + ds_destroy(&s); + return 0; + +err_id_alloc: + free(data_cur->data); +err_data_alloc: + free(data_cur); +err: + VLOG_ERR_RL(&rl, "%s: %s: error. '%s'", __func__, md->name, + ds_cstr(md->dump_context_data(&s, data_cur->data))); + ds_destroy(&s); + return -1; +} + +static int +get_context_data_by_id(struct context_metadata *md, uint32_t id, void *data) +{ + size_t ihash = hash_add(0, id); + struct context_data *data_cur; + struct ds s; + + ds_init(&s); + HMAP_FOR_EACH_WITH_HASH (data_cur, i2d_node, ihash, &md->i2d_hmap) { + if (data_cur->id == id) { + memcpy(data, data_cur->data, md->data_size); + ds_destroy(&s); + return 0; + } + } + + ds_destroy(&s); + return -1; +} + +static void +put_context_data_by_id(struct context_metadata *md, uint32_t id) +{ + struct context_data *data_cur; + size_t ihash; + struct ds s; + + if (id == 0) { + return; + } + ihash = hash_add(0, id); + HMAP_FOR_EACH_WITH_HASH (data_cur, i2d_node, ihash, &md->i2d_hmap) { + if (data_cur->id == id) { + data_cur->refcnt--; + ds_init(&s); + VLOG_DBG_RL(&rl, + "%s: %s: '%s', refcnt=%d, id=%d", __func__, md->name, + ds_cstr(md->dump_context_data(&s, data_cur->data)), + data_cur->refcnt, data_cur->id); + ds_destroy(&s); + if (data_cur->refcnt == 0) { + hmap_remove(&md->i2d_hmap, &data_cur->i2d_node); + hmap_remove(&md->d2i_hmap, &data_cur->d2i_node); + free(data_cur); + md->id_free(id); + } + return; + } + } + VLOG_ERR_RL(&rl, + "%s: %s: error. id=%d not found", __func__, md->name, id); +} + +struct table_id_data { + odp_port_t vport; +}; + +static struct ds * +dump_table_id(struct ds *s, void *data) +{ + struct table_id_data *table_id_data = data; + + ds_put_format(s, "vport=%"PRIu32, table_id_data->vport); + return s; +} + +#define MIN_TABLE_ID 1 +#define MAX_TABLE_ID 0xFFFF + +static struct id_pool *table_id_pool = NULL; +static uint32_t +table_id_alloc(void) +{ + uint32_t id; + + if (!table_id_pool) { + /* Haven't initiated yet, do it here */ + table_id_pool = id_pool_create(MIN_TABLE_ID, MAX_TABLE_ID); + } + + if (id_pool_alloc_id(table_id_pool, &id)) { + return id; + } + + return 0; +} + +static void +table_id_free(uint32_t id) +{ + id_pool_free_id(table_id_pool, id); +} + +static struct context_metadata table_id_md = { + .name = "table_id", + .dump_context_data = dump_table_id, + .d2i_hmap = HMAP_INITIALIZER(&table_id_md.d2i_hmap), + .i2d_hmap = HMAP_INITIALIZER(&table_id_md.i2d_hmap), + .id_alloc = table_id_alloc, + .id_free = table_id_free, + .data_size = sizeof(struct table_id_data), +}; + +OVS_UNUSED +static int +get_table_id(odp_port_t vport, uint32_t *table_id) +{ + struct table_id_data table_id_data = { .vport = vport }; + struct context_data table_id_context = { + .data = &table_id_data, + }; + + if (vport == ODPP_NONE) { + *table_id = 0; + return 0; + } + + return get_context_data_id_by_data(&table_id_md, &table_id_context, + table_id); +} + +OVS_UNUSED +static void +put_table_id(uint32_t table_id) +{ + put_context_data_by_id(&table_id_md, table_id); +} + +struct flow_miss_ctx { + odp_port_t vport; +}; + +static struct ds * +dump_flow_ctx_id(struct ds *s, void *data) +{ + struct flow_miss_ctx *flow_ctx_data = data; + + ds_put_format(s, "vport=%"PRIu32, flow_ctx_data->vport); + return s; +} + +static struct context_metadata flow_miss_ctx_md = { + .name = "flow_miss_ctx", + .dump_context_data = dump_flow_ctx_id, + .d2i_hmap = HMAP_INITIALIZER(&flow_miss_ctx_md.d2i_hmap), + .i2d_hmap = HMAP_INITIALIZER(&flow_miss_ctx_md.i2d_hmap), + .id_alloc = netdev_offload_flow_mark_alloc, + .id_free = netdev_offload_flow_mark_free, + .data_size = sizeof(struct flow_miss_ctx), +}; + +OVS_UNUSED +static int +get_flow_miss_ctx_id(struct flow_miss_ctx *flow_ctx_data, + uint32_t *miss_ctx_id) +{ + struct context_data flow_ctx = { + .data = flow_ctx_data, + }; + + return get_context_data_id_by_data(&flow_miss_ctx_md, &flow_ctx, + miss_ctx_id); +} + +OVS_UNUSED +static void +put_flow_miss_ctx_id(uint32_t flow_ctx_id) +{ + put_context_data_by_id(&flow_miss_ctx_md, flow_ctx_id); +} + +OVS_UNUSED +static int +find_flow_miss_ctx(int flow_ctx_id, struct flow_miss_ctx *ctx) +{ + return get_context_data_by_id(&flow_miss_ctx_md, flow_ctx_id, ctx); +} + /* * To avoid individual xrealloc calls for each new element, a 'curent_max' * is used to keep track of current allocated number of elements. Starts From patchwork Mon Jan 20 15:08:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226032 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Zpz4mPgz9sS9 for ; Tue, 21 Jan 2020 02:10:19 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 01B0C2263E; Mon, 20 Jan 2020 15:10:18 +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 bG5rplWVg8sa; Mon, 20 Jan 2020 15:10:11 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id D4A3E22650; Mon, 20 Jan 2020 15:09:11 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id BDC10C1D8D; Mon, 20 Jan 2020 15:09:11 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 44AF4C0176 for ; Mon, 20 Jan 2020 15:08:58 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 309798750A for ; Mon, 20 Jan 2020 15:08:58 +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 76JH0EfKDoOR for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by hemlock.osuosl.org (Postfix) with ESMTP id 1714C873BC for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:44 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hV3013116; Mon, 20 Jan 2020 17:08:44 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:18 +0000 Message-Id: <20200120150830.16262-14-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 13/25] netdev-offload: Add HW miss packet state recover API 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: Oz Shlomo When the HW offload involves multiple flows, like in tunnel decap path, it is possible that not all flows in the path are offloaded, resulting in partial processing in HW. In order to proceed the rest of the processing in SW, the packet has to be recovered to its state as if it was processed in SW from the beginning of the path. Add API for that. Co-authored-by: Ophir Munk Co-authored-by: Eli Britstein Signed-off-by: Oz Shlomo Reviewed-by: Roni Bar Yanai Signed-off-by: Eli Britstein --- lib/netdev-offload-provider.h | 6 ++++++ lib/netdev-offload.c | 14 ++++++++++++++ lib/netdev-offload.h | 3 +++ 3 files changed, 23 insertions(+) diff --git a/lib/netdev-offload-provider.h b/lib/netdev-offload-provider.h index 5a809c0cd..22de2247e 100644 --- a/lib/netdev-offload-provider.h +++ b/lib/netdev-offload-provider.h @@ -82,6 +82,12 @@ struct netdev_flow_api { int (*flow_del)(struct netdev *, const ovs_u128 *ufid, struct dpif_flow_stats *); + /* Recover the packet state (contents and data) for continued processing + * in software. + * Return 0 if successful, otherwise returns a positive errno value. */ + int (*hw_miss_packet_recover)(struct netdev *, uint32_t flow_miss_ctx_id, + struct dp_packet *); + /* Initializies the netdev flow api. * Return 0 if successful, otherwise returns a positive errno value. */ int (*init_flow_api)(struct netdev *); diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c index 3469b71c6..7c24ecb75 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -255,6 +255,20 @@ netdev_flow_put(struct netdev *netdev, struct match *match, : EOPNOTSUPP; } +int +netdev_hw_miss_packet_recover(struct netdev *netdev, + uint32_t flow_miss_ctx_id, + struct dp_packet *packet) +{ + const struct netdev_flow_api *flow_api = + ovsrcu_get(const struct netdev_flow_api *, &netdev->flow_api); + + return (flow_api && flow_api->hw_miss_packet_recover) + ? flow_api->hw_miss_packet_recover(netdev, flow_miss_ctx_id, + packet) + : EOPNOTSUPP; +} + int netdev_flow_get(struct netdev *netdev, struct match *match, struct nlattr **actions, const ovs_u128 *ufid, diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index 25ff308df..3b5e636f0 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -87,6 +87,9 @@ bool netdev_flow_dump_next(struct netdev_flow_dump *, struct match *, int netdev_flow_put(struct netdev *, struct match *, struct nlattr *actions, size_t actions_len, const ovs_u128 *, struct offload_info *, struct dpif_flow_stats *); +int netdev_hw_miss_packet_recover(struct netdev *netdev, + uint32_t flow_miss_ctx_id, + struct dp_packet *packet); int netdev_flow_get(struct netdev *, struct match *, struct nlattr **actions, const ovs_u128 *, struct dpif_flow_stats *, struct dpif_flow_attrs *, struct ofpbuf *wbuffer); From patchwork Mon Jan 20 15:08:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226012 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481ZnV1SBRz9sRk for ; Tue, 21 Jan 2020 02:08:59 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id E9290826D3; Mon, 20 Jan 2020 15:08:57 +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 rljBqCY010jJ; Mon, 20 Jan 2020 15:08:53 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 82E28853F8; Mon, 20 Jan 2020 15:08:53 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 579D2C0176; Mon, 20 Jan 2020 15:08:53 +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 89328C0174 for ; Mon, 20 Jan 2020 15:08:52 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 6FBDA8140D for ; Mon, 20 Jan 2020 15:08:52 +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 GfpmgA7SpqV3 for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by whitealder.osuosl.org (Postfix) with ESMTP id 13C188583C for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:45 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hV4013116; Mon, 20 Jan 2020 17:08:44 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:19 +0000 Message-Id: <20200120150830.16262-15-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 14/25] netdev-offload-dpdk: Implement HW miss packet recover for vport 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" A miss in virtual port offloads means the flow with tnl_pop was offloaded, but not the following one. Recover the state and continue with SW processing. Co-authored-by: Eli Britstein Signed-off-by: Ophir Munk Reviewed-by: Roni Bar Yanai Signed-off-by: Eli Britstein --- lib/netdev-offload-dpdk.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index fc890b915..c4d77c115 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -385,7 +385,6 @@ put_flow_miss_ctx_id(uint32_t flow_ctx_id) put_context_data_by_id(&flow_miss_ctx_md, flow_ctx_id); } -OVS_UNUSED static int find_flow_miss_ctx(int flow_ctx_id, struct flow_miss_ctx *ctx) { @@ -1769,10 +1768,43 @@ out: return ret; } +static int +netdev_offload_dpdk_hw_miss_packet_recover(struct netdev *netdev, + uint32_t flow_miss_ctx_id, + struct dp_packet *packet) +{ + struct flow_miss_ctx flow_miss_ctx; + struct netdev *vport_netdev; + + if (find_flow_miss_ctx(flow_miss_ctx_id, &flow_miss_ctx)) { + return -1; + } + + if (flow_miss_ctx.vport != ODPP_NONE) { + vport_netdev = netdev_ports_get(flow_miss_ctx.vport, + netdev->dpif_type); + if (vport_netdev) { + pkt_metadata_init(&packet->md, flow_miss_ctx.vport); + if (vport_netdev->netdev_class->pop_header) { + vport_netdev->netdev_class->pop_header(packet); + dp_packet_reset_offload(packet); + packet->md.in_port.odp_port = flow_miss_ctx.vport; + } else { + VLOG_ERR("vport nedtdev=%s with no pop_header method", + netdev_get_name(vport_netdev)); + } + netdev_close(vport_netdev); + } + } + + return 0; +} + const struct netdev_flow_api netdev_offload_dpdk = { .type = "dpdk_flow_api", .flow_put = netdev_offload_dpdk_flow_put, .flow_del = netdev_offload_dpdk_flow_del, .init_flow_api = netdev_offload_dpdk_init_flow_api, .flow_get = netdev_offload_dpdk_flow_get, + .hw_miss_packet_recover = netdev_offload_dpdk_hw_miss_packet_recover, }; From patchwork Mon Jan 20 15:08:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226016 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Znl4tVNz9sRk for ; Tue, 21 Jan 2020 02:09:15 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 191F586372; Mon, 20 Jan 2020 15:09:14 +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 Wp2Qc5sMA0gx; Mon, 20 Jan 2020 15:09:08 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 28BC185C98; Mon, 20 Jan 2020 15:09:02 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 08E29C1D88; Mon, 20 Jan 2020 15:09:02 +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 61F06C0174 for ; Mon, 20 Jan 2020 15:08:56 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 5D7E4811EA for ; Mon, 20 Jan 2020 15:08:56 +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 3Jvl4EH5xbbE for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by whitealder.osuosl.org (Postfix) with ESMTP id 1549785BCC for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:45 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hV5013116; Mon, 20 Jan 2020 17:08:45 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:20 +0000 Message-Id: <20200120150830.16262-16-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 15/25] dpif-netdev: Add HW miss packet state recover logic 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: Ophir Munk Mark can have the legacy meaning of flow ID, or the ID for a flow miss context, that might occur during multiple flows of HW offload. Use HW miss packet recover callback in case there is a mark, to recover potential state. Co-authored-by: Eli Britstein Signed-off-by: Ophir Munk Reviewed-by: Roni Bar Yanai Signed-off-by: Eli Britstein --- lib/dpif-netdev.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index bd937f300..5618af0a9 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -6528,6 +6528,10 @@ smc_lookup_batch(struct dp_netdev_pmd_thread *pmd, pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_SMC_HIT, n_smc_hit); } +static struct tx_port * +pmd_send_port_cache_lookup(const struct dp_netdev_pmd_thread *pmd, + odp_port_t port_no); + /* Try to process all ('cnt') the 'packets' using only the datapath flow cache * 'pmd->flow_cache'. If a flow is not found for a packet 'packets[i]', the * miniflow is copied into 'keys' and the packet pointer is moved at the @@ -6593,9 +6597,18 @@ dfc_processing(struct dp_netdev_pmd_thread *pmd, if ((*recirc_depth_get() == 0) && dp_packet_has_flow_mark(packet, &mark)) { - flow = mark_to_flow_find(pmd, mark); + /* Restore the packet if it was interrupted in the middle + * of HW offload processing. + */ + struct tx_port *p; + int hw_ret; + + tcp_flags = parse_tcp_flags(packet); + p = pmd_send_port_cache_lookup(pmd, port_no); + hw_ret = p ? netdev_hw_miss_packet_recover(p->port->netdev, mark, + packet) : -1; + flow = hw_ret == -1 ? mark_to_flow_find(pmd, mark) : NULL; if (OVS_LIKELY(flow)) { - tcp_flags = parse_tcp_flags(packet); if (OVS_LIKELY(batch_enable)) { dp_netdev_queue_batches(packet, flow, tcp_flags, batches, n_batches); From patchwork Mon Jan 20 15:08:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226014 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Zng2Wygz9sRk for ; Tue, 21 Jan 2020 02:09:11 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 8BEA12050A; Mon, 20 Jan 2020 15:09: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 b11mftHr0Vfp; Mon, 20 Jan 2020 15:09:02 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id D0DA420466; Mon, 20 Jan 2020 15:08:57 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B3AF3C1D88; Mon, 20 Jan 2020 15:08:57 +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 05700C0176 for ; Mon, 20 Jan 2020 15:08:55 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 01D012045D for ; Mon, 20 Jan 2020 15:08:55 +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 C1cdjHfCSyht for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by silver.osuosl.org (Postfix) with ESMTP id 150601FEED for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:45 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hV6013116; Mon, 20 Jan 2020 17:08:45 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:21 +0000 Message-Id: <20200120150830.16262-17-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 16/25] netdev-offload-dpdk: Refactor disassociate ufid function 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" Find the entry of UFID mappings and use it in the disassociate function, as a pre-step towards more release operations to be done with properties in the entry. Signed-off-by: Eli Britstein Reviewed-by: Roni Bar Yanai --- lib/netdev-offload-dpdk.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index c4d77c115..9fd95d775 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -109,22 +109,14 @@ ufid_to_rte_flow_associate(const ovs_u128 *ufid, } static inline void -ufid_to_rte_flow_disassociate(const ovs_u128 *ufid) +ufid_to_rte_flow_disassociate(struct ufid_to_rte_flow_data *data) { - size_t hash = hash_bytes(ufid, sizeof *ufid, 0); - struct ufid_to_rte_flow_data *data; - - CMAP_FOR_EACH_WITH_HASH (data, node, hash, &ufid_to_rte_flow) { - if (ovs_u128_equals(*ufid, data->ufid)) { - cmap_remove(&ufid_to_rte_flow, - CONST_CAST(struct cmap_node *, &data->node), hash); - ovsrcu_postpone(free, data); - return; - } - } + size_t hash; - VLOG_WARN("ufid "UUID_FMT" is not associated with an rte flow\n", - UUID_ARGS((struct uuid *) ufid)); + hash = hash_bytes(&data->ufid, sizeof data->ufid, 0); + cmap_remove(&ufid_to_rte_flow, + CONST_CAST(struct cmap_node *, &data->node), hash); + ovsrcu_postpone(free, data); } /* A generic data structure used for mapping data to id and id to data. The @@ -1647,11 +1639,18 @@ netdev_offload_dpdk_destroy_flow(struct netdev *netdev, const ovs_u128 *ufid, struct rte_flow *rte_flow) { + struct ufid_to_rte_flow_data *data; struct rte_flow_error error; int ret = netdev_dpdk_rte_flow_destroy(netdev, rte_flow, &error); if (ret == 0) { - ufid_to_rte_flow_disassociate(ufid); + data = ufid_to_rte_flow_data_find(ufid); + if (!data) { + VLOG_WARN("ufid "UUID_FMT" is not associated with an rte flow\n", + UUID_ARGS((struct uuid *) ufid)); + return -1; + } + ufid_to_rte_flow_disassociate(data); VLOG_DBG("%s: removed rte flow %p associated with ufid " UUID_FMT "\n", netdev_get_name(netdev), rte_flow, UUID_ARGS((struct uuid *)ufid)); From patchwork Mon Jan 20 15:08:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226033 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Zq12JYnz9sS9 for ; Tue, 21 Jan 2020 02:10:21 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 970CC864D2; Mon, 20 Jan 2020 15:10:19 +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 ZkJI1HU8dgLx; Mon, 20 Jan 2020 15:10:11 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 13B5F864F6; Mon, 20 Jan 2020 15:09:16 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id EDD56C1D8D; Mon, 20 Jan 2020 15:09:15 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 49B76C0174 for ; Mon, 20 Jan 2020 15:09:03 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 3432F875CB for ; Mon, 20 Jan 2020 15:09:03 +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 6B2HN8qEVtuX for ; Mon, 20 Jan 2020 15:08:57 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by hemlock.osuosl.org (Postfix) with ESMTP id 185CA87404 for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:45 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hV7013116; Mon, 20 Jan 2020 17:08:45 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:22 +0000 Message-Id: <20200120150830.16262-18-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 17/25] netdev-offload-dpdk: Support tunnel pop action 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" Support tunnel pop action with marking the packet with a flow miss context ID, and jump to the vport table. Co-authored-by: Eli Britstein Signed-off-by: Ophir Munk Signed-off-by: Eli Britstein Reviewed-by: Roni Bar Yanai --- Documentation/howto/dpdk.rst | 1 + NEWS | 2 +- lib/netdev-offload-dpdk.c | 92 +++++++++++++++++++++++++++++++++++++++----- 3 files changed, 84 insertions(+), 11 deletions(-) diff --git a/Documentation/howto/dpdk.rst b/Documentation/howto/dpdk.rst index d1f8685f2..ea00b4a94 100644 --- a/Documentation/howto/dpdk.rst +++ b/Documentation/howto/dpdk.rst @@ -396,6 +396,7 @@ Supported actions for hardware offload are: - Modification of IPv4 (mod_nw_src/mod_nw_dst/mod_nw_ttl). - Modification of TCP/UDP (mod_tp_src/mod_tp_dst). - Clone/output (tnl_push and output) for encapsulating over a tunnel. +- Tunnel pop, for changing from PF port to vport. Further Reading --------------- diff --git a/NEWS b/NEWS index c9b6b62d6..d7f9a1e18 100644 --- a/NEWS +++ b/NEWS @@ -29,7 +29,7 @@ Post-v2.12.0 releases. * Add support for DPDK 19.11. * Add hardware offload support for output, drop, set of MAC, IPv4, - TCP/UDP ports and tunnel push-output actions (experimental). + TCP/UDP ports and tunnel push-output/pop actions (experimental). * Add experimental support for TSO. * Add hardware offload support for matching IPv6 protocol. - RSTP: diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 9fd95d775..4611caa8f 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -57,12 +57,18 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(100, 5); */ static struct cmap ufid_to_rte_flow = CMAP_INITIALIZER; +struct act_resources { + uint32_t next_table_id; + uint32_t flow_miss_ctx_id; +}; + struct ufid_to_rte_flow_data { struct cmap_node node; ovs_u128 ufid; struct rte_flow *rte_flow; bool actions_offloaded; struct dpif_flow_stats stats; + struct act_resources act_resources; }; /* Find rte_flow with @ufid. */ @@ -83,7 +89,8 @@ ufid_to_rte_flow_data_find(const ovs_u128 *ufid) static inline void ufid_to_rte_flow_associate(const ovs_u128 *ufid, - struct rte_flow *rte_flow, bool actions_offloaded) + struct rte_flow *rte_flow, bool actions_offloaded, + struct act_resources *act_resources) { size_t hash = hash_bytes(ufid, sizeof *ufid, 0); struct ufid_to_rte_flow_data *data = xzalloc(sizeof *data); @@ -103,6 +110,7 @@ ufid_to_rte_flow_associate(const ovs_u128 *ufid, data->ufid = *ufid; data->rte_flow = rte_flow; data->actions_offloaded = actions_offloaded; + memcpy(&data->act_resources, act_resources, sizeof data->act_resources); cmap_insert(&ufid_to_rte_flow, CONST_CAST(struct cmap_node *, &data->node), hash); @@ -309,7 +317,6 @@ static struct context_metadata table_id_md = { .data_size = sizeof(struct table_id_data), }; -OVS_UNUSED static int get_table_id(odp_port_t vport, uint32_t *table_id) { @@ -327,7 +334,6 @@ get_table_id(odp_port_t vport, uint32_t *table_id) table_id); } -OVS_UNUSED static void put_table_id(uint32_t table_id) { @@ -357,7 +363,6 @@ static struct context_metadata flow_miss_ctx_md = { .data_size = sizeof(struct flow_miss_ctx), }; -OVS_UNUSED static int get_flow_miss_ctx_id(struct flow_miss_ctx *flow_ctx_data, uint32_t *miss_ctx_id) @@ -370,7 +375,6 @@ get_flow_miss_ctx_id(struct flow_miss_ctx *flow_ctx_data, miss_ctx_id); } -OVS_UNUSED static void put_flow_miss_ctx_id(uint32_t flow_ctx_id) { @@ -383,6 +387,13 @@ find_flow_miss_ctx(int flow_ctx_id, struct flow_miss_ctx *ctx) return get_context_data_by_id(&flow_miss_ctx_md, flow_ctx_id, ctx); } +static void +put_action_resources(struct act_resources *act_resources) +{ + put_table_id(act_resources->next_table_id); + put_flow_miss_ctx_id(act_resources->flow_miss_ctx_id); +} + /* * To avoid individual xrealloc calls for each new element, a 'curent_max' * is used to keep track of current allocated number of elements. Starts @@ -755,6 +766,13 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) while (items && items->type != RTE_FLOW_ITEM_TYPE_END) { dump_flow_pattern(s, items++); } + } else if (actions->type == RTE_FLOW_ACTION_TYPE_JUMP) { + const struct rte_flow_action_jump *jump = actions->conf; + + ds_put_cstr(s, "rte flow jump action\n"); + if (jump) { + ds_put_format(s, " Jump: group=%"PRIu32"\n", jump->group); + } } else { ds_put_format(s, "unknown rte flow action (%d)\n", actions->type); } @@ -1519,11 +1537,52 @@ parse_clone_actions(struct netdev *netdev, return 0; } +static void +add_mark_action(struct flow_actions *actions, + uint32_t mark_id) +{ + struct rte_flow_action_mark *mark = xzalloc(sizeof *mark); + + mark->id = mark_id; + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_MARK, mark); +} + +static void +add_jump_action(struct flow_actions *actions, uint32_t group) +{ + struct rte_flow_action_jump *jump = xzalloc (sizeof *jump); + + jump->group = group; + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_JUMP, jump); +} + +static int +add_tnl_pop_action(struct flow_actions *actions, + const struct nlattr *nla, + struct act_resources *act_resources) +{ + struct flow_miss_ctx miss_ctx; + odp_port_t port; + + port = nl_attr_get_odp_port(nla); + miss_ctx.vport = port; + if (get_flow_miss_ctx_id(&miss_ctx, &act_resources->flow_miss_ctx_id)) { + return -1; + } + add_mark_action(actions, act_resources->flow_miss_ctx_id); + if (get_table_id(port, &act_resources->next_table_id)) { + return -1; + } + add_jump_action(actions, act_resources->next_table_id); + return 0; +} + static int parse_flow_actions(struct netdev *netdev, struct flow_actions *actions, struct nlattr *nl_actions, - size_t nl_actions_len) + size_t nl_actions_len, + struct act_resources *act_resources) { struct nlattr *nla; size_t left; @@ -1554,6 +1613,10 @@ parse_flow_actions(struct netdev *netdev, clone_actions_len)) { return -1; } + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_TUNNEL_POP) { + if (add_tnl_pop_action(actions, nla, act_resources)) { + return -1; + } } else { VLOG_DBG_RL(&rl, "Unsupported action type %d", nl_attr_type(nla)); return -1; @@ -1573,7 +1636,8 @@ static struct rte_flow * netdev_offload_dpdk_actions(struct netdev *netdev, struct flow_patterns *patterns, struct nlattr *nl_actions, - size_t actions_len) + size_t actions_len, + struct act_resources *act_resources) { const struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1 }; struct flow_actions actions = { .actions = NULL, .cnt = 0 }; @@ -1581,7 +1645,8 @@ netdev_offload_dpdk_actions(struct netdev *netdev, struct rte_flow_error error; int ret; - ret = parse_flow_actions(netdev, &actions, nl_actions, actions_len); + ret = parse_flow_actions(netdev, &actions, nl_actions, actions_len, + act_resources); if (ret) { goto out; } @@ -1601,17 +1666,20 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, struct offload_info *info) { struct flow_patterns patterns = { .items = NULL, .cnt = 0 }; + struct act_resources act_resources; bool actions_offloaded = true; struct rte_flow *flow; int ret = 0; + memset(&act_resources, 0, sizeof act_resources); + ret = parse_flow_match(&patterns, match); if (ret) { goto out; } flow = netdev_offload_dpdk_actions(netdev, &patterns, nl_actions, - actions_len); + actions_len, &act_resources); if (!flow) { /* If we failed to offload the rule actions fallback to MARK+RSS * actions. @@ -1625,11 +1693,14 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, ret = -1; goto out; } - ufid_to_rte_flow_associate(ufid, flow, actions_offloaded); + ufid_to_rte_flow_associate(ufid, flow, actions_offloaded, &act_resources); VLOG_DBG("%s: installed flow %p by ufid "UUID_FMT"\n", netdev_get_name(netdev), flow, UUID_ARGS((struct uuid *)ufid)); out: + if (ret) { + put_action_resources(&act_resources); + } free_flow_patterns(&patterns); return ret; } @@ -1650,6 +1721,7 @@ netdev_offload_dpdk_destroy_flow(struct netdev *netdev, UUID_ARGS((struct uuid *) ufid)); return -1; } + put_action_resources(&data->act_resources); ufid_to_rte_flow_disassociate(data); VLOG_DBG("%s: removed rte flow %p associated with ufid " UUID_FMT "\n", netdev_get_name(netdev), rte_flow, From patchwork Mon Jan 20 15:08:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226024 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481ZpK1rH7z9sRk for ; Tue, 21 Jan 2020 02:09:45 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 8D0A785CD0; Mon, 20 Jan 2020 15:09:43 +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 BzXi00F03CZN; Mon, 20 Jan 2020 15:09:38 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 07E8686123; Mon, 20 Jan 2020 15:09:09 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id D5D23C1D88; Mon, 20 Jan 2020 15:09:09 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 11AECC1D8B for ; Mon, 20 Jan 2020 15:08:57 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id ED3C5877B3 for ; Mon, 20 Jan 2020 15:08:56 +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 NDGX+5ofmiL3 for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by hemlock.osuosl.org (Postfix) with ESMTP id 1A416874E4 for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:45 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hV8013116; Mon, 20 Jan 2020 17:08:45 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:23 +0000 Message-Id: <20200120150830.16262-19-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 18/25] netdev-offload-dpdk: Implement flow dump create/destroy APIs 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" When offloading vports, we don't configure rte_flow on the vport itself, as it is not a physical dpdk port, but rather on uplinks. Implement those APIs as a pre-step to enable iterate over the ports. Signed-off-by: Eli Britstein Reviewed-by: Roni Bar Yanai --- lib/netdev-offload-dpdk.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 4611caa8f..669110e4a 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -1871,6 +1871,27 @@ netdev_offload_dpdk_hw_miss_packet_recover(struct netdev *netdev, return 0; } +static int +netdev_offload_dpdk_flow_dump_create(struct netdev *netdev, + struct netdev_flow_dump **dump_out) +{ + struct netdev_flow_dump *dump; + + dump = xzalloc(sizeof *dump); + dump->netdev = netdev_ref(netdev); + + *dump_out = dump; + return 0; +} + +static int +netdev_offload_dpdk_flow_dump_destroy(struct netdev_flow_dump *dump) +{ + netdev_close(dump->netdev); + free(dump); + return 0; +} + const struct netdev_flow_api netdev_offload_dpdk = { .type = "dpdk_flow_api", .flow_put = netdev_offload_dpdk_flow_put, @@ -1878,4 +1899,6 @@ const struct netdev_flow_api netdev_offload_dpdk = { .init_flow_api = netdev_offload_dpdk_init_flow_api, .flow_get = netdev_offload_dpdk_flow_get, .hw_miss_packet_recover = netdev_offload_dpdk_hw_miss_packet_recover, + .flow_dump_create = netdev_offload_dpdk_flow_dump_create, + .flow_dump_destroy = netdev_offload_dpdk_flow_dump_destroy, }; From patchwork Mon Jan 20 15:08:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226025 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481ZpL0MxXz9sS9 for ; Tue, 21 Jan 2020 02:09:46 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 8F05622EE7; Mon, 20 Jan 2020 15:09:44 +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 HSOBMqcWYUXO; Mon, 20 Jan 2020 15:09:36 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 45DE6204BA; Mon, 20 Jan 2020 15:09:05 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 241B1C1D8A; Mon, 20 Jan 2020 15:09:05 +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 D00A6C1D88 for ; Mon, 20 Jan 2020 15:08:56 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id BEA5C857B0 for ; Mon, 20 Jan 2020 15:08:56 +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 VsCipI5YgutV for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by fraxinus.osuosl.org (Postfix) with ESMTP id 13AC385775 for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:45 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hV9013116; Mon, 20 Jan 2020 17:08:45 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:24 +0000 Message-Id: <20200120150830.16262-20-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 19/25] netdev-dpdk: Introduce an API to query if a dpdk port is an uplink port 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: Ophir Munk When a vport is offloaded it has no explicit matching physical port so rte_flows are created on each of the uplink ports. Add an API to query if a DPDK port is an uplink port, as a pre-step towards applying vport flows on the uplink ports. Co-authored-by: Eli Britstein Signed-off-by: Ophir Munk Reviewed-by: Roni Bar Yanai Signed-off-by: Eli Britstein --- lib/netdev-dpdk.c | 21 +++++++++++++++++++++ lib/netdev-dpdk.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index b108cbd6b..52a3bc153 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -460,6 +460,7 @@ struct netdev_dpdk { }; struct dpdk_tx_queue *tx_q; struct rte_eth_link link; + bool is_uplink_port; /* True=uplink port, false=representor port. */ ); PADDED_MEMBERS_CACHELINE_MARKER(CACHE_LINE_SIZE, cacheline1, @@ -1139,6 +1140,8 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev) VLOG_WARN("Tx TSO offload is not supported on %s port " DPDK_PORT_ID_FMT, netdev_get_name(&dev->up), dev->port_id); } + dev->is_uplink_port = !(*info.dev_flags & RTE_ETH_DEV_REPRESENTOR) && + info.switch_info.domain_id != RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID; n_rxq = MIN(info.max_rx_queues, dev->up.n_rxq); n_txq = MIN(info.max_tx_queues, dev->up.n_txq); @@ -5295,6 +5298,24 @@ out: return ret; } +bool +netdev_dpdk_is_uplink_port(struct netdev *netdev) +{ + struct netdev_dpdk *dev; + bool ret = false; + + if (!is_dpdk_class(netdev->netdev_class)) { + goto out; + } + + dev = netdev_dpdk_cast(netdev); + ovs_mutex_lock(&dev->mutex); + ret = dev->is_uplink_port; + ovs_mutex_unlock(&dev->mutex); +out: + return ret; +} + bool netdev_dpdk_flow_api_supported(struct netdev *netdev) { diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h index 848346cb4..abda4a865 100644 --- a/lib/netdev-dpdk.h +++ b/lib/netdev-dpdk.h @@ -55,6 +55,8 @@ netdev_dpdk_rte_flow_query_count(struct netdev *netdev, struct rte_flow_error *error); int netdev_dpdk_get_port_id(struct netdev *netdev); +bool +netdev_dpdk_is_uplink_port(struct netdev *netdev); #else From patchwork Mon Jan 20 15:08:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226017 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Znq406nz9sRk for ; Tue, 21 Jan 2020 02:09:19 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 7AF2322846; Mon, 20 Jan 2020 15:09:17 +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 6NLMc1wIwp6k; Mon, 20 Jan 2020 15:09:11 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id B29E220471; Mon, 20 Jan 2020 15:08:58 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 83F09C1D89; Mon, 20 Jan 2020 15:08:58 +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 2E747C0174 for ; Mon, 20 Jan 2020 15:08:55 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 17D971FEED for ; Mon, 20 Jan 2020 15:08:55 +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 7OeEcuQJ1whT for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by silver.osuosl.org (Postfix) with ESMTP id 17B412044B for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:45 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hVA013116; Mon, 20 Jan 2020 17:08:45 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:25 +0000 Message-Id: <20200120150830.16262-21-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 20/25] netdev-dpdk: Getter function for dpdk devargs API 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" When a vport is offloaded it has no explicit matching physical port so rte_flows are created on each of the uplink ports. Those ports should be kept for later deletion of the flow. While ODP number or dpdk port id may be changed between adding and removing the flow, devargs is a unique identifier. Introduce a getter function to get it. Signed-off-by: Eli Britstein Reviewed-by: Roni Bar Yanai --- lib/netdev-dpdk.c | 18 ++++++++++++++++++ lib/netdev-dpdk.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 52a3bc153..c094a33a5 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -5316,6 +5316,24 @@ out: return ret; } +const char * +netdev_dpdk_get_port_devargs(struct netdev *netdev) +{ + const char *devargs = NULL; + struct netdev_dpdk *dev; + + if (!is_dpdk_class(netdev->netdev_class)) { + goto out; + } + + dev = netdev_dpdk_cast(netdev); + ovs_mutex_lock(&dev->mutex); + devargs = dev->devargs; + ovs_mutex_unlock(&dev->mutex); +out: + return devargs; +} + bool netdev_dpdk_flow_api_supported(struct netdev *netdev) { diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h index abda4a865..3deadafff 100644 --- a/lib/netdev-dpdk.h +++ b/lib/netdev-dpdk.h @@ -57,6 +57,8 @@ int netdev_dpdk_get_port_id(struct netdev *netdev); bool netdev_dpdk_is_uplink_port(struct netdev *netdev); +const char * +netdev_dpdk_get_port_devargs(struct netdev *netdev); #else From patchwork Mon Jan 20 15:08:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226027 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481ZpZ2gKkz9sRk for ; Tue, 21 Jan 2020 02:09:58 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 9DE7D204F0; Mon, 20 Jan 2020 15:09:56 +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 C3erll6AFH8T; Mon, 20 Jan 2020 15:09:51 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id E4D01204E8; Mon, 20 Jan 2020 15:09:07 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id C25CAC1D89; Mon, 20 Jan 2020 15:09:07 +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 E20D6C1D89 for ; Mon, 20 Jan 2020 15:08:56 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id CE9DF857D8 for ; Mon, 20 Jan 2020 15:08:56 +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 rMDq-H45N41f for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by fraxinus.osuosl.org (Postfix) with ESMTP id 14BDC857A4 for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:45 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hVB013116; Mon, 20 Jan 2020 17:08:45 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:26 +0000 Message-Id: <20200120150830.16262-22-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 21/25] netdev-dpdk: Introduce get netdev by devargs function 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" When a vport flow is removed, we need to get the netdev struct from the devargs we kept in the offload event, in order to remove the rules. Introduce a function to lookup a netdev by provided devargs. Signed-off-by: Eli Britstein Reviewed-by: Roni Bar Yanai --- lib/netdev-dpdk.c | 23 +++++++++++++++++++++++ lib/netdev-dpdk.h | 2 ++ 2 files changed, 25 insertions(+) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index c094a33a5..f2e737e30 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -5334,6 +5334,29 @@ out: return devargs; } +struct netdev * +netdev_dpdk_get_netdev_by_devargs(const char *devargs) +{ + struct netdev *netdev = NULL; + struct netdev_dpdk *dev; + dpdk_port_t port_id; + + ovs_mutex_lock(&dpdk_mutex); + port_id = netdev_dpdk_get_port_by_devargs(devargs); + if (!rte_eth_dev_is_valid_port(port_id)) { + goto out; + } + dev = netdev_dpdk_lookup_by_port_id(port_id); + ovs_mutex_lock(&dev->mutex); + netdev = &dev->up; + netdev_ref(netdev); + ovs_mutex_unlock(&dev->mutex); + +out: + ovs_mutex_unlock(&dpdk_mutex); + return netdev; +} + bool netdev_dpdk_flow_api_supported(struct netdev *netdev) { diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h index 3deadafff..94e08e516 100644 --- a/lib/netdev-dpdk.h +++ b/lib/netdev-dpdk.h @@ -59,6 +59,8 @@ bool netdev_dpdk_is_uplink_port(struct netdev *netdev); const char * netdev_dpdk_get_port_devargs(struct netdev *netdev); +struct netdev * +netdev_dpdk_get_netdev_by_devargs(const char *devargs); #else From patchwork Mon Jan 20 15:08:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226035 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Zq70H4dz9sS9 for ; Tue, 21 Jan 2020 02:10:26 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 48DD98627E; Mon, 20 Jan 2020 15:10:25 +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 PYAyzdf1pOt5; Mon, 20 Jan 2020 15:10:16 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id BA83B86651; Mon, 20 Jan 2020 15:09:16 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id A5556C1D8E; Mon, 20 Jan 2020 15:09:16 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 49DA7C0176 for ; Mon, 20 Jan 2020 15:09:03 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 366CC87884 for ; Mon, 20 Jan 2020 15:09:03 +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 jC0k5+vi62vV for ; Mon, 20 Jan 2020 15:08:57 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by hemlock.osuosl.org (Postfix) with ESMTP id 2046D875B3 for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:45 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hVC013116; Mon, 20 Jan 2020 17:08:45 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:27 +0000 Message-Id: <20200120150830.16262-23-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 22/25] netdev-dpdk-offload: Infrastructure for multiple rte_flows per UFID 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: Ophir Munk When offloading a "dpdk" port, a single rte_flow is created and associated with the OVS flow UFID. For a vport (for example "vxlan"), multiple rte_flows (per uplink port) are created and should be associated. Introduce an infrastructure for that. Co-authored-by: Eli Britstein Signed-off-by: Ophir Munk Reviewed-by: Roni Bar Yanai Signed-off-by: Eli Britstein --- lib/netdev-offload-dpdk.c | 226 +++++++++++++++++++++++++++++++++------------- 1 file changed, 163 insertions(+), 63 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 669110e4a..0bea84b39 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -62,16 +62,62 @@ struct act_resources { uint32_t flow_miss_ctx_id; }; +struct flow_item { + const char *devargs; + struct rte_flow *rte_flow; +}; + +struct flows_handle { + struct flow_item *items; + int cnt; + int current_max; +}; + struct ufid_to_rte_flow_data { struct cmap_node node; ovs_u128 ufid; - struct rte_flow *rte_flow; + struct flows_handle flows; bool actions_offloaded; struct dpif_flow_stats stats; struct act_resources act_resources; }; -/* Find rte_flow with @ufid. */ +static void +free_flow_handle(struct flows_handle *flows) +{ + int i; + + for (i = 0; i < flows->cnt; i++) { + if (flows->items[i].devargs) { + free(CONST_CAST(void *, flows->items[i].devargs)); + } + } + free(flows->items); + flows->items = NULL; + flows->cnt = 0; +} + +static void +add_flow_item(struct flows_handle *flows, + struct flow_item *item) +{ + int cnt = flows->cnt; + + if (cnt == 0) { + flows->current_max = 1; + flows->items = xcalloc(flows->current_max, sizeof *flows->items); + } else if (cnt == flows->current_max) { + flows->current_max *= 2; + flows->items = xrealloc(flows->items, flows->current_max * + sizeof *flows->items); + } + + flows->items[cnt].devargs = nullable_xstrdup(item->devargs); + flows->items[cnt].rte_flow = item->rte_flow; + flows->cnt++; +} + +/* Find rte_flow_data with @ufid. */ static struct ufid_to_rte_flow_data * ufid_to_rte_flow_data_find(const ovs_u128 *ufid) { @@ -89,7 +135,7 @@ ufid_to_rte_flow_data_find(const ovs_u128 *ufid) static inline void ufid_to_rte_flow_associate(const ovs_u128 *ufid, - struct rte_flow *rte_flow, bool actions_offloaded, + struct flows_handle *flows, bool actions_offloaded, struct act_resources *act_resources) { size_t hash = hash_bytes(ufid, sizeof *ufid, 0); @@ -104,12 +150,12 @@ ufid_to_rte_flow_associate(const ovs_u128 *ufid, */ data_prev = ufid_to_rte_flow_data_find(ufid); if (data_prev) { - ovs_assert(data_prev->rte_flow == NULL); + ovs_assert(data_prev->flows.cnt == 0); } data->ufid = *ufid; - data->rte_flow = rte_flow; data->actions_offloaded = actions_offloaded; + memcpy(&data->flows, flows, sizeof data->flows); memcpy(&data->act_resources, act_resources, sizeof data->act_resources); cmap_insert(&ufid_to_rte_flow, @@ -796,23 +842,25 @@ dump_flow(struct ds *s, return s; } -static struct rte_flow * +static int netdev_offload_dpdk_flow_create(struct netdev *netdev, const struct rte_flow_attr *attr, const struct rte_flow_item *items, const struct rte_flow_action *actions, - struct rte_flow_error *error) + struct rte_flow_error *error, + struct flow_item *fi) { - struct rte_flow *flow; struct ds s; - flow = netdev_dpdk_rte_flow_create(netdev, attr, items, actions, error); - if (flow) { + fi->rte_flow = netdev_dpdk_rte_flow_create(netdev, attr, items, actions, + error); + if (fi->rte_flow) { if (!VLOG_DROP_DBG(&rl)) { ds_init(&s); dump_flow(&s, attr, items, actions); VLOG_DBG_RL(&rl, "%s: rte_flow 0x%"PRIxPTR" created:\n%s", - netdev_get_name(netdev), (intptr_t) flow, ds_cstr(&s)); + netdev_get_name(netdev), (intptr_t) fi->rte_flow, + ds_cstr(&s)); ds_destroy(&s); } } else { @@ -830,7 +878,7 @@ netdev_offload_dpdk_flow_create(struct netdev *netdev, ds_destroy(&s); } } - return flow; + return fi->rte_flow ? 0 : -1; } static void @@ -1217,6 +1265,7 @@ netdev_offload_dpdk_mark_rss(struct flow_patterns *patterns, uint32_t flow_mark) { struct flow_actions actions = { .actions = NULL, .cnt = 0 }; + struct flow_item flow_item = { .devargs = NULL }; const struct rte_flow_attr flow_attr = { .group = 0, .priority = 0, @@ -1224,15 +1273,14 @@ netdev_offload_dpdk_mark_rss(struct flow_patterns *patterns, .egress = 0 }; struct rte_flow_error error; - struct rte_flow *flow; add_flow_mark_rss_actions(&actions, flow_mark, netdev); - flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items, - actions.actions, &error); + netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items, + actions.actions, &error, &flow_item); free_flow_actions(&actions); - return flow; + return flow_item.rte_flow; } static void @@ -1632,16 +1680,16 @@ parse_flow_actions(struct netdev *netdev, return 0; } -static struct rte_flow * +static int netdev_offload_dpdk_actions(struct netdev *netdev, struct flow_patterns *patterns, struct nlattr *nl_actions, size_t actions_len, - struct act_resources *act_resources) + struct act_resources *act_resources, + struct flow_item *fi) { const struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1 }; struct flow_actions actions = { .actions = NULL, .cnt = 0 }; - struct rte_flow *flow = NULL; struct rte_flow_error error; int ret; @@ -1650,11 +1698,11 @@ netdev_offload_dpdk_actions(struct netdev *netdev, if (ret) { goto out; } - flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items, - actions.actions, &error); + ret = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items, + actions.actions, &error, fi); out: free_flow_actions(&actions); - return flow; + return ret; } static int @@ -1666,9 +1714,10 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, struct offload_info *info) { struct flow_patterns patterns = { .items = NULL, .cnt = 0 }; + struct flows_handle flows = { .items = NULL, .cnt = 0 }; + struct flow_item flow_item = { .devargs = NULL }; struct act_resources act_resources; bool actions_offloaded = true; - struct rte_flow *flow; int ret = 0; memset(&act_resources, 0, sizeof act_resources); @@ -1678,24 +1727,27 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, goto out; } - flow = netdev_offload_dpdk_actions(netdev, &patterns, nl_actions, - actions_len, &act_resources); - if (!flow) { + ret = netdev_offload_dpdk_actions(netdev, &patterns, nl_actions, + actions_len, &act_resources, &flow_item); + if (ret) { /* If we failed to offload the rule actions fallback to MARK+RSS * actions. */ - flow = netdev_offload_dpdk_mark_rss(&patterns, netdev, - info->flow_mark); + flow_item.rte_flow = netdev_offload_dpdk_mark_rss(&patterns, netdev, + info->flow_mark); + ret = flow_item.rte_flow ? 0 : -1; actions_offloaded = false; } - if (!flow) { - ret = -1; + if (ret) { goto out; } - ufid_to_rte_flow_associate(ufid, flow, actions_offloaded, &act_resources); + add_flow_item(&flows, &flow_item); + ufid_to_rte_flow_associate(ufid, &flows, actions_offloaded, + &act_resources); VLOG_DBG("%s: installed flow %p by ufid "UUID_FMT"\n", - netdev_get_name(netdev), flow, UUID_ARGS((struct uuid *)ufid)); + netdev_get_name(netdev), flow_item.rte_flow, + UUID_ARGS((struct uuid *)ufid)); out: if (ret) { @@ -1708,29 +1760,57 @@ out: static int netdev_offload_dpdk_destroy_flow(struct netdev *netdev, const ovs_u128 *ufid, - struct rte_flow *rte_flow) + struct flows_handle *flows) { struct ufid_to_rte_flow_data *data; struct rte_flow_error error; - int ret = netdev_dpdk_rte_flow_destroy(netdev, rte_flow, &error); + struct netdev *flow_netdev; + int ret; + int i; - if (ret == 0) { - data = ufid_to_rte_flow_data_find(ufid); - if (!data) { - VLOG_WARN("ufid "UUID_FMT" is not associated with an rte flow\n", - UUID_ARGS((struct uuid *) ufid)); - return -1; + for (i = 0; i < flows->cnt; i++) { + struct flow_item *fi = &flows->items[i]; + + if (fi->devargs) { + flow_netdev = netdev_dpdk_get_netdev_by_devargs(fi->devargs); + if (!flow_netdev) { + VLOG_DBG_RL(&rl, "%s: ufid "UUID_FMT": " + "could not find a netdev for devargs='%s'\n", + netdev_get_name(netdev), + UUID_ARGS((struct uuid *)ufid), fi->devargs); + continue; + } + } else { + flow_netdev = netdev; + netdev_ref(flow_netdev); } + ret = netdev_dpdk_rte_flow_destroy(flow_netdev, fi->rte_flow, &error); + if (!ret) { + VLOG_DBG("%s: removed rte flow %p associated with ufid " UUID_FMT + "\n", netdev_get_name(flow_netdev), fi->rte_flow, + UUID_ARGS((struct uuid *)ufid)); + netdev_close(flow_netdev); + } else { + VLOG_ERR("%s: Failed to destroy flow: %s (%u)\n", + netdev_get_name(flow_netdev), error.message, error.type); + netdev_close(flow_netdev); + goto out; + } + } + + data = ufid_to_rte_flow_data_find(ufid); + if (data) { put_action_resources(&data->act_resources); ufid_to_rte_flow_disassociate(data); - VLOG_DBG("%s: removed rte flow %p associated with ufid " UUID_FMT "\n", - netdev_get_name(netdev), rte_flow, - UUID_ARGS((struct uuid *)ufid)); + ret = 0; } else { - VLOG_ERR("%s: Failed to destroy flow: %s (%u)\n", - netdev_get_name(netdev), error.message, error.type); + VLOG_WARN("ufid "UUID_FMT" is not associated with rte flow(s)\n", + UUID_ARGS((struct uuid *) ufid)); + ret = -1; } +out: + free_flow_handle(flows); return ret; } @@ -1748,9 +1828,9 @@ netdev_offload_dpdk_flow_put(struct netdev *netdev, struct match *match, * Here destroy the old rte flow first before adding a new one. */ rte_flow_data = ufid_to_rte_flow_data_find(ufid); - if (rte_flow_data && rte_flow_data->rte_flow) { + if (rte_flow_data) { ret = netdev_offload_dpdk_destroy_flow(netdev, ufid, - rte_flow_data->rte_flow); + &rte_flow_data->flows); if (ret < 0) { return ret; } @@ -1770,7 +1850,7 @@ netdev_offload_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid, struct ufid_to_rte_flow_data *rte_flow_data; rte_flow_data = ufid_to_rte_flow_data_find(ufid); - if (!rte_flow_data || !rte_flow_data->rte_flow) { + if (!rte_flow_data) { return -1; } @@ -1778,7 +1858,7 @@ netdev_offload_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid, memset(stats, 0, sizeof *stats); } return netdev_offload_dpdk_destroy_flow(netdev, ufid, - rte_flow_data->rte_flow); + &rte_flow_data->flows); } static int @@ -1803,13 +1883,15 @@ netdev_offload_dpdk_flow_get(struct netdev *netdev, struct dpif_flow_attrs *attrs, struct ofpbuf *buf OVS_UNUSED) { - struct rte_flow_query_count query = { .reset = 1 }; struct ufid_to_rte_flow_data *rte_flow_data; + struct rte_flow_query_count query; struct rte_flow_error error; + struct netdev *flow_netdev; int ret = 0; + int i; rte_flow_data = ufid_to_rte_flow_data_find(ufid); - if (!rte_flow_data || !rte_flow_data->rte_flow) { + if (!rte_flow_data || rte_flow_data->flows.cnt == 0) { ret = -1; goto out; } @@ -1820,19 +1902,37 @@ netdev_offload_dpdk_flow_get(struct netdev *netdev, memset(stats, 0, sizeof *stats); goto out; } + attrs->dp_layer = "dpdk"; - ret = netdev_dpdk_rte_flow_query_count(netdev, rte_flow_data->rte_flow, - &query, &error); - if (ret) { - VLOG_DBG_RL(&rl, "%s: Failed to query ufid "UUID_FMT" flow: %p\n", - netdev_get_name(netdev), UUID_ARGS((struct uuid *) ufid), - rte_flow_data->rte_flow); - goto out; - } - rte_flow_data->stats.n_packets += (query.hits_set) ? query.hits : 0; - rte_flow_data->stats.n_bytes += (query.bytes_set) ? query.bytes : 0; - if (query.hits_set && query.hits) { - rte_flow_data->stats.used = time_msec(); + for (i = 0; i < rte_flow_data->flows.cnt; i++) { + struct flow_item *fi = &rte_flow_data->flows.items[i]; + + memset(&query, 0, sizeof query); + query.reset = 1; + if (rte_flow_data->flows.items[i].devargs) { + flow_netdev = netdev_dpdk_get_netdev_by_devargs(fi->devargs); + if (!flow_netdev) { + ret = -1; + goto out; + } + } else { + flow_netdev = netdev; + netdev_ref(flow_netdev); + } + ret = netdev_dpdk_rte_flow_query_count(flow_netdev, fi->rte_flow, + &query, &error); + if (ret) { + VLOG_DBG_RL(&rl, "%s: Failed to query ufid "UUID_FMT" flow: %p\n", + netdev_get_name(netdev), + UUID_ARGS((struct uuid *) ufid), fi->rte_flow); + goto out; + } + netdev_close(flow_netdev); + rte_flow_data->stats.n_packets += (query.hits_set) ? query.hits : 0; + rte_flow_data->stats.n_bytes += (query.bytes_set) ? query.bytes : 0; + if (query.hits_set && query.hits) { + rte_flow_data->stats.used = time_msec(); + } } memcpy(stats, &rte_flow_data->stats, sizeof *stats); out: From patchwork Mon Jan 20 15:08:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226026 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481ZpT1C68z9sRk for ; Tue, 21 Jan 2020 02:09:53 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id A7D2D22FF0; Mon, 20 Jan 2020 15:09:51 +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 CVa2OFXgbkjV; Mon, 20 Jan 2020 15:09:46 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 245AA2045A; Mon, 20 Jan 2020 15:09:07 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id E4490C1D88; Mon, 20 Jan 2020 15:09:06 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id EE3DFC0176 for ; Mon, 20 Jan 2020 15:08:56 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id E6EEF877B1 for ; Mon, 20 Jan 2020 15:08:56 +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 yo3V+XTGsxDZ for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by hemlock.osuosl.org (Postfix) with ESMTP id 1E2BF8750A for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:46 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hVD013116; Mon, 20 Jan 2020 17:08:45 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:28 +0000 Message-Id: <20200120150830.16262-24-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 23/25] netdev-dpdk-offload: Add vxlan pattern matching function 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" For VXLAN offload, matches should be done on outer header for tunnel properties as well as inner packet matches. Add a function for parsing VXLAN tunnel matches. Co-authored-by: Eli Britstein Signed-off-by: Ophir Munk Reviewed-by: Roni Bar Yanai Signed-off-by: Eli Britstein --- lib/netdev-offload-dpdk.c | 143 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 141 insertions(+), 2 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 0bea84b39..5e8ed33f7 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -959,7 +959,140 @@ free_flow_actions(struct flow_actions *actions) } static int -parse_flow_match(struct flow_patterns *patterns, +parse_tnl_ip_match(struct flow_patterns *patterns, + struct match *match, + uint8_t proto) +{ + struct flow *consumed_masks; + + consumed_masks = &match->wc.masks; + /* IP v4 */ + if (match->wc.masks.tunnel.ip_src || match->wc.masks.tunnel.ip_dst) { + struct rte_flow_item_ipv4 *spec, *mask; + + spec = xzalloc(sizeof *spec); + mask = xzalloc(sizeof *mask); + + spec->hdr.type_of_service = match->flow.tunnel.ip_tos; + spec->hdr.time_to_live = match->flow.tunnel.ip_ttl; + spec->hdr.next_proto_id = proto; + spec->hdr.src_addr = match->flow.tunnel.ip_src; + spec->hdr.dst_addr = match->flow.tunnel.ip_dst; + + mask->hdr.type_of_service = match->wc.masks.tunnel.ip_tos; + mask->hdr.time_to_live = match->wc.masks.tunnel.ip_ttl; + mask->hdr.next_proto_id = UINT8_MAX; + mask->hdr.src_addr = match->wc.masks.tunnel.ip_src; + mask->hdr.dst_addr = match->wc.masks.tunnel.ip_dst; + + consumed_masks->tunnel.ip_tos = 0; + consumed_masks->tunnel.ip_ttl = 0; + consumed_masks->tunnel.ip_src = 0; + consumed_masks->tunnel.ip_dst = 0; + + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_IPV4, spec, mask); + } else if (!is_all_zeros(&match->wc.masks.tunnel.ipv6_src, + sizeof(struct in6_addr)) || + !is_all_zeros(&match->wc.masks.tunnel.ipv6_dst, + sizeof(struct in6_addr))) { + /* IP v6 */ + struct rte_flow_item_ipv6 *spec, *mask; + + spec = xzalloc(sizeof *spec); + mask = xzalloc(sizeof *mask); + + spec->hdr.proto = proto; + spec->hdr.hop_limits = match->flow.tunnel.ip_ttl; + spec->hdr.vtc_flow = htonl((uint32_t)match->flow.tunnel.ip_tos << + RTE_IPV6_HDR_TC_SHIFT); + memcpy(spec->hdr.src_addr, &match->flow.tunnel.ipv6_src, + sizeof spec->hdr.src_addr); + memcpy(spec->hdr.dst_addr, &match->flow.tunnel.ipv6_dst, + sizeof spec->hdr.dst_addr); + + mask->hdr.proto = UINT8_MAX; + mask->hdr.hop_limits = match->wc.masks.tunnel.ip_ttl; + mask->hdr.vtc_flow = htonl((uint32_t)match->wc.masks.tunnel.ip_tos << + RTE_IPV6_HDR_TC_SHIFT); + memcpy(mask->hdr.src_addr, &match->wc.masks.tunnel.ipv6_src, + sizeof mask->hdr.src_addr); + memcpy(mask->hdr.dst_addr, &match->wc.masks.tunnel.ipv6_dst, + sizeof mask->hdr.dst_addr); + + consumed_masks->tunnel.ip_tos = 0; + consumed_masks->tunnel.ip_ttl = 0; + memset(&consumed_masks->tunnel.ipv6_src, 0, + sizeof consumed_masks->tunnel.ipv6_src); + memset(&consumed_masks->tunnel.ipv6_dst, 0, + sizeof consumed_masks->tunnel.ipv6_dst); + + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_IPV6, spec, mask); + } else { + VLOG_ERR_RL(&rl, "Tunnel L3 protocol is neither IPv4 nor IPv6"); + return -1; + } + + return 0; +} + +static void +parse_tnl_udp_match(struct flow_patterns *patterns, + struct match *match) +{ + struct flow *consumed_masks; + struct rte_flow_item_udp *spec, *mask; + + consumed_masks = &match->wc.masks; + + spec = xzalloc(sizeof *spec); + mask = xzalloc(sizeof *mask); + + spec->hdr.src_port = match->flow.tunnel.tp_src; + spec->hdr.dst_port = match->flow.tunnel.tp_dst; + + mask->hdr.src_port = match->wc.masks.tunnel.tp_src; + mask->hdr.dst_port = match->wc.masks.tunnel.tp_dst; + + consumed_masks->tunnel.tp_src = 0; + consumed_masks->tunnel.tp_dst = 0; + + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_UDP, spec, mask); +} + +static int +parse_vxlan_match(struct flow_patterns *patterns, + struct match *match) +{ + struct rte_flow_item_vxlan *vx_spec, *vx_mask; + struct flow *consumed_masks; + int ret; + + ret = parse_tnl_ip_match(patterns, match, IPPROTO_UDP); + if (ret) { + return -1; + } + parse_tnl_udp_match(patterns, match); + + consumed_masks = &match->wc.masks; + /* VXLAN */ + vx_spec = xzalloc(sizeof *vx_spec); + vx_mask = xzalloc(sizeof *vx_mask); + + put_unaligned_be32((ovs_be32 *)vx_spec->vni, + htonl(ntohll(match->flow.tunnel.tun_id) << 8)); + put_unaligned_be32((ovs_be32 *)vx_mask->vni, + htonl(ntohll(match->wc.masks.tunnel.tun_id) << 8)); + + consumed_masks->tunnel.tun_id = 0; + consumed_masks->tunnel.flags = 0; + + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_VXLAN, vx_spec, vx_mask); + return 0; +} + +static int +parse_flow_match(struct netdev *netdev, + struct flow_patterns *patterns, struct match *match) { uint8_t *next_proto_mask = NULL; @@ -969,6 +1102,12 @@ parse_flow_match(struct flow_patterns *patterns, consumed_masks = &match->wc.masks; + if (!strcmp(netdev_get_type(netdev), "vxlan") && + parse_vxlan_match(patterns, match)) { + ret = -1; + goto out; + } + memset(&consumed_masks->in_port, 0, sizeof consumed_masks->in_port); if (match->flow.recirc_id != 0) { ret = -1; @@ -1722,7 +1861,7 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, memset(&act_resources, 0, sizeof act_resources); - ret = parse_flow_match(&patterns, match); + ret = parse_flow_match(netdev, &patterns, match); if (ret) { goto out; } From patchwork Mon Jan 20 15:08:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226018 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Znt4PLTz9sRk for ; Tue, 21 Jan 2020 02:09:22 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 6A21E22902; Mon, 20 Jan 2020 15:09:20 +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 caFfFAGbottg; Mon, 20 Jan 2020 15:09:13 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 6C0FD20479; Mon, 20 Jan 2020 15:08:59 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 40C6BC1D88; Mon, 20 Jan 2020 15:08:59 +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 3CE06C0176 for ; Mon, 20 Jan 2020 15:08:55 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 2A21C2043E for ; Mon, 20 Jan 2020 15:08:55 +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 i5JZ1nndht0S for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by silver.osuosl.org (Postfix) with ESMTP id 236982044C for ; Mon, 20 Jan 2020 15:08:49 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:46 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hVE013116; Mon, 20 Jan 2020 17:08:46 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:29 +0000 Message-Id: <20200120150830.16262-25-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh , Eveline Raine Subject: [ovs-dev] [PATCH 24/25] netdev-dpdk: Add flow_api support for netdev vxlan vports 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: Ophir Munk Add the acceptance of vxlan devices to netdev_dpdk_flow_api_supported() API, to allow offloading of DPDK vxlan devices. Co-authored-by: Eveline Raine Co-authored-by: Eli Britstein Signed-off-by: Eveline Raine Signed-off-by: Ophir Munk Reviewed-by: Roni Bar Yanai Signed-off-by: Eli Britstein --- lib/netdev-dpdk.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index f2e737e30..45b665f45 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -5363,6 +5363,12 @@ netdev_dpdk_flow_api_supported(struct netdev *netdev) struct netdev_dpdk *dev; bool ret = false; + if (!strcmp(netdev_get_type(netdev), "vxlan") && + !strcmp(netdev_get_dpif_type(netdev), "netdev")) { + ret = true; + goto out; + } + if (!is_dpdk_class(netdev->netdev_class)) { goto out; } From patchwork Mon Jan 20 15:08:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eli Britstein X-Patchwork-Id: 1226036 X-Patchwork-Delegate: i.maximets@samsung.com 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=mellanox.com 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 481Zq80XYxz9sRk for ; Tue, 21 Jan 2020 02:10:28 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 2E3A887635; Mon, 20 Jan 2020 15:10:26 +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 E3dkFRIH2p68; Mon, 20 Jan 2020 15:10:19 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 9772A85C45; Mon, 20 Jan 2020 15:09:17 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 7A44EC1D8D; Mon, 20 Jan 2020 15:09:17 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from hemlock.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 6CDCAC1D89 for ; Mon, 20 Jan 2020 15:09:03 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 5924A875CB for ; Mon, 20 Jan 2020 15:09:03 +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 WMnHFIfKdymo for ; Mon, 20 Jan 2020 15:08:57 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by hemlock.osuosl.org (Postfix) with ESMTP id A8D0E875C2 for ; Mon, 20 Jan 2020 15:08:50 +0000 (UTC) Received: from Internal Mail-Server by MTLPINE1 (envelope-from elibr@mellanox.com) with ESMTPS (AES256-SHA encrypted); 20 Jan 2020 17:08:46 +0200 Received: from dev-r-vrt-215.mtr.labs.mlnx. (dev-r-vrt-215.mtr.labs.mlnx [10.212.215.1]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 00KF8hVF013116; Mon, 20 Jan 2020 17:08:46 +0200 From: Eli Britstein To: dev@openvswitch.org, Ilya Maximets Date: Mon, 20 Jan 2020 15:08:30 +0000 Message-Id: <20200120150830.16262-26-elibr@mellanox.com> X-Mailer: git-send-email 2.14.5 In-Reply-To: <20200120150830.16262-1-elibr@mellanox.com> References: <20200120150830.16262-1-elibr@mellanox.com> Cc: Simon Horman , Eli Britstein , Ameer Mahagneh Subject: [ovs-dev] [PATCH 25/25] netdev-offload-dpdk: Support offload for vxlan vport 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: Ophir Munk For virtual port (as "vxlan"), HW rules match tunnel properties (outer header) and inner packet fields, and with a decap action. The rules are placed on all uplinks as they are the potential for the origin of the traffic. Co-authored-by: Eli Britstein Signed-off-by: Ophir Munk Reviewed-by: Roni Bar Yanai Signed-off-by: Eli Britstein --- Documentation/howto/dpdk.rst | 1 + NEWS | 1 + lib/netdev-offload-dpdk.c | 122 ++++++++++++++++++++++++++++++++++++++----- 3 files changed, 110 insertions(+), 14 deletions(-) diff --git a/Documentation/howto/dpdk.rst b/Documentation/howto/dpdk.rst index ea00b4a94..c12941cb8 100644 --- a/Documentation/howto/dpdk.rst +++ b/Documentation/howto/dpdk.rst @@ -397,6 +397,7 @@ Supported actions for hardware offload are: - Modification of TCP/UDP (mod_tp_src/mod_tp_dst). - Clone/output (tnl_push and output) for encapsulating over a tunnel. - Tunnel pop, for changing from PF port to vport. +- Offloading VXLAN vport. Further Reading --------------- diff --git a/NEWS b/NEWS index d7f9a1e18..24366369e 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,7 @@ Post-v2.12.0 TCP/UDP ports and tunnel push-output/pop actions (experimental). * Add experimental support for TSO. * Add hardware offload support for matching IPv6 protocol. + * Add hardware offload support VXLAN vports. - RSTP: * The rstp_statistics column in Port table will only be updated every stats-update-interval configured in Open_vSwitch table. diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 5e8ed33f7..2fd840ed4 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -59,6 +59,7 @@ static struct cmap ufid_to_rte_flow = CMAP_INITIALIZER; struct act_resources { uint32_t next_table_id; + uint32_t self_table_id; uint32_t flow_miss_ctx_id; }; @@ -436,6 +437,7 @@ find_flow_miss_ctx(int flow_ctx_id, struct flow_miss_ctx *ctx) static void put_action_resources(struct act_resources *act_resources) { + put_table_id(act_resources->self_table_id); put_table_id(act_resources->next_table_id); put_flow_miss_ctx_id(act_resources->flow_miss_ctx_id); } @@ -819,6 +821,8 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) if (jump) { ds_put_format(s, " Jump: group=%"PRIu32"\n", jump->group); } + } else if (actions->type == RTE_FLOW_ACTION_TYPE_VXLAN_DECAP) { + ds_put_cstr(s, "rte flow vxlan-decap action\n"); } else { ds_put_format(s, "unknown rte flow action (%d)\n", actions->type); } @@ -1093,7 +1097,8 @@ parse_vxlan_match(struct flow_patterns *patterns, static int parse_flow_match(struct netdev *netdev, struct flow_patterns *patterns, - struct match *match) + struct match *match, + struct act_resources *act_resources) { uint8_t *next_proto_mask = NULL; struct flow *consumed_masks; @@ -1108,6 +1113,14 @@ parse_flow_match(struct netdev *netdev, goto out; } + if (netdev_vport_is_vport_class(netdev->netdev_class)) { + ret = get_table_id(match->flow.in_port.odp_port, + &act_resources->self_table_id); + if (ret) { + goto out; + } + } + memset(&consumed_masks->in_port, 0, sizeof consumed_masks->in_port); if (match->flow.recirc_id != 0) { ret = -1; @@ -1764,6 +1777,12 @@ add_tnl_pop_action(struct flow_actions *actions, return 0; } +static void +add_vxlan_decap_action(struct flow_actions *actions) +{ + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_VXLAN_DECAP, NULL); +} + static int parse_flow_actions(struct netdev *netdev, struct flow_actions *actions, @@ -1774,6 +1793,9 @@ parse_flow_actions(struct netdev *netdev, struct nlattr *nla; size_t left; + if (!strcmp(netdev_get_type(netdev), "vxlan")) { + add_vxlan_decap_action(actions); + } 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) { @@ -1781,6 +1803,8 @@ parse_flow_actions(struct netdev *netdev, return -1; } } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_DROP) { + free_flow_actions(actions); + add_count_action(actions); add_flow_action(actions, RTE_FLOW_ACTION_TYPE_DROP, NULL); } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_SET || nl_attr_type(nla) == OVS_ACTION_ATTR_SET_MASKED) { @@ -1819,16 +1843,67 @@ parse_flow_actions(struct netdev *netdev, return 0; } +static int +netdev_offload_dpdk_create_tnl_flows(struct netdev *netdev, + struct flow_patterns *patterns, + struct flow_actions *actions, + const ovs_u128 *ufid, + struct act_resources *act_resources, + struct flows_handle *flows) +{ + struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1 }; + struct flow_item flow_item = { .devargs = NULL }; + struct netdev_flow_dump **netdev_dumps; + struct rte_flow_error error; + int num_ports = 0; + int ret; + int i; + + netdev_dumps = netdev_ports_flow_dump_create(netdev->dpif_type, + &num_ports); + flow_attr.group = act_resources->self_table_id; + for (i = 0; i < num_ports; i++) { + if (!netdev_dpdk_is_uplink_port(netdev_dumps[i]->netdev)) { + continue; + } + ret = netdev_offload_dpdk_flow_create(netdev_dumps[i]->netdev, + &flow_attr, patterns->items, + actions->actions, &error, + &flow_item); + if (ret) { + continue; + } + flow_item.devargs = + netdev_dpdk_get_port_devargs(netdev_dumps[i]->netdev); + VLOG_DBG_RL(&rl, "%s: installed flow %p by ufid "UUID_FMT"\n", + netdev_get_name(netdev), flow_item.rte_flow, + UUID_ARGS((struct uuid *)ufid)); + add_flow_item(flows, &flow_item); + } + for (i = 0; i < num_ports; i++) { + int err = netdev_flow_dump_destroy(netdev_dumps[i]); + + if (err != 0 && err != EOPNOTSUPP) { + VLOG_ERR("failed dumping netdev: %s", ovs_strerror(err)); + } + } + + ret = flows->cnt > 0 ? 0 : -1; + return ret; +} + static int netdev_offload_dpdk_actions(struct netdev *netdev, struct flow_patterns *patterns, struct nlattr *nl_actions, size_t actions_len, + const ovs_u128 *ufid, struct act_resources *act_resources, - struct flow_item *fi) + struct flows_handle *flows) { const struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1 }; struct flow_actions actions = { .actions = NULL, .cnt = 0 }; + struct flow_item flow_item = { .devargs = NULL }; struct rte_flow_error error; int ret; @@ -1837,8 +1912,22 @@ netdev_offload_dpdk_actions(struct netdev *netdev, if (ret) { goto out; } - ret = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items, - actions.actions, &error, fi); + if (netdev_vport_is_vport_class(netdev->netdev_class)) { + ret = netdev_offload_dpdk_create_tnl_flows(netdev, patterns, &actions, + ufid, act_resources, flows); + } else { + ret = netdev_offload_dpdk_flow_create(netdev, &flow_attr, + patterns->items, + actions.actions, &error, + &flow_item); + if (ret) { + goto out; + } + VLOG_DBG_RL(&rl, "%s: installed flow %p by ufid "UUID_FMT"\n", + netdev_get_name(netdev), flow_item.rte_flow, + UUID_ARGS((struct uuid *)ufid)); + add_flow_item(flows, &flow_item); + } out: free_flow_actions(&actions); return ret; @@ -1857,36 +1946,41 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, struct flow_item flow_item = { .devargs = NULL }; struct act_resources act_resources; bool actions_offloaded = true; - int ret = 0; + int ret; memset(&act_resources, 0, sizeof act_resources); - ret = parse_flow_match(netdev, &patterns, match); + ret = parse_flow_match(netdev, &patterns, match, &act_resources); if (ret) { goto out; } ret = netdev_offload_dpdk_actions(netdev, &patterns, nl_actions, - actions_len, &act_resources, &flow_item); + actions_len, ufid, &act_resources, + &flows); if (ret) { /* If we failed to offload the rule actions fallback to MARK+RSS * actions. */ - flow_item.rte_flow = netdev_offload_dpdk_mark_rss(&patterns, netdev, - info->flow_mark); - ret = flow_item.rte_flow ? 0 : -1; actions_offloaded = false; + flow_item.rte_flow = act_resources.self_table_id == 0 ? + netdev_offload_dpdk_mark_rss(&patterns, netdev, info->flow_mark) : + NULL; + ret = flow_item.rte_flow ? 0 : -1; + if (ret) { + goto out; + } + VLOG_DBG_RL(&rl, "%s: installed flow %p by ufid "UUID_FMT"\n", + netdev_get_name(netdev), flow_item.rte_flow, + UUID_ARGS((struct uuid *)ufid)); + add_flow_item(&flows, &flow_item); } if (ret) { goto out; } - add_flow_item(&flows, &flow_item); ufid_to_rte_flow_associate(ufid, &flows, actions_offloaded, &act_resources); - VLOG_DBG("%s: installed flow %p by ufid "UUID_FMT"\n", - netdev_get_name(netdev), flow_item.rte_flow, - UUID_ARGS((struct uuid *)ufid)); out: if (ret) {