From patchwork Mon Dec 28 09:24:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420968 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qby5w6Fz9sVv for ; Tue, 29 Dec 2020 05:11:42 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 478AA872ED; Mon, 28 Dec 2020 18:11:41 +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 boU3Q79d6geo; Mon, 28 Dec 2020 18:11:36 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id C7C9E871AC; Mon, 28 Dec 2020 18:11:20 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id ACDD8C1EB6; Mon, 28 Dec 2020 18:11:20 +0000 (UTC) X-Original-To: ovs-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 6BFE7C0891 for ; Mon, 28 Dec 2020 09:26:12 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 6851986C71 for ; Mon, 28 Dec 2020 09:26:12 +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 YTR1fHI3foMb for ; Mon, 28 Dec 2020 09:26:11 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by whitealder.osuosl.org (Postfix) with ESMTP id 372B586C46 for ; Mon, 28 Dec 2020 09:26:11 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app07-12007 (RichMail) with SMTP id 2ee75fe9a48baf7-c334f; Mon, 28 Dec 2020 17:25:32 +0800 (CST) X-RM-TRANSID: 2ee75fe9a48baf7-c334f X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b832; Mon, 28 Dec 2020 17:25:31 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b832 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:19 -0800 Message-Id: <20201228092520.11807-2-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 01/62] netdev-offload-dpdk: Add offloading mechanism for VxLAN push 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: Translate VxLAN encap action(For DPDK, it's clone(tnl_push) action) into RTE_FLOW_ACTION_TYPE_RAW_ENCAP Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index f8c46bb..d7184c0 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -16,6 +16,8 @@ */ #include +#include +#include #include #include "cmap.h" @@ -26,6 +28,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); @@ -970,6 +974,140 @@ 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; + + VLOG_DBG_RL(&rl, "TIMO DBG: in add_vxlan_encap_action"); + 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, + const struct nlattr *clone_actions, + const size_t clone_actions_len, + struct offload_info *info) +{ + 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); + + VLOG_DBG_RL(&rl, "TIMO DBG: in parse_clone_action"); + + 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; + + 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; + + 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,info)) { + 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, @@ -998,6 +1136,15 @@ 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,info)) { + return -1; + } + } else { VLOG_DBG_RL(&rl, "Unsupported action type %d", nl_attr_type(nla)); return -1; From patchwork Mon Dec 28 09:24:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420975 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QcQ3c4Vz9sVv for ; Tue, 29 Dec 2020 05:12:06 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id EEA9887278; Mon, 28 Dec 2020 18:12: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 6ZZ7QlYjF-hF; Mon, 28 Dec 2020 18:12:00 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 95F0087267; Mon, 28 Dec 2020 18:11:29 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 65290C1E7E; Mon, 28 Dec 2020 18:11:29 +0000 (UTC) X-Original-To: ovs-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 6D5CFC0893 for ; Mon, 28 Dec 2020 09:26:18 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 5ACEB86C8C for ; Mon, 28 Dec 2020 09:26:18 +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 zJhfsGdOYbao for ; Mon, 28 Dec 2020 09:26:17 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by whitealder.osuosl.org (Postfix) with ESMTP id E1DF386C46 for ; Mon, 28 Dec 2020 09:26:12 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app07-12007 (RichMail) with SMTP id 2ee75fe9a48caf9-c3351; Mon, 28 Dec 2020 17:25:32 +0800 (CST) X-RM-TRANSID: 2ee75fe9a48caf9-c3351 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b835; Mon, 28 Dec 2020 17:25:32 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b835 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:20 -0800 Message-Id: <20201228092520.11807-3-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 02/62] configure.ac: Change version to 2.13.ofd 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: change compiled version Jira: #[Optional] 市场项目编号(名称):[Optional --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index a918698..1f23c9e 100644 --- a/configure.ac +++ b/configure.ac @@ -13,7 +13,7 @@ # limitations under the License. AC_PREREQ(2.63) -AC_INIT(openvswitch, 2.13.1, bugs@openvswitch.org) +AC_INIT(openvswitch, 2.13.ofd, bugs@openvswitch.org) AC_CONFIG_SRCDIR([datapath/datapath.c]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_AUX_DIR([build-aux]) From patchwork Mon Dec 28 09:24:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420965 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qbr2ksxz9sVv for ; Tue, 29 Dec 2020 05:11:36 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 8C7988720C; Mon, 28 Dec 2020 18:11:34 +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 L-1GAvxsdCnH; Mon, 28 Dec 2020 18:11:29 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id E240886DBB; Mon, 28 Dec 2020 18:10:44 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B8C3DC1833; Mon, 28 Dec 2020 18:10:44 +0000 (UTC) X-Original-To: ovs-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 E7DC2C1D9C for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id E07428709E for ; Mon, 28 Dec 2020 09:26:04 +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 uq-RD5XfqGiY for ; Mon, 28 Dec 2020 09:26:03 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by hemlock.osuosl.org (Postfix) with ESMTP id 59C5B870C1 for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app04-12004 (RichMail) with SMTP id 2ee45fe9a48c75c-c214c; Mon, 28 Dec 2020 17:25:32 +0800 (CST) X-RM-TRANSID: 2ee45fe9a48c75c-c214c X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b836; Mon, 28 Dec 2020 17:25:32 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b836 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:21 -0800 Message-Id: <20201228092520.11807-4-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 03/62] 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: 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. Jira: #[Optional] 市场项目编号(名称):[Optional --- 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 6f50942..1ff468b 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -96,7 +96,8 @@ struct netdev { /* Functions to control flow offloading. */ OVSRCU_TYPE(const struct netdev_flow_api *) flow_api; - struct netdev_hw_info hw_info; /* offload-capable netdev info */ + const char *dpif_type; /* Type of dpif this netdev belongs to. */ + struct netdev_hw_info hw_info; /* Offload-capable netdev info. */ }; static inline void diff --git a/lib/netdev.c b/lib/netdev.c index 8c44eee..e2d743f 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -1983,6 +1983,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 fdbe0e1..fb50730 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 Dec 28 09:24:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420956 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QbL5m29z9sWM for ; Tue, 29 Dec 2020 05:11:10 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 1168F86D24; Mon, 28 Dec 2020 18:11:08 +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 ihBsi87vNKWH; Mon, 28 Dec 2020 18:10:51 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 726E586D19; Mon, 28 Dec 2020 18:10:39 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id D8780C1DA2; Mon, 28 Dec 2020 18:10:38 +0000 (UTC) X-Original-To: ovs-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 25CAAC0891 for ; Mon, 28 Dec 2020 09:25:57 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 1E2CE86C46 for ; Mon, 28 Dec 2020 09:25: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 UtrXVPwcvwTG for ; Mon, 28 Dec 2020 09:25:55 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by whitealder.osuosl.org (Postfix) with ESMTP id A6DB086C4C for ; Mon, 28 Dec 2020 09:25:54 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app06-12006 (RichMail) with SMTP id 2ee65fe9a48e5b3-c1c4a; Mon, 28 Dec 2020 17:25:34 +0800 (CST) X-RM-TRANSID: 2ee65fe9a48e5b3-c1c4a X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b83a; Mon, 28 Dec 2020 17:25:34 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b83a From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:22 -0800 Message-Id: <20201228092520.11807-5-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 04/62] dpif-netdev: change offload netdev type 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: 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. Jira: #[Optional] 市场项目编号(名称):[Optional --- lib/dpif-netdev.c | 10 +++++---- lib/dpif-netlink.c | 23 ++++++++++--------- lib/dpif.c | 21 ++++++++++-------- lib/netdev-offload-tc.c | 3 ++- lib/netdev-offload.c | 51 +++++++++++++++++++++---------------------- lib/netdev-offload.h | 16 ++++++-------- ofproto/ofproto-dpif-upcall.c | 5 ++--- 7 files changed, 67 insertions(+), 62 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index e456cc9..12ee8bd 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2275,10 +2275,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(dpif_type(pmd->dp->dpif)); 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; @@ -2291,7 +2292,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. */ @@ -2401,6 +2402,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) 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(dpif_type(pmd->dp->dpif)); bool modification = offload->op == DP_NETDEV_FLOW_OFFLOAD_OP_MOD; struct offload_info info; struct netdev *port; @@ -2438,7 +2440,7 @@ 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; diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 6d9427b..57ad657 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); } @@ -1994,6 +1995,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; @@ -2008,8 +2010,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; } @@ -2034,8 +2036,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; @@ -2057,7 +2059,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; } @@ -2070,7 +2072,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; @@ -2086,7 +2088,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 @@ -2190,8 +2191,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 9d9c716..8264bb5 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-tc.c b/lib/netdev-offload-tc.c index 875ebef..51f5fd5 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -1638,7 +1638,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 32eab59..82b163e 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 b4b882a..67504dd 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 */ @@ -104,21 +103,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 409286a..becdb55 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 Dec 28 09:24:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420973 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QcJ17Jpz9sVv for ; Tue, 29 Dec 2020 05:11:59 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 2EFB5871F4; Mon, 28 Dec 2020 18:11:58 +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 A-OLd1YAjlNZ; Mon, 28 Dec 2020 18:11:51 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 8F18386E62; Mon, 28 Dec 2020 18:10:50 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 478B7C1DA9; Mon, 28 Dec 2020 18:10:50 +0000 (UTC) X-Original-To: ovs-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 17CB3C1D9C for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 1143386CA1 for ; Mon, 28 Dec 2020 09:26:06 +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 hF0idbf5MgFi for ; Mon, 28 Dec 2020 09:26:05 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by whitealder.osuosl.org (Postfix) with ESMTP id A9F6D86C77 for ; Mon, 28 Dec 2020 09:26:03 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app11-12011 (RichMail) with SMTP id 2eeb5fe9a48e4e9-c1b90; Mon, 28 Dec 2020 17:25:35 +0800 (CST) X-RM-TRANSID: 2eeb5fe9a48e4e9-c1b90 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b846; Mon, 28 Dec 2020 17:25:34 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b846 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:23 -0800 Message-Id: <20201228092520.11807-6-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 05/62] netdev-offload: Fix ifindex check rule 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: 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. Jira: #[Optional] 市场项目编号(名称):[Optional --- 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 82b163e..1612fe6 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 Dec 28 09:24:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420969 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qc22tbDz9sWC for ; Tue, 29 Dec 2020 05:11:46 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id D373B87201; Mon, 28 Dec 2020 18:11:44 +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 0y+yZ8AejV5h; Mon, 28 Dec 2020 18:11:42 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id DDE1A87139; Mon, 28 Dec 2020 18:11:22 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 52441C1E54; Mon, 28 Dec 2020 18:11:22 +0000 (UTC) X-Original-To: ovs-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 906B7C0891 for ; Mon, 28 Dec 2020 09:26:14 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 7BC9720512 for ; Mon, 28 Dec 2020 09:26:14 +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 kGkyd+Wm9qMs for ; Mon, 28 Dec 2020 09:26:13 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by silver.osuosl.org (Postfix) with ESMTP id 7D924228EA for ; Mon, 28 Dec 2020 09:26:12 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app03-12003 (RichMail) with SMTP id 2ee35fe9a48e538-bee3f; Mon, 28 Dec 2020 17:25:35 +0800 (CST) X-RM-TRANSID: 2ee35fe9a48e538-bee3f X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b849; Mon, 28 Dec 2020 17:25:35 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b849 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:24 -0800 Message-Id: <20201228092520.11807-7-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 06/62] netdev-offload: Add vport offload flow 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: '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. Jira: #[Optional] 市场项目编号(名称):[Optional] --- 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 12ee8bd..492b2c1 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2441,8 +2441,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) info.dpif_class = dpif_class; 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 d7184c0..5ce25e3 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -24,6 +24,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" @@ -1374,6 +1375,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 51f5fd5..6c76f69 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" @@ -1912,6 +1913,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 Dec 28 09:24:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420979 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QcZ3XFzz9sVv for ; Tue, 29 Dec 2020 05:12:14 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 073B186EC3; Mon, 28 Dec 2020 18:12:13 +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 EFFqgKueKkc3; Mon, 28 Dec 2020 18:12:11 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 1012086ECC; Mon, 28 Dec 2020 18:10:55 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id E3634C1DCE; Mon, 28 Dec 2020 18:10:54 +0000 (UTC) X-Original-To: ovs-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 789FDC1DA3 for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 02AB181F2E for ; Mon, 28 Dec 2020 09:26:06 +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 C2yVVdS-DjO8 for ; Mon, 28 Dec 2020 09:26:05 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by hemlock.osuosl.org (Postfix) with ESMTP id 6BFE6870CD for ; Mon, 28 Dec 2020 09:26:03 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app09-12009 (RichMail) with SMTP id 2ee95fe9a48f0b6-bef2b; Mon, 28 Dec 2020 17:25:35 +0800 (CST) X-RM-TRANSID: 2ee95fe9a48f0b6-bef2b X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b84c; Mon, 28 Dec 2020 17:25:35 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b84c From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:25 -0800 Message-Id: <20201228092520.11807-8-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 07/62] dpif-netdev: Fix dpif_type during offload api operation 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: Fix dpif_type in dpif_netdev_get_flow_offload_status Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 492b2c1..74fd05c 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -3052,7 +3052,7 @@ 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(odp_port, dpif_normalize_type(dp->class->type)); if (!netdev) { return false; } From patchwork Mon Dec 28 09:24:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420982 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qcg3SNNz9sWC for ; Tue, 29 Dec 2020 05:12:19 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id D8D0786538; Mon, 28 Dec 2020 18:12:17 +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 QIUSzVSYr8K9; Mon, 28 Dec 2020 18:12:15 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by fraxinus.osuosl.org (Postfix) with ESMTP id B23D5864AA; Mon, 28 Dec 2020 18:11:47 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 46784C1F5C; Mon, 28 Dec 2020 18:11:47 +0000 (UTC) X-Original-To: ovs-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 DB1F1C0891 for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id D6080820E7 for ; Mon, 28 Dec 2020 09:26:33 +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 F1WnsS7omwYm for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by hemlock.osuosl.org (Postfix) with ESMTP id 7CC7F819CF for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app08-12008 (RichMail) with SMTP id 2ee85fe9a490f34-c07d3; Mon, 28 Dec 2020 17:25:36 +0800 (CST) X-RM-TRANSID: 2ee85fe9a490f34-c07d3 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b850; Mon, 28 Dec 2020 17:25:36 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b850 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:26 -0800 Message-Id: <20201228092520.11807-9-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 08/62] netdev-offload-dpdk: Not attemp to offload ipv4 fragment pkt 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: For ipv4 fragment pkt , as Hardware not support to offload, we disable these pkts during offloading. Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 5ce25e3..05c7558 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -613,6 +613,13 @@ parse_flow_match(struct flow_patterns *patterns, add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_VLAN, spec, mask); } + /* do not attempt to offload frags. */ + if (match->flow.nw_frag != OVS_FRAG_TYPE_NONE && match->wc.masks.nw_frag) { + VLOG_DBG("Frag (%d/%d) not supported", match->flow.nw_frag, + match->wc.masks.nw_frag); + return -1; + } + /* IP v4 */ if (match->flow.dl_type == htons(ETH_TYPE_IP)) { struct rte_flow_item_ipv4 *spec, *mask; From patchwork Mon Dec 28 09:24:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420996 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QdY3VG8z9sVv for ; Tue, 29 Dec 2020 05:13:05 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id B9A018708A; Mon, 28 Dec 2020 18:13:03 +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 H6l0W5t2S6tX; Mon, 28 Dec 2020 18:12:58 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 26E5C870A4; Mon, 28 Dec 2020 18:11:05 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id E44AEC1DA5; Mon, 28 Dec 2020 18:11:04 +0000 (UTC) X-Original-To: ovs-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 8EE10C1D9C for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 4CEB6816DB for ; Mon, 28 Dec 2020 09:26:06 +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 bXCwQFChDEOS for ; Mon, 28 Dec 2020 09:26:03 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by hemlock.osuosl.org (Postfix) with ESMTP id 5BEEC870C3 for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app04-12004 (RichMail) with SMTP id 2ee45fe9a490763-c2153; Mon, 28 Dec 2020 17:25:37 +0800 (CST) X-RM-TRANSID: 2ee45fe9a490763-c2153 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b856; Mon, 28 Dec 2020 17:25:36 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b856 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:28 -0800 Message-Id: <20201228092520.11807-11-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 10/62] netdev-offload-dpdk: Fix compile warnings 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: Fix compile warnings Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 8 ++++---- lib/netdev-offload-dpdk.c | 7 +++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 74fd05c..ce6ba27 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2275,7 +2275,7 @@ static int mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd, struct dp_netdev_flow *flow) { - const char *dpif_type_str = dpif_normalize_type(dpif_type(pmd->dp->dpif)); + 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; @@ -2402,7 +2402,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) 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(dpif_type(pmd->dp->dpif)); + 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; @@ -2438,7 +2438,6 @@ 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, dpif_type_str); if (!port) { @@ -3045,6 +3044,7 @@ dpif_netdev_get_flow_offload_status(const struct dp_netdev *dp, struct netdev *netdev; struct match match; struct ofpbuf buf; + const char *dpif_type_str = dpif_normalize_type(dp->class->type); int ret = 0; @@ -3052,7 +3052,7 @@ dpif_netdev_get_flow_offload_status(const struct dp_netdev *dp, return false; } - netdev = netdev_ports_get(odp_port, dpif_normalize_type(dp->class->type)); + netdev = netdev_ports_get(netdev_flow->flow.in_port.odp_port, dpif_type_str); if (!netdev) { return false; } diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 5cce175..7cb2dc0 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -568,9 +568,12 @@ parse_flow_match(struct flow_patterns *patterns, { uint8_t *next_proto_mask = NULL; uint8_t proto = 0; + struct match consumed_match; struct flow *consumed_masks; - consumed_masks = &match->wc.masks; + memcpy(&consumed_match, match, sizeof consumed_match); + + consumed_masks = &(consumed_match.wc.masks); /* Not attemp to offload in_port/recirc_id ? memset(&consumed_masks->in_port, 0, sizeof consumed_masks->in_port); consumed_masks->recirc_id = 0; @@ -884,7 +887,7 @@ add_output_action(struct netdev *netdev, 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; From patchwork Mon Dec 28 09:24:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420987 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qcy2FfGz9sVv for ; Tue, 29 Dec 2020 05:12:34 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id D604886E44; Mon, 28 Dec 2020 18:12:32 +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 Edim9VrmFHTH; Mon, 28 Dec 2020 18:12:26 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id BFE7386ED2; Mon, 28 Dec 2020 18:10:58 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 83825C1DEE; Mon, 28 Dec 2020 18:10:58 +0000 (UTC) X-Original-To: ovs-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 76F3CC0891 for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 9B35981E8B for ; Mon, 28 Dec 2020 09:26:05 +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 LWN7s-SlMeyT for ; Mon, 28 Dec 2020 09:26:03 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by hemlock.osuosl.org (Postfix) with ESMTP id 5CF40870C4 for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app04-12004 (RichMail) with SMTP id 2ee45fe9a491764-c2154; Mon, 28 Dec 2020 17:25:37 +0800 (CST) X-RM-TRANSID: 2ee45fe9a491764-c2154 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b859; Mon, 28 Dec 2020 17:25:37 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b859 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:30 -0800 Message-Id: <20201228092520.11807-13-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 12/62] netdev-offload: work around for vhostuserclient type flow_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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: For vhu type, no intel dpdk driver cannot support coresponding offload api, so for debug reason, we add work around code for vhost user type Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 2 +- lib/netdev-offload-provider.h | 5 +++++ lib/netdev-offload.c | 15 +++++++++++---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 23527bd..befc1d6 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -1368,7 +1368,7 @@ netdev_offload_dpdk_destroy_flow(struct netdev *netdev, return ret; } -static int +int netdev_offload_dpdk_flow_put(struct netdev *netdev, struct match *match, struct nlattr *actions, size_t actions_len, const ovs_u128 *ufid, struct offload_info *info, diff --git a/lib/netdev-offload-provider.h b/lib/netdev-offload-provider.h index 5a809c0..0c1a370 100644 --- a/lib/netdev-offload-provider.h +++ b/lib/netdev-offload-provider.h @@ -28,6 +28,11 @@ extern "C" { #endif +extern int +netdev_offload_dpdk_flow_put(struct netdev *netdev, struct match *match, + struct nlattr *actions, size_t actions_len, + const ovs_u128 *ufid, struct offload_info *info, + struct dpif_flow_stats *stats); struct netdev_flow_api { char *type; /* Flush all offloaded flows from a netdev. diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c index 1612fe6..a32b3fc 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -237,6 +237,7 @@ netdev_flow_dump_next(struct netdev_flow_dump *dump, struct match *match, : false; } + int netdev_flow_put(struct netdev *netdev, struct match *match, struct nlattr *actions, size_t act_len, @@ -245,11 +246,17 @@ netdev_flow_put(struct netdev *netdev, struct match *match, { const struct netdev_flow_api *flow_api = ovsrcu_get(const struct netdev_flow_api *, &netdev->flow_api); + const char *netdev_type = netdev->netdev_class->type; - return (flow_api && flow_api->flow_put) - ? flow_api->flow_put(netdev, match, actions, act_len, ufid, - info, stats) - : EOPNOTSUPP; + if (!strcmp(netdev_type, "dpdkvhostuserclient")) { + return netdev_offload_dpdk_flow_put(netdev, match, actions, act_len, ufid, + info, stats); + } else { + return (flow_api && flow_api->flow_put) + ? flow_api->flow_put(netdev, match, actions, act_len, ufid, + info, stats) + : EOPNOTSUPP; + } } int From patchwork Mon Dec 28 09:24:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420997 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qdd4RLQz9sVv for ; Tue, 29 Dec 2020 05:13:09 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 271BB876AA; Mon, 28 Dec 2020 18:13: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 8+2S5j2fdWLg; Mon, 28 Dec 2020 18:13:04 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 0993487428; Mon, 28 Dec 2020 18:11:51 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id AC1D7C1E4E; Mon, 28 Dec 2020 18:11:50 +0000 (UTC) X-Original-To: ovs-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 00D1AC1D9C for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id D944A8507C for ; Mon, 28 Dec 2020 09:26:33 +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 lNXQAEhbKoVH for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by hemlock.osuosl.org (Postfix) with ESMTP id 82A7582B51 for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app08-12008 (RichMail) with SMTP id 2ee85fe9a492f39-c07d8; Mon, 28 Dec 2020 17:25:38 +0800 (CST) X-RM-TRANSID: 2ee85fe9a492f39-c07d8 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b860; Mon, 28 Dec 2020 17:25:38 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b860 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:31 -0800 Message-Id: <20201228092520.11807-14-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 13/62] netdev-offload-dpdk: work around for vhost type port trans to rte_flow 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: work around for vhost type port trans to rte_flow Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index befc1d6..7e59d51 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -891,8 +891,10 @@ add_output_action(struct netdev *netdev, VLOG_DBG_RL(&rl, "Cannot find netdev for odp port %"PRIu32, port); return -1; } + /* work around: to enable vhost type port tans rte_flow if (!netdev_flow_api_equals(netdev, outdev) || - add_port_id_action(actions, outdev)) { + add_port_id_action(actions, outdev)) { */ + if (add_port_id_action(actions, outdev)) { VLOG_DBG_RL(&rl, "%s: Output to port \'%s\' cannot be offloaded.", netdev_get_name(netdev), netdev_get_name(outdev)); ret = -1; @@ -1044,7 +1046,7 @@ add_vxlan_encap_action(struct flow_actions *actions, const void *l4; int field; - VLOG_DBG_RL(&rl, "TIMO DBG: in add_vxlan_encap_action"); + VLOG_DBG("TIMO DBG: in add_vxlan_encap_action"); vxlan_data = xzalloc(sizeof *vxlan_data + sizeof(struct rte_flow_item) * ACTION_VXLAN_ENCAP_ITEMS_NUM); @@ -1120,11 +1122,12 @@ parse_clone_actions(struct netdev *netdev, { const struct nlattr *ca; unsigned int cleft; + u_int8_t i = 0; NL_ATTR_FOR_EACH_UNSAFE (ca, cleft, clone_actions, clone_actions_len) { int clone_type = nl_attr_type(ca); - VLOG_DBG_RL(&rl, "TIMO DBG: in parse_clone_action"); + VLOG_DBG("TIMO DBG: in parse_clone_action %0d:%d",i++,clone_type); if (clone_type == OVS_ACTION_ATTR_TUNNEL_PUSH) { const struct ovs_action_push_tnl *tnl_push = nl_attr_get(ca); @@ -1146,6 +1149,9 @@ parse_clone_actions(struct netdev *netdev, if (add_output_action(netdev, actions, ca,info)) { return -1; } + /* work around: tmp bypass vlan push action*/ + } else if (clone_type == OVS_ACTION_ATTR_PUSH_VLAN) { + continue; } else { VLOG_DBG_RL(&rl, "Unsupported nested action inside clone(), " @@ -1166,9 +1172,11 @@ parse_flow_actions(struct netdev *netdev, { struct nlattr *nla; size_t left; + uint8_t i = 0; add_count_action(actions); NL_ATTR_FOR_EACH_UNSAFE (nla, left, nl_actions, nl_actions_len) { + VLOG_DBG("TIMO:action type %0d:%d",i++,nl_attr_type(nla)); if (nl_attr_type(nla) == OVS_ACTION_ATTR_OUTPUT) { if (add_output_action(netdev, actions, nla, info)) { return -1; From patchwork Mon Dec 28 09:24:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1421015 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qk81gQzz9sWC for ; Tue, 29 Dec 2020 05:17:04 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 8FBC785899; Mon, 28 Dec 2020 18:17:02 +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 QZMJTtuuuwB0; Mon, 28 Dec 2020 18:16:59 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 3A2FD8743E; Mon, 28 Dec 2020 18:12:17 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0FB8BC2015; Mon, 28 Dec 2020 18:12:17 +0000 (UTC) X-Original-To: ovs-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 DEC02C0891 for ; Mon, 28 Dec 2020 09:26:36 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id CB4E12045F for ; Mon, 28 Dec 2020 09:26:36 +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 i8eKOAfQfe6H for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by silver.osuosl.org (Postfix) with ESMTP id A125620464 for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app03-12003 (RichMail) with SMTP id 2ee35fe9a490540-bee47; Mon, 28 Dec 2020 17:25:38 +0800 (CST) X-RM-TRANSID: 2ee35fe9a490540-bee47 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b865; Mon, 28 Dec 2020 17:25:38 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b865 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:32 -0800 Message-Id: <20201228092520.11807-15-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 14/62] netdev-offload-dpdk: add vxlan encap action dump method 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: For debug reason, add vxlan encap action dump method Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 7e59d51..8f8a85b 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -326,6 +326,31 @@ 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"); + ds_put_cstr(s, "vxlan "); + if (vxlan_spec) { + ds_put_format(s, " Spec: flags=0x%x, vni=%d\n", + vxlan_spec->flags, + ntohl(*(ovs_be32 *)vxlan_spec->vni) >> 8); + ds_put_format(s, "vni spec %d ", + 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); + ds_put_format(s, "vni mask 0x%06x ", + ntohl(*(ovs_be32 *)vxlan_mask->vni) >> 8); + } else { + ds_put_cstr(s, " Mask = null\n"); + } + ds_put_cstr(s, "/ "); } else { ds_put_format(s, "unknown rte flow pattern (%d)\n", item->type); } @@ -374,6 +399,26 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) } } else if (actions->type == RTE_FLOW_ACTION_TYPE_DROP) { ds_put_cstr(s, "rte flow drop action\n"); + } 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 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"); + ds_put_cstr(s, "vxlan_encap / "); + while (items && items->type != RTE_FLOW_ITEM_TYPE_END) { + dump_flow_pattern(s, items++); + } } else if (actions->type == RTE_FLOW_ACTION_TYPE_SET_MAC_SRC || actions->type == RTE_FLOW_ACTION_TYPE_SET_MAC_DST) { const struct rte_flow_action_set_mac *set_mac = actions->conf; @@ -459,6 +504,14 @@ netdev_offload_dpdk_flow_create(struct netdev *netdev, struct ds s; flow = netdev_dpdk_rte_flow_create(netdev, attr, items, actions, error); + /* work around: for dump_flow even if rte_flow create fail */ + if (!VLOG_DROP_DBG(&rl)) { + ds_init(&s); + dump_flow(&s, attr, items, actions); + VLOG_DBG_RL(&rl, "TIMO:%s: rte_flow 0x%"PRIxPTR" printed:\n%s", + netdev_get_name(netdev), (intptr_t) flow, ds_cstr(&s)); + ds_destroy(&s); + } if (flow) { if (!VLOG_DROP_DBG(&rl)) { ds_init(&s); From patchwork Mon Dec 28 09:24:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420955 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QbL3bXyz9sVv for ; Tue, 29 Dec 2020 05:11:10 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id B508B86D19; Mon, 28 Dec 2020 18:11:08 +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 uoVN4weDAotF; Mon, 28 Dec 2020 18:11:07 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 963C586D43; Mon, 28 Dec 2020 18:10:40 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 6F97FC1DA4; Mon, 28 Dec 2020 18:10:40 +0000 (UTC) X-Original-To: ovs-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 A73C4C0891 for ; Mon, 28 Dec 2020 09:26:01 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 9548286C8C for ; Mon, 28 Dec 2020 09:26:01 +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 JaqO6AqTRo2I for ; Mon, 28 Dec 2020 09:26:00 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by whitealder.osuosl.org (Postfix) with ESMTP id B344986C4C for ; Mon, 28 Dec 2020 09:25:59 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app02-12002 (RichMail) with SMTP id 2ee25fe9a491d54-bebdd; Mon, 28 Dec 2020 17:25:39 +0800 (CST) X-RM-TRANSID: 2ee25fe9a491d54-bebdd X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b86c; Mon, 28 Dec 2020 17:25:38 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b86c From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:33 -0800 Message-Id: <20201228092520.11807-16-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 15/62] netdev-offload-dpdk: add vlan push action offloading mechanism 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: add vlan push action offloading machenism Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 8f8a85b..cc5cbe0 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -419,6 +419,15 @@ 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_OF_PUSH_VLAN) { + const struct rte_flow_action_of_push_vlan *vlan_tci = actions->conf; + + if (vlan_tci) { + ds_put_format(s, "rte flow vlan-push action:\n"); + ds_put_format(s, "vlan-encap: tci=%"PRIu16"\n",ntohs(vlan_tci->ethertype)); + } else { + ds_put_format(s, "vlan-encap: null\n"); + } } else if (actions->type == RTE_FLOW_ACTION_TYPE_SET_MAC_SRC || actions->type == RTE_FLOW_ACTION_TYPE_SET_MAC_DST) { const struct rte_flow_action_set_mac *set_mac = actions->conf; @@ -1202,9 +1211,14 @@ parse_clone_actions(struct netdev *netdev, if (add_output_action(netdev, actions, ca,info)) { return -1; } - /* work around: tmp bypass vlan push action*/ } else if (clone_type == OVS_ACTION_ATTR_PUSH_VLAN) { - continue; + const struct ovs_action_push_vlan *vlan = nl_attr_get(ca); + struct rte_flow_action_of_push_vlan *vlan_tci; + + vlan_tci = xzalloc(sizeof *vlan_tci); + vlan_tci->ethertype = vlan->vlan_tci & ~htons(VLAN_CFI); + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN, + vlan_tci); } else { VLOG_DBG_RL(&rl, "Unsupported nested action inside clone(), " @@ -1255,6 +1269,14 @@ parse_flow_actions(struct netdev *netdev, return -1; } + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_PUSH_VLAN) { + const struct ovs_action_push_vlan *vlan = nl_attr_get(nla); + struct rte_flow_action_of_push_vlan *vlan_tci; + + vlan_tci = xzalloc(sizeof *vlan_tci); + vlan_tci->ethertype = vlan->vlan_tci & ~htons(VLAN_CFI); + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN, + vlan_tci); } else { VLOG_DBG_RL(&rl, "Unsupported action type %d", nl_attr_type(nla)); return -1; From patchwork Mon Dec 28 09:24:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420964 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qbn6wN3z9sVv for ; Tue, 29 Dec 2020 05:11:33 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 88F118713A; Mon, 28 Dec 2020 18:11:32 +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 bT5xsEfCEqBD; Mon, 28 Dec 2020 18:11:30 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 1A5338717F; Mon, 28 Dec 2020 18:11:18 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id CBC77C1E44; Mon, 28 Dec 2020 18:11:17 +0000 (UTC) X-Original-To: ovs-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 6851BC0891 for ; Mon, 28 Dec 2020 09:26:10 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 57A3286C4A for ; Mon, 28 Dec 2020 09:26:10 +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 ngRF5JYGDPeu for ; Mon, 28 Dec 2020 09:26:05 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by whitealder.osuosl.org (Postfix) with ESMTP id 90B4486C9F for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app10-12010 (RichMail) with SMTP id 2eea5fe9a4939bd-c33bd; Mon, 28 Dec 2020 17:25:39 +0800 (CST) X-RM-TRANSID: 2eea5fe9a4939bd-c33bd X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b86d; Mon, 28 Dec 2020 17:25:39 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b86d From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:34 -0800 Message-Id: <20201228092520.11807-17-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 16/62] netdev-offload-dpdk: remove RAW_ENCAP 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: remove RAW_ENCAP action as we don't use it Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index cc5cbe0..b20e59b 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -1193,20 +1193,11 @@ 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; 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; - - 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,info)) { return -1; From patchwork Mon Dec 28 09:24:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420998 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qdm02BDz9sVv for ; Tue, 29 Dec 2020 05:13:15 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id E53D0876E4; Mon, 28 Dec 2020 18:13:13 +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 KzD0HrsPogGN; Mon, 28 Dec 2020 18:13:11 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 4EE9087227; Mon, 28 Dec 2020 18:11:54 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 22FF6C1F8C; Mon, 28 Dec 2020 18:11:54 +0000 (UTC) X-Original-To: ovs-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 5F603C0891 for ; Mon, 28 Dec 2020 09:26:34 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 4B189819CF for ; Mon, 28 Dec 2020 09:26:34 +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 WjIef-egyAO9 for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by hemlock.osuosl.org (Postfix) with ESMTP id 28D3484FB1 for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app08-12008 (RichMail) with SMTP id 2ee85fe9a493f3d-c07dc; Mon, 28 Dec 2020 17:25:39 +0800 (CST) X-RM-TRANSID: 2ee85fe9a493f3d-c07dc X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b86f; Mon, 28 Dec 2020 17:25:39 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b86f From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:35 -0800 Message-Id: <20201228092520.11807-18-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 17/62] netdev-offload-dpdk: add vlan-pop action offloading mechanism 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: add vlan-pop action offloading mechanism Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index b20e59b..7d34870 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -428,6 +428,8 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) } else { ds_put_format(s, "vlan-encap: null\n"); } + } else if (actions->type == RTE_FLOW_ACTION_TYPE_OF_POP_VLAN) { + ds_put_format(s, "vlan-decap: nop\n"); } else if (actions->type == RTE_FLOW_ACTION_TYPE_SET_MAC_SRC || actions->type == RTE_FLOW_ACTION_TYPE_SET_MAC_DST) { const struct rte_flow_action_set_mac *set_mac = actions->conf; @@ -1210,6 +1212,8 @@ parse_clone_actions(struct netdev *netdev, vlan_tci->ethertype = vlan->vlan_tci & ~htons(VLAN_CFI); add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN, vlan_tci); + } else if (clone_type == OVS_ACTION_ATTR_POP_VLAN) { + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_POP_VLAN, NULL); } else { VLOG_DBG_RL(&rl, "Unsupported nested action inside clone(), " @@ -1259,7 +1263,6 @@ parse_flow_actions(struct netdev *netdev, clone_actions_len,info)) { return -1; } - } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_PUSH_VLAN) { const struct ovs_action_push_vlan *vlan = nl_attr_get(nla); struct rte_flow_action_of_push_vlan *vlan_tci; @@ -1268,6 +1271,8 @@ parse_flow_actions(struct netdev *netdev, vlan_tci->ethertype = vlan->vlan_tci & ~htons(VLAN_CFI); add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN, vlan_tci); + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_POP_VLAN) { + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_POP_VLAN, NULL); } else { VLOG_DBG_RL(&rl, "Unsupported action type %d", nl_attr_type(nla)); return -1; From patchwork Mon Dec 28 09:24:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420958 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QbT3l4fz9sVv for ; Tue, 29 Dec 2020 05:11:17 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 2E9708713A; Mon, 28 Dec 2020 18:11: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 4sZPWipnO8MC; Mon, 28 Dec 2020 18:11:08 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 792A586D63; Mon, 28 Dec 2020 18:10:41 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 4F5ECC1DA2; Mon, 28 Dec 2020 18:10:41 +0000 (UTC) X-Original-To: ovs-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 CDC06C0891 for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id C622A86C46 for ; Mon, 28 Dec 2020 09:26:02 +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 1W0HtZidCoAP for ; Mon, 28 Dec 2020 09:26:01 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by whitealder.osuosl.org (Postfix) with ESMTP id B43C786C71 for ; Mon, 28 Dec 2020 09:25:59 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app02-12002 (RichMail) with SMTP id 2ee25fe9a494d58-bebe1; Mon, 28 Dec 2020 17:25:40 +0800 (CST) X-RM-TRANSID: 2ee25fe9a494d58-bebe1 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b871; Mon, 28 Dec 2020 17:25:40 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b871 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:36 -0800 Message-Id: <20201228092520.11807-19-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 18/62] netdev-offload-dpdk.c: add flag to exclude multicast scenario 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: Now we can only offload unicast flow,so we should seperate these pkts before offloading Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 12 +++++++++++- lib/netdev-offload.h | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 7d34870..970eada 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -1201,9 +1201,13 @@ parse_clone_actions(struct netdev *netdev, continue; } } else if (clone_type == OVS_ACTION_ATTR_OUTPUT) { - if (add_output_action(netdev, actions, ca,info)) { + if (add_output_action(netdev, actions, ca, info)) { + return -1; + } else if (info->valid_ucast) { + VLOG_DBG_RL(&rl, "Unsupported multicast output action"); return -1; } + info->valid_ucast = true; } else if (clone_type == OVS_ACTION_ATTR_PUSH_VLAN) { const struct ovs_action_push_vlan *vlan = nl_attr_get(ca); struct rte_flow_action_of_push_vlan *vlan_tci; @@ -1235,14 +1239,20 @@ parse_flow_actions(struct netdev *netdev, struct nlattr *nla; size_t left; uint8_t i = 0; + add_count_action(actions); NL_ATTR_FOR_EACH_UNSAFE (nla, left, nl_actions, nl_actions_len) { + VLOG_DBG("TIMO:action type %0d:%d",i++,nl_attr_type(nla)); if (nl_attr_type(nla) == OVS_ACTION_ATTR_OUTPUT) { if (add_output_action(netdev, actions, nla, info)) { return -1; + } else if (info->valid_ucast) { + VLOG_DBG_RL(&rl, "Unsupported multicast output action"); + return -1; } + info->valid_ucast = true; } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_DROP) { add_flow_action(actions, RTE_FLOW_ACTION_TYPE_DROP, NULL); } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_SET || diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index 67504dd..cadbde1 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -76,6 +76,7 @@ struct offload_info { bool tc_modify_flow_deleted; /* Indicate the tc modify flow put success * to delete the original flow. */ + bool valid_ucast; /* flag to judge multicast && broadcast */ }; int netdev_flow_flush(struct netdev *); From patchwork Mon Dec 28 09:24:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420970 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qc25zh7z9sWL for ; Tue, 29 Dec 2020 05:11:46 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 4785D872F2; Mon, 28 Dec 2020 18:11:45 +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 GHepBekFcEC1; Mon, 28 Dec 2020 18:11:39 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 773D986E0A; Mon, 28 Dec 2020 18:10:47 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 39011C1DA8; Mon, 28 Dec 2020 18:10:47 +0000 (UTC) X-Original-To: ovs-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 932F7C1D9C for ; Mon, 28 Dec 2020 09:26:05 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 7E01A2045F for ; Mon, 28 Dec 2020 09:26:05 +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 mG7Ls9LdAqJC for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by silver.osuosl.org (Postfix) with ESMTP id AEC7A20487 for ; Mon, 28 Dec 2020 09:26:01 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app01-12001 (RichMail) with SMTP id 2ee15fe9a4946b0-bca1a; Mon, 28 Dec 2020 17:25:40 +0800 (CST) X-RM-TRANSID: 2ee15fe9a4946b0-bca1a X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b874; Mon, 28 Dec 2020 17:25:40 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b874 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:37 -0800 Message-Id: <20201228092520.11807-20-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 19/62] netdev-offload-dpdk: add vxlan decap action offloading mechanism 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: add vxlan decap action offloading mechanism Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 1 - lib/netdev-offload-dpdk.c | 51 +++++++++++++++++++++++++++++++++++++++++++++-- lib/netdev-offload.h | 1 + 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index ce6ba27..74ceadc 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2399,7 +2399,6 @@ 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); diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 970eada..96a295f 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -419,6 +419,8 @@ 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_VXLAN_DECAP) { + ds_put_format(s, "vxlan-decap: nop\n"); } else if (actions->type == RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN) { const struct rte_flow_action_of_push_vlan *vlan_tci = actions->conf; @@ -627,8 +629,40 @@ free_flow_actions(struct flow_actions *actions) } static int +parse_vxlan_match(struct flow_patterns *patterns, + const struct match *match) +{ + struct rte_flow_item_vxlan *vx_spec, *vx_mask; + + if (is_all_zeros(&match->wc.masks.tunnel, sizeof match->wc.masks.tunnel)) { + return 0; + } + + /* no need to tranmit layer2/layer3/layer4 as + * for outer key fpga only support vni */ + /* + ret = parse_tnl_ip_match(patterns, match, IPPROTO_UDP); + parse_tnl_udp_match(patterns, match); + */ + + /* 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)); + + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_VXLAN, vx_spec, vx_mask); + return 0; +} + +static int parse_flow_match(struct flow_patterns *patterns, - const struct match *match) + const struct match *match, + struct netdev *netdev, + struct offload_info *info) { uint8_t *next_proto_mask = NULL; uint8_t proto = 0; @@ -643,6 +677,15 @@ parse_flow_match(struct flow_patterns *patterns, consumed_masks->recirc_id = 0; consumed_masks->packet_type = 0; + if (!strcmp(netdev_get_type(netdev), "vxlan")) { + parse_vxlan_match(patterns, match); + memset(&consumed_masks->tunnel, 0, sizeof consumed_masks->tunnel); + info->vxlan_decap = true; + } else if (netdev_vport_is_vport_class(netdev->netdev_class)) { + VLOG_DBG("in port (%s) not supported", netdev->name); + return -1; + } + /* Eth */ if (!eth_addr_is_zero(match->wc.masks.dl_src) || !eth_addr_is_zero(match->wc.masks.dl_dst)) { @@ -1289,6 +1332,10 @@ parse_flow_actions(struct netdev *netdev, } } + if (info->vxlan_decap) { + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_VXLAN_DECAP, NULL); + info->vxlan_decap = false; + } if (nl_actions_len == 0) { VLOG_DBG_RL(&rl, "No actions provided"); return -1; @@ -1335,7 +1382,7 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, struct rte_flow *flow; int ret = 0; - ret = parse_flow_match(&patterns, match); + ret = parse_flow_match(&patterns, match, netdev, info); if (ret) { goto out; } diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index cadbde1..8264e32 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -77,6 +77,7 @@ struct offload_info { bool tc_modify_flow_deleted; /* Indicate the tc modify flow put success * to delete the original flow. */ bool valid_ucast; /* flag to judge multicast && broadcast */ + bool vxlan_decap; /* flag to turn on vxlan decap */ }; int netdev_flow_flush(struct netdev *); From patchwork Mon Dec 28 09:24:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420984 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qcn38vpz9sVv for ; Tue, 29 Dec 2020 05:12:25 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id ECCB486D21; Mon, 28 Dec 2020 18:12:23 +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 rw6jOuQeSWXI; Mon, 28 Dec 2020 18:12:19 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id DA78886F87; Mon, 28 Dec 2020 18:10:56 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id A8338C1DE6; Mon, 28 Dec 2020 18:10:56 +0000 (UTC) X-Original-To: ovs-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 7639EC1DA2 for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 5728D81BA7 for ; Mon, 28 Dec 2020 09:26:05 +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 Ftlx2dCtcFhU for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by hemlock.osuosl.org (Postfix) with ESMTP id C87EA870B5 for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app09-12009 (RichMail) with SMTP id 2ee95fe9a4940bf-bef34; Mon, 28 Dec 2020 17:25:41 +0800 (CST) X-RM-TRANSID: 2ee95fe9a4940bf-bef34 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b875; Mon, 28 Dec 2020 17:25:40 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b875 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:38 -0800 Message-Id: <20201228092520.11807-21-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 20/62] netdev-dpdk: Add flow_api support for netdev 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: Currently vport devices with dpif type "system" are rejected as part of netdev_offload_dpdk_init_flow_api() call. It is correct but we also need to specify what should be accepted. We should accept vport devices with dpif type "netdev". This commit add the acceptance of such devices to netdev_dpdk_flow_api_supported() API. This will allow any vport of type "netdev" to be considered for offloading by flow_put(). Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-dpdk.c | 6 ++++++ lib/netdev-offload-dpdk.c | 7 ------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 7ab8186..22f7044 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -5333,6 +5333,12 @@ netdev_dpdk_flow_api_supported(struct netdev *netdev) struct netdev_dpdk *dev; bool ret = false; + if (netdev_vport_is_vport_class(netdev->netdev_class) && + !strcmp(netdev_get_dpif_type(netdev), "netdev")) { + ret = true; + goto out; + } + if (!is_dpdk_class(netdev->netdev_class)) { goto out; } diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 96a295f..338a272 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -1559,13 +1559,6 @@ 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; } From patchwork Mon Dec 28 09:24:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420999 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qdq74V5z9sWC for ; Tue, 29 Dec 2020 05:13:19 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 5A09787132; Mon, 28 Dec 2020 18:13:18 +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 PcW5nj+rFXg6; Mon, 28 Dec 2020 18:13:15 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 50C4E87120; Mon, 28 Dec 2020 18:11:08 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0E5DBC1DC9; Mon, 28 Dec 2020 18:11:08 +0000 (UTC) X-Original-To: ovs-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 D624AC0891 for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id C183A86C46 for ; Mon, 28 Dec 2020 09:26:06 +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 gqj44cnYz8g3 for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by whitealder.osuosl.org (Postfix) with ESMTP id AF43586C98 for ; Mon, 28 Dec 2020 09:26:03 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app10-12010 (RichMail) with SMTP id 2eea5fe9a4959c7-c33c7; Mon, 28 Dec 2020 17:25:41 +0800 (CST) X-RM-TRANSID: 2eea5fe9a4959c7-c33c7 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b879; Mon, 28 Dec 2020 17:25:41 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b879 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:39 -0800 Message-Id: <20201228092520.11807-22-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Liuchang Subject: [ovs-dev] [PATCH 21/62] netdev-offload-dpdk: add vxlan decap debug info 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Liuchang Code Source From: Self Code Description: add vxlan decap debug info Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 338a272..3e268bf 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -637,6 +637,7 @@ parse_vxlan_match(struct flow_patterns *patterns, if (is_all_zeros(&match->wc.masks.tunnel, sizeof match->wc.masks.tunnel)) { return 0; } + VLOG_DBG("TIMO:in parse_vxlan_match"); /* no need to tranmit layer2/layer3/layer4 as * for outer key fpga only support vni */ @@ -1423,10 +1424,12 @@ netdev_offload_dpdk_validate_flow(const struct match *match) /* Create a wc-zeroed version of flow. */ match_init(&match_zero_wc, &match->flow, &match->wc); + /* support tunnel now so mark this checker 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) { @@ -1467,9 +1470,11 @@ netdev_offload_dpdk_validate_flow(const struct match *match) } /* If fragmented, then don't HW accelerate - for now. */ + /* move this checker to parse_flow_match if (match_zero_wc.flow.nw_frag) { goto err; } + */ /* Unsupported L4. */ if (masks->igmp_group_ip4 || masks->ct_tp_src || masks->ct_tp_dst) { From patchwork Mon Dec 28 09:24:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1421007 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QfZ2BXPz9sVv for ; Tue, 29 Dec 2020 05:13:58 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 9BF1C87507; Mon, 28 Dec 2020 18:13: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 KTsWV0A-Va9p; Mon, 28 Dec 2020 18:13:54 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id D281E874B9; Mon, 28 Dec 2020 18:12:10 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 804BDC1EEA; Mon, 28 Dec 2020 18:12:10 +0000 (UTC) X-Original-To: ovs-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 571EFC0893 for ; Mon, 28 Dec 2020 09:26:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 452EA2046B for ; Mon, 28 Dec 2020 09:26: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 euMLIQmkRP7Q for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by silver.osuosl.org (Postfix) with ESMTP id A779B20487 for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app03-12003 (RichMail) with SMTP id 2ee35fe9a495549-bee50; Mon, 28 Dec 2020 17:25:41 +0800 (CST) X-RM-TRANSID: 2ee35fe9a495549-bee50 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b87c; Mon, 28 Dec 2020 17:25:41 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b87c From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:40 -0800 Message-Id: <20201228092520.11807-23-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 22/62] netdev-offload-dpdk: fix dpif_type caused thread dead lock 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin NOTE: https://patchwork.ozlabs.org/patch/1205684/ Code Source From: Self Code Description: fix dpif_type caused thread dead lock Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 1 + lib/netdev-offload-dpdk.c | 17 +++++++++++------ lib/netdev-offload.h | 1 + 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 74ceadc..008ffa8 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2437,6 +2437,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) } } info.flow_mark = mark; + info.dpif_type_str = dpif_type_str; port = netdev_ports_get(in_port, dpif_type_str); if (!port) { diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 3e268bf..ea1eb2e 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -628,14 +628,14 @@ free_flow_actions(struct flow_actions *actions) actions->cnt = 0; } -static int +static void parse_vxlan_match(struct flow_patterns *patterns, const struct match *match) { struct rte_flow_item_vxlan *vx_spec, *vx_mask; if (is_all_zeros(&match->wc.masks.tunnel, sizeof match->wc.masks.tunnel)) { - return 0; + return ; } VLOG_DBG("TIMO:in parse_vxlan_match"); @@ -656,7 +656,7 @@ parse_vxlan_match(struct flow_patterns *patterns, htonl(ntohll(match->wc.masks.tunnel.tun_id) << 8)); add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_VXLAN, vx_spec, vx_mask); - return 0; + return ; } static int @@ -994,7 +994,7 @@ add_output_action(struct netdev *netdev, int ret = 0; port = nl_attr_get_odp_port(nla); - outdev = netdev_ports_get(port, netdev->dpif_type); + outdev = netdev_ports_get(port, info->dpif_type_str); if (outdev == NULL) { VLOG_DBG_RL(&rl, "Cannot find netdev for odp port %"PRIu32, port); return -1; @@ -1247,11 +1247,14 @@ parse_clone_actions(struct netdev *netdev, } else if (clone_type == OVS_ACTION_ATTR_OUTPUT) { if (add_output_action(netdev, actions, ca, info)) { return -1; + } + /* } else if (info->valid_ucast) { VLOG_DBG_RL(&rl, "Unsupported multicast output action"); return -1; + info->valid_ucast = true; } - info->valid_ucast = true; + */ } else if (clone_type == OVS_ACTION_ATTR_PUSH_VLAN) { const struct ovs_action_push_vlan *vlan = nl_attr_get(ca); struct rte_flow_action_of_push_vlan *vlan_tci; @@ -1292,11 +1295,13 @@ parse_flow_actions(struct netdev *netdev, if (nl_attr_type(nla) == OVS_ACTION_ATTR_OUTPUT) { if (add_output_action(netdev, actions, nla, info)) { return -1; + /* } else if (info->valid_ucast) { VLOG_DBG_RL(&rl, "Unsupported multicast output action"); return -1; + info->valid_ucast = true; + */ } - info->valid_ucast = true; } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_DROP) { add_flow_action(actions, RTE_FLOW_ACTION_TYPE_DROP, NULL); } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_SET || diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index 8264e32..a4b8d5f 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -78,6 +78,7 @@ struct offload_info { * to delete the original flow. */ bool valid_ucast; /* flag to judge multicast && broadcast */ bool vxlan_decap; /* flag to turn on vxlan decap */ + const char *dpif_type_str; /* dpif type string. */ }; int netdev_flow_flush(struct netdev *); From patchwork Mon Dec 28 09:24:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420992 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QdG0njrz9sWC for ; Tue, 29 Dec 2020 05:12:50 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 6C95987019; Mon, 28 Dec 2020 18:12:48 +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 zsaq+ZVauGxT; Mon, 28 Dec 2020 18:12:41 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 051D886D2E; Mon, 28 Dec 2020 18:11:02 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id D35EDC1DE1; Mon, 28 Dec 2020 18:11:01 +0000 (UTC) X-Original-To: ovs-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 7BF37C1DA5 for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 219B1820E7 for ; Mon, 28 Dec 2020 09:26:06 +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 1i6zGiExC1eS for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by hemlock.osuosl.org (Postfix) with ESMTP id C76A2870B4 for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app09-12009 (RichMail) with SMTP id 2ee95fe9a4960c5-bef3a; Mon, 28 Dec 2020 17:25:42 +0800 (CST) X-RM-TRANSID: 2ee95fe9a4960c5-bef3a X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b87d; Mon, 28 Dec 2020 17:25:42 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b87d From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:41 -0800 Message-Id: <20201228092520.11807-24-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 23/62] When vxlan decap vport should be changed to uplink port to call rte_flow_create 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: When vxlan decap vport should be changed to uplink port to call rte_flow_create Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-dpdk.c | 21 +++++++++++ lib/netdev-dpdk.h | 3 ++ lib/netdev-offload-dpdk.c | 91 ++++++++++++++++++++++++++++++----------------- lib/netdev-offload.h | 2 -- 4 files changed, 82 insertions(+), 35 deletions(-) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 22f7044..cd3d156 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -5328,6 +5328,25 @@ out: } 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;*/ + ret = (dev->type == DPDK_DEV_ETH); + ovs_mutex_unlock(&dev->mutex); +out: + return ret; +} + +bool netdev_dpdk_flow_api_supported(struct netdev *netdev) { struct netdev_dpdk *dev; @@ -5378,8 +5397,10 @@ netdev_dpdk_rte_flow_create(struct netdev *netdev, struct rte_flow *flow; struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); + VLOG_DBG("TIMO DBG: in netdev_dpdk_rte_flow_create"); ovs_mutex_lock(&dev->mutex); flow = rte_flow_create(dev->port_id, attr, items, actions, error); + VLOG_DBG("TIMO DBG: after rte_flow_create"); ovs_mutex_unlock(&dev->mutex); return flow; } diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h index 848346c..811992c 100644 --- a/lib/netdev-dpdk.h +++ b/lib/netdev-dpdk.h @@ -56,6 +56,9 @@ netdev_dpdk_rte_flow_query_count(struct netdev *netdev, int netdev_dpdk_get_port_id(struct netdev *netdev); +bool +netdev_dpdk_is_uplink_port(struct netdev *netdev); + #else static inline void diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index ea1eb2e..445ca22 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -142,6 +142,7 @@ struct flow_actions { struct rte_flow_action *actions; int cnt; int current_max; + bool valid_ucast; /* flag to judge multicast && broadcast */ }; static void @@ -516,6 +517,7 @@ netdev_offload_dpdk_flow_create(struct netdev *netdev, struct rte_flow *flow; struct ds s; + VLOG_DBG("TIMO DBG: in netdev_offload_dpdk_flow_create %s",netdev->name); flow = netdev_dpdk_rte_flow_create(netdev, attr, items, actions, error); /* work around: for dump_flow even if rte_flow create fail */ if (!VLOG_DROP_DBG(&rl)) { @@ -580,6 +582,11 @@ add_flow_action(struct flow_actions *actions, enum rte_flow_action_type type, { int cnt = actions->cnt; + if ( (actions->valid_ucast == true) && + (type == RTE_FLOW_ACTION_TYPE_PORT_ID) ) { + VLOG_DBG_RL(&rl, "Unsupported multicast output action"); + return ; + } if (cnt == 0) { actions->current_max = 8; actions->actions = xcalloc(actions->current_max, @@ -593,6 +600,8 @@ add_flow_action(struct flow_actions *actions, enum rte_flow_action_type type, actions->actions[cnt].type = type; actions->actions[cnt].conf = conf; actions->cnt++; + actions->valid_ucast = (type == RTE_FLOW_ACTION_TYPE_PORT_ID)? + true : actions->valid_ucast; } static void @@ -626,16 +635,17 @@ free_flow_actions(struct flow_actions *actions) free(actions->actions); actions->actions = NULL; actions->cnt = 0; + actions->valid_ucast = false; } -static void +static int parse_vxlan_match(struct flow_patterns *patterns, const struct match *match) { struct rte_flow_item_vxlan *vx_spec, *vx_mask; if (is_all_zeros(&match->wc.masks.tunnel, sizeof match->wc.masks.tunnel)) { - return ; + return -1; } VLOG_DBG("TIMO:in parse_vxlan_match"); @@ -656,32 +666,29 @@ parse_vxlan_match(struct flow_patterns *patterns, htonl(ntohll(match->wc.masks.tunnel.tun_id) << 8)); add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_VXLAN, vx_spec, vx_mask); - return ; + return 0; } static int parse_flow_match(struct flow_patterns *patterns, - const struct match *match, + struct match *match, struct netdev *netdev, struct offload_info *info) { uint8_t *next_proto_mask = NULL; uint8_t proto = 0; - struct match consumed_match; struct flow *consumed_masks; - memcpy(&consumed_match, match, sizeof consumed_match); - consumed_masks = &(consumed_match.wc.masks); + consumed_masks = &match->wc.masks; /* Not attemp to offload in_port/recirc_id ? */ memset(&consumed_masks->in_port, 0, sizeof consumed_masks->in_port); consumed_masks->recirc_id = 0; consumed_masks->packet_type = 0; - if (!strcmp(netdev_get_type(netdev), "vxlan")) { - parse_vxlan_match(patterns, match); + if (!strcmp(netdev_get_type(netdev), "vxlan") && + !parse_vxlan_match(patterns, match)) { memset(&consumed_masks->tunnel, 0, sizeof consumed_masks->tunnel); - info->vxlan_decap = true; } else if (netdev_vport_is_vport_class(netdev->netdev_class)) { VLOG_DBG("in port (%s) not supported", netdev->name); return -1; @@ -946,14 +953,16 @@ netdev_offload_dpdk_mark_rss(struct flow_patterns *patterns, .ingress = 1, .egress = 0 }; - struct rte_flow_error error; struct rte_flow *flow; + /* work around : not do mark rss action + struct rte_flow_error error; add_flow_mark_rss_actions(&actions, flow_mark, netdev); flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items, actions.actions, &error); + */ free_flow_actions(&actions); return flow; } @@ -973,6 +982,7 @@ add_port_id_action(struct flow_actions *actions, struct rte_flow_action_port_id *port_id; int outdev_id; + VLOG_DBG("TIMO DBG: in add_port_id_action"); outdev_id = netdev_dpdk_get_port_id(outdev); if (outdev_id < 0) { return -1; @@ -993,6 +1003,7 @@ add_output_action(struct netdev *netdev, odp_port_t port; int ret = 0; + VLOG_DBG("TIMO DBG: in add_output_action"); port = nl_attr_get_odp_port(nla); outdev = netdev_ports_get(port, info->dpif_type_str); if (outdev == NULL) { @@ -1221,6 +1232,13 @@ err: return -1; } +static void +add_vxlan_decap_action(struct flow_actions *actions) +{ + VLOG_DBG("TIMO DBG: in add_vxlan_decap_action"); + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_VXLAN_DECAP, NULL); +} + static int parse_clone_actions(struct netdev *netdev, struct flow_actions *actions, @@ -1248,13 +1266,6 @@ parse_clone_actions(struct netdev *netdev, if (add_output_action(netdev, actions, ca, info)) { return -1; } - /* - } else if (info->valid_ucast) { - VLOG_DBG_RL(&rl, "Unsupported multicast output action"); - return -1; - info->valid_ucast = true; - } - */ } else if (clone_type == OVS_ACTION_ATTR_PUSH_VLAN) { const struct ovs_action_push_vlan *vlan = nl_attr_get(ca); struct rte_flow_action_of_push_vlan *vlan_tci; @@ -1288,6 +1299,9 @@ parse_flow_actions(struct netdev *netdev, uint8_t i = 0; + if (nl_actions_len != 0 && !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) { @@ -1295,12 +1309,6 @@ parse_flow_actions(struct netdev *netdev, if (nl_attr_type(nla) == OVS_ACTION_ATTR_OUTPUT) { if (add_output_action(netdev, actions, nla, info)) { return -1; - /* - } else if (info->valid_ucast) { - VLOG_DBG_RL(&rl, "Unsupported multicast output action"); - return -1; - info->valid_ucast = true; - */ } } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_DROP) { add_flow_action(actions, RTE_FLOW_ACTION_TYPE_DROP, NULL); @@ -1338,10 +1346,6 @@ parse_flow_actions(struct netdev *netdev, } } - if (info->vxlan_decap) { - add_flow_action(actions, RTE_FLOW_ACTION_TYPE_VXLAN_DECAP, NULL); - info->vxlan_decap = false; - } if (nl_actions_len == 0) { VLOG_DBG_RL(&rl, "No actions provided"); return -1; @@ -1359,17 +1363,38 @@ netdev_offload_dpdk_actions(struct netdev *netdev, struct offload_info *info) { const struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1 }; - struct flow_actions actions = { .actions = NULL, .cnt = 0 }; + struct flow_actions actions = { .actions = NULL, .cnt = 0, + .valid_ucast = false }; struct rte_flow *flow = NULL; struct rte_flow_error error; - int ret; + int ret,i; ret = parse_flow_actions(netdev, &actions, nl_actions, actions_len, info); if (ret) { + VLOG_DBG("TIMO DBG: after parse_flow_actions, ret is -1"); goto out; } - flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items, - actions.actions, &error); + if (netdev_vport_is_vport_class(netdev->netdev_class)) { + struct netdev_flow_dump **netdev_dumps; + int num_ports = 0; + + netdev_dumps = netdev_ports_flow_dump_create(netdev->dpif_type, + &num_ports); + for (i = 0; i < num_ports; i++) { + if (!netdev_dpdk_is_uplink_port(netdev_dumps[i]->netdev)) { + continue; + } + VLOG_DBG("TIMO DBG: in netdev_offload_dpdk_flow_create, netdev dpdk"); + flow = netdev_offload_dpdk_flow_create(netdev_dumps[i]->netdev, + &flow_attr, patterns->items, + actions.actions, &error); + break; + } + + } else { + flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items, + actions.actions, &error); + } out: free_flow_actions(&actions); return flow; @@ -1377,7 +1402,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, diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index a4b8d5f..f15f86f 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -76,8 +76,6 @@ struct offload_info { bool tc_modify_flow_deleted; /* Indicate the tc modify flow put success * to delete the original flow. */ - bool valid_ucast; /* flag to judge multicast && broadcast */ - bool vxlan_decap; /* flag to turn on vxlan decap */ const char *dpif_type_str; /* dpif type string. */ }; From patchwork Mon Dec 28 09:24:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420967 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qbv3xGRz9sWC for ; Tue, 29 Dec 2020 05:11:39 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 1B88987297; Mon, 28 Dec 2020 18:11:38 +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 lgg+KDaDDqIX; Mon, 28 Dec 2020 18:11:33 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 1B3DB86DE4; Mon, 28 Dec 2020 18:10:46 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id DFB57C1787; Mon, 28 Dec 2020 18:10:45 +0000 (UTC) X-Original-To: ovs-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 876F7C0891 for ; Mon, 28 Dec 2020 09:26:05 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 76C3086C8C for ; Mon, 28 Dec 2020 09:26: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 3xHSiv1ZvYzX for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by whitealder.osuosl.org (Postfix) with ESMTP id AB4F086C8E for ; Mon, 28 Dec 2020 09:26:03 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app11-12011 (RichMail) with SMTP id 2eeb5fe9a4954fe-c1ba5; Mon, 28 Dec 2020 17:25:42 +0800 (CST) X-RM-TRANSID: 2eeb5fe9a4954fe-c1ba5 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b881; Mon, 28 Dec 2020 17:25:42 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b881 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:42 -0800 Message-Id: <20201228092520.11807-25-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 24/62] netdev-offload-dpdk: add dpdk flow_dump_crate flow_dump_destroy 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: add dpdk flow_dump_crate flow_dump_destroy api Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 445ca22..63379e3 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -1390,6 +1390,13 @@ netdev_offload_dpdk_actions(struct netdev *netdev, actions.actions, &error); break; } + 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)); + } + } } else { flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items, @@ -1643,10 +1650,33 @@ out: return ret; } +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, .flow_del = netdev_offload_dpdk_flow_del, .init_flow_api = netdev_offload_dpdk_init_flow_api, .flow_get = netdev_offload_dpdk_flow_get, + .flow_dump_create = netdev_offload_dpdk_flow_dump_create, + .flow_dump_destroy = netdev_offload_dpdk_flow_dump_destroy, }; From patchwork Mon Dec 28 09:24:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420978 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QcY0WmQz9sVv for ; Tue, 29 Dec 2020 05:12:13 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 2E1A8275A5; Mon, 28 Dec 2020 18:12: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 r9v9YavsVHSF; Mon, 28 Dec 2020 18:11:57 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 8B0CE27261; Mon, 28 Dec 2020 18:11:10 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 41BAFC1E88; Mon, 28 Dec 2020 18:11:10 +0000 (UTC) X-Original-To: ovs-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 E75F2C0891 for ; Mon, 28 Dec 2020 09:26:07 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id D5C9286C73 for ; Mon, 28 Dec 2020 09:26:07 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id YkU33lJDflLS for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by whitealder.osuosl.org (Postfix) with ESMTP id A9F9486C8A for ; Mon, 28 Dec 2020 09:26:03 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app11-12011 (RichMail) with SMTP id 2eeb5fe9a497502-c1ba9; Mon, 28 Dec 2020 17:25:43 +0800 (CST) X-RM-TRANSID: 2eeb5fe9a497502-c1ba9 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b887; Mon, 28 Dec 2020 17:25:43 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b887 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:44 -0800 Message-Id: <20201228092520.11807-27-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 26/62] netdev-offload-dpdk: Add geneve push/pop (non option hdr) 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin NOTE: there're some TBD should be fixed Code Source From: Self Code Description: Add geneve push/pop (non option hdr) Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 172 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 63379e3..472aa6e 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -352,6 +352,25 @@ dump_flow_pattern(struct ds *s, const struct rte_flow_item *item) ds_put_cstr(s, " Mask = null\n"); } ds_put_cstr(s, "/ "); + } else if (item->type == RTE_FLOW_ITEM_TYPE_GENEVE) { + const struct rte_flow_item_geneve *geneve_spec = item->spec; + const struct rte_flow_item_geneve *geneve_mask = item->mask; + + ds_put_cstr(s, "rte flow geneve pattern:\n"); + ds_put_cstr(s, "geneve "); + if (geneve_spec) { + ds_put_format(s, "vni spec %d ", + ntohl(*(ovs_be32 *)geneve_spec->vni) >> 8); + } else { + ds_put_cstr(s, " Spec = null\n"); + } + if (geneve_mask) { + ds_put_format(s, "vni mask 0x%06x ", + ntohl(*(ovs_be32 *)geneve_mask->vni) >> 8); + } else { + ds_put_cstr(s, " Mask = null\n"); + } + ds_put_cstr(s, "/ "); } else { ds_put_format(s, "unknown rte flow pattern (%d)\n", item->type); } @@ -422,6 +441,19 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) } } else if (actions->type == RTE_FLOW_ACTION_TYPE_VXLAN_DECAP) { ds_put_format(s, "vxlan-decap: nop\n"); + /* TBD + } else if (actions->type == RTE_FLOW_ACTION_TYPE_GENEVE_ENCAP) { + const struct rte_flow_action_geneve_encap *geneve_encap = actions->conf; + const struct rte_flow_item *items = geneve_encap->definition; + + ds_put_cstr(s, "rte flow geneve-encap action:\n"); + ds_put_cstr(s, "geneve_encap / "); + while (items && items->type != RTE_FLOW_ITEM_TYPE_END) { + dump_flow_pattern(s, items++); + } + } else if (actions->type == RTE_FLOW_ACTION_TYPE_GENEVE_DECAP) { + ds_put_format(s, "geneve-decap: nop\n"); + */ } else if (actions->type == RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN) { const struct rte_flow_action_of_push_vlan *vlan_tci = actions->conf; @@ -670,6 +702,38 @@ parse_vxlan_match(struct flow_patterns *patterns, } static int +parse_geneve_match(struct flow_patterns *patterns, + const struct match *match) +{ + struct rte_flow_item_geneve *vx_spec, *vx_mask; + + if (is_all_zeros(&match->wc.masks.tunnel, sizeof match->wc.masks.tunnel)) { + return -1; + } + VLOG_DBG("TIMO:in parse_geneve_match"); + + /* no need to tranmit layer2/layer3/layer4 as + * for outer key fpga only support vni */ + /* + ret = parse_tnl_ip_match(patterns, match, IPPROTO_UDP); + parse_tnl_udp_match(patterns, match); + */ + + /* GENEVE */ + 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)); + + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_GENEVE, vx_spec, vx_mask); + /* TBD: add option hdr */ + return 0; +} + +static int parse_flow_match(struct flow_patterns *patterns, struct match *match, struct netdev *netdev, @@ -689,6 +753,9 @@ parse_flow_match(struct flow_patterns *patterns, if (!strcmp(netdev_get_type(netdev), "vxlan") && !parse_vxlan_match(patterns, match)) { memset(&consumed_masks->tunnel, 0, sizeof consumed_masks->tunnel); + } else if (!strcmp(netdev_get_type(netdev), "geneve") && + !parse_geneve_match(patterns, match)) { + memset(&consumed_masks->tunnel, 0, sizeof consumed_masks->tunnel); } else if (netdev_vport_is_vport_class(netdev->netdev_class)) { VLOG_DBG("in port (%s) not supported", netdev->name); return -1; @@ -1232,6 +1299,96 @@ err: return -1; } +#define ACTION_GENEVE_ENCAP_ITEMS_NUM 5 + +static int +add_geneve_encap_action(struct flow_actions *actions, + const void *header) +{ + const struct eth_header *eth; + const struct udp_header *udp; + struct geneve_data { + /* TBD + struct rte_flow_action_geneve_encap conf; + */ + struct rte_flow_action_vxlan_encap conf; + struct rte_flow_item items[0]; + } *geneve_data; + BUILD_ASSERT_DECL(offsetof(struct geneve_data, conf) == 0); + const void *geneve; + const void *l3; + const void *l4; + int field; + + VLOG_DBG("TIMO DBG: in add_geneve_encap_action"); + geneve_data = xzalloc(sizeof *geneve_data + + sizeof(struct rte_flow_item) * + ACTION_GENEVE_ENCAP_ITEMS_NUM); + field = 0; + + eth = header; + /* Ethernet */ + geneve_data->items[field].type = RTE_FLOW_ITEM_TYPE_ETH; + geneve_data->items[field].spec = eth; + geneve_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; + + geneve_data->items[field].type = RTE_FLOW_ITEM_TYPE_IPV4; + geneve_data->items[field].spec = ip; + geneve_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; + + geneve_data->items[field].type = RTE_FLOW_ITEM_TYPE_IPV6; + geneve_data->items[field].spec = ip6; + geneve_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; + geneve_data->items[field].type = RTE_FLOW_ITEM_TYPE_UDP; + geneve_data->items[field].spec = udp; + geneve_data->items[field].mask = &rte_flow_item_udp_mask; + field++; + + geneve = (udp + 1); + geneve_data->items[field].type = RTE_FLOW_ITEM_TYPE_GENEVE; + geneve_data->items[field].spec = geneve; + geneve_data->items[field].mask = &rte_flow_item_geneve_mask; + field++; + + geneve_data->items[field].type = RTE_FLOW_ITEM_TYPE_END; + + geneve_data->conf.definition = geneve_data->items; + + /* TBD + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_GENEVE_ENCAP, geneve_data); + */ + + return 0; +err: + free(geneve_data); + return -1; +} + static void add_vxlan_decap_action(struct flow_actions *actions) { @@ -1239,6 +1396,16 @@ add_vxlan_decap_action(struct flow_actions *actions) add_flow_action(actions, RTE_FLOW_ACTION_TYPE_VXLAN_DECAP, NULL); } +static void +add_geneve_decap_action(struct flow_actions *actions) +{ + VLOG_DBG("TIMO DBG: in add_geneve_decap_action"); + /* TBD need change to geneve decap + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_GENEVE_DECAP, NULL); + */ + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_VXLAN_DECAP, NULL); +} + static int parse_clone_actions(struct netdev *netdev, struct flow_actions *actions, @@ -1261,6 +1428,9 @@ parse_clone_actions(struct netdev *netdev, if (tnl_push->tnl_type == OVS_VPORT_TYPE_VXLAN && !add_vxlan_encap_action(actions, tnl_push->header)) { continue; + } else if (tnl_push->tnl_type == OVS_VPORT_TYPE_GENEVE && + !add_geneve_encap_action(actions, tnl_push->header)) { + continue; } } else if (clone_type == OVS_ACTION_ATTR_OUTPUT) { if (add_output_action(netdev, actions, ca, info)) { @@ -1301,6 +1471,8 @@ parse_flow_actions(struct netdev *netdev, if (nl_actions_len != 0 && !strcmp(netdev_get_type(netdev), "vxlan")) { add_vxlan_decap_action(actions); + } else if (nl_actions_len != 0 && !strcmp(netdev_get_type(netdev), "geneve")) { + add_geneve_decap_action(actions); } add_count_action(actions); NL_ATTR_FOR_EACH_UNSAFE (nla, left, nl_actions, nl_actions_len) { From patchwork Mon Dec 28 09:24:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420991 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QdF4SNSz9sVv for ; Tue, 29 Dec 2020 05:12:49 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 1F40B2E363; Mon, 28 Dec 2020 18:12:48 +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 Ub2ZUAo7W2iF; Mon, 28 Dec 2020 18:12:42 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 6667C2DADE; Mon, 28 Dec 2020 18:11:16 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 2953FC1EA4; Mon, 28 Dec 2020 18:11:16 +0000 (UTC) X-Original-To: ovs-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 C2856C1DA7 for ; Mon, 28 Dec 2020 09:26:09 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id AD39E84FB8 for ; Mon, 28 Dec 2020 09:26:09 +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 zHPj3EV+jcdN for ; Mon, 28 Dec 2020 09:26:07 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by hemlock.osuosl.org (Postfix) with ESMTP id 9F2E1816DB for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app12-12012 (RichMail) with SMTP id 2eec5fe9a497fdf-c1482; Mon, 28 Dec 2020 17:25:44 +0800 (CST) X-RM-TRANSID: 2eec5fe9a497fdf-c1482 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b88d; Mon, 28 Dec 2020 17:25:43 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b88d From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:45 -0800 Message-Id: <20201228092520.11807-28-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 27/62] netdev-offload-dpdk: disable recirc_id check 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: disable recirc_id check Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 472aa6e..bb0b91d 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -1646,9 +1646,11 @@ netdev_offload_dpdk_validate_flow(const struct match *match) } /* recirc id must be zero. */ + /* support recirc now so mark this checker if (match_zero_wc.flow.recirc_id) { goto err; } + */ if (masks->ct_state || masks->ct_nw_proto || masks->ct_zone || masks->ct_mark || From patchwork Mon Dec 28 09:24:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420972 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qc90gfDz9sWC for ; Tue, 29 Dec 2020 05:11:53 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 91C87870C0; Mon, 28 Dec 2020 18:11:51 +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 5bcqqtf9rDrZ; Mon, 28 Dec 2020 18:11:48 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id F1A168721F; Mon, 28 Dec 2020 18:11:25 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id A1BFBC1E62; Mon, 28 Dec 2020 18:11:25 +0000 (UTC) X-Original-To: ovs-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 BF0F1C0891 for ; Mon, 28 Dec 2020 09:26:17 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id AE80B86C4C for ; Mon, 28 Dec 2020 09:26:17 +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 zXFzwmKDMrDF for ; Mon, 28 Dec 2020 09:26:17 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by whitealder.osuosl.org (Postfix) with ESMTP id 86AE786C8F for ; Mon, 28 Dec 2020 09:26:15 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app02-12002 (RichMail) with SMTP id 2ee25fe9a497d66-bebef; Mon, 28 Dec 2020 17:25:44 +0800 (CST) X-RM-TRANSID: 2ee25fe9a497d66-bebef X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b88f; Mon, 28 Dec 2020 17:25:44 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b88f From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:46 -0800 Message-Id: <20201228092520.11807-29-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 28/62] netdev-offload-dpdk: delete mask effect in parse_flow_match 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: delete mask effect in parse_flow_match Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index bb0b91d..11b04b5 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -762,8 +762,7 @@ parse_flow_match(struct flow_patterns *patterns, } /* Eth */ - if (!eth_addr_is_zero(match->wc.masks.dl_src) || - !eth_addr_is_zero(match->wc.masks.dl_dst)) { + if (match->flow.packet_type == htonl(PT_ETH)) { struct rte_flow_item_eth *spec, *mask; spec = xzalloc(sizeof *spec); @@ -845,26 +844,24 @@ parse_flow_match(struct flow_patterns *patterns, consumed_masks->nw_src = 0; consumed_masks->nw_dst = 0; - /* Save proto for L4 protocol setup. */ + /* Save proto for L4 protocol setup.Not consider mask proto = spec->hdr.next_proto_id & mask->hdr.next_proto_id; + */ + proto = spec->hdr.next_proto_id ; next_proto_mask = &mask->hdr.next_proto_id; + } else { + /* if eth_type is not IP ,just transit eth rte_flow */ + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_END, NULL, NULL); + return 0; } if (proto != IPPROTO_ICMP && proto != IPPROTO_UDP && - proto != IPPROTO_SCTP && proto != IPPROTO_TCP && - (match->wc.masks.tp_src || - match->wc.masks.tp_dst || - match->wc.masks.tcp_flags)) { + proto != IPPROTO_SCTP && proto != IPPROTO_TCP ){ VLOG_DBG("L4 Protocol (%u) not supported", proto); return -1; } - 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; - } - if (proto == IPPROTO_TCP) { struct rte_flow_item_tcp *spec, *mask; From patchwork Mon Dec 28 09:24:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420988 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qd01v3sz9sWC for ; Tue, 29 Dec 2020 05:12:36 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 6E94A86B3B; Mon, 28 Dec 2020 18:12:34 +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 e-i7lO3Yy2eF; Mon, 28 Dec 2020 18:12:28 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by fraxinus.osuosl.org (Postfix) with ESMTP id 4C15C869C5; Mon, 28 Dec 2020 18:11:59 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 04A54C1FA9; Mon, 28 Dec 2020 18:11:59 +0000 (UTC) X-Original-To: ovs-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 ACC71C0891 for ; Mon, 28 Dec 2020 09:26:34 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 9905B819CF for ; Mon, 28 Dec 2020 09:26:34 +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 jZFpW5j8NRmQ for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by hemlock.osuosl.org (Postfix) with ESMTP id 7ECA881EDB for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app08-12008 (RichMail) with SMTP id 2ee85fe9a497f49-c07e8; Mon, 28 Dec 2020 17:25:44 +0800 (CST) X-RM-TRANSID: 2ee85fe9a497f49-c07e8 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b892; Mon, 28 Dec 2020 17:25:44 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b892 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:47 -0800 Message-Id: <20201228092520.11807-30-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 29/62] dpif-netdev: try to offload flow after dpcls_lookup 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin The original netdev datapath offload mechanism is based on mega_ufid, But Intel FPGA card only support exact match, so there is a so called "wildcard" situation when the pkt miss FPGA table search and slow path EMC cache search but hit in dpcls cache. As for original offload mechanism, we won't try to offload such flows(as the mega_ufid is the same as before) This patch tries to use ufid instead of mega_ufid during offloading. So the original megaufid_to_mark and flow_to_mark mapping can be kept. Also as for flows that has been offloaded but failed, we won't waste effort to offload that flow again. So a offload_fail status flag is added in megaufid_to_mark mapping. Before append offload list, we should try to check this flag. This patch changed offloading mechanism, should be considered carefully, and task more tests. Code Source From: Self Code Description: see above Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 100 insertions(+), 12 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 008ffa8..db28b88 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2155,6 +2155,7 @@ struct megaflow_to_mark_data { const struct cmap_node node; ovs_u128 mega_ufid; uint32_t mark; + bool offload_failed; /* indicate if this ufid has been offloaded fail */ }; struct flow_mark { @@ -2193,13 +2194,15 @@ flow_mark_free(uint32_t 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) +megaflow_to_mark_associate(const ovs_u128 *mega_ufid, uint32_t mark, + bool offload_failed) { size_t hash = dp_netdev_flow_hash(mega_ufid); struct megaflow_to_mark_data *data = xzalloc(sizeof(*data)); data->mega_ufid = *mega_ufid; data->mark = mark; + data->offload_failed = offload_failed; cmap_insert(&flow_mark.megaflow_to_mark, CONST_CAST(struct cmap_node *, &data->node), hash); @@ -2242,6 +2245,23 @@ megaflow_to_mark_find(const ovs_u128 *mega_ufid) return INVALID_FLOW_MARK; } +static inline bool +megaflow_to_offload_st_find(const ovs_u128 *mega_ufid) +{ + size_t hash = dp_netdev_flow_hash(mega_ufid); + struct megaflow_to_mark_data *data; + + CMAP_FOR_EACH_WITH_HASH (data, node, hash, &flow_mark.megaflow_to_mark) { + if (ovs_u128_equals(*mega_ufid, data->mega_ufid)) { + return data->offload_failed; + } + } + + VLOG_DBG("Offload status of Mark id for ufid "UUID_FMT" was not found \n", + UUID_ARGS((struct uuid *)mega_ufid)); + return false; +} + /* associate mark with a flow, which is 1:N mapping */ static void mark_to_flow_associate(const uint32_t mark, struct dp_netdev_flow *flow) @@ -2297,7 +2317,7 @@ mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd, /* Taking a global 'port_mutex' to fulfill thread safety * restrictions for the netdev-offload-dpdk module. */ ovs_mutex_lock(&pmd->dp->port_mutex); - ret = netdev_flow_del(port, &flow->mega_ufid, NULL); + ret = netdev_flow_del(port, &flow->ufid, NULL); ovs_mutex_unlock(&pmd->dp->port_mutex); netdev_close(port); } @@ -2305,7 +2325,7 @@ mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd, flow_mark_free(mark); VLOG_DBG("Freed flow mark %u\n", mark); - megaflow_to_mark_disassociate(&flow->mega_ufid); + megaflow_to_mark_disassociate(&flow->ufid); } dp_netdev_flow_unref(flow); @@ -2420,7 +2440,10 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) * If a mega flow has already been offloaded (from other PMD * instances), do not offload it again. */ - mark = megaflow_to_mark_find(&flow->mega_ufid); + mark = megaflow_to_mark_find(&flow->ufid); + if (megaflow_to_offload_st_find(&flow->ufid) == true) { + return -1; + } if (mark != INVALID_FLOW_MARK) { VLOG_DBG("Flow has already been offloaded with mark %u\n", mark); if (flow->mark != INVALID_FLOW_MARK) { @@ -2448,7 +2471,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) ovs_mutex_lock(&pmd->dp->port_mutex); ret = netdev_flow_put(port, &offload->match, CONST_CAST(struct nlattr *, offload->actions), - offload->actions_len, &flow->mega_ufid, &info, + offload->actions_len, &flow->ufid, &info, NULL); ovs_mutex_unlock(&pmd->dp->port_mutex); netdev_close(port); @@ -2458,14 +2481,25 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) } if (!modification) { - megaflow_to_mark_associate(&flow->mega_ufid, mark); + megaflow_to_mark_associate(&flow->ufid, mark,false); mark_to_flow_associate(mark, flow); + VLOG_DBG("TIMO DBG: associate ufid with st false"); + VLOG_DBG("TIMO DBG: ufid:"UUID_FMT" mark:%u \n", + UUID_ARGS((struct uuid *)&flow->ufid),mark); } return 0; err_free: if (!modification) { - flow_mark_free(mark); + /*flow_mark_free(mark);*/ + /* If offloaded fail, also generate ufid->mark mapping + * we waste some mark values in pool , but can get offload + * status + */ + megaflow_to_mark_associate(&flow->ufid, mark,true); + VLOG_DBG("TIMO DBG: associate ufid with st true"); + VLOG_DBG("TIMO DBG: ufid:"UUID_FMT" mark:%u \n", + UUID_ARGS((struct uuid *)&flow->ufid),mark); } else { mark_to_flow_disassociate(pmd, flow); } @@ -3060,7 +3094,7 @@ dpif_netdev_get_flow_offload_status(const struct dp_netdev *dp, /* Taking a global 'port_mutex' to fulfill thread safety * restrictions for the netdev-offload-dpdk module. */ ovs_mutex_lock(&dp->port_mutex); - ret = netdev_flow_get(netdev, &match, &actions, &netdev_flow->mega_ufid, + ret = netdev_flow_get(netdev, &match, &actions, &netdev_flow->ufid, stats, attrs, &buf); ovs_mutex_unlock(&dp->port_mutex); netdev_close(netdev); @@ -3362,7 +3396,10 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd, cmap_insert(&pmd->flow_table, CONST_CAST(struct cmap_node *, &flow->node), dp_netdev_flow_hash(&flow->ufid)); - queue_netdev_flow_put(pmd, flow, match, actions, actions_len); + /*Don't try to offload flows that has been offloaded failed */ + if (megaflow_to_offload_st_find(&flow->ufid) == false) { + queue_netdev_flow_put(pmd, flow, match, actions, actions_len); + } if (OVS_UNLIKELY(!VLOG_DROP_DBG((&upcall_rl)))) { struct ds ds = DS_EMPTY_INITIALIZER; @@ -3451,8 +3488,11 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd, old_actions = dp_netdev_flow_get_actions(netdev_flow); ovsrcu_set(&netdev_flow->actions, new_actions); - queue_netdev_flow_put(pmd, netdev_flow, match, - put->actions, put->actions_len); + /*Don't try to offload flows that has been offloaded failed */ + if (megaflow_to_offload_st_find(&netdev_flow->ufid) == false) { + queue_netdev_flow_put(pmd, netdev_flow, match, + put->actions, put->actions_len); + } if (stats) { get_dpif_flow_status(pmd->dp, netdev_flow, stats, NULL); @@ -4212,7 +4252,37 @@ dp_netdev_actions_free(struct dp_netdev_actions *actions) { free(actions); } - + +static void +dp_netdev_append_hw_offload(struct dp_netdev_pmd_thread *pmd, + struct dp_netdev_flow *flow) +{ + struct match flow_put_match; + struct dp_netdev_actions *flow_put_actions; + struct dp_flow_offload_item *offload; + int op = DP_NETDEV_FLOW_OFFLOAD_OP_ADD; + + match_wc_init(&flow_put_match,&(flow->flow)); + /* If this flow has been offloaded, but fail, won't offload again + * Otherwise if this flow has been offloaded succeded, it means + * although the ufid is the same, but exact flow is different + * in this scenario, or hw flow is ageout. we should also try to + * offload it to hw + */ + if (megaflow_to_offload_st_find(&flow->ufid) == true) { + return ; + } + flow_put_actions = dp_netdev_flow_get_actions(flow); + + offload = dp_netdev_alloc_flow_offload(pmd, flow, op); + offload->match = flow_put_match; + offload->actions = xmalloc(flow_put_actions->size); + memcpy(offload->actions, flow_put_actions->actions, flow_put_actions->size); + offload->actions_len = flow_put_actions->size; + + dp_netdev_append_flow_offload(offload); +} + static void dp_netdev_rxq_set_cycles(struct dp_netdev_rxq *rx, enum rxq_cycles_counter_type type, @@ -6532,6 +6602,15 @@ smc_lookup_batch(struct dp_netdev_pmd_thread *pmd, flow->flow.in_port.odp_port == packet->md.in_port.odp_port)) { tcp_flags = miniflow_get_tcp_flags(&keys[i].mf); + /* In case of wildcard condition: FPGA and EMC lookup miss but + * smc/dpcls lookup hit, before insert EMC, try to offload + * netdev flows again(correspond to new ufid) + */ + if (netdev_is_flow_api_enabled() && + (flow->flow.dl_type == htons(ETH_TYPE_IP))) { + dp_netdev_append_hw_offload(pmd,flow); + } + /* SMC hit and emc miss, we insert into EMC */ keys[i].len = netdev_flow_key_size(miniflow_n_values(&keys[i].mf)); @@ -6882,6 +6961,15 @@ fast_path_processing(struct dp_netdev_pmd_thread *pmd, } flow = dp_netdev_flow_cast(rules[i]); + /* In case of wildcard condition: FPGA and EMC lookup miss but + * smc/dpcls lookup hit, before insert EMC, try to offload + * netdev flows again(correspond to new mega_ufid) + */ + if (netdev_is_flow_api_enabled() && + (flow->flow.dl_type == htons(ETH_TYPE_IP))) { + dp_netdev_append_hw_offload(pmd,flow); + } + uint32_t hash = dp_netdev_flow_hash(&flow->ufid); smc_insert(pmd, keys[i], hash); From patchwork Mon Dec 28 09:24:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420983 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qck5ttCz9sVv for ; Tue, 29 Dec 2020 05:12:22 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 64580875CD; Mon, 28 Dec 2020 18:12:21 +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 42n1NLCnhKr2; Mon, 28 Dec 2020 18:12:19 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 63AB9872E0; Mon, 28 Dec 2020 18:11:36 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 3B27FC1EF9; Mon, 28 Dec 2020 18:11:36 +0000 (UTC) X-Original-To: ovs-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 D966CC1D9C for ; Mon, 28 Dec 2020 09:26:18 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id BF6022046B for ; Mon, 28 Dec 2020 09:26: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 UNl8QcPeEhGg for ; Mon, 28 Dec 2020 09:26:17 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by silver.osuosl.org (Postfix) with ESMTP id 20E772045F for ; Mon, 28 Dec 2020 09:26:16 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app07-12007 (RichMail) with SMTP id 2ee75fe9a498b17-c336f; Mon, 28 Dec 2020 17:25:45 +0800 (CST) X-RM-TRANSID: 2ee75fe9a498b17-c336f X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b896; Mon, 28 Dec 2020 17:25:45 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b896 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:48 -0800 Message-Id: <20201228092520.11807-31-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 30/62] dpif-netdev: free mark value if the offloaded fail flow deleted 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: free mark value if the offloaded fail flow deleted Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index db28b88..73367ab 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2444,6 +2444,13 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) if (megaflow_to_offload_st_find(&flow->ufid) == true) { return -1; } + /* There are two possibilities when runs here: + * 1. This flow is new, has never been offloaded before + * 2. This flow has been offload before and succeed + * means hw flow is ageout,ovs should offload it again + * So for 1. we should alloc new mark value from pool + * for 2. we should assert flow->mark == mark + */ if (mark != INVALID_FLOW_MARK) { VLOG_DBG("Flow has already been offloaded with mark %u\n", mark); if (flow->mark != INVALID_FLOW_MARK) { @@ -2611,11 +2618,21 @@ dp_netdev_pmd_remove_flow(struct dp_netdev_pmd_thread *pmd, struct cmap_node *node = CONST_CAST(struct cmap_node *, &flow->node); struct dpcls *cls; odp_port_t in_port = flow->flow.in_port.odp_port; + uint32_t mark ; cls = dp_netdev_pmd_lookup_dpcls(pmd, in_port); ovs_assert(cls != NULL); dpcls_remove(cls, &flow->cr); cmap_remove(&pmd->flow_table, node, dp_netdev_flow_hash(&flow->ufid)); + /* There is one condition that offloaded failed flows should also + * free mark value + */ + if (megaflow_to_offload_st_find(&flow->ufid) == true ){ + mark = megaflow_to_mark_find(&flow->ufid); + if (mark != INVALID_FLOW_MARK) { + flow_mark_free(mark); + } + } if (flow->mark != INVALID_FLOW_MARK) { queue_netdev_flow_del(pmd, flow); } From patchwork Mon Dec 28 09:24:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420981 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qcf58Ghz9sVv for ; Tue, 29 Dec 2020 05:12:18 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 4F22787592; Mon, 28 Dec 2020 18:12:17 +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 6w8yP50edttz; Mon, 28 Dec 2020 18:12:13 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id B942B8714E; Mon, 28 Dec 2020 18:11:34 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 87C35C1EF1; Mon, 28 Dec 2020 18:11:34 +0000 (UTC) X-Original-To: ovs-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 CAE92C0891 for ; Mon, 28 Dec 2020 09:26:18 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id B6FB820464 for ; Mon, 28 Dec 2020 09:26: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 tHQM3NHzMiaN for ; Mon, 28 Dec 2020 09:26:17 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by silver.osuosl.org (Postfix) with ESMTP id 2439B20487 for ; Mon, 28 Dec 2020 09:26:16 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app07-12007 (RichMail) with SMTP id 2ee75fe9a499b19-c3371; Mon, 28 Dec 2020 17:25:45 +0800 (CST) X-RM-TRANSID: 2ee75fe9a499b19-c3371 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b89a; Mon, 28 Dec 2020 17:25:45 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b89a From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:49 -0800 Message-Id: <20201228092520.11807-32-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 31/62] dpif-netdev: add megaflow_to_mark disassociate when flow del 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: add megaflow_to_mark disassociate when flow del Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 73367ab..623e1c8 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2618,7 +2618,7 @@ dp_netdev_pmd_remove_flow(struct dp_netdev_pmd_thread *pmd, struct cmap_node *node = CONST_CAST(struct cmap_node *, &flow->node); struct dpcls *cls; odp_port_t in_port = flow->flow.in_port.odp_port; - uint32_t mark ; + uint32_t mark = INVALID_FLOW_MARK; cls = dp_netdev_pmd_lookup_dpcls(pmd, in_port); ovs_assert(cls != NULL); @@ -2632,7 +2632,15 @@ dp_netdev_pmd_remove_flow(struct dp_netdev_pmd_thread *pmd, if (mark != INVALID_FLOW_MARK) { flow_mark_free(mark); } + /* As we would to del flow, so disassociate mapping between + * mageflow and mark(this mark value is fail offloaded value) + * for succeed offload mark, this procesure is done in queue_ + * netdev_flow_del + */ + megaflow_to_mark_disassociate(&flow->ufid); } + VLOG_DBG("TIMO DBG: flow del ufid:"UUID_FMT" mark:%u \n", + UUID_ARGS((struct uuid *)&flow->ufid),mark); if (flow->mark != INVALID_FLOW_MARK) { queue_netdev_flow_del(pmd, flow); } From patchwork Mon Dec 28 09:24:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420971 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qc82tT4z9sVv for ; Tue, 29 Dec 2020 05:11:51 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 5A4F187304; Mon, 28 Dec 2020 18:11:50 +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 pEi90QJXXRgH; Mon, 28 Dec 2020 18:11:45 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id CF2C686E35; Mon, 28 Dec 2020 18:10:48 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id AAF25C1DA4; Mon, 28 Dec 2020 18:10:48 +0000 (UTC) X-Original-To: ovs-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 DF2CFC0891 for ; Mon, 28 Dec 2020 09:26:05 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id CF0E586C8C for ; Mon, 28 Dec 2020 09:26: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 Xf4uDlBOPUpS for ; Mon, 28 Dec 2020 09:26:05 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by whitealder.osuosl.org (Postfix) with ESMTP id 4413386CA1 for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app10-12010 (RichMail) with SMTP id 2eea5fe9a4999d1-c33d1; Mon, 28 Dec 2020 17:25:46 +0800 (CST) X-RM-TRANSID: 2eea5fe9a4999d1-c33d1 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b89d; Mon, 28 Dec 2020 17:25:45 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b89d From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:50 -0800 Message-Id: <20201228092520.11807-33-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 32/62] netdev-linux:don't print no ifindex 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: don't print no ifindex log Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-linux.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 4326456..5d02e12 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -6263,9 +6263,11 @@ linux_get_ifindex(const char *netdev_name) /* ENODEV probably means that a vif disappeared asynchronously and * hasn't been removed from the database yet, so reduce the log level * to INFO for that case. */ - VLOG_RL(&rl, error == ENODEV ? VLL_INFO : VLL_ERR, - "ioctl(SIOCGIFINDEX) on %s device failed: %s", - netdev_name, ovs_strerror(error)); + if (error != ENODEV) { + VLOG_RL(&rl, error == ENODEV ? VLL_INFO : VLL_ERR, + "ioctl(SIOCGIFINDEX) on %s device failed: %s", + netdev_name, ovs_strerror(error)); + } return -error; } return ifr.ifr_ifindex; From patchwork Mon Dec 28 09:24:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420980 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qcb43YJz9sWC for ; Tue, 29 Dec 2020 05:12:15 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 6759886EC7; Mon, 28 Dec 2020 18:12:13 +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 4qK6mibakujn; Mon, 28 Dec 2020 18:12:07 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 6C14586D12; Mon, 28 Dec 2020 18:10:53 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 45566C1DD7; Mon, 28 Dec 2020 18:10:53 +0000 (UTC) X-Original-To: ovs-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 7058FC0893 for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 2600581B5E for ; Mon, 28 Dec 2020 09:26:05 +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 uAGWI2kY+cUe for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by hemlock.osuosl.org (Postfix) with ESMTP id 5ABD1870C2 for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app04-12004 (RichMail) with SMTP id 2ee45fe9a49a77e-c216e; Mon, 28 Dec 2020 17:25:46 +0800 (CST) X-RM-TRANSID: 2ee45fe9a49a77e-c216e X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8a0; Mon, 28 Dec 2020 17:25:46 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8a0 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:51 -0800 Message-Id: <20201228092520.11807-34-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 33/62] dpif-netdev.c: for offloaded flow, change offloaded_type to partial when rte_flow_query doesn't available 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: For offloaded flow, change offloaded_type to partial when rte_flow_query doesn't available Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 623e1c8..ff226ea 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -3165,7 +3165,15 @@ get_dpif_flow_status(const struct dp_netdev *dp, attrs->dp_layer = offload_attrs.dp_layer; } } else if (attrs) { - attrs->offloaded = false; + attrs->offloaded = offload_attrs.offloaded; + /* When dpdk_rte_flow_query doesn't available,we should also use + * offloaded flag to mark if this flow has been offloaded success + * and for offloaded:partial, dp:ovs , the stats get from userspace + * datapath + * + * + * attrs->offloaded = false; + */ attrs->dp_layer = "ovs"; } } From patchwork Mon Dec 28 09:24:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420977 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QcW5vdZz9sVv for ; Tue, 29 Dec 2020 05:12:11 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 523B48754F; Mon, 28 Dec 2020 18:12:10 +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 RDvNWrujpQAf; Mon, 28 Dec 2020 18:12:09 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id EF1198729B; Mon, 28 Dec 2020 18:11:32 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id A57B8C1EE8; Mon, 28 Dec 2020 18:11:32 +0000 (UTC) X-Original-To: ovs-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 C1334C0893 for ; Mon, 28 Dec 2020 09:26:18 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id BE68386C46 for ; Mon, 28 Dec 2020 09:26:18 +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 UCAQCICJTDah for ; Mon, 28 Dec 2020 09:26:16 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by whitealder.osuosl.org (Postfix) with ESMTP id 4B00386C8E for ; Mon, 28 Dec 2020 09:26:16 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app07-12007 (RichMail) with SMTP id 2ee75fe9a49ab21-c3379; Mon, 28 Dec 2020 17:25:46 +0800 (CST) X-RM-TRANSID: 2ee75fe9a49ab21-c3379 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8a1; Mon, 28 Dec 2020 17:25:46 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8a1 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:52 -0800 Message-Id: <20201228092520.11807-35-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 34/62] conntrack: Add coverage count for l4csum error 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: Add coverage count for l4csum error Jira: #[Optional] 市场项目编号(名称):[Optional] Add a coverage counter when userspace conntrack receives a packet with invalid l4 checksum. When using veth for testing, users often forget to turn off the tx offload on the other side of the namespace, causing l4 checksum not calculated in packet header, and at conntrack, return invalid conntrack state --- lib/conntrack.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/conntrack.c b/lib/conntrack.c index 0cbc8f6..95d48c5 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -44,6 +44,7 @@ VLOG_DEFINE_THIS_MODULE(conntrack); COVERAGE_DEFINE(conntrack_full); COVERAGE_DEFINE(conntrack_long_cleanup); +COVERAGE_DEFINE(conntrack_l4csum_err); struct conn_lookup_ctx { struct conn_key key; @@ -1661,6 +1662,7 @@ checksum_valid(const struct conn_key *key, const void *data, size_t size, } else if (key->dl_type == htons(ETH_TYPE_IPV6)) { return packet_csum_upperlayer6(l3, data, key->nw_proto, size) == 0; } else { + COVERAGE_INC(conntrack_l4csum_err); return false; } } @@ -1704,7 +1706,12 @@ check_l4_udp(const struct conn_key *key, const void *data, size_t size, static inline bool check_l4_icmp(const void *data, size_t size, bool validate_checksum) { - return validate_checksum ? csum(data, size) == 0 : true; + if (validate_checksum && csum(data, size) != 0) { + COVERAGE_INC(conntrack_l4csum_err); + return false; + } else { + return true; + } } static inline bool From patchwork Mon Dec 28 09:24:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1421005 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QfR0z0xz9sVv for ; Tue, 29 Dec 2020 05:13:51 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 600BA873CB; Mon, 28 Dec 2020 18:13:49 +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 ys7Yt1sdO8sT; Mon, 28 Dec 2020 18:13:47 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 2643387519; Mon, 28 Dec 2020 18:12:08 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id CCF3DC1DD9; Mon, 28 Dec 2020 18:12:07 +0000 (UTC) X-Original-To: ovs-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 14A83C0891 for ; Mon, 28 Dec 2020 09:26:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 0A51E207A9 for ; Mon, 28 Dec 2020 09:26: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 4u0daHFZosX2 for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by silver.osuosl.org (Postfix) with ESMTP id A69522046B for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app03-12003 (RichMail) with SMTP id 2ee35fe9a49e561-bee68; Mon, 28 Dec 2020 17:25:50 +0800 (CST) X-RM-TRANSID: 2ee35fe9a49e561-bee68 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8a6; Mon, 28 Dec 2020 17:25:50 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8a6 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:53 -0800 Message-Id: <20201228092520.11807-36-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 35/62] vlog.h: Fix error log print time about openvswitch 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: Fix error log print time about openvswitch Jira: #[Optional] 市场项目编号(名称):[Optional] --- include/openvswitch/vlog.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/openvswitch/vlog.h b/include/openvswitch/vlog.h index 476bf3d..58f1c44 100644 --- a/include/openvswitch/vlog.h +++ b/include/openvswitch/vlog.h @@ -63,8 +63,8 @@ enum vlog_level vlog_get_level_val(const char *name); /* Destinations that we can log to. */ #define VLOG_DESTINATIONS \ VLOG_DESTINATION(SYSLOG, "ovs|%05N|%c%T|%p|%m") \ - VLOG_DESTINATION(CONSOLE, "%D{%Y-%m-%dT%H:%M:%SZ}|%05N|%c%T|%p|%m") \ - VLOG_DESTINATION(FILE, "%D{%Y-%m-%dT%H:%M:%S.###Z}|%05N|%c%T|%p|%m") + VLOG_DESTINATION(CONSOLE, "%d{%Y-%m-%dT%H:%M:%SZ}|%05N|%c%T|%p|%m") \ + VLOG_DESTINATION(FILE, "%d{%Y-%m-%dT%H:%M:%S.###Z}|%05N|%c%T|%p|%m") enum vlog_destination { #define VLOG_DESTINATION(NAME, PATTERN) VLF_##NAME, VLOG_DESTINATIONS From patchwork Mon Dec 28 09:24:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420962 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qbg3LCFz9sWC for ; Tue, 29 Dec 2020 05:11:27 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id F22E987222; Mon, 28 Dec 2020 18:11: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 7vjdH3Gj+8-X; Mon, 28 Dec 2020 18:11:17 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 853C886D91; Mon, 28 Dec 2020 18:10:43 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 46758C1DA7; Mon, 28 Dec 2020 18:10:43 +0000 (UTC) X-Original-To: ovs-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 CF5E8C0891 for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id BEB868709E for ; Mon, 28 Dec 2020 09:26:04 +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 LBVUbiigy3jB for ; Mon, 28 Dec 2020 09:26:03 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by hemlock.osuosl.org (Postfix) with ESMTP id CAA73870C8 for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app09-12009 (RichMail) with SMTP id 2ee95fe9a49f0dc-bef51; Mon, 28 Dec 2020 17:25:51 +0800 (CST) X-RM-TRANSID: 2ee95fe9a49f0dc-bef51 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8b8; Mon, 28 Dec 2020 17:25:50 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8b8 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:54 -0800 Message-Id: <20201228092520.11807-37-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Rongyin Subject: [ovs-dev] =?utf-8?q?=5BPATCH_36/62=5D_=5Bnetdev-offload-dpdk=5D?= =?utf-8?q?=EF=BC=9Badd_ipv6_hw_offload_support_=26=26_suppress_non_ipv4/ipv?= =?utf-8?q?6_hw_offload?= 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: Add ipv6 hw offload support && suppress non ipv4/ipv6 hw offload Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 11b04b5..13b46a5 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -856,6 +856,44 @@ parse_flow_match(struct flow_patterns *patterns, return 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 ){ VLOG_DBG("L4 Protocol (%u) not supported", proto); @@ -1649,6 +1687,14 @@ netdev_offload_dpdk_validate_flow(const struct match *match) } */ + /* only offload ipv4/ipv6 */ + if ((match->flow.dl_type != htons(ETH_TYPE_IP)) && + (match->flow.dl_type != htons(ETH_TYPE_IPV6))) { + VLOG_DBG("RY DBG: dl_type=0x%04x no need to be offloaded", + ntohs(match->flow.dl_type)); + return -1; + } + if (masks->ct_state || masks->ct_nw_proto || masks->ct_zone || masks->ct_mark || !ovs_u128_is_zero(masks->ct_label)) { From patchwork Mon Dec 28 09:24:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420985 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qcq59rTz9sVv for ; Tue, 29 Dec 2020 05:12:27 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 4AFBE8761C; Mon, 28 Dec 2020 18:12:26 +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 2BivL6TsHnHn; Mon, 28 Dec 2020 18:12:22 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id F3C3681DED; Mon, 28 Dec 2020 18:11:37 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B9DC2C1F09; Mon, 28 Dec 2020 18:11:37 +0000 (UTC) X-Original-To: ovs-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 24051C0891 for ; Mon, 28 Dec 2020 09:26:19 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 1317686C46 for ; Mon, 28 Dec 2020 09:26: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 5rtVKFKCus74 for ; Mon, 28 Dec 2020 09:26:17 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by whitealder.osuosl.org (Postfix) with ESMTP id DB4E686C92 for ; Mon, 28 Dec 2020 09:26:16 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app07-12007 (RichMail) with SMTP id 2ee75fe9a49fb2e-c3386; Mon, 28 Dec 2020 17:25:51 +0800 (CST) X-RM-TRANSID: 2ee75fe9a49fb2e-c3386 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8b9; Mon, 28 Dec 2020 17:25:51 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8b9 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:55 -0800 Message-Id: <20201228092520.11807-38-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 37/62] Add Intel init patch 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: Add Intel init patch Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dp-packet.h | 6 ++ lib/netdev-offload-dpdk.c | 211 +++++++++++++++++++++++++++++++++++++--------- lib/packets.h | 22 +++++ 3 files changed, 197 insertions(+), 42 deletions(-) diff --git a/lib/dp-packet.h b/lib/dp-packet.h index 9f8991f..9e415cb 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -1082,6 +1082,12 @@ dp_packet_batch_init_packet_fields(struct dp_packet_batch *batch) DP_PACKET_BATCH_FOR_EACH (i, packet, batch) { dp_packet_reset_cutlen(packet); packet->packet_type = htonl(PT_ETH); + /* Packet mbuf allocated by SP/EP device mempool + * and OVS doesn't know about it and all OVS required + * initializations missed. OVS needs mbuf orignation to do + * various opertions like cleanup, etc.. + */ + packet->source = DPBUF_DPDK; } } diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 13b46a5..21a4058 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -29,6 +29,7 @@ #include "openvswitch/vlog.h" #include "packets.h" #include "uuid.h" +#include #include "id-pool.h" #include "odp-util.h" @@ -234,6 +235,31 @@ 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; + + ds_put_cstr(s, "rte flow ipv6 pattern:\n"); + if (ipv6_spec) { + ds_put_format(s, + " proto=0x%"PRIx8 + ", src="IP6_FMT", dst="IP6_FMT"\n", + ipv6_spec->hdr.proto, + IP6_ARGS(ipv6_spec->hdr.src_addr), + IP6_ARGS(ipv6_spec->hdr.dst_addr)); + } else { + ds_put_cstr(s, " Spec = null\n"); + } + if (ipv6_mask) { + ds_put_format(s, + " proto=0x%"PRIx8 + ", src="IP6_FMT", dst="IP6_FMT"\n", + ipv6_mask->hdr.proto, + IP6_ARGS(ipv6_mask->hdr.src_addr), + IP6_ARGS(ipv6_mask->hdr.dst_addr)); + } else { + ds_put_cstr(s, " Mask = null\n"); + } } else if (item->type == RTE_FLOW_ITEM_TYPE_UDP) { const struct rte_flow_item_udp *udp_spec = item->spec; const struct rte_flow_item_udp *udp_mask = item->mask; @@ -295,11 +321,33 @@ dump_flow_pattern(struct ds *s, const struct rte_flow_item *item) ds_put_format(s, " Mask: icmp_type=0x%"PRIx8 ", icmp_code=0x%"PRIx8"\n", - icmp_spec->hdr.icmp_type, - icmp_spec->hdr.icmp_code); + icmp_mask->hdr.icmp_type, + icmp_mask->hdr.icmp_code); } else { ds_put_cstr(s, " Mask = null\n"); } + } else if (item->type == RTE_FLOW_ITEM_TYPE_ICMP6) { + const struct rte_flow_item_icmp6 *icmp6_spec = item->spec; + const struct rte_flow_item_icmp6 *icmp6_mask = item->mask; + + ds_put_cstr(s, "rte flow icmpv6 pattern:\n"); + if (icmp6_spec) { + ds_put_format(s, + " Spec: icmp6_type=%"PRIu8", icmp6_code=%"PRIu8"\n", + icmp6_spec->type, + icmp6_spec->code); + } else { + ds_put_cstr(s, " Spec = null\n"); + } + if (icmp6_mask) { + ds_put_format(s, + " Mask: icmp6_type=0x%"PRIx8 + ", icmp6_code=0x%"PRIx8"\n", + icmp6_mask->type, + icmp6_mask->code); + } else { + ds_put_cstr(s, " Mask = null\n"); + } } else if (item->type == RTE_FLOW_ITEM_TYPE_TCP) { const struct rte_flow_item_tcp *tcp_spec = item->spec; const struct rte_flow_item_tcp *tcp_mask = item->mask; @@ -459,7 +507,16 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) if (vlan_tci) { ds_put_format(s, "rte flow vlan-push action:\n"); - ds_put_format(s, "vlan-encap: tci=%"PRIu16"\n",ntohs(vlan_tci->ethertype)); + ds_put_format(s, "vlan-encap: tpid=%"PRIu16"\n",ntohs(vlan_tci->ethertype)); + } else { + ds_put_format(s, "vlan-encap: null\n"); + } + } else if (actions->type == RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID) { + const struct rte_flow_action_of_set_vlan_vid *vid = actions->conf; + + if (vid) { + ds_put_format(s, "rte flow vlan-push action:\n"); + ds_put_format(s, "vlan-encap: vid=%"PRIu16"\n",ntohs(vid->vlan_vid)); } else { ds_put_format(s, "vlan-encap: null\n"); } @@ -706,6 +763,12 @@ parse_geneve_match(struct flow_patterns *patterns, const struct match *match) { struct rte_flow_item_geneve *vx_spec, *vx_mask; + /* TBD + uint8_t data_len; + uint32_t len,opt_data; + struct geneve_opt *opt; + uint8_t i; + */ if (is_all_zeros(&match->wc.masks.tunnel, sizeof match->wc.masks.tunnel)) { return -1; @@ -729,7 +792,20 @@ parse_geneve_match(struct flow_patterns *patterns, htonl(ntohll(match->wc.masks.tunnel.tun_id) << 8)); add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_GENEVE, vx_spec, vx_mask); - /* TBD: add option hdr */ + + /* TBD: add option hdr + len = match->flow.tunnel.metadata.present.len; + if (len > 0) { + opt = &match->flow.tunnel.metadata.opts.gnv; + data_len = opt->length*4; + uint8_t *buf = (opt+1); + for (i=0; iflow.dl_type == htons(ETH_TYPE_IP)) { struct rte_flow_item_ipv4 *spec, *mask; + /* Vista Creek PAC N3000 hardware doesn't support IPv4 Multicast + * messages acceleration. So, checking for the same and returning + * from here if it matches. + */ + if (ip_is_multicast(match->flow.nw_dst)) { + VLOG_DBG("IPV4 multicast address not supported"); + return -1; + } + spec = xzalloc(sizeof *spec); mask = xzalloc(sizeof *mask); @@ -850,16 +935,19 @@ parse_flow_match(struct flow_patterns *patterns, */ proto = spec->hdr.next_proto_id ; next_proto_mask = &mask->hdr.next_proto_id; - } else { - /* if eth_type is not IP ,just transit eth rte_flow */ - add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_END, NULL, NULL); - return 0; - } - - /* IP v6 */ - if (match->flow.dl_type == htons(ETH_TYPE_IPV6)) { + } else if (match->flow.dl_type == htons(ETH_TYPE_IPV6)) { + /* IP v6 */ struct rte_flow_item_ipv6 *spec, *mask; + /* Vista Creek PAC N3000 hardware doesn't support IPv6 Multicast + * messages acceleration. So, checking for the same and returning + * from here if it matches. + */ + if (ipv6_addr_is_multicast(&match->flow.ipv6_dst)) { + VLOG_DBG("IPV6 multicast address not supported"); + return -1; + } + spec = xzalloc(sizeof *spec); mask = xzalloc(sizeof *mask); @@ -892,10 +980,15 @@ parse_flow_match(struct flow_patterns *patterns, /* Save proto for L4 protocol setup */ proto = spec->hdr.proto & mask->hdr.proto; next_proto_mask = &mask->hdr.proto; + } else { + /* if eth_type is not IP ,just transit eth rte_flow */ + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_END, NULL, NULL); + return 0; } if (proto != IPPROTO_ICMP && proto != IPPROTO_UDP && - proto != IPPROTO_SCTP && proto != IPPROTO_TCP ){ + proto != IPPROTO_SCTP && proto != IPPROTO_TCP && + proto != IPPROTO_ICMPV6 ){ VLOG_DBG("L4 Protocol (%u) not supported", proto); return -1; } @@ -989,6 +1082,34 @@ parse_flow_match(struct flow_patterns *patterns, if (next_proto_mask) { *next_proto_mask = 0; } + } else if (proto == IPPROTO_ICMPV6) { + struct rte_flow_item_icmp6 *spec, *mask; + + /* Vista Creek PAC N3000 hardware doesn't support IPv6 NS and NA + * messages acceleration. So, checking for the same and returning from here + * if it matches. + */ + if (match->flow.tp_src == ntohs(ND_NEIGHBOR_SOLICIT) || + match->flow.tp_src == ntohs(ND_NEIGHBOR_ADVERT) ) { + VLOG_DBG("IPv6 NS and ND messages HW acceleration not supported"); + return -1; + } + + spec = xzalloc(sizeof *spec); + mask = xzalloc(sizeof *mask); + + spec->type = (uint8_t) ntohs(match->flow.tp_src); + spec->code = (uint8_t) ntohs(match->flow.tp_dst); + + mask->type = (uint8_t) ntohs(match->wc.masks.tp_src); + mask->code = (uint8_t) ntohs(match->wc.masks.tp_dst); + + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_ICMP6, spec, mask); + + /* proto == ICMPV6 and ITEM_TYPE_ICMPV6, thus no need for proto match. */ + if (next_proto_mask) { + *next_proto_mask = 0; + } } add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_END, NULL, NULL); @@ -1043,32 +1164,6 @@ add_flow_mark_rss_actions(struct flow_actions *actions, add_flow_action(actions, RTE_FLOW_ACTION_TYPE_END, NULL); } -static struct rte_flow * -netdev_offload_dpdk_mark_rss(struct flow_patterns *patterns, - struct netdev *netdev, - uint32_t flow_mark) -{ - struct flow_actions actions = { .actions = NULL, .cnt = 0 }; - const struct rte_flow_attr flow_attr = { - .group = 0, - .priority = 0, - .ingress = 1, - .egress = 0 - }; - struct rte_flow *flow; - /* work around : not do mark rss action - struct rte_flow_error error; - - add_flow_mark_rss_actions(&actions, flow_mark, netdev); - - flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items, - actions.actions, &error); - - */ - free_flow_actions(&actions); - return flow; -} - static void add_count_action(struct flow_actions *actions) { @@ -1214,6 +1309,17 @@ parse_set_actions(struct flow_actions *actions, VLOG_DBG_RL(&rl, "Unsupported IPv4 set action"); return -1; } + } else if (nl_attr_type(sa) == OVS_KEY_ATTR_IPV6) { + const struct ovs_key_ipv6 *key = nl_attr_get(sa); + const struct ovs_key_ipv6 *mask = masked ? key + 1 : NULL; + + add_set_flow_action(ipv6_src, RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC); + add_set_flow_action(ipv6_dst, RTE_FLOW_ACTION_TYPE_SET_IPV6_DST); + + if (mask && !is_all_zeros(mask, sizeof *mask)) { + VLOG_DBG_RL(&rl, "Unsupported IPv6 set action"); + return -1; + } } else if (nl_attr_type(sa) == OVS_KEY_ATTR_TCP) { const struct ovs_key_tcp *key = nl_attr_get(sa); const struct ovs_key_tcp *mask = masked ? key + 1 : NULL; @@ -1474,11 +1580,21 @@ parse_clone_actions(struct netdev *netdev, } else if (clone_type == OVS_ACTION_ATTR_PUSH_VLAN) { const struct ovs_action_push_vlan *vlan = nl_attr_get(ca); struct rte_flow_action_of_push_vlan *vlan_tci; + struct rte_flow_action_of_set_vlan_vid *vid; + if (vlan == NULL) { + VLOG_DBG_RL(&rl, "VLAN attribute info null..."); + return -1; + } vlan_tci = xzalloc(sizeof *vlan_tci); - vlan_tci->ethertype = vlan->vlan_tci & ~htons(VLAN_CFI); + vlan_tci->ethertype = vlan->vlan_tpid; add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN, vlan_tci); + + vid = xzalloc(sizeof *vid); + vid->vlan_vid = vlan->vlan_tci & ~htons(VLAN_CFI); + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID, vid); + } else if (clone_type == OVS_ACTION_ATTR_POP_VLAN) { add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_POP_VLAN, NULL); } else { @@ -1540,11 +1656,22 @@ parse_flow_actions(struct netdev *netdev, } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_PUSH_VLAN) { const struct ovs_action_push_vlan *vlan = nl_attr_get(nla); struct rte_flow_action_of_push_vlan *vlan_tci; + struct rte_flow_action_of_set_vlan_vid *vid; + + if (vlan == NULL) { + VLOG_DBG_RL(&rl, "VLAN attribute info null..."); + return -1; + } vlan_tci = xzalloc(sizeof *vlan_tci); - vlan_tci->ethertype = vlan->vlan_tci & ~htons(VLAN_CFI); + vlan_tci->ethertype = vlan->vlan_tpid; add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN, vlan_tci); + + vid = xzalloc(sizeof *vid); + vid->vlan_vid = vlan->vlan_tci & ~htons(VLAN_CFI); + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID, vid); + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_POP_VLAN) { add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_POP_VLAN, NULL); } else { @@ -1637,9 +1764,9 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, if (!flow) { /* If we failed to offload the rule actions fallback to MARK+RSS * actions. - */ flow = netdev_offload_dpdk_mark_rss(&patterns, netdev, info->flow_mark); + */ actions_offloaded = false; } diff --git a/lib/packets.h b/lib/packets.h index 5d7f82c..9d5d241 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -632,6 +632,28 @@ mpls_lse_to_bos(ovs_be32 mpls_lse) (ntohl(ip) >> 8) & 0xff, \ ntohl(ip) & 0xff +#define IP6_FMT "%"PRIx8"%"PRIx8":%"PRIx8"%"PRIx8 \ + ":%"PRIx8"%"PRIx8":%"PRIx8"%"PRIx8 \ + ":%"PRIx8"%"PRIx8":%"PRIx8"%"PRIx8 \ + ":%"PRIx8"%"PRIx8":%"PRIx8"%"PRIx8 +#define IP6_ARGS(ip6) \ + ntohs(ip6[0]), \ + ntohs(ip6[1]), \ + ntohs(ip6[2]), \ + ntohs(ip6[3]), \ + ntohs(ip6[4]), \ + ntohs(ip6[5]), \ + ntohs(ip6[6]), \ + ntohs(ip6[7]), \ + ntohs(ip6[8]), \ + ntohs(ip6[9]), \ + ntohs(ip6[10]), \ + ntohs(ip6[11]), \ + ntohs(ip6[12]), \ + ntohs(ip6[13]), \ + ntohs(ip6[14]), \ + ntohs(ip6[15]) + /* Example: * * char *string = "1 33.44.55.66 2"; From patchwork Mon Dec 28 09:24:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1421006 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QfW0DLXz9sVv for ; Tue, 29 Dec 2020 05:13:55 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 8E61287453; Mon, 28 Dec 2020 18:13:53 +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 SUxghnpbJGVV; Mon, 28 Dec 2020 18:13:50 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 4D59F8728C; Mon, 28 Dec 2020 18:12:09 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 164E2C1DF6; Mon, 28 Dec 2020 18:12:09 +0000 (UTC) X-Original-To: ovs-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 419CDC0891 for ; Mon, 28 Dec 2020 09:26:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 2F3EC2046B for ; Mon, 28 Dec 2020 09:26: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 wRCoHS6SW1Gk for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by silver.osuosl.org (Postfix) with ESMTP id A84902048D for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app03-12003 (RichMail) with SMTP id 2ee35fe9a4a0568-bee6f; Mon, 28 Dec 2020 17:25:52 +0800 (CST) X-RM-TRANSID: 2ee35fe9a4a0568-bee6f X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8c0; Mon, 28 Dec 2020 17:25:52 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8c0 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:57 -0800 Message-Id: <20201228092520.11807-40-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 39/62] netdev-offload-dpdk: Add geneve opt header parse/push item code 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: Add geneve opt header parse/push item code Jira: #[Optional] 市场项目编号(名称):[Optional] NOTE: we should wait intel DPDK geneve release --- lib/netdev-offload-dpdk.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 4867053..4c0a5be 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -755,12 +755,11 @@ parse_geneve_match(struct flow_patterns *patterns, const struct match *match) { struct rte_flow_item_geneve *vx_spec, *vx_mask; - /* TBD + /* TBD */ uint8_t data_len; uint32_t len,opt_data; struct geneve_opt *opt; uint8_t i; - */ if (is_all_zeros(&match->wc.masks.tunnel, sizeof match->wc.masks.tunnel)) { return -1; @@ -785,19 +784,18 @@ parse_geneve_match(struct flow_patterns *patterns, add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_GENEVE, vx_spec, vx_mask); - /* TBD: add option hdr + /* TBD: add option hdr */ len = match->flow.tunnel.metadata.present.len; if (len > 0) { opt = &match->flow.tunnel.metadata.opts.gnv; data_len = opt->length*4; uint8_t *buf = (opt+1); for (i=0; i X-Patchwork-Id: 1420960 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QbZ635tz9sWC for ; Tue, 29 Dec 2020 05:11:22 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 4755387137; Mon, 28 Dec 2020 18:11:21 +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 DSHK4Ol-5QHH; Mon, 28 Dec 2020 18:11:18 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id BD97287132; Mon, 28 Dec 2020 18:11:13 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 5B4DBC1E98; Mon, 28 Dec 2020 18:11:13 +0000 (UTC) X-Original-To: ovs-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 2A612C1DA3 for ; Mon, 28 Dec 2020 09:26:09 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 0FCFA86C8A for ; Mon, 28 Dec 2020 09:26:09 +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 jVUwH9+3Alh4 for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by whitealder.osuosl.org (Postfix) with ESMTP id ACF4186C90 for ; Mon, 28 Dec 2020 09:26:03 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app11-12011 (RichMail) with SMTP id 2eeb5fe9a4a051b-c1bc2; Mon, 28 Dec 2020 17:25:52 +0800 (CST) X-RM-TRANSID: 2eeb5fe9a4a051b-c1bc2 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8c1; Mon, 28 Dec 2020 17:25:52 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8c1 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:58 -0800 Message-Id: <20201228092520.11807-41-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 40/62] ovs_gdb.py: add print ofp buffers in gdb script 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin This adds the ovs_dump_ifpacts command: (gdb) help ovs_dump_ofpacts Dump all actions in an ofpacts set Usage: ovs_dump_ofpacts : Pointer to set of ofpact structures. : Total length of the set. Example dumping all actions when in the clone_xlate_actions() function: (gdb) ovs_dump_ofpacts actions actions_len (struct ofpact *) 0x561c7be487c8: {type = OFPACT_SET_FIELD, raw = 255 '', len = 24} (struct ofpact *) 0x561c7be487e0: {type = OFPACT_SET_FIELD, raw = 255 '', len = 24} (struct ofpact *) 0x561c7be487f8: {type = OFPACT_SET_FIELD, raw = 255 '', len = 24} (struct ofpact *) 0x561c7be48810: {type = OFPACT_SET_FIELD, raw = 255 '', len = 32} (struct ofpact *) 0x561c7be48830: {type = OFPACT_SET_FIELD, raw = 255 '', len = 24} (struct ofpact *) 0x561c7be48848: {type = OFPACT_RESUBMIT, raw = 38 '&', len = 16} Code Source From: Self Code Description: Add print ofp buffers in gdb script. The details as above. Jira: #[Optional] 市场项目编号(名称):[Optional] --- utilities/gdb/ovs_gdb.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/utilities/gdb/ovs_gdb.py b/utilities/gdb/ovs_gdb.py index befc2b4..1111f31 100644 --- a/utilities/gdb/ovs_gdb.py +++ b/utilities/gdb/ovs_gdb.py @@ -55,6 +55,7 @@ # ... # ... # +from __future__ import print_function import gdb import sys import uuid @@ -414,6 +415,39 @@ class ForEachLIST(): # +# Class that will provide an iterator over an OFPACTS. +# +class ForEachOFPACTS(): + def __init__(self, ofpacts, ofpacts_len): + self.ofpact = ofpacts.cast(gdb.lookup_type('struct ofpact').pointer()) + self.length = int(ofpacts_len) + + def __round_up(self, val, round_to): + return int(val) + (round_to - int(val)) % round_to + + def __iter__(self): + return self + + def __next__(self): + if self.ofpact is None or self.length <= 0: + raise StopIteration + + ofpact = self.ofpact + length = self.__round_up(ofpact['len'], 8) + + self.length -= length + self.ofpact = self.ofpact.cast( + gdb.lookup_type('void').pointer()) + length + self.ofpact = self.ofpact.cast( + gdb.lookup_type('struct ofpact').pointer()) + + return ofpact + + def next(self): + return self.__next__() + + +# # Implements the GDB "ovs_dump_bridges" command # class CmdDumpBridge(gdb.Command): @@ -1234,6 +1268,46 @@ class CmdShowUpcall(gdb.Command): # +# Implements the GDB "ovs_dump_ofpacts" command +# +class CmdDumpOfpacts(gdb.Command): + """Dump all actions in an ofpacts set + Usage: ovs_dump_ofpacts + + : Pointer to set of ofpact structures. + : Total length of the set. + + Example dumping all actions when in the clone_xlate_actions() function: + + (gdb) ovs_dump_ofpacts actions actions_len + (struct ofpact *) 0x561c7be487c8: {type = OFPACT_SET_FIELD, raw = 255 '', len = 24} + (struct ofpact *) 0x561c7be487e0: {type = OFPACT_SET_FIELD, raw = 255 '', len = 24} + (struct ofpact *) 0x561c7be487f8: {type = OFPACT_SET_FIELD, raw = 255 '', len = 24} + (struct ofpact *) 0x561c7be48810: {type = OFPACT_SET_FIELD, raw = 255 '', len = 32} + (struct ofpact *) 0x561c7be48830: {type = OFPACT_SET_FIELD, raw = 255 '', len = 24} + (struct ofpact *) 0x561c7be48848: {type = OFPACT_RESUBMIT, raw = 38 '&', len = 16} + """ + def __init__(self): + super(CmdDumpOfpacts, self).__init__("ovs_dump_ofpacts", + gdb.COMMAND_DATA) + + def invoke(self, arg, from_tty): + arg_list = gdb.string_to_argv(arg) + + if len(arg_list) != 2: + print("usage: ovs_dump_ofpacts ") + return + + ofpacts = gdb.parse_and_eval(arg_list[0]).cast( + gdb.lookup_type('struct ofpact').pointer()) + + length = gdb.parse_and_eval(arg_list[1]) + + for node in ForEachOFPACTS(ofpacts, length): + print("(struct ofpact *) {}: {}".format(node, node.dereference())) + + +# # Initialize all GDB commands # CmdDumpBridge() @@ -1244,6 +1318,7 @@ CmdDumpDpNetdevPorts() CmdDumpDpProvider() CmdDumpNetdev() CmdDumpNetdevProvider() +CmdDumpOfpacts() CmdDumpOvsList() CmdDumpSimap() CmdDumpSmap() From patchwork Mon Dec 28 09:24:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1421009 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qfp1g7Xz9sWL for ; Tue, 29 Dec 2020 05:14:10 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id A032A87518; Mon, 28 Dec 2020 18:14: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 J+tnrLYK70ri; Mon, 28 Dec 2020 18:14:08 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id C12A58757D; Mon, 28 Dec 2020 18:12:15 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 8331CC200A; Mon, 28 Dec 2020 18:12:15 +0000 (UTC) X-Original-To: ovs-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 21ED2C0891 for ; Mon, 28 Dec 2020 09:26:36 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 1B16D2046B for ; Mon, 28 Dec 2020 09:26:36 +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 ro+N4qUYnpEO for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by silver.osuosl.org (Postfix) with ESMTP id 9F27A2045F for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app03-12003 (RichMail) with SMTP id 2ee35fe9a4a056a-bee71; Mon, 28 Dec 2020 17:25:53 +0800 (CST) X-RM-TRANSID: 2ee35fe9a4a056a-bee71 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8c5; Mon, 28 Dec 2020 17:25:52 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8c5 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:24:59 -0800 Message-Id: <20201228092520.11807-42-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 41/62] netdev-offload-dpdk: validate mask check for disable megaflow 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: Validate mask check for disable megaflow Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 4c0a5be..ad6302b 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -1789,11 +1789,12 @@ netdev_offload_dpdk_validate_flow(const struct match *match) goto err; } */ - + /* work around if (masks->metadata || masks->skb_priority || masks->pkt_mark || masks->dp_hash) { goto err; } + */ /* recirc id must be zero. */ /* support recirc now so mark this checker @@ -1810,12 +1811,15 @@ netdev_offload_dpdk_validate_flow(const struct match *match) return -1; } + /* support conntrack now so mark this checker if (masks->ct_state || masks->ct_nw_proto || masks->ct_zone || masks->ct_mark || !ovs_u128_is_zero(masks->ct_label)) { goto err; } + */ + /* not support conj action */ if (masks->conj_id || masks->actset_output) { goto err; } @@ -1825,19 +1829,10 @@ netdev_offload_dpdk_validate_flow(const struct match *match) 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)) { + if (!is_all_zeros(&masks->nd_target, sizeof masks->nd_target) || + !is_all_zeros(&masks->nsh, sizeof masks->nsh) ){ goto err; } - /* If fragmented, then don't HW accelerate - for now. */ /* move this checker to parse_flow_match if (match_zero_wc.flow.nw_frag) { From patchwork Mon Dec 28 09:25:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420986 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qcr0CsJz9sWC for ; Tue, 29 Dec 2020 05:12:28 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 43C4886992; Mon, 28 Dec 2020 18:12:26 +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 Q5JpqDaDG8xz; Mon, 28 Dec 2020 18:12:24 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by fraxinus.osuosl.org (Postfix) with ESMTP id F3CCA868C5; Mon, 28 Dec 2020 18:11:55 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 9E0B3C1F92; Mon, 28 Dec 2020 18:11:55 +0000 (UTC) X-Original-To: ovs-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 80194C0891 for ; Mon, 28 Dec 2020 09:26:34 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 7A2BD81B5E for ; Mon, 28 Dec 2020 09:26:34 +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 QnDOCEy9WwuF for ; Mon, 28 Dec 2020 09:26:34 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by hemlock.osuosl.org (Postfix) with ESMTP id 5BCFE84FB8 for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app08-12008 (RichMail) with SMTP id 2ee85fe9a4a2f65-c0804; Mon, 28 Dec 2020 17:25:54 +0800 (CST) X-RM-TRANSID: 2ee85fe9a4a2f65-c0804 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8c7; Mon, 28 Dec 2020 17:25:54 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8c7 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:00 -0800 Message-Id: <20201228092520.11807-43-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 42/62] dpif-netdev: delete insert hw offload after dpcls lookup mechanism 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin Code Source From: Self Code Description: Delete insert hw offload after dpcls lookup mechanism Jira: #[Optional] 市场项目编号(名称):[Optional] NOTE: The reason of delete this mechanism is: If we set megaflow enable ,when we do dpcls insertion, the rule is together with megaflow mask, and even if EMC lookup miss, but dpcls lookup hit, the offloaded flow is the same as dpcls already has, but not the new flow. So it seems as intel FPGA card can't support wildcard match, the only solution is turn off megaflow. --- lib/dpif-netdev.c | 47 ----------------------------------------------- 1 file changed, 47 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index ff226ea..a2cf82b 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -4287,36 +4287,6 @@ dp_netdev_actions_free(struct dp_netdev_actions *actions) } static void -dp_netdev_append_hw_offload(struct dp_netdev_pmd_thread *pmd, - struct dp_netdev_flow *flow) -{ - struct match flow_put_match; - struct dp_netdev_actions *flow_put_actions; - struct dp_flow_offload_item *offload; - int op = DP_NETDEV_FLOW_OFFLOAD_OP_ADD; - - match_wc_init(&flow_put_match,&(flow->flow)); - /* If this flow has been offloaded, but fail, won't offload again - * Otherwise if this flow has been offloaded succeded, it means - * although the ufid is the same, but exact flow is different - * in this scenario, or hw flow is ageout. we should also try to - * offload it to hw - */ - if (megaflow_to_offload_st_find(&flow->ufid) == true) { - return ; - } - flow_put_actions = dp_netdev_flow_get_actions(flow); - - offload = dp_netdev_alloc_flow_offload(pmd, flow, op); - offload->match = flow_put_match; - offload->actions = xmalloc(flow_put_actions->size); - memcpy(offload->actions, flow_put_actions->actions, flow_put_actions->size); - offload->actions_len = flow_put_actions->size; - - dp_netdev_append_flow_offload(offload); -} - -static void dp_netdev_rxq_set_cycles(struct dp_netdev_rxq *rx, enum rxq_cycles_counter_type type, unsigned long long cycles) @@ -6635,15 +6605,6 @@ smc_lookup_batch(struct dp_netdev_pmd_thread *pmd, flow->flow.in_port.odp_port == packet->md.in_port.odp_port)) { tcp_flags = miniflow_get_tcp_flags(&keys[i].mf); - /* In case of wildcard condition: FPGA and EMC lookup miss but - * smc/dpcls lookup hit, before insert EMC, try to offload - * netdev flows again(correspond to new ufid) - */ - if (netdev_is_flow_api_enabled() && - (flow->flow.dl_type == htons(ETH_TYPE_IP))) { - dp_netdev_append_hw_offload(pmd,flow); - } - /* SMC hit and emc miss, we insert into EMC */ keys[i].len = netdev_flow_key_size(miniflow_n_values(&keys[i].mf)); @@ -6994,14 +6955,6 @@ fast_path_processing(struct dp_netdev_pmd_thread *pmd, } flow = dp_netdev_flow_cast(rules[i]); - /* In case of wildcard condition: FPGA and EMC lookup miss but - * smc/dpcls lookup hit, before insert EMC, try to offload - * netdev flows again(correspond to new mega_ufid) - */ - if (netdev_is_flow_api_enabled() && - (flow->flow.dl_type == htons(ETH_TYPE_IP))) { - dp_netdev_append_hw_offload(pmd,flow); - } uint32_t hash = dp_netdev_flow_hash(&flow->ufid); smc_insert(pmd, keys[i], hash); From patchwork Mon Dec 28 09:25:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420993 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QdH1MHPz9sVv for ; Tue, 29 Dec 2020 05:12:51 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 46E35871BE; Mon, 28 Dec 2020 18:12:49 +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 zJV0WfDyFfH7; Mon, 28 Dec 2020 18:12:42 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 6BBD98733B; Mon, 28 Dec 2020 18:11:44 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 2B901C1F46; Mon, 28 Dec 2020 18:11:44 +0000 (UTC) X-Original-To: ovs-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 BC067C0891 for ; Mon, 28 Dec 2020 09:26:20 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 9DB4D86C46 for ; Mon, 28 Dec 2020 09:26:20 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id BK7pgWKk63S3 for ; Mon, 28 Dec 2020 09:26:17 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by whitealder.osuosl.org (Postfix) with ESMTP id 9B3FC86C90 for ; Mon, 28 Dec 2020 09:26:15 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app02-12002 (RichMail) with SMTP id 2ee25fe9a4a1d81-bec0a; Mon, 28 Dec 2020 17:25:55 +0800 (CST) X-RM-TRANSID: 2ee25fe9a4a1d81-bec0a X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8d2; Mon, 28 Dec 2020 17:25:55 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8d2 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:01 -0800 Message-Id: <20201228092520.11807-44-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Rongyin Subject: [ovs-dev] [PATCH 43/62] netdev-offload-dpdk: add conntrack offload init version 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Rongyin NOTE: dpif-netdev: transmit mod_flag && nat_info to offload item netdev-offload: add nat_info into offload item netdev-offload-dpdk: translate jump action when combined recirc and set action translate ct action when pkt->md.ct_state == est translate ipv4 nat action into ip/port set action translate recirc_id match set into rte_flow_attr.group not translate ct_clear and other ct action,just continue Code Source From: Self Code Description: Add conntrack offload init version. The details as above. Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 193 ++++++++++++++++++++++++++++++++++++++++++++-- lib/netdev-offload-dpdk.c | 139 ++++++++++++++++++++++----------- lib/netdev-offload.h | 7 +- lib/odp-execute.c | 2 + lib/odp-execute.h | 5 ++ lib/packets.h | 3 + 6 files changed, 298 insertions(+), 51 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index a2cf82b..4beea5b 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -417,6 +417,9 @@ struct dp_flow_offload_item { struct match match; struct nlattr *actions; size_t actions_len; + uint8_t mod_flag; /* from packet->md.mod_flag */ + bool should_jump; + struct nat_action_info_t nat_action; struct ovs_list node; }; @@ -2372,6 +2375,7 @@ dp_netdev_alloc_flow_offload(struct dp_netdev_pmd_thread *pmd, offload->pmd = pmd; offload->flow = flow; offload->op = op; + offload->should_jump = false; dp_netdev_flow_ref(flow); dp_netdev_pmd_try_ref(pmd); @@ -2468,6 +2472,9 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) } info.flow_mark = mark; info.dpif_type_str = dpif_type_str; + info.mod_flag = offload->mod_flag; + info.nat_action = offload->nat_action; + info.ct_enable = false; port = netdev_ports_get(in_port, dpif_type_str); if (!port) { @@ -2577,17 +2584,180 @@ queue_netdev_flow_del(struct dp_netdev_pmd_thread *pmd, dp_netdev_append_flow_offload(offload); } +/* return value show if this flow should be offloaded*/ +static bool +parse_netdev_flow_put(struct match *match, const struct nlattr *actions, + size_t actions_len, struct nat_action_info_t *nat_action, + uint8_t mod_flag) +{ + bool action_has_recirc = false; + bool action_has_set = false; + bool ret = false; + struct nlattr *nla; + size_t left; + + /* filter non IP pkt out */ + if ((match->flow.dl_type != htons(ETH_TYPE_IP)) && + (match->flow.dl_type != htons(ETH_TYPE_IPV6))) { + goto out; + } + /*parse actions to decide flags */ + NL_ATTR_FOR_EACH_UNSAFE (nla, left, actions, actions_len) { + if (nl_attr_type(nla) == OVS_ACTION_ATTR_RECIRC) { + action_has_recirc = true; + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_SET || + nl_attr_type(nla) == OVS_ACTION_ATTR_SET_MASKED) { + action_has_set = true; + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_CT) { + const struct nlattr *b; + unsigned int ct_left; + + if (nat_action == NULL) { + continue; + } + + NL_ATTR_FOR_EACH_UNSAFE (b, ct_left, nl_attr_get(nla), + nl_attr_get_size(nla)) { + if ( nl_attr_type(b) == OVS_CT_ATTR_NAT) { + const struct nlattr *b_nest; + unsigned int left_nest; + bool ip_min_specified = false; + bool proto_num_min_specified = false; + bool ip_max_specified = false; + bool proto_num_max_specified = false; + memset(nat_action, 0, sizeof *nat_action); + + NL_NESTED_FOR_EACH_UNSAFE (b_nest, left_nest, b) { + enum ovs_nat_attr sub_type_nest = nl_attr_type(b_nest); + + switch (sub_type_nest) { + case OVS_NAT_ATTR_SRC: + case OVS_NAT_ATTR_DST: + nat_action->nat_action |= + ((sub_type_nest == OVS_NAT_ATTR_SRC) + ? NAT_ACTION_SRC : NAT_ACTION_DST); + break; + case OVS_NAT_ATTR_IP_MIN: + memcpy(&(nat_action->min_addr), + nl_attr_get(b_nest), + nl_attr_get_size(b_nest)); + ip_min_specified = true; + break; + case OVS_NAT_ATTR_IP_MAX: + memcpy(&(nat_action->max_addr), + nl_attr_get(b_nest), + nl_attr_get_size(b_nest)); + ip_max_specified = true; + break; + case OVS_NAT_ATTR_PROTO_MIN: + nat_action->min_port = + nl_attr_get_u16(b_nest); + proto_num_min_specified = true; + break; + case OVS_NAT_ATTR_PROTO_MAX: + nat_action->max_port = + nl_attr_get_u16(b_nest); + proto_num_max_specified = true; + break; + case OVS_NAT_ATTR_PERSISTENT: + case OVS_NAT_ATTR_PROTO_HASH: + case OVS_NAT_ATTR_PROTO_RANDOM: + break; + case OVS_NAT_ATTR_UNSPEC: + case __OVS_NAT_ATTR_MAX: + OVS_NOT_REACHED(); + } + } + + if (ip_min_specified && !ip_max_specified) { + nat_action->max_addr = nat_action->min_addr; + } + if (proto_num_min_specified && !proto_num_max_specified) { + nat_action->max_port = nat_action->min_port; + } + if (proto_num_min_specified || proto_num_max_specified) { + if (nat_action->nat_action & NAT_ACTION_SRC) { + nat_action->nat_action |= NAT_ACTION_SRC_PORT; + } else if (nat_action->nat_action & NAT_ACTION_DST) { + nat_action->nat_action |= NAT_ACTION_DST_PORT; + } + } + break; + } else { /* (b) == OVS_CT_ATTR_NAT */ + continue; + } + } /* nl_attr_get_size(nla)) */ + } else { /* (nla) == OVS_ACTION_ATTR_CT */ + continue; + } + } /*FOR_EACH_UNSAFE (nla, left, actions, actions_len) */ + + /* mod_flag has been set,means it's loopbacked pkt with new match + * we should try to offload jump action and group id + * in this condition: there are three scenarios: + * 1. care ct_state && ct_state = est (should offload) + * 2. care ct_state && ct_state != est (not offload) + * 3. don't care ct_state (should try offload) + * For 1, the rte_flow ct action will be set + * For 3, the rte_flow ct action won't be set + */ + if (mod_flag) { + if (match->wc.masks.ct_state && + !(match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) ){ + ret = false; + } else { + ret = true; + } + goto out; + } + + /* no mod_flag means: 1. no set action at all + * 2. set action but is the first translated pkt + * For 1 , only established pkt should try to offload + * For 2 , still established pkt should be offload + * so in this condition: we cannot offload non-est pkt + */ + if (match->wc.masks.ct_state && + !(match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) ){ + goto out; + } + + /* no mod_flag and no recirc flow: we should try to offload */ + if (action_has_recirc==false) { + ret = true; + goto out; + } + /* no mod_flag and recirc and set and +est,means it's first loopback pkt + * we should try to offload jump action and "no" group id + */ + if (action_has_set==true) { + if (match->wc.masks.ct_state && + (match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED)) { + ret = true; + goto out; + } + } + + +out: + return ret; +} + static void queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd, struct dp_netdev_flow *flow, struct match *match, - const struct nlattr *actions, size_t actions_len) + const struct nlattr *actions, size_t actions_len,uint8_t mod_flag) { struct dp_flow_offload_item *offload; int op; + struct nat_action_info_t nat_action; if (!netdev_is_flow_api_enabled()) { return; } + if (!parse_netdev_flow_put(match,actions,actions_len,&nat_action,mod_flag)) { + return; + } if (ovsthread_once_start(&offload_thread_once)) { xpthread_cond_init(&dp_flow_offload.cond, NULL); @@ -2606,6 +2776,8 @@ queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd, offload->actions = xmalloc(actions_len); memcpy(offload->actions, actions, actions_len); offload->actions_len = actions_len; + offload->mod_flag = mod_flag; + offload->nat_action = nat_action; dp_netdev_append_flow_offload(offload); } @@ -3366,7 +3538,8 @@ dp_netdev_get_mega_ufid(const struct match *match, ovs_u128 *mega_ufid) static struct dp_netdev_flow * dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd, struct match *match, const ovs_u128 *ufid, - const struct nlattr *actions, size_t actions_len) + const struct nlattr *actions, size_t actions_len, + uint8_t mod_flag) OVS_REQUIRES(pmd->flow_mutex) { struct ds extra_info = DS_EMPTY_INITIALIZER; @@ -3431,7 +3604,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd, /*Don't try to offload flows that has been offloaded failed */ if (megaflow_to_offload_st_find(&flow->ufid) == false) { - queue_netdev_flow_put(pmd, flow, match, actions, actions_len); + queue_netdev_flow_put(pmd, flow, match, actions, actions_len,mod_flag); } if (OVS_UNLIKELY(!VLOG_DROP_DBG((&upcall_rl)))) { @@ -3502,7 +3675,7 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd, if (put->flags & DPIF_FP_CREATE) { if (cmap_count(&pmd->flow_table) < MAX_FLOWS) { dp_netdev_flow_add(pmd, match, ufid, put->actions, - put->actions_len); + put->actions_len,(uint8_t)0); error = 0; } else { error = EFBIG; @@ -3524,7 +3697,7 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd, /*Don't try to offload flows that has been offloaded failed */ if (megaflow_to_offload_st_find(&netdev_flow->ufid) == false) { queue_netdev_flow_put(pmd, netdev_flow, match, - put->actions, put->actions_len); + put->actions, put->actions_len,(uint8_t)0); } if (stats) { @@ -6793,6 +6966,7 @@ handle_packet_upcall(struct dp_netdev_pmd_thread *pmd, ovs_u128 ufid; int error; uint64_t cycles = cycles_counter_update(&pmd->perf_stats); + uint8_t mod_flag; match.tun_md.valid = false; miniflow_expand(&key->mf, &match.flow); @@ -6824,9 +6998,15 @@ handle_packet_upcall(struct dp_netdev_pmd_thread *pmd, /* We can't allow the packet batching in the next loop to execute * the actions. Otherwise, if there are any slow path actions, * we'll send the packet up twice. */ + + /* get mod_flag before execute action, so can set group_id=0 for first + * loopbacked pkt with set action + */ + mod_flag = packet->md.mod_flag; dp_packet_batch_init_packet(&b, packet); dp_netdev_execute_actions(pmd, &b, true, &match.flow, actions->data, actions->size); + /* get nat action after execute action, so can set nat info in time */ add_actions = put_actions->size ? put_actions : actions; if (OVS_LIKELY(error != ENOSPC)) { @@ -6842,7 +7022,8 @@ handle_packet_upcall(struct dp_netdev_pmd_thread *pmd, if (OVS_LIKELY(!netdev_flow)) { netdev_flow = dp_netdev_flow_add(pmd, &match, &ufid, add_actions->data, - add_actions->size); + add_actions->size, + mod_flag); } ovs_mutex_unlock(&pmd->flow_mutex); uint32_t hash = dp_netdev_flow_hash(&netdev_flow->ufid); diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index ad6302b..d4a80bb 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -573,6 +573,11 @@ 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_JUMP) { + const struct rte_flow_action_jump *jump = actions->conf; + ds_put_format(s, " Set-Jump to : %"PRIu32"\n", jump->group); + } else if (actions->type == RTE_FLOW_ACTION_TYPE_CT) { + ds_put_cstr(s, " Set-CT-enable bit\n"); } else { ds_put_format(s, "unknown rte flow action (%d)\n", actions->type); } @@ -807,26 +812,21 @@ parse_flow_match(struct flow_patterns *patterns, { uint8_t *next_proto_mask = NULL; uint8_t proto = 0; - struct flow *consumed_masks; - consumed_masks = &match->wc.masks; - /* Not attemp to offload in_port/recirc_id ? */ - memset(&consumed_masks->in_port, 0, sizeof consumed_masks->in_port); - consumed_masks->recirc_id = 0; - consumed_masks->packet_type = 0; - if (!strcmp(netdev_get_type(netdev), "vxlan") && !parse_vxlan_match(patterns, match)) { - memset(&consumed_masks->tunnel, 0, sizeof consumed_masks->tunnel); } else if (!strcmp(netdev_get_type(netdev), "geneve") && !parse_geneve_match(patterns, match)) { - memset(&consumed_masks->tunnel, 0, sizeof consumed_masks->tunnel); } else if (netdev_vport_is_vport_class(netdev->netdev_class)) { VLOG_DBG("in port (%s) not supported", netdev->name); return -1; } + /* Group id */ + if (info->mod_flag) { + info->group_id = match->flow.recirc_id; + } /* Eth */ if (match->flow.packet_type == htonl(PT_ETH)) { struct rte_flow_item_eth *spec, *mask; @@ -843,8 +843,6 @@ parse_flow_match(struct flow_patterns *patterns, mask->type = match->wc.masks.dl_type; add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_ETH, spec, mask); - memset(&consumed_masks->dl_dst, 0, sizeof consumed_masks->dl_dst); - memset(&consumed_masks->dl_src, 0, sizeof consumed_masks->dl_src); } else { /* @@ -856,7 +854,6 @@ 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) { @@ -873,7 +870,6 @@ 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]); /* do not attempt to offload frags. */ if (match->flow.nw_frag != OVS_FRAG_TYPE_NONE && match->wc.masks.nw_frag) { @@ -881,7 +877,6 @@ parse_flow_match(struct flow_patterns *patterns, match->wc.masks.nw_frag); return -1; } - consumed_masks->nw_frag = 0; /* IP v4 */ if (match->flow.dl_type == htons(ETH_TYPE_IP)) { @@ -913,11 +908,6 @@ parse_flow_match(struct flow_patterns *patterns, add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_IPV4, spec, mask); - 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; /* Save proto for L4 protocol setup.Not consider mask proto = spec->hdr.next_proto_id & @@ -959,11 +949,6 @@ parse_flow_match(struct flow_patterns *patterns, 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); @@ -1001,9 +986,6 @@ parse_flow_match(struct flow_patterns *patterns, add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_TCP, spec, mask); - consumed_masks->tp_src = 0; - consumed_masks->tp_dst = 0; - consumed_masks->tcp_flags = 0; /* proto == TCP and ITEM_TYPE_TCP, thus no need for proto match. */ if (next_proto_mask) { @@ -1023,8 +1005,6 @@ parse_flow_match(struct flow_patterns *patterns, add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_UDP, spec, mask); - consumed_masks->tp_src = 0; - consumed_masks->tp_dst = 0; /* proto == UDP and ITEM_TYPE_UDP, thus no need for proto match. */ if (next_proto_mask) { @@ -1044,8 +1024,6 @@ parse_flow_match(struct flow_patterns *patterns, add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_SCTP, spec, mask); - consumed_masks->tp_src = 0; - consumed_masks->tp_dst = 0; /* proto == SCTP and ITEM_TYPE_SCTP, thus no need for proto match. */ if (next_proto_mask) { @@ -1065,8 +1043,6 @@ parse_flow_match(struct flow_patterns *patterns, add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_ICMP, spec, mask); - consumed_masks->tp_src = 0; - consumed_masks->tp_dst = 0; /* proto == ICMP and ITEM_TYPE_ICMP, thus no need for proto match. */ if (next_proto_mask) { @@ -1101,15 +1077,16 @@ parse_flow_match(struct flow_patterns *patterns, *next_proto_mask = 0; } } + VLOG_DBG("TIMO DBG. ct_state mask =0x%04x,ct_state =0x%04x", + match->wc.masks.ct_state, match->flow.ct_state); + /* ct state */ + if (match->wc.masks.ct_state && + (match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) ){ + info->ct_enable = true; + } add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_END, NULL, NULL); - if (!is_all_zeros(consumed_masks, sizeof *consumed_masks)) { - VLOG_DBG("Cannot match all matches. dl_type=0x%04x", - ntohs(match->flow.dl_type)); - return -1; - } - return 0; } @@ -1340,6 +1317,61 @@ parse_set_actions(struct flow_actions *actions, return 0; } +static int +add_ipv4_nat_action(struct flow_actions *actions, + struct nat_action_info_t *nat_action) +{ + + if (nat_action->nat_action & NAT_ACTION_SRC) { + __be32 ipv4_src; + + /*only support set fixed sip/dip ,not support range*/ + if (ntohl(nat_action->min_addr.ipv4) == + ntohl(nat_action->max_addr.ipv4) ) { + ipv4_src = nat_action->min_addr.ipv4; + add_set_flow_action__(actions, &ipv4_src, NULL, sizeof(ipv4_src), + RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC); + } else { + return -1; + } + } + if (nat_action->nat_action & NAT_ACTION_DST) { + __be32 ipv4_dst; + /*only support set fixed sip/dip ,not support range*/ + if (ntohl(nat_action->min_addr.ipv4) == + ntohl(nat_action->max_addr.ipv4) ) { + ipv4_dst = nat_action->min_addr.ipv4; + add_set_flow_action__(actions, &ipv4_dst, NULL, sizeof(ipv4_dst), + RTE_FLOW_ACTION_TYPE_SET_IPV4_DST); + } else { + return -1; + } + } + if (nat_action->nat_action & NAT_ACTION_SRC_PORT) { + __be16 tcp_src; + /*only support set fixed sport/dport ,not support range*/ + if (nat_action->min_port == nat_action->max_port) { + tcp_src = ntohs(nat_action->min_port); + add_set_flow_action__(actions, &tcp_src, NULL, sizeof(tcp_src), + RTE_FLOW_ACTION_TYPE_SET_TP_SRC); + } else { + return -1; + } + } + if (nat_action->nat_action & NAT_ACTION_DST_PORT) { + __be16 tcp_dst; + /*only support set fixed sport/dport ,not support range*/ + if (nat_action->min_port == nat_action->max_port) { + tcp_dst = ntohs(nat_action->min_port); + add_set_flow_action__(actions, &tcp_dst, NULL, sizeof(tcp_dst), + RTE_FLOW_ACTION_TYPE_SET_TP_DST); + } else { + return -1; + } + } + return 0; +} + /* Maximum number of items in struct rte_flow_action_vxlan_encap. * ETH / IPv4(6) / UDP / VXLAN / END */ @@ -1662,6 +1694,16 @@ parse_flow_actions(struct netdev *netdev, } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_POP_VLAN) { add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_POP_VLAN, NULL); + + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_RECIRC) { + struct rte_flow_action_jump *jump = xzalloc (sizeof *jump); + const uint32_t group = nl_attr_get_u32(nla); + jump->group = group; + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_JUMP, jump); + + /* for ct && ct clear no need to translate*/ + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_CT_CLEAR || + nl_attr_type(nla) == OVS_ACTION_ATTR_CT ) { } else { VLOG_DBG_RL(&rl, "Unsupported action type %d", nl_attr_type(nla)); return -1; @@ -1673,6 +1715,16 @@ parse_flow_actions(struct netdev *netdev, return -1; } + /* add conntrack action */ + if (info->ct_enable) { + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_CT, NULL); + } + /* translate nat action to rte_flow set action */ + if (info->nat_action.nat_action) { + if(add_ipv4_nat_action(actions,&(info->nat_action)) ) { + return -1; + } + } add_flow_action(actions, RTE_FLOW_ACTION_TYPE_END, NULL); return 0; } @@ -1684,7 +1736,8 @@ netdev_offload_dpdk_actions(struct netdev *netdev, size_t actions_len, struct offload_info *info) { - const struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1 }; + const struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1 , + .group = info->group_id }; struct flow_actions actions = { .actions = NULL, .cnt = 0, .valid_ucast = false }; struct rte_flow *flow = NULL; @@ -1806,9 +1859,7 @@ netdev_offload_dpdk_validate_flow(const struct match *match) /* only offload ipv4/ipv6 */ if ((match->flow.dl_type != htons(ETH_TYPE_IP)) && (match->flow.dl_type != htons(ETH_TYPE_IPV6))) { - VLOG_DBG("RY DBG: dl_type=0x%04x no need to be offloaded", - ntohs(match->flow.dl_type)); - return -1; + goto err; } /* support conntrack now so mark this checker @@ -1841,7 +1892,7 @@ netdev_offload_dpdk_validate_flow(const struct match *match) */ /* Unsupported L4. */ - if (masks->igmp_group_ip4 || masks->ct_tp_src || masks->ct_tp_dst) { + if (masks->igmp_group_ip4) { goto err; } diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index f15f86f..7c39706 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -22,6 +22,7 @@ #include "openvswitch/types.h" #include "packets.h" #include "flow.h" +#include "conntrack.h" #ifdef __cplusplus extern "C" { @@ -39,7 +40,6 @@ struct smap; struct sset; struct ovs_action_push_tnl; - /* Offload-capable (HW) netdev information */ struct netdev_hw_info { bool oor; /* Out of Offload Resources ? */ @@ -77,6 +77,11 @@ struct offload_info { bool tc_modify_flow_deleted; /* Indicate the tc modify flow put success * to delete the original flow. */ const char *dpif_type_str; /* dpif type string. */ + + uint8_t mod_flag; /* from packet->md.mod_flag */ + bool ct_enable; /* if true, we should translate to rte_flow_action_ct */ + uint32_t group_id; + struct nat_action_info_t nat_action; }; int netdev_flow_flush(struct netdev *); diff --git a/lib/odp-execute.c b/lib/odp-execute.c index 42d3335..b3cb71b 100644 --- a/lib/odp-execute.c +++ b/lib/odp-execute.c @@ -955,12 +955,14 @@ odp_execute_actions(void *dp, struct dp_packet_batch *batch, bool steal, case OVS_ACTION_ATTR_SET: DP_PACKET_BATCH_FOR_EACH (i, packet, batch) { odp_execute_set_action(packet, nl_attr_get(a)); + packet->md.mod_flag |= 1 << SET_ACTION_SET ; } break; case OVS_ACTION_ATTR_SET_MASKED: DP_PACKET_BATCH_FOR_EACH(i, packet, batch) { odp_execute_masked_set_action(packet, nl_attr_get(a)); + packet->md.mod_flag |= 1 << SET_ACTION_SET ; } break; diff --git a/lib/odp-execute.h b/lib/odp-execute.h index a3578a5..74e308c 100644 --- a/lib/odp-execute.h +++ b/lib/odp-execute.h @@ -28,6 +28,11 @@ struct dp_packet; struct pkt_metadata; struct dp_packet_batch; +enum { + RECIRC_ACTION_SET, + SET_ACTION_SET, +}; + typedef void (*odp_execute_cb)(void *dp, struct dp_packet_batch *batch, const struct nlattr *action, bool should_steal); diff --git a/lib/packets.h b/lib/packets.h index 9d5d241..4eafaca 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -112,6 +112,8 @@ PADDED_MEMBERS_CACHELINE_MARKER(CACHE_LINE_SIZE, cacheline0, struct conn *conn; /* Cached conntrack connection. */ bool reply; /* True if reply direction. */ bool icmp_related; /* True if ICMP related. */ + uint8_t mod_flag; /* Modify flag */ + ); PADDED_MEMBERS_CACHELINE_MARKER(CACHE_LINE_SIZE, cacheline1, @@ -168,6 +170,7 @@ pkt_metadata_init(struct pkt_metadata *md, odp_port_t port) md->tunnel.ipv6_dst = in6addr_any; md->in_port.odp_port = port; md->conn = NULL; + md->mod_flag = 0; } /* This function prefetches the cachelines touched by pkt_metadata_init() From patchwork Mon Dec 28 09:25:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420963 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qbh27y5z9sVv for ; Tue, 29 Dec 2020 05:11:28 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id DE05487231; Mon, 28 Dec 2020 18:11:26 +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 j+S6pEnPZ4mo; Mon, 28 Dec 2020 18:11:22 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 170C887146; Mon, 28 Dec 2020 18:11:15 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id CA09AC1E9F; Mon, 28 Dec 2020 18:11:14 +0000 (UTC) X-Original-To: ovs-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 4D2CEC1DA8 for ; Mon, 28 Dec 2020 09:26:09 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 3272884FB8 for ; Mon, 28 Dec 2020 09:26:09 +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 pPI2jEftFnEA for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by hemlock.osuosl.org (Postfix) with ESMTP id EF6C4870C9 for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app04-12004 (RichMail) with SMTP id 2ee45fe9a4a1792-c2182; Mon, 28 Dec 2020 17:25:55 +0800 (CST) X-RM-TRANSID: 2ee45fe9a4a1792-c2182 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8d7; Mon, 28 Dec 2020 17:25:55 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8d7 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:02 -0800 Message-Id: <20201228092520.11807-45-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 44/62] dpif-netdev: use skb_priority to substitute mod_flag 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: As packet->md.mod_flag would be the last mod_flag status, but we need to get mod status in time, so we reuse match.flow.skb_priority (it won't be used before). And retrive packet->md.skb_priority. Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 64 ++++++++++++++++++++++++++++++++++------------- lib/netdev-offload-dpdk.c | 3 ++- lib/odp-execute.c | 4 +-- lib/packets.h | 6 ++--- 4 files changed, 53 insertions(+), 24 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 4beea5b..b96d12d 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2475,6 +2475,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) info.mod_flag = offload->mod_flag; info.nat_action = offload->nat_action; info.ct_enable = false; + info.group_id = 0; port = netdev_ports_get(in_port, dpif_type_str); if (!port) { @@ -2587,14 +2588,17 @@ queue_netdev_flow_del(struct dp_netdev_pmd_thread *pmd, /* return value show if this flow should be offloaded*/ static bool parse_netdev_flow_put(struct match *match, const struct nlattr *actions, - size_t actions_len, struct nat_action_info_t *nat_action, - uint8_t mod_flag) + size_t actions_len, struct nat_action_info_t *nat_action + ) { bool action_has_recirc = false; bool action_has_set = false; + bool action_has_dnat = false; + bool action_has_ct = false; bool ret = false; struct nlattr *nla; size_t left; + uint32_t mod_flag = match->flow.skb_priority; /* filter non IP pkt out */ if ((match->flow.dl_type != htons(ETH_TYPE_IP)) && @@ -2612,6 +2616,7 @@ parse_netdev_flow_put(struct match *match, const struct nlattr *actions, const struct nlattr *b; unsigned int ct_left; + action_has_ct = true; if (nat_action == NULL) { continue; } @@ -2636,6 +2641,8 @@ parse_netdev_flow_put(struct match *match, const struct nlattr *actions, nat_action->nat_action |= ((sub_type_nest == OVS_NAT_ATTR_SRC) ? NAT_ACTION_SRC : NAT_ACTION_DST); + action_has_dnat = (sub_type_nest == OVS_NAT_ATTR_DST)? + true : action_has_dnat; break; case OVS_NAT_ATTR_IP_MIN: memcpy(&(nat_action->min_addr), @@ -2711,12 +2718,23 @@ parse_netdev_flow_put(struct match *match, const struct nlattr *actions, goto out; } + /*if only has one conntrack action, won't need to offload */ + if ((actions_len == 1) && action_has_ct) { + goto out; + } /* no mod_flag means: 1. no set action at all * 2. set action but is the first translated pkt + * 3. nat action then set mac/ttl: such as DNAT * For 1 , only established pkt should try to offload * For 2 , still established pkt should be offload - * so in this condition: we cannot offload non-est pkt + * For 3 , we don't care ct_state,and try to offload + * so for 1 && 2: we cannot offload non-est pkt + * for 3, we try to offload non-est pkt */ + if (action_has_dnat) { + ret = true; + goto out; + } if (match->wc.masks.ct_state && !(match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) ){ goto out; @@ -2746,7 +2764,7 @@ out: static void queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd, struct dp_netdev_flow *flow, struct match *match, - const struct nlattr *actions, size_t actions_len,uint8_t mod_flag) + const struct nlattr *actions, size_t actions_len) { struct dp_flow_offload_item *offload; int op; @@ -2755,10 +2773,20 @@ queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd, if (!netdev_is_flow_api_enabled()) { return; } - if (!parse_netdev_flow_put(match,actions,actions_len,&nat_action,mod_flag)) { + if (!parse_netdev_flow_put(match,actions,actions_len,&nat_action)) { return; } + VLOG_DBG("TIMO DBG: in queue_netdev_flow_put:recirc %x mod %x \n", match->flow.recirc_id, + match->flow.skb_priority); + VLOG_DBG("TIMO DBG: in queue_netdev_flow_put:nw_src %x ct_nw_src %x \n", + ntohl(match->flow.nw_src), ntohl(match->flow.ct_nw_src)); + VLOG_DBG("TIMO DBG: in queue_netdev_flow_put:nat action %x \n", + nat_action.nat_action); + VLOG_DBG("TIMO DBG: in queue_netdev_flow_put:nat min addr %x \n", + ntohl(nat_action.min_addr.ipv4)); + VLOG_DBG("TIMO DBG: in queue_netdev_flow_put:nat max addr %x \n", + ntohl(nat_action.max_addr.ipv4)); if (ovsthread_once_start(&offload_thread_once)) { xpthread_cond_init(&dp_flow_offload.cond, NULL); ovs_thread_create("dp_netdev_flow_offload", @@ -2776,7 +2804,7 @@ queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd, offload->actions = xmalloc(actions_len); memcpy(offload->actions, actions, actions_len); offload->actions_len = actions_len; - offload->mod_flag = mod_flag; + offload->mod_flag = match->flow.skb_priority; offload->nat_action = nat_action; dp_netdev_append_flow_offload(offload); @@ -3538,8 +3566,7 @@ dp_netdev_get_mega_ufid(const struct match *match, ovs_u128 *mega_ufid) static struct dp_netdev_flow * dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd, struct match *match, const ovs_u128 *ufid, - const struct nlattr *actions, size_t actions_len, - uint8_t mod_flag) + const struct nlattr *actions, size_t actions_len) OVS_REQUIRES(pmd->flow_mutex) { struct ds extra_info = DS_EMPTY_INITIALIZER; @@ -3604,7 +3631,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd, /*Don't try to offload flows that has been offloaded failed */ if (megaflow_to_offload_st_find(&flow->ufid) == false) { - queue_netdev_flow_put(pmd, flow, match, actions, actions_len,mod_flag); + queue_netdev_flow_put(pmd, flow, match, actions, actions_len); } if (OVS_UNLIKELY(!VLOG_DROP_DBG((&upcall_rl)))) { @@ -3675,7 +3702,7 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd, if (put->flags & DPIF_FP_CREATE) { if (cmap_count(&pmd->flow_table) < MAX_FLOWS) { dp_netdev_flow_add(pmd, match, ufid, put->actions, - put->actions_len,(uint8_t)0); + put->actions_len); error = 0; } else { error = EFBIG; @@ -3697,7 +3724,7 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd, /*Don't try to offload flows that has been offloaded failed */ if (megaflow_to_offload_st_find(&netdev_flow->ufid) == false) { queue_netdev_flow_put(pmd, netdev_flow, match, - put->actions, put->actions_len,(uint8_t)0); + put->actions, put->actions_len); } if (stats) { @@ -6966,7 +6993,6 @@ handle_packet_upcall(struct dp_netdev_pmd_thread *pmd, ovs_u128 ufid; int error; uint64_t cycles = cycles_counter_update(&pmd->perf_stats); - uint8_t mod_flag; match.tun_md.valid = false; miniflow_expand(&key->mf, &match.flow); @@ -6999,10 +7025,6 @@ handle_packet_upcall(struct dp_netdev_pmd_thread *pmd, * the actions. Otherwise, if there are any slow path actions, * we'll send the packet up twice. */ - /* get mod_flag before execute action, so can set group_id=0 for first - * loopbacked pkt with set action - */ - mod_flag = packet->md.mod_flag; dp_packet_batch_init_packet(&b, packet); dp_netdev_execute_actions(pmd, &b, true, &match.flow, actions->data, actions->size); @@ -7022,8 +7044,7 @@ handle_packet_upcall(struct dp_netdev_pmd_thread *pmd, if (OVS_LIKELY(!netdev_flow)) { netdev_flow = dp_netdev_flow_add(pmd, &match, &ufid, add_actions->data, - add_actions->size, - mod_flag); + add_actions->size); } ovs_mutex_unlock(&pmd->flow_mutex); uint32_t hash = dp_netdev_flow_hash(&netdev_flow->ufid); @@ -7651,6 +7672,13 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, nat_action_info.nat_action |= ((sub_type_nest == OVS_NAT_ATTR_SRC) ? NAT_ACTION_SRC : NAT_ACTION_DST); + /*For DNAT, we should also set mod_flag */ + if (sub_type_nest == OVS_NAT_ATTR_DST) { + struct dp_packet *packet; + DP_PACKET_BATCH_FOR_EACH (i, packet, packets_) { + packet->md.skb_priority |= 1 << SET_ACTION_SET ; + } + } break; case OVS_NAT_ATTR_IP_MIN: memcpy(&nat_action_info.min_addr, diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index d4a80bb..12aa5c1 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -507,7 +507,7 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) if (vlan_tci) { ds_put_format(s, "rte flow vlan-push action:\n"); - ds_put_format(s, "vlan-encap: tpid=%"PRIu16"\n",ntohs(vlan_tci->ethertype)); + ds_put_format(s, "vlan-encap: tpid=0x%06x\n",ntohs(vlan_tci->ethertype)); } else { ds_put_format(s, "vlan-encap: null\n"); } @@ -1322,6 +1322,7 @@ add_ipv4_nat_action(struct flow_actions *actions, struct nat_action_info_t *nat_action) { + VLOG_DBG("TIMO DBG: in add_ipv4_nat_action"); if (nat_action->nat_action & NAT_ACTION_SRC) { __be32 ipv4_src; diff --git a/lib/odp-execute.c b/lib/odp-execute.c index b3cb71b..559f260 100644 --- a/lib/odp-execute.c +++ b/lib/odp-execute.c @@ -955,14 +955,14 @@ odp_execute_actions(void *dp, struct dp_packet_batch *batch, bool steal, case OVS_ACTION_ATTR_SET: DP_PACKET_BATCH_FOR_EACH (i, packet, batch) { odp_execute_set_action(packet, nl_attr_get(a)); - packet->md.mod_flag |= 1 << SET_ACTION_SET ; + packet->md.skb_priority |= 1 << SET_ACTION_SET ; } break; case OVS_ACTION_ATTR_SET_MASKED: DP_PACKET_BATCH_FOR_EACH(i, packet, batch) { odp_execute_masked_set_action(packet, nl_attr_get(a)); - packet->md.mod_flag |= 1 << SET_ACTION_SET ; + packet->md.skb_priority |= 1 << SET_ACTION_SET ; } break; diff --git a/lib/packets.h b/lib/packets.h index 4eafaca..84c554e 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -101,7 +101,9 @@ PADDED_MEMBERS_CACHELINE_MARKER(CACHE_LINE_SIZE, cacheline0, received from the wire. */ uint32_t dp_hash; /* hash value computed by the recirculation action. */ - uint32_t skb_priority; /* Packet priority for QoS. */ + uint32_t skb_priority; /* Packet priority for QoS. + * together with mod_flag + */ uint32_t pkt_mark; /* Packet mark. */ uint8_t ct_state; /* Connection state. */ bool ct_orig_tuple_ipv6; @@ -112,7 +114,6 @@ PADDED_MEMBERS_CACHELINE_MARKER(CACHE_LINE_SIZE, cacheline0, struct conn *conn; /* Cached conntrack connection. */ bool reply; /* True if reply direction. */ bool icmp_related; /* True if ICMP related. */ - uint8_t mod_flag; /* Modify flag */ ); @@ -170,7 +171,6 @@ pkt_metadata_init(struct pkt_metadata *md, odp_port_t port) md->tunnel.ipv6_dst = in6addr_any; md->in_port.odp_port = port; md->conn = NULL; - md->mod_flag = 0; } /* This function prefetches the cachelines touched by pkt_metadata_init() From patchwork Mon Dec 28 09:25:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420974 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QcL5yPnz9sVv for ; Tue, 29 Dec 2020 05:12:02 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 2D7448748C; Mon, 28 Dec 2020 18:12:01 +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 kIZq5ahMFJFM; Mon, 28 Dec 2020 18:11:53 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 2364F871BA; Mon, 28 Dec 2020 18:11:28 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B0A5EC1ECE; Mon, 28 Dec 2020 18:11:27 +0000 (UTC) X-Original-To: ovs-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 5545EC0891 for ; Mon, 28 Dec 2020 09:26:18 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 440F686C8A for ; Mon, 28 Dec 2020 09:26:18 +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 IUsRRFMU5bi8 for ; Mon, 28 Dec 2020 09:26:16 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by whitealder.osuosl.org (Postfix) with ESMTP id E5E5B86C8C for ; Mon, 28 Dec 2020 09:26:15 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app02-12002 (RichMail) with SMTP id 2ee25fe9a4a4d84-bec0d; Mon, 28 Dec 2020 17:25:56 +0800 (CST) X-RM-TRANSID: 2ee25fe9a4a4d84-bec0d X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8d9; Mon, 28 Dec 2020 17:25:55 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8d9 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:03 -0800 Message-Id: <20201228092520.11807-46-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 45/62] netdev-offload-dpdk: Add geneve option header parse/encap 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: Add geneve tunnel header parse/encap support. Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 96 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 77 insertions(+), 19 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 12aa5c1..fb36466 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -413,12 +413,37 @@ dump_flow_pattern(struct ds *s, const struct rte_flow_item *item) ds_put_cstr(s, " Spec = null\n"); } if (geneve_mask) { - ds_put_format(s, "vni mask 0x%06x ", + ds_put_format(s, "vni mask 0x%06x \n", ntohl(*(ovs_be32 *)geneve_mask->vni) >> 8); } else { ds_put_cstr(s, " Mask = null\n"); } ds_put_cstr(s, "/ "); + } else if (item->type == RTE_FLOW_ITEM_TYPE_GENEVE_OPTIONS) { + const struct rte_flow_item_geneve_options *op_spec = item->spec; + const struct rte_flow_item_geneve_options *op_mask = item->mask; + + ds_put_cstr(s, "rte flow geneve options pattern:\n"); + ds_put_cstr(s, "geneve op \n"); + if (op_spec) { + ds_put_format(s, "class spec 0x%04x \n", ntohs(op_spec->class)); + ds_put_format(s, "type spec 0x%02x \n", op_spec->type); + ds_put_format(s, "len spec %d \n", op_spec->len); + ds_put_format(s, "opdata spec 0x%08x \n", + ntohl(op_spec->option_data)); + } else { + ds_put_cstr(s, " Spec = null\n"); + } + if (op_mask) { + ds_put_format(s, "class mask 0x%04x \n", ntohs(op_mask->class)); + ds_put_format(s, "type mask 0x%02x \n", op_mask->type); + ds_put_format(s, "len mask %d \n", op_mask->len); + ds_put_format(s, "opdata mask 0x%08x \n", + ntohl(op_mask->option_data)); + } else { + ds_put_cstr(s, " Mask = null\n"); + } + ds_put_cstr(s, "/ "); } else { ds_put_format(s, "unknown rte flow pattern (%d)\n", item->type); } @@ -489,7 +514,6 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) } } else if (actions->type == RTE_FLOW_ACTION_TYPE_VXLAN_DECAP) { ds_put_format(s, "vxlan-decap: nop\n"); - /* TBD } else if (actions->type == RTE_FLOW_ACTION_TYPE_GENEVE_ENCAP) { const struct rte_flow_action_geneve_encap *geneve_encap = actions->conf; const struct rte_flow_item *items = geneve_encap->definition; @@ -501,7 +525,6 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) } } else if (actions->type == RTE_FLOW_ACTION_TYPE_GENEVE_DECAP) { ds_put_format(s, "geneve-decap: nop\n"); - */ } else if (actions->type == RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN) { const struct rte_flow_action_of_push_vlan *vlan_tci = actions->conf; @@ -760,10 +783,11 @@ parse_geneve_match(struct flow_patterns *patterns, const struct match *match) { struct rte_flow_item_geneve *vx_spec, *vx_mask; - /* TBD */ + struct rte_flow_item_geneve_options *op_spec, *op_mask; uint8_t data_len; uint32_t len,opt_data; struct geneve_opt *opt; + const void *gnv; uint8_t i; if (is_all_zeros(&match->wc.masks.tunnel, sizeof match->wc.masks.tunnel)) { @@ -789,17 +813,28 @@ parse_geneve_match(struct flow_patterns *patterns, add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_GENEVE, vx_spec, vx_mask); - /* TBD: add option hdr */ len = match->flow.tunnel.metadata.present.len; if (len > 0) { - opt = &match->flow.tunnel.metadata.opts.gnv; + gnv = &(match->flow.tunnel.metadata.opts.gnv); + opt = (struct geneve_opt *)gnv; data_len = opt->length*4; - uint8_t *buf = (opt+1); + uint8_t *buf = (uint8_t *)(opt+1); for (i=0; iclass = opt->opt_class; + op_spec->type = opt->type; + op_spec->len = opt->length; + op_spec->option_data = htonl(opt_data); + + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_GENEVE_OPTIONS, op_spec, op_mask); } return 0; } @@ -1461,7 +1496,7 @@ err: return -1; } -#define ACTION_GENEVE_ENCAP_ITEMS_NUM 5 +#define ACTION_GENEVE_ENCAP_ITEMS_NUM 6 static int add_geneve_encap_action(struct flow_actions *actions, @@ -1469,18 +1504,21 @@ add_geneve_encap_action(struct flow_actions *actions, { const struct eth_header *eth; const struct udp_header *udp; + const struct genevehdr *geneve; struct geneve_data { - /* TBD struct rte_flow_action_geneve_encap conf; - */ - struct rte_flow_action_vxlan_encap conf; struct rte_flow_item items[0]; } *geneve_data; BUILD_ASSERT_DECL(offsetof(struct geneve_data, conf) == 0); - const void *geneve; const void *l3; const void *l4; + const void *l5; + struct rte_flow_item_geneve_options *op_spec; + struct rte_flow_item_geneve *gnv_spec; + struct geneve_opt *opt; int field; + uint8_t data_len,i; + uint32_t opt_data = 0; VLOG_DBG("TIMO DBG: in add_geneve_encap_action"); geneve_data = xzalloc(sizeof *geneve_data + @@ -1529,21 +1567,44 @@ add_geneve_encap_action(struct flow_actions *actions, geneve_data->items[field].type = RTE_FLOW_ITEM_TYPE_UDP; geneve_data->items[field].spec = udp; geneve_data->items[field].mask = &rte_flow_item_udp_mask; + l5 = (udp + 1); field++; - geneve = (udp + 1); + geneve = (const struct genevehdr *)l5; + gnv_spec = xzalloc(sizeof *gnv_spec); geneve_data->items[field].type = RTE_FLOW_ITEM_TYPE_GENEVE; - geneve_data->items[field].spec = geneve; + gnv_spec->protocol = geneve->proto_type; + put_unaligned_be32((ovs_be32 *)gnv_spec->vni, + get_16aligned_be32(&geneve->vni)); + geneve_data->items[field].spec = gnv_spec; geneve_data->items[field].mask = &rte_flow_item_geneve_mask; field++; + opt =(struct geneve_opt *)&geneve->options; + data_len = opt->length*4; + if (data_len) { + uint8_t *buf = (uint8_t *)(opt+1); + for (i=0; iclass = opt->opt_class; + op_spec->type = opt->type; + op_spec->len = opt->length; + op_spec->option_data = htonl(opt_data); + geneve_data->items[field].type = RTE_FLOW_ITEM_TYPE_GENEVE_OPTIONS; + geneve_data->items[field].spec = op_spec; + geneve_data->items[field].mask = &rte_flow_item_geneve_options_mask; + field++; + } + geneve_data->items[field].type = RTE_FLOW_ITEM_TYPE_END; geneve_data->conf.definition = geneve_data->items; - /* TBD add_flow_action(actions, RTE_FLOW_ACTION_TYPE_GENEVE_ENCAP, geneve_data); - */ return 0; err: @@ -1562,10 +1623,7 @@ static void add_geneve_decap_action(struct flow_actions *actions) { VLOG_DBG("TIMO DBG: in add_geneve_decap_action"); - /* TBD need change to geneve decap add_flow_action(actions, RTE_FLOW_ACTION_TYPE_GENEVE_DECAP, NULL); - */ - add_flow_action(actions, RTE_FLOW_ACTION_TYPE_VXLAN_DECAP, NULL); } static int From patchwork Mon Dec 28 09:25:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420954 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QbL19yFz9sWL for ; Tue, 29 Dec 2020 05:11:10 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id B8086870D1; Mon, 28 Dec 2020 18:11: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 9unZY2qpqfor; Mon, 28 Dec 2020 18:11:06 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id A984787101; Mon, 28 Dec 2020 18:11:03 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 4EF76C1E4B; Mon, 28 Dec 2020 18:11:03 +0000 (UTC) X-Original-To: ovs-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 8239DC1DA7 for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 7B4F481B5E for ; Mon, 28 Dec 2020 09:26:06 +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 jcSHvAtB1YSA for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by hemlock.osuosl.org (Postfix) with ESMTP id 56539870B6 for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app04-12004 (RichMail) with SMTP id 2ee45fe9a4a3793-c2183; Mon, 28 Dec 2020 17:25:56 +0800 (CST) X-RM-TRANSID: 2ee45fe9a4a3793-c2183 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8de; Mon, 28 Dec 2020 17:25:56 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8de From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:04 -0800 Message-Id: <20201228092520.11807-47-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 46/62] dpif-netdev: Fix snat pkt offload bug 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: For snat reply pkt , we should offload from action ct(nat), fix it in parse_netdev_flow_put. Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/conntrack.c | 3 +++ lib/dpif-netdev.c | 50 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/lib/conntrack.c b/lib/conntrack.c index 95d48c5..5318df0 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -32,6 +32,7 @@ #include "flow.h" #include "netdev.h" #include "odp-netlink.h" +#include "odp-execute.h" #include "openvswitch/hmap.h" #include "openvswitch/vlog.h" #include "ovs-rcu.h" @@ -883,6 +884,7 @@ un_nat_packet(struct dp_packet *pkt, const struct conn *conn, struct ip_header *nh = dp_packet_l3(pkt); packet_set_ipv4_addr(pkt, &nh->ip_dst, conn->key.src.addr.ipv4); + pkt->md.skb_priority |= 1 << SET_ACTION_SET ; } else { struct ovs_16aligned_ip6_hdr *nh6 = dp_packet_l3(pkt); packet_set_ipv6_addr(pkt, conn->key.nw_proto, @@ -901,6 +903,7 @@ un_nat_packet(struct dp_packet *pkt, const struct conn *conn, struct ip_header *nh = dp_packet_l3(pkt); packet_set_ipv4_addr(pkt, &nh->ip_src, conn->key.dst.addr.ipv4); + pkt->md.skb_priority |= 1 << SET_ACTION_SET ; } else { struct ovs_16aligned_ip6_hdr *nh6 = dp_packet_l3(pkt); packet_set_ipv6_addr(pkt, conn->key.nw_proto, diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index b96d12d..96eaeb2 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2594,7 +2594,9 @@ parse_netdev_flow_put(struct match *match, const struct nlattr *actions, bool action_has_recirc = false; bool action_has_set = false; bool action_has_dnat = false; + bool action_has_null_nat = false; bool action_has_ct = false; + bool action_has_ct_nat = false; bool ret = false; struct nlattr *nla; size_t left; @@ -2630,6 +2632,9 @@ parse_netdev_flow_put(struct match *match, const struct nlattr *actions, bool proto_num_min_specified = false; bool ip_max_specified = false; bool proto_num_max_specified = false; + + action_has_ct_nat = true; + action_has_null_nat = true; memset(nat_action, 0, sizeof *nat_action); NL_NESTED_FOR_EACH_UNSAFE (b_nest, left_nest, b) { @@ -2643,6 +2648,7 @@ parse_netdev_flow_put(struct match *match, const struct nlattr *actions, ? NAT_ACTION_SRC : NAT_ACTION_DST); action_has_dnat = (sub_type_nest == OVS_NAT_ATTR_DST)? true : action_has_dnat; + action_has_null_nat = false; break; case OVS_NAT_ATTR_IP_MIN: memcpy(&(nat_action->min_addr), @@ -2710,7 +2716,12 @@ parse_netdev_flow_put(struct match *match, const struct nlattr *actions, */ if (mod_flag) { if (match->wc.masks.ct_state && - !(match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) ){ + (match->wc.masks.ct_state & match->flow.ct_state & CS_TRACKED) && + !(match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) && + !(action_has_ct_nat && !action_has_null_nat) ) { + /* for nat(src= or nat(dst= , we should try to offload no matter + * what ct_state is + */ ret = false; } else { ret = true; @@ -2718,38 +2729,54 @@ parse_netdev_flow_put(struct match *match, const struct nlattr *actions, goto out; } - /*if only has one conntrack action, won't need to offload */ - if ((actions_len == 1) && action_has_ct) { - goto out; - } /* no mod_flag means: 1. no set action at all - * 2. set action but is the first translated pkt - * 3. nat action then set mac/ttl: such as DNAT + * 2. first translated pkt with set action + * 3. first translated pkt with reply dir nat action + * 4. first translated pkt with req dir dnat action + * 5. others * For 1 , only established pkt should try to offload - * For 2 , still established pkt should be offload - * For 3 , we don't care ct_state,and try to offload - * so for 1 && 2: we cannot offload non-est pkt - * for 3, we try to offload non-est pkt + * For 2 and 3 , still established pkt should be offload + * For 4 , we don't care ct_state,and try to offload + * so for 1 - 3: we cannot offload non-est pkt + * for 4, we try to offload non-est pkt + * for 5, no need to offload */ + + /* scenario:4 */ if (action_has_dnat) { ret = true; goto out; } if (match->wc.masks.ct_state && + (match->wc.masks.ct_state & match->flow.ct_state & CS_TRACKED) && !(match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) ){ goto out; } + /* scenario 3: if in reply direction's nat and also +est , + * we should try to offload it + */ + if (match->wc.masks.ct_state && + action_has_ct_nat && + action_has_null_nat && + (match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) && + (match->wc.masks.ct_state & match->flow.ct_state & CS_REPLY_DIR) ){ + ret = true; + goto out; + } + /* scenario:1 */ /* no mod_flag and no recirc flow: we should try to offload */ if (action_has_recirc==false) { ret = true; goto out; } + /* scenario:2 */ /* no mod_flag and recirc and set and +est,means it's first loopback pkt * we should try to offload jump action and "no" group id */ if (action_has_set==true) { if (match->wc.masks.ct_state && + (match->wc.masks.ct_state & match->flow.ct_state & CS_TRACKED) && (match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED)) { ret = true; goto out; @@ -2758,6 +2785,7 @@ parse_netdev_flow_put(struct match *match, const struct nlattr *actions, out: + /* scenario:5 */ return ret; } From patchwork Mon Dec 28 09:25:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420959 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QbZ31WLz9sVv for ; Tue, 29 Dec 2020 05:11:22 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 4AD4E871F0; Mon, 28 Dec 2020 18:11: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 ywoIb1wKR89V; Mon, 28 Dec 2020 18:11:15 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id EBEA686D81; Mon, 28 Dec 2020 18:10:42 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 626D9C1DA2; Mon, 28 Dec 2020 18:10:42 +0000 (UTC) X-Original-To: ovs-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 7E804C0891 for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 6DE5020464 for ; Mon, 28 Dec 2020 09:26:04 +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 slNa9mfqXu49 for ; Mon, 28 Dec 2020 09:26:02 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by silver.osuosl.org (Postfix) with ESMTP id AFE732048D for ; Mon, 28 Dec 2020 09:26:01 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app01-12001 (RichMail) with SMTP id 2ee15fe9a4a36d9-bca43; Mon, 28 Dec 2020 17:25:56 +0800 (CST) X-RM-TRANSID: 2ee15fe9a4a36d9-bca43 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8e0; Mon, 28 Dec 2020 17:25:56 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8e0 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:05 -0800 Message-Id: <20201228092520.11807-48-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:33 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 47/62] dpif-netdev: fix offload fail bug during executing ovs-tcpdump 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: OpenSource Description: NOTE: when execute ovs-tcpdump, the flow_mark_flush would be called several times, the second time when we try to call cmap_remove would emit an error, as the formal calling would set mark value to 0xffffffff so add a flag to ensure that the flow_mark_flush would be called only once when we adjust pmd threads Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 7 +++++++ lib/netdev-offload-dpdk.c | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 96eaeb2..e48423f 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2304,6 +2304,13 @@ mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd, uint32_t mark = flow->mark; int ret = 0; + /* Check if the mark is available,INVALID_FLOW_MARK + * means that the flow has been disassociated or never + * associated. + */ + if (OVS_UNLIKELY(mark == INVALID_FLOW_MARK)) { + return -1; + } cmap_remove(&flow_mark.mark_to_flow, mark_node, hash_int(mark, 0)); flow->mark = INVALID_FLOW_MARK; diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index fb36466..f04f61f 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -1209,6 +1209,13 @@ add_output_action(struct netdev *netdev, VLOG_DBG_RL(&rl, "Cannot find netdev for odp port %"PRIu32, port); return -1; } + /* for mirror port, such as port create by executing ovs-tcpdump + * we should just jump output actions to mirroring port + */ + if (strstr(outdev->name,"mi") != NULL) { + netdev_close(outdev); + return 0; + } if (!netdev_flow_api_equals(netdev, outdev) || add_port_id_action(actions, outdev)) { VLOG_DBG_RL(&rl, "%s: Output to port \'%s\' cannot be offloaded.", From patchwork Mon Dec 28 09:25:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420961 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qbd3Bt7z9sVv for ; Tue, 29 Dec 2020 05:11:25 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 6E0BA871C3; Mon, 28 Dec 2020 18:11:22 +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 b2vXduyp4rmC; Mon, 28 Dec 2020 18:11:15 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id EF73D87121; Mon, 28 Dec 2020 18:11:11 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id C55A0C1E8C; Mon, 28 Dec 2020 18:11:11 +0000 (UTC) X-Original-To: ovs-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 CE50CC1DA5 for ; Mon, 28 Dec 2020 09:26:08 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id B91AF84FFF for ; Mon, 28 Dec 2020 09:26: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 eK9O84aP14yh for ; Mon, 28 Dec 2020 09:26:07 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by hemlock.osuosl.org (Postfix) with ESMTP id A328481B5E for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app12-12012 (RichMail) with SMTP id 2eec5fe9a4a5000-c14a3; Mon, 28 Dec 2020 17:25:57 +0800 (CST) X-RM-TRANSID: 2eec5fe9a4a5000-c14a3 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8e3; Mon, 28 Dec 2020 17:25:57 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8e3 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:06 -0800 Message-Id: <20201228092520.11807-49-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 48/62] dpif-netdev: Add NAT offloading init version 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: opensource code does not support conntrack and NAT offloading by rte_flow.This change add a init version to support it. Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/conntrack.c | 44 +++++++++++++++- lib/dpif-netdev.c | 127 ++++++++++++++-------------------------------- lib/netdev-offload-dpdk.c | 51 ++++++++++++++++--- lib/netdev-offload.h | 5 ++ lib/odp-execute.c | 2 - lib/odp-execute.h | 5 +- lib/packets.h | 8 +++ 7 files changed, 142 insertions(+), 100 deletions(-) diff --git a/lib/conntrack.c b/lib/conntrack.c index 5318df0..adb4dbb 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -736,6 +736,12 @@ nat_packet(struct dp_packet *pkt, const struct conn *conn, bool related) struct ip_header *nh = dp_packet_l3(pkt); packet_set_ipv4_addr(pkt, &nh->ip_src, conn->rev_key.dst.addr.ipv4); + /* + if (pkt->md.skb_priority & (1 << NAT_MOD_SIP)) { + } else { + pkt->md.skb_priority |= 1 << NAT_MOD_SIP; + } + */ } else { struct ovs_16aligned_ip6_hdr *nh6 = dp_packet_l3(pkt); packet_set_ipv6_addr(pkt, conn->key.nw_proto, @@ -751,6 +757,12 @@ nat_packet(struct dp_packet *pkt, const struct conn *conn, bool related) struct ip_header *nh = dp_packet_l3(pkt); packet_set_ipv4_addr(pkt, &nh->ip_dst, conn->rev_key.src.addr.ipv4); + /* + if (pkt->md.skb_priority & (1 << NAT_MOD_DIP)) { + } else { + pkt->md.skb_priority |= 1 << NAT_MOD_DIP; + } + */ } else { struct ovs_16aligned_ip6_hdr *nh6 = dp_packet_l3(pkt); packet_set_ipv6_addr(pkt, conn->key.nw_proto, @@ -835,9 +847,17 @@ reverse_nat_packet(struct dp_packet *pkt, const struct conn *conn) if (conn->nat_info->nat_action & NAT_ACTION_SRC) { packet_set_ipv4_addr(pkt, &inner_l3->ip_src, conn->key.src.addr.ipv4); + if (pkt->md.skb_priority & (1 << NAT_MOD_SIP)) { + } else { + pkt->md.skb_priority |= 1 << NAT_MOD_SIP; + } } else if (conn->nat_info->nat_action & NAT_ACTION_DST) { packet_set_ipv4_addr(pkt, &inner_l3->ip_dst, conn->key.dst.addr.ipv4); + if (pkt->md.skb_priority & (1 << NAT_MOD_DIP)) { + } else { + pkt->md.skb_priority |= 1 << NAT_MOD_DIP; + } } reverse_pat_packet(pkt, conn); @@ -884,7 +904,10 @@ un_nat_packet(struct dp_packet *pkt, const struct conn *conn, struct ip_header *nh = dp_packet_l3(pkt); packet_set_ipv4_addr(pkt, &nh->ip_dst, conn->key.src.addr.ipv4); - pkt->md.skb_priority |= 1 << SET_ACTION_SET ; + if (pkt->md.skb_priority & (1 << NAT_MOD_DIP)) { + } else { + pkt->md.skb_priority |= 1 << NAT_MOD_DIP; + } } else { struct ovs_16aligned_ip6_hdr *nh6 = dp_packet_l3(pkt); packet_set_ipv6_addr(pkt, conn->key.nw_proto, @@ -903,7 +926,10 @@ un_nat_packet(struct dp_packet *pkt, const struct conn *conn, struct ip_header *nh = dp_packet_l3(pkt); packet_set_ipv4_addr(pkt, &nh->ip_src, conn->key.dst.addr.ipv4); - pkt->md.skb_priority |= 1 << SET_ACTION_SET ; + if (pkt->md.skb_priority & (1 << NAT_MOD_SIP)) { + } else { + pkt->md.skb_priority |= 1 << NAT_MOD_SIP; + } } else { struct ovs_16aligned_ip6_hdr *nh6 = dp_packet_l3(pkt); packet_set_ipv6_addr(pkt, conn->key.nw_proto, @@ -1409,6 +1435,20 @@ conntrack_execute(struct conntrack *ct, struct dp_packet_batch *pkt_batch, DP_PACKET_BATCH_FOR_EACH (i, packet, pkt_batch) { struct conn *conn = packet->md.conn; + if (packet->md.ori_nw_src){ + } else { + struct ip_header *nh = dp_packet_l3(packet); + packet->md.ori_nw_src =get_16aligned_be32(&nh->ip_src); + } + if (packet->md.ori_nw_dst){ + } else { + struct ip_header *nh = dp_packet_l3(packet); + packet->md.ori_nw_dst =get_16aligned_be32(&nh->ip_dst); + } + /* clear NAT_MOD_ Flag to 0, when doing un_nat action, it should + * be set to non-zero value + */ + packet->md.skb_priority = 0; if (OVS_UNLIKELY(packet->md.ct_state == CS_INVALID)) { write_ct_md(packet, zone, NULL, NULL, NULL); } else if (conn && conn->key.zone == zone && !force diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index e48423f..a40441f 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -420,6 +420,8 @@ struct dp_flow_offload_item { uint8_t mod_flag; /* from packet->md.mod_flag */ bool should_jump; struct nat_action_info_t nat_action; + ovs_be32 ori_nw_src; + ovs_be32 ori_nw_dst; struct ovs_list node; }; @@ -2481,6 +2483,8 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) info.dpif_type_str = dpif_type_str; info.mod_flag = offload->mod_flag; info.nat_action = offload->nat_action; + info.ori_nw_src = offload->ori_nw_src; + info.ori_nw_dst = offload->ori_nw_dst; info.ct_enable = false; info.group_id = 0; @@ -2598,30 +2602,27 @@ parse_netdev_flow_put(struct match *match, const struct nlattr *actions, size_t actions_len, struct nat_action_info_t *nat_action ) { - bool action_has_recirc = false; - bool action_has_set = false; - bool action_has_dnat = false; bool action_has_null_nat = false; bool action_has_ct = false; bool action_has_ct_nat = false; bool ret = false; struct nlattr *nla; size_t left; - uint32_t mod_flag = match->flow.skb_priority; /* filter non IP pkt out */ if ((match->flow.dl_type != htons(ETH_TYPE_IP)) && (match->flow.dl_type != htons(ETH_TYPE_IPV6))) { goto out; } + /* recirc_id =0 , need to translate*/ + if (match->flow.recirc_id ==0){ + ret = true; + goto out; + } + /*parse actions to decide flags */ NL_ATTR_FOR_EACH_UNSAFE (nla, left, actions, actions_len) { - if (nl_attr_type(nla) == OVS_ACTION_ATTR_RECIRC) { - action_has_recirc = true; - } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_SET || - nl_attr_type(nla) == OVS_ACTION_ATTR_SET_MASKED) { - action_has_set = true; - } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_CT) { + if (nl_attr_type(nla) == OVS_ACTION_ATTR_CT) { const struct nlattr *b; unsigned int ct_left; @@ -2653,8 +2654,6 @@ parse_netdev_flow_put(struct match *match, const struct nlattr *actions, nat_action->nat_action |= ((sub_type_nest == OVS_NAT_ATTR_SRC) ? NAT_ACTION_SRC : NAT_ACTION_DST); - action_has_dnat = (sub_type_nest == OVS_NAT_ATTR_DST)? - true : action_has_dnat; action_has_null_nat = false; break; case OVS_NAT_ATTR_IP_MIN: @@ -2712,84 +2711,24 @@ parse_netdev_flow_put(struct match *match, const struct nlattr *actions, } } /*FOR_EACH_UNSAFE (nla, left, actions, actions_len) */ - /* mod_flag has been set,means it's loopbacked pkt with new match + /* recirc_id is not 0,means it's loopbacked pkt * we should try to offload jump action and group id - * in this condition: there are three scenarios: - * 1. care ct_state && ct_state = est (should offload) - * 2. care ct_state && ct_state != est (not offload) - * 3. don't care ct_state (should try offload) - * For 1, the rte_flow ct action will be set - * For 3, the rte_flow ct action won't be set - */ - if (mod_flag) { - if (match->wc.masks.ct_state && - (match->wc.masks.ct_state & match->flow.ct_state & CS_TRACKED) && - !(match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) && - !(action_has_ct_nat && !action_has_null_nat) ) { - /* for nat(src= or nat(dst= , we should try to offload no matter - * what ct_state is - */ - ret = false; - } else { - ret = true; - } - goto out; - } - - /* no mod_flag means: 1. no set action at all - * 2. first translated pkt with set action - * 3. first translated pkt with reply dir nat action - * 4. first translated pkt with req dir dnat action - * 5. others - * For 1 , only established pkt should try to offload - * For 2 and 3 , still established pkt should be offload - * For 4 , we don't care ct_state,and try to offload - * so for 1 - 3: we cannot offload non-est pkt - * for 4, we try to offload non-est pkt - * for 5, no need to offload + * in this condition: there are two scenarios: + * 1. nat action with src/dst info: not care ct_state should offload + * 2. others:only ct_state = est should offload */ - - /* scenario:4 */ - if (action_has_dnat) { + if (action_has_ct_nat && !action_has_null_nat) { + /* for nat(src= or nat(dst= , we should try to offload no matter + * what ct_state is + */ ret = true; goto out; - } - if (match->wc.masks.ct_state && + } else if (match->wc.masks.ct_state && (match->wc.masks.ct_state & match->flow.ct_state & CS_TRACKED) && - !(match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) ){ - goto out; - } - - /* scenario 3: if in reply direction's nat and also +est , - * we should try to offload it - */ - if (match->wc.masks.ct_state && - action_has_ct_nat && - action_has_null_nat && - (match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) && - (match->wc.masks.ct_state & match->flow.ct_state & CS_REPLY_DIR) ){ + (match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) ){ ret = true; goto out; } - /* scenario:1 */ - /* no mod_flag and no recirc flow: we should try to offload */ - if (action_has_recirc==false) { - ret = true; - goto out; - } - /* scenario:2 */ - /* no mod_flag and recirc and set and +est,means it's first loopback pkt - * we should try to offload jump action and "no" group id - */ - if (action_has_set==true) { - if (match->wc.masks.ct_state && - (match->wc.masks.ct_state & match->flow.ct_state & CS_TRACKED) && - (match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED)) { - ret = true; - goto out; - } - } - out: /* scenario:5 */ @@ -2841,6 +2780,13 @@ queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd, offload->actions_len = actions_len; offload->mod_flag = match->flow.skb_priority; offload->nat_action = nat_action; + if (offload->mod_flag & (1<ori_nw_src = match->flow.ct_nw_src; + } + if (offload->mod_flag & (1<ori_nw_dst = match->flow.ct_nw_dst; + } + dp_netdev_append_flow_offload(offload); } @@ -7077,6 +7023,16 @@ handle_packet_upcall(struct dp_netdev_pmd_thread *pmd, ovs_mutex_lock(&pmd->flow_mutex); netdev_flow = dp_netdev_pmd_lookup_flow(pmd, key, NULL); if (OVS_LIKELY(!netdev_flow)) { + /* If pkt has been modified before, we should store + * original mac/ip information into match + */ + if (match.flow.skb_priority & (1<md.ori_nw_src; + } + if (match.flow.skb_priority & (1<md.ori_nw_dst; + } + netdev_flow = dp_netdev_flow_add(pmd, &match, &ufid, add_actions->data, add_actions->size); @@ -7707,13 +7663,6 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_, nat_action_info.nat_action |= ((sub_type_nest == OVS_NAT_ATTR_SRC) ? NAT_ACTION_SRC : NAT_ACTION_DST); - /*For DNAT, we should also set mod_flag */ - if (sub_type_nest == OVS_NAT_ATTR_DST) { - struct dp_packet *packet; - DP_PACKET_BATCH_FOR_EACH (i, packet, packets_) { - packet->md.skb_priority |= 1 << SET_ACTION_SET ; - } - } break; case OVS_NAT_ATTR_IP_MIN: memcpy(&nat_action_info.min_addr, diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index f04f61f..59ecf88 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -32,6 +32,7 @@ #include #include "id-pool.h" #include "odp-util.h" +#include "odp-execute.h" VLOG_DEFINE_THIS_MODULE(netdev_offload_dpdk); static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(100, 5); @@ -858,10 +859,7 @@ parse_flow_match(struct flow_patterns *patterns, return -1; } - /* Group id */ - if (info->mod_flag) { - info->group_id = match->flow.recirc_id; - } + info->group_id = match->flow.recirc_id; /* Eth */ if (match->flow.packet_type == htonl(PT_ETH)) { struct rte_flow_item_eth *spec, *mask; @@ -932,8 +930,19 @@ parse_flow_match(struct flow_patterns *patterns, spec->hdr.type_of_service = match->flow.nw_tos; spec->hdr.time_to_live = match->flow.nw_ttl; spec->hdr.next_proto_id = match->flow.nw_proto; - spec->hdr.src_addr = match->flow.nw_src; - spec->hdr.dst_addr = match->flow.nw_dst; + /* If IP has been modified, we should translate origin IP */ + if (info->mod_flag & (1<hdr.src_addr = match->flow.ct_nw_src; + info->mod_nw_src = match->flow.nw_src; + } else { + spec->hdr.src_addr = match->flow.nw_src; + } + if (info->mod_flag & (1<hdr.dst_addr = match->flow.ct_nw_dst; + info->mod_nw_dst = match->flow.nw_dst; + } else { + spec->hdr.dst_addr = match->flow.nw_dst; + } mask->hdr.type_of_service = match->wc.masks.nw_tos; mask->hdr.time_to_live = match->wc.masks.nw_ttl; @@ -1415,6 +1424,29 @@ add_ipv4_nat_action(struct flow_actions *actions, return 0; } +static int +add_ipv4_un_nat_action(struct flow_actions *actions, + struct offload_info *info) +{ + /*only support set fixed sip/dip ,not support range*/ + if (info->mod_flag & (1<mod_nw_src; + + if (add_set_flow_action__(actions, &ipv4_src, NULL, sizeof(ipv4_src), + RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC) ) { + return -1; + } + } + if (info->mod_flag & (1<mod_nw_dst; + + if (add_set_flow_action__(actions, &ipv4_dst, NULL, sizeof(ipv4_dst), + RTE_FLOW_ACTION_TYPE_SET_IPV4_DST) ) { + return -1; + } + } + return 0; +} /* Maximum number of items in struct rte_flow_action_vxlan_encap. * ETH / IPv4(6) / UDP / VXLAN / END */ @@ -1790,7 +1822,14 @@ parse_flow_actions(struct netdev *netdev, if(add_ipv4_nat_action(actions,&(info->nat_action)) ) { return -1; } + } else if (info->mod_flag & (1<mod_flag & (1<md.mod_flag */ bool ct_enable; /* if true, we should translate to rte_flow_action_ct */ + ovs_be32 ori_nw_src; + ovs_be32 ori_nw_dst; + ovs_be32 mod_nw_src; + ovs_be32 mod_nw_dst; + uint32_t group_id; struct nat_action_info_t nat_action; }; diff --git a/lib/odp-execute.c b/lib/odp-execute.c index 559f260..42d3335 100644 --- a/lib/odp-execute.c +++ b/lib/odp-execute.c @@ -955,14 +955,12 @@ odp_execute_actions(void *dp, struct dp_packet_batch *batch, bool steal, case OVS_ACTION_ATTR_SET: DP_PACKET_BATCH_FOR_EACH (i, packet, batch) { odp_execute_set_action(packet, nl_attr_get(a)); - packet->md.skb_priority |= 1 << SET_ACTION_SET ; } break; case OVS_ACTION_ATTR_SET_MASKED: DP_PACKET_BATCH_FOR_EACH(i, packet, batch) { odp_execute_masked_set_action(packet, nl_attr_get(a)); - packet->md.skb_priority |= 1 << SET_ACTION_SET ; } break; diff --git a/lib/odp-execute.h b/lib/odp-execute.h index 74e308c..5235fa1 100644 --- a/lib/odp-execute.h +++ b/lib/odp-execute.h @@ -30,7 +30,10 @@ struct dp_packet_batch; enum { RECIRC_ACTION_SET, - SET_ACTION_SET, + NAT_MOD_SIP, + NAT_MOD_DIP, + NAT_MOD_SPORT, + NAT_MOD_DPORT, }; typedef void (*odp_execute_cb)(void *dp, struct dp_packet_batch *batch, diff --git a/lib/packets.h b/lib/packets.h index 84c554e..25e0325 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -122,6 +122,10 @@ PADDED_MEMBERS_CACHELINE_MARKER(CACHE_LINE_SIZE, cacheline1, struct ovs_key_ct_tuple_ipv4 ipv4; struct ovs_key_ct_tuple_ipv6 ipv6; /* Used only if */ } ct_orig_tuple; /* 'ct_orig_tuple_ipv6' is set */ + ovs_be32 ori_nw_src; + ovs_be32 ori_nw_dst; + ovs_be16 ori_tp_sport; + ovs_be16 ori_tp_dport; ); PADDED_MEMBERS_CACHELINE_MARKER(CACHE_LINE_SIZE, cacheline2, @@ -171,6 +175,10 @@ pkt_metadata_init(struct pkt_metadata *md, odp_port_t port) md->tunnel.ipv6_dst = in6addr_any; md->in_port.odp_port = port; md->conn = NULL; + md->ori_nw_src = 0; + md->ori_nw_dst = 0; + md->ori_tp_sport = 0; + md->ori_tp_dport = 0; } /* This function prefetches the cachelines touched by pkt_metadata_init() From patchwork Mon Dec 28 09:25:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420953 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QbF5Kmnz9sWL for ; Tue, 29 Dec 2020 05:11:05 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 210CA8710A; Mon, 28 Dec 2020 18:11:04 +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 tQ+UJ-OeYE0z; Mon, 28 Dec 2020 18:11:00 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 5A3F787027; Mon, 28 Dec 2020 18:11:00 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0DC50C1E03; Mon, 28 Dec 2020 18:11:00 +0000 (UTC) X-Original-To: ovs-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 7A76EC1DA4 for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 69BF386C71 for ; Mon, 28 Dec 2020 09:26:06 +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 lDzHNgoBASAg for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by whitealder.osuosl.org (Postfix) with ESMTP id AE6C286C92 for ; Mon, 28 Dec 2020 09:26:03 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app11-12011 (RichMail) with SMTP id 2eeb5fe9a4a5527-c1bce; Mon, 28 Dec 2020 17:25:57 +0800 (CST) X-RM-TRANSID: 2eeb5fe9a4a5527-c1bce X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8e7; Mon, 28 Dec 2020 17:25:57 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8e7 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:07 -0800 Message-Id: <20201228092520.11807-50-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 49/62] Geneve option data which need transformat u32 to u8_array 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: Add Geneve option data which need transformat u32 to u8_array. Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 48 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 59ecf88..9dc8ae1 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -67,6 +67,44 @@ struct ufid_to_rte_flow_data { struct dpif_flow_stats stats; }; +/* maybe little-endian */ +/* +static void +u32_to_u8_array(uint32_t var, uint8_t array[]) { + uint8_t len, i; + + len = sizeof (var) / sizeof (array[0]); + ovs_assert(len == 4); + + for (i = 3; i <= 0; i--) { + array[i] = var & 0xFF; + var >>= 8; + } +} +*/ + +/* u32 && u8_array transformation */ +static void +u32_to_u8_array(uint32_t var, uint8_t array[]) { + uint8_t len, i; + + len = sizeof (var) / sizeof (array[0]); + ovs_assert(len == 4); + + for (i = 0; i < 4; i++) { + array[i] = var & 0xFF; + var >>= 8; + } +} + +static uint32_t +u8_array_to_u32(uint8_t array[]) { + uint32_t *var; + + var = (uint32_t *)array; + return *var; +} + /* Find rte_flow with @ufid. */ static struct ufid_to_rte_flow_data * ufid_to_rte_flow_data_find(const ovs_u128 *ufid) @@ -431,7 +469,7 @@ dump_flow_pattern(struct ds *s, const struct rte_flow_item *item) ds_put_format(s, "type spec 0x%02x \n", op_spec->type); ds_put_format(s, "len spec %d \n", op_spec->len); ds_put_format(s, "opdata spec 0x%08x \n", - ntohl(op_spec->option_data)); + u8_array_to_u32(op_spec->option_data)); } else { ds_put_cstr(s, " Spec = null\n"); } @@ -440,7 +478,7 @@ dump_flow_pattern(struct ds *s, const struct rte_flow_item *item) ds_put_format(s, "type mask 0x%02x \n", op_mask->type); ds_put_format(s, "len mask %d \n", op_mask->len); ds_put_format(s, "opdata mask 0x%08x \n", - ntohl(op_mask->option_data)); + u8_array_to_u32(op_mask->option_data)); } else { ds_put_cstr(s, " Mask = null\n"); } @@ -833,7 +871,8 @@ parse_geneve_match(struct flow_patterns *patterns, op_spec->class = opt->opt_class; op_spec->type = opt->type; op_spec->len = opt->length; - op_spec->option_data = htonl(opt_data); + /*op_spec->option_data = &opt_data;*/ + u32_to_u8_array(opt_data, op_spec->option_data); add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_GENEVE_OPTIONS, op_spec, op_mask); } @@ -1632,7 +1671,8 @@ add_geneve_encap_action(struct flow_actions *actions, op_spec->class = opt->opt_class; op_spec->type = opt->type; op_spec->len = opt->length; - op_spec->option_data = htonl(opt_data); + /*op_spec->option_data = htonl(opt_data);*/ + u32_to_u8_array(opt_data, op_spec->option_data); geneve_data->items[field].type = RTE_FLOW_ITEM_TYPE_GENEVE_OPTIONS; geneve_data->items[field].spec = op_spec; geneve_data->items[field].mask = &rte_flow_item_geneve_options_mask; From patchwork Mon Dec 28 09:25:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420995 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QdT4BBDz9sVv for ; Tue, 29 Dec 2020 05:13:01 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id BF92A871E9; Mon, 28 Dec 2020 18:12:59 +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 m2g+Z-xytt51; Mon, 28 Dec 2020 18:12:59 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 2E1BC873BF; Mon, 28 Dec 2020 18:11:49 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 02869C1EB4; Mon, 28 Dec 2020 18:11:49 +0000 (UTC) X-Original-To: ovs-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 DC07CC0893 for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id C6F6184FFF for ; Mon, 28 Dec 2020 09:26:33 +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 l5VxLJV9O8l1 for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by hemlock.osuosl.org (Postfix) with ESMTP id 7FBD4820E7 for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app08-12008 (RichMail) with SMTP id 2ee85fe9a4a5f71-c0810; Mon, 28 Dec 2020 17:25:58 +0800 (CST) X-RM-TRANSID: 2ee85fe9a4a5f71-c0810 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8e9; Mon, 28 Dec 2020 17:25:57 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8e9 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:08 -0800 Message-Id: <20201228092520.11807-51-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 50/62] Not offload dmac with ff:ff:ff:ff:ff:ff 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: Not offload dmac with ff:ff:ff:ff:ff:ff Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 9dc8ae1..b5e9002 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -2007,6 +2007,11 @@ netdev_offload_dpdk_validate_flow(const struct match *match) goto err; } + /* not support dmac with ff:ff:ff:ff:ff:ff */ + if (is_all_ones(&match->flow.dl_dst, sizeof match->flow.dl_dst)) { + goto err; + } + /* support conntrack now so mark this checker if (masks->ct_state || masks->ct_nw_proto || masks->ct_zone || masks->ct_mark || From patchwork Mon Dec 28 09:25:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420976 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QcT3crxz9sVv for ; Tue, 29 Dec 2020 05:12:09 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 1C0BB86582; Mon, 28 Dec 2020 18:12:08 +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 btxre853H88v; Mon, 28 Dec 2020 18:12:05 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by fraxinus.osuosl.org (Postfix) with ESMTP id 29AC38672E; Mon, 28 Dec 2020 18:11:41 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id F1438C1F35; Mon, 28 Dec 2020 18:11:40 +0000 (UTC) X-Original-To: ovs-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 74F18C0891 for ; Mon, 28 Dec 2020 09:26:20 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 633A786C46 for ; Mon, 28 Dec 2020 09:26:20 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Q3jR679VC00A for ; Mon, 28 Dec 2020 09:26:19 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by whitealder.osuosl.org (Postfix) with ESMTP id 0D2B186C4A for ; Mon, 28 Dec 2020 09:26:17 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app02-12002 (RichMail) with SMTP id 2ee25fe9a4a6d93-bec1c; Mon, 28 Dec 2020 17:25:59 +0800 (CST) X-RM-TRANSID: 2ee25fe9a4a6d93-bec1c X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8ed; Mon, 28 Dec 2020 17:25:59 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8ed From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:09 -0800 Message-Id: <20201228092520.11807-52-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 51/62] netdev-dpdk: add flag to distinct between pf and rep 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: Add flag to distinct between pf and rep port. Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-dpdk.c | 5 +++-- lib/netdev-offload-dpdk.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index cd3d156..8e093ed 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -5339,8 +5339,9 @@ netdev_dpdk_is_uplink_port(struct netdev *netdev) dev = netdev_dpdk_cast(netdev); ovs_mutex_lock(&dev->mutex); - /*ret = dev->is_uplink_port;*/ - ret = (dev->type == DPDK_DEV_ETH); + if (strstr(dev->devargs,"representor=[10")) { + ret = true; + } ovs_mutex_unlock(&dev->mutex); out: return ret; diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index b5e9002..f7c8f2b 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -2159,8 +2159,33 @@ netdev_offload_dpdk_flow_get(struct netdev *netdev, goto out; } attrs->dp_layer = "dpdk"; - ret = netdev_dpdk_rte_flow_query_count(netdev, rte_flow_data->rte_flow, - &query, &error); + if (netdev_vport_is_vport_class(netdev->netdev_class)) { + struct netdev_flow_dump **netdev_dumps; + int num_ports = 0; + int i; + + netdev_dumps = netdev_ports_flow_dump_create(netdev->dpif_type, + &num_ports); + for (i = 0; i < num_ports; i++) { + if (!netdev_dpdk_is_uplink_port(netdev_dumps[i]->netdev)) { + continue; + } + ret = netdev_dpdk_rte_flow_query_count(netdev_dumps[i]->netdev, rte_flow_data->rte_flow, + &query, &error); + break; + } + 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)); + } + } + + } else { + 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), From patchwork Mon Dec 28 09:25:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420966 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qbt2XyZz9sVv for ; Tue, 29 Dec 2020 05:11:38 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id EA0B38719E; Mon, 28 Dec 2020 18:11:36 +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 Iku77YajZVgD; Mon, 28 Dec 2020 18:11:34 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 945AD8719C; Mon, 28 Dec 2020 18:11:19 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 400DDC1E49; Mon, 28 Dec 2020 18:11:19 +0000 (UTC) X-Original-To: ovs-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 78E68C0893 for ; Mon, 28 Dec 2020 09:26:10 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 70B4B86C4A for ; Mon, 28 Dec 2020 09:26:10 +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 AzBWeea0BNFq for ; Mon, 28 Dec 2020 09:26:10 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by whitealder.osuosl.org (Postfix) with ESMTP id 788C886C77 for ; Mon, 28 Dec 2020 09:26:09 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app06-12006 (RichMail) with SMTP id 2ee65fe9a4a85fb-c1c92; Mon, 28 Dec 2020 17:26:00 +0800 (CST) X-RM-TRANSID: 2ee65fe9a4a85fb-c1c92 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8f4; Mon, 28 Dec 2020 17:26:00 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8f4 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:10 -0800 Message-Id: <20201228092520.11807-53-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 52/62] packets.h: fix IP6_FMT error 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: Fix IP6_FMT error Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/packets.h | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/packets.h b/lib/packets.h index 25e0325..66838a9 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -648,22 +648,22 @@ mpls_lse_to_bos(ovs_be32 mpls_lse) ":%"PRIx8"%"PRIx8":%"PRIx8"%"PRIx8 \ ":%"PRIx8"%"PRIx8":%"PRIx8"%"PRIx8 #define IP6_ARGS(ip6) \ - ntohs(ip6[0]), \ - ntohs(ip6[1]), \ - ntohs(ip6[2]), \ - ntohs(ip6[3]), \ - ntohs(ip6[4]), \ - ntohs(ip6[5]), \ - ntohs(ip6[6]), \ - ntohs(ip6[7]), \ - ntohs(ip6[8]), \ - ntohs(ip6[9]), \ - ntohs(ip6[10]), \ - ntohs(ip6[11]), \ - ntohs(ip6[12]), \ - ntohs(ip6[13]), \ - ntohs(ip6[14]), \ - ntohs(ip6[15]) + ip6[0], \ + ip6[1], \ + ip6[2], \ + ip6[3], \ + ip6[4], \ + ip6[5], \ + ip6[6], \ + ip6[7], \ + ip6[8], \ + ip6[9], \ + ip6[10], \ + ip6[11], \ + ip6[12], \ + ip6[13], \ + ip6[14], \ + ip6[15] /* Example: * From patchwork Mon Dec 28 09:25:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1421013 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QjD6L80z9sVx for ; Tue, 29 Dec 2020 05:16:16 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 4F6D927230; Mon, 28 Dec 2020 18:16:15 +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 pPpv4yJJyI3v; Mon, 28 Dec 2020 18:16:07 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 7748A2E21F; Mon, 28 Dec 2020 18:11:52 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 64050C1F77; Mon, 28 Dec 2020 18:11:52 +0000 (UTC) X-Original-To: ovs-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 061B3C0891 for ; Mon, 28 Dec 2020 09:26:34 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id E2322819CF for ; Mon, 28 Dec 2020 09:26:33 +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 2Jz2acDK7lc1 for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by hemlock.osuosl.org (Postfix) with ESMTP id 7EBC881B5E for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app08-12008 (RichMail) with SMTP id 2ee85fe9a4a8f7d-c081c; Mon, 28 Dec 2020 17:26:01 +0800 (CST) X-RM-TRANSID: 2ee85fe9a4a8f7d-c081c X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b8fc; Mon, 28 Dec 2020 17:26:00 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b8fc From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:11 -0800 Message-Id: <20201228092520.11807-54-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 53/62] netdev-dpdk: Add uplink port and vf representor port flag 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: Add uplink port and vf representor port flag Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-dpdk.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 8e093ed..45fc908 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -471,6 +471,8 @@ struct netdev_dpdk { }; struct dpdk_tx_queue *tx_q; struct rte_eth_link link; + bool is_uplink_port; /* True=uplink port, false=vfrep port or pf port. */ + bool is_vf_rep_port; /* True=vf rep port, false=vfrep port or pf port. */ ); PADDED_MEMBERS_CACHELINE_MARKER(CACHE_LINE_SIZE, cacheline1, @@ -2005,6 +2007,12 @@ netdev_dpdk_set_config(struct netdev *netdev, const struct smap *args, netdev_get_name(netdev)); err = EINVAL; } + /* update is_uplink_port && is_vf_rep_port flag */ + if (strstr(dev->devargs,"representor=[10")) { + dev->is_uplink_port = true; + } else if (strstr(dev->devargs,"representor")) { + dev->is_vf_rep_port = true; + } if (err) { goto out; @@ -5339,7 +5347,27 @@ netdev_dpdk_is_uplink_port(struct netdev *netdev) dev = netdev_dpdk_cast(netdev); ovs_mutex_lock(&dev->mutex); - if (strstr(dev->devargs,"representor=[10")) { + if (dev->is_uplink_port) { + ret = true; + } + ovs_mutex_unlock(&dev->mutex); +out: + return ret; +} + +bool +netdev_dpdk_is_vfrep_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); + if (dev->is_vf_rep_port) { ret = true; } ovs_mutex_unlock(&dev->mutex); From patchwork Mon Dec 28 09:25:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1421010 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qfp6k58z9sWM for ; Tue, 29 Dec 2020 05:14:10 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 5EEE2872B9; Mon, 28 Dec 2020 18:14:09 +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 vmrpDSo6B4FK; Mon, 28 Dec 2020 18:14:01 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 09AC287572; Mon, 28 Dec 2020 18:12:14 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id D6444C1E06; Mon, 28 Dec 2020 18:12:13 +0000 (UTC) X-Original-To: ovs-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 E2848C0891 for ; Mon, 28 Dec 2020 09:26:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 370CD81EDB for ; Mon, 28 Dec 2020 09:26:35 +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 AhlCYEDodH5j for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by hemlock.osuosl.org (Postfix) with ESMTP id 7CBE4816DB for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app08-12008 (RichMail) with SMTP id 2ee85fe9a4a9f83-c0822; Mon, 28 Dec 2020 17:26:01 +0800 (CST) X-RM-TRANSID: 2ee85fe9a4a9f83-c0822 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b903; Mon, 28 Dec 2020 17:26:01 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b903 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:12 -0800 Message-Id: <20201228092520.11807-55-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 54/62] Add QoS function offload support by meter 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: This is the init version to support QoS function offload, which is handled by meter aciton. So this change offload meter action from openflow. Jira: #[Optional] 市场项目编号(名称):[Optional] Add QoS function offload support by meter. --- include/openvswitch/ofp-meter.h | 1 + lib/dpif-netdev.c | 162 +++++++++++++++++++++++--- lib/dpif-netdev.h | 19 +++ lib/dpif-netlink.c | 5 +- lib/dpif-provider.h | 5 + lib/dpif.c | 66 +++++++++++ lib/dpif.h | 6 + lib/netdev-dpdk.c | 6 + lib/netdev-dpdk.h | 1 + lib/netdev-dummy.c | 8 +- lib/netdev-offload-dpdk.c | 250 +++++++++++++++++++++++++++++++++++++--- lib/netdev-offload-provider.h | 17 ++- lib/netdev-offload-tc.c | 7 +- lib/netdev-offload.c | 11 +- lib/netdev-offload.h | 8 +- lib/ofp-meter.c | 14 +++ 16 files changed, 535 insertions(+), 51 deletions(-) diff --git a/include/openvswitch/ofp-meter.h b/include/openvswitch/ofp-meter.h index 6776eae..c6678f5 100644 --- a/include/openvswitch/ofp-meter.h +++ b/include/openvswitch/ofp-meter.h @@ -62,6 +62,7 @@ int ofputil_decode_meter_config(struct ofpbuf *, struct ofpbuf *bands); void ofputil_format_meter_config(struct ds *, const struct ofputil_meter_config *); +uint32_t ofputil_meter_config_max_rate(struct ofputil_meter_config *conf); struct ofputil_meter_mod { uint16_t command; diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index a40441f..b03a2ab 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -272,23 +272,6 @@ static bool dpcls_lookup(struct dpcls *cls, #define DP_SUPPORTED_METER_BAND_TYPES \ ( 1 << OFPMBT13_DROP ) -struct dp_meter_band { - struct ofputil_meter_band up; /* type, prec_level, pad, rate, burst_size */ - uint32_t bucket; /* In 1/1000 packets (for PKTPS), or in bits (for KBPS) */ - uint64_t packet_count; - uint64_t byte_count; -}; - -struct dp_meter { - uint16_t flags; - uint16_t n_bands; - uint32_t max_delta_t; - uint64_t used; - uint64_t packet_count; - uint64_t byte_count; - struct dp_meter_band bands[]; -}; - struct pmd_auto_lb { bool auto_lb_requested; /* Auto load balancing requested by user. */ bool is_enabled; /* Current status of Auto load balancing. */ @@ -424,6 +407,7 @@ struct dp_flow_offload_item { ovs_be32 ori_nw_dst; struct ovs_list node; + struct dpif *dpif; }; struct dp_flow_offload { @@ -1640,6 +1624,31 @@ dpif_netdev_open(const struct dpif_class *class, const char *name, return error; } +static struct dpif * +dpif_netdev_dump_create(struct dp_netdev *dp) +{ + struct dpif *dpif = NULL; + + ovs_mutex_lock(&dp_netdev_mutex); + dpif = create_dpif_netdev(dp); + ovs_mutex_unlock(&dp_netdev_mutex); + + return dpif; +} + +static void +dpif_netdev_dump_destroy(struct dp_netdev *dp, struct dpif *dpif) +{ + ovs_mutex_lock(&dp_netdev_mutex); + + free(dpif->base_name); + free(dpif->full_name); + free(dpif); + ovs_refcount_unref(&dp->ref_cnt); + + ovs_mutex_unlock(&dp_netdev_mutex); +} + static void dp_netdev_destroy_upcall_lock(struct dp_netdev *dp) OVS_NO_THREAD_SAFETY_ANALYSIS @@ -1657,6 +1666,15 @@ dp_delete_meter(struct dp_netdev *dp, uint32_t meter_id) OVS_REQUIRES(dp->meter_locks[meter_id % N_METER_LOCKS]) { if (dp->meters[meter_id]) { + if (dp->meters[meter_id]->offload) { + struct netdev_offload_meter *nom; + + nom = dp->meters[meter_id]->offload; + nom->meter_ops->meter_destroy(nom->priv_data); + free(nom); + dp->meters[meter_id]->offload = NULL; + } + free(dp->meters[meter_id]); dp->meters[meter_id] = NULL; } @@ -2385,6 +2403,7 @@ dp_netdev_alloc_flow_offload(struct dp_netdev_pmd_thread *pmd, offload->flow = flow; offload->op = op; offload->should_jump = false; + offload->dpif = dpif_netdev_dump_create(pmd->dp); dp_netdev_flow_ref(flow); dp_netdev_pmd_try_ref(pmd); @@ -2395,6 +2414,7 @@ dp_netdev_alloc_flow_offload(struct dp_netdev_pmd_thread *pmd, static void dp_netdev_free_flow_offload(struct dp_flow_offload_item *offload) { + dpif_netdev_dump_destroy(offload->pmd->dp, offload->dpif); dp_netdev_pmd_unref(offload->pmd); dp_netdev_flow_unref(offload->flow); @@ -2480,6 +2500,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) } } info.flow_mark = mark; + info.dpif_class = pmd->dp->class; info.dpif_type_str = dpif_type_str; info.mod_flag = offload->mod_flag; info.nat_action = offload->nat_action; @@ -2487,6 +2508,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) info.ori_nw_dst = offload->ori_nw_dst; info.ct_enable = false; info.group_id = 0; + info.dpif_class = pmd->dp->class; port = netdev_ports_get(in_port, dpif_type_str); if (!port) { @@ -2495,7 +2517,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) /* Taking a global 'port_mutex' to fulfill thread safety restrictions for * the netdev-offload-dpdk module. */ ovs_mutex_lock(&pmd->dp->port_mutex); - ret = netdev_flow_put(port, &offload->match, + ret = netdev_flow_put(offload->dpif, port, &offload->match, CONST_CAST(struct nlattr *, offload->actions), offload->actions_len, &flow->ufid, &info, NULL); @@ -6193,6 +6215,15 @@ dpif_netdev_meter_set(struct dpif *dpif, ofproto_meter_id meter_id, } meter_lock(dp, mid); + if (dp->meters[mid] && dp->meters[mid]->offload) { + struct netdev_offload_meter *nom; + + nom = dp->meters[mid]->offload; + nom->meter_ops->meter_update(nom->priv_data, config); + meter->offload = nom; + dp->meters[mid]->offload = NULL; + } + dp_delete_meter(dp, mid); /* Free existing meter, if any */ dp->meters[mid] = meter; meter_unlock(dp, mid); @@ -6257,7 +6288,97 @@ dpif_netdev_meter_del(struct dpif *dpif, return error; } - +static int +dpif_netdev_meter_get_config(struct dpif *dpif, + ofproto_meter_id meter_id, + struct ofputil_meter_config *conf) +{ + struct dp_netdev *dp = get_dp_netdev(dpif); + uint32_t mid = meter_id.uint32; + struct dp_meter *meter; + int ret = 0, i; + + if (mid >= MAX_METERS) { + return -1; + } + + meter_lock(dp, mid); + meter = dp->meters[mid]; + if (!meter) { + ret = -1; + goto done; + } + + conf->n_bands = meter->n_bands; + conf->bands = xzalloc(conf->n_bands * sizeof(struct dp_meter_band)); + for (i = 0; i < meter->n_bands; ++i) { + conf->bands[i] = meter->bands[i].up; + } + +done: + meter_unlock(dp, mid); + return ret; +} + +static int +dpif_netdev_meter_set_offload(struct dpif *dpif, + ofproto_meter_id meter_id, + void *data) +{ + struct dp_netdev *dp = get_dp_netdev(dpif); + uint32_t mid = meter_id.uint32; + struct dp_meter *meter; + int ret = 0; + + if (mid >= MAX_METERS) { + return -1; + } + + meter_lock(dp, mid); + meter = dp->meters[mid]; + if (!meter) { + ret = -1; + goto done; + } + + meter->offload = (struct netdev_offload_meter *)data; +done: + meter_unlock(dp, mid); + return ret; +} + +static int +dpif_netdev_meter_get_offload(struct dpif *dpif, + ofproto_meter_id meter_id, + void **data, uint16_t size) +{ + struct dp_netdev *dp = get_dp_netdev(dpif); + uint32_t mid = meter_id.uint32; + struct dp_meter *meter; + int ret = 0; + + if (mid >= MAX_METERS) { + return -1; + } + + meter_lock(dp, mid); + meter = dp->meters[mid]; + if (!meter) { + ret = -1; + goto done; + } + + *data = NULL; + if (meter->offload) { + *data = xmemdup(meter->offload, size); + } + +done: + meter_unlock(dp, mid); + return ret; +} + + static void dpif_netdev_disable_upcall(struct dpif *dpif) OVS_NO_THREAD_SAFETY_ANALYSIS @@ -8088,6 +8209,9 @@ const struct dpif_class dpif_netdev_class = { dpif_netdev_meter_set, dpif_netdev_meter_get, dpif_netdev_meter_del, + dpif_netdev_meter_get_config, + dpif_netdev_meter_set_offload, + dpif_netdev_meter_get_offload, }; static void diff --git a/lib/dpif-netdev.h b/lib/dpif-netdev.h index 6db6ed2..123cf99 100644 --- a/lib/dpif-netdev.h +++ b/lib/dpif-netdev.h @@ -21,6 +21,7 @@ #include #include #include "dpif.h" +#include "netdev-offload-provider.h" #include "openvswitch/types.h" #include "dp-packet.h" #include "packets.h" @@ -33,6 +34,24 @@ extern "C" { * headers to be aligned on a 4-byte boundary. */ enum { DP_NETDEV_HEADROOM = 2 + VLAN_HEADER_LEN }; +struct dp_meter_band { + struct ofputil_meter_band up; /* type, prec_level, pad, rate, burst_size */ + uint32_t bucket; /* In 1/1000 packets (for PKTPS), or in bits (for KBPS) */ + uint64_t packet_count; + uint64_t byte_count; +}; + +struct dp_meter { + uint16_t flags; + uint16_t n_bands; + uint32_t max_delta_t; + uint64_t used; + uint64_t packet_count; + uint64_t byte_count; + struct netdev_offload_meter *offload; + struct dp_meter_band bands[]; +}; + bool dpif_is_netdev(const struct dpif *); #define NR_QUEUE 1 diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 57ad657..7c921bd 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -2093,7 +2093,7 @@ parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put) info.recirc_id_shared_with_tc = (dpif->user_features & OVS_DP_F_TC_RECIRC_SHARING); info.tc_modify_flow_deleted = false; - err = netdev_flow_put(dev, &match, + err = netdev_flow_put(NULL, dev, &match, CONST_CAST(struct nlattr *, put->actions), put->actions_len, CONST_CAST(ovs_u128 *, put->ufid), @@ -4001,6 +4001,9 @@ const struct dpif_class dpif_netlink_class = { dpif_netlink_meter_set, dpif_netlink_meter_get, dpif_netlink_meter_del, + NULL, + NULL, + NULL, }; static int diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h index b77317b..50fe086 100644 --- a/lib/dpif-provider.h +++ b/lib/dpif-provider.h @@ -616,6 +616,11 @@ struct dpif_class { * zero. */ int (*meter_del)(struct dpif *, ofproto_meter_id meter_id, struct ofputil_meter_stats *, uint16_t n_bands); + int (*meter_get_config)(struct dpif *, ofproto_meter_id meter_id, + struct ofputil_meter_config *); + int (*meter_set_offload)(struct dpif *, ofproto_meter_id meter_id, void *); + int (*meter_get_offload)(struct dpif *, ofproto_meter_id meter_id, void **, + uint16_t size); }; extern const struct dpif_class dpif_netlink_class; diff --git a/lib/dpif.c b/lib/dpif.c index 8264bb5..9a7d312 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -66,6 +66,9 @@ COVERAGE_DEFINE(dpif_execute_with_help); COVERAGE_DEFINE(dpif_meter_set); COVERAGE_DEFINE(dpif_meter_get); COVERAGE_DEFINE(dpif_meter_del); +COVERAGE_DEFINE(dpif_meter_get_config); +COVERAGE_DEFINE(dpif_meter_set_offload); +COVERAGE_DEFINE(dpif_meter_get_offload); static const struct dpif_class *base_dpif_classes[] = { #if defined(__linux__) || defined(_WIN32) @@ -1979,3 +1982,66 @@ dpif_meter_del(struct dpif *dpif, ofproto_meter_id meter_id, } return error; } + +int +dpif_meter_get_config(struct dpif *dpif, ofproto_meter_id meter_id, + struct ofputil_meter_config *config) +{ + COVERAGE_INC(dpif_meter_get_config); + + int error = (dpif->dpif_class->meter_get_config + ? dpif->dpif_class->meter_get_config(dpif, meter_id, + config) + : EOPNOTSUPP); + if (!error) { + VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" get config", + dpif_name(dpif), meter_id.uint32); + } else { + VLOG_WARN_RL(&error_rl, "%s: failed to get DPIF meter config %"PRIu32": %s", + dpif_name(dpif), meter_id.uint32, ovs_strerror(error)); + } + + return error; +} + +int +dpif_meter_set_offload(struct dpif *dpif, ofproto_meter_id meter_id, + void *data) +{ + COVERAGE_INC(dpif_meter_set_offload); + + int error = (dpif->dpif_class->meter_set_offload + ? dpif->dpif_class->meter_set_offload(dpif, meter_id, + data) + : EOPNOTSUPP); + if (!error) { + VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" offload set", + dpif_name(dpif), meter_id.uint32); + } else { + VLOG_WARN_RL(&error_rl, "%s: failed to offload set DPIF meter %"PRIu32": %s", + dpif_name(dpif), meter_id.uint32, ovs_strerror(error)); + } + + return error; +} + +int +dpif_meter_get_offload(struct dpif *dpif, ofproto_meter_id meter_id, + void **data, uint16_t size) +{ + COVERAGE_INC(dpif_meter_get_offload); + + int error = (dpif->dpif_class->meter_get_offload + ? dpif->dpif_class->meter_get_offload(dpif, meter_id, + data, size) + : EOPNOTSUPP); + if (!error) { + VLOG_DBG_RL(&dpmsg_rl, "%s: DPIF meter %"PRIu32" offload get", + dpif_name(dpif), meter_id.uint32); + } else { + VLOG_WARN_RL(&error_rl, "%s: failed to offload get DPIF meter %"PRIu32": %s", + dpif_name(dpif), meter_id.uint32, ovs_strerror(error)); + } + + return error; +} diff --git a/lib/dpif.h b/lib/dpif.h index 4df8f7c..c90ca71 100644 --- a/lib/dpif.h +++ b/lib/dpif.h @@ -891,6 +891,12 @@ int dpif_meter_get(const struct dpif *, ofproto_meter_id meter_id, struct ofputil_meter_stats *, uint16_t n_bands); int dpif_meter_del(struct dpif *, ofproto_meter_id meter_id, struct ofputil_meter_stats *, uint16_t n_bands); +int dpif_meter_get_config(struct dpif *dpif, ofproto_meter_id meter_id, + struct ofputil_meter_config *config); +int dpif_meter_set_offload(struct dpif *dpif, ofproto_meter_id meter_id, + void *data); +int dpif_meter_get_offload(struct dpif *dpif, ofproto_meter_id meter_id, + void **data, uint16_t size); /* Miscellaneous. */ diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 45fc908..9f382ea 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -1205,6 +1205,12 @@ netdev_dpdk_cast(const struct netdev *netdev) return CONTAINER_OF(netdev, struct netdev_dpdk, up); } +int +netdev_dpdk_get_portid(const struct netdev *netdev) +{ + return netdev_dpdk_cast(netdev)->port_id; +} + static struct netdev * netdev_dpdk_alloc(void) { diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h index 811992c..7c82bc6 100644 --- a/lib/netdev-dpdk.h +++ b/lib/netdev-dpdk.h @@ -37,6 +37,7 @@ void netdev_dpdk_register(void); void free_dpdk_buf(struct dp_packet *); bool netdev_dpdk_flow_api_supported(struct netdev *); +int netdev_dpdk_get_portid(const struct netdev *netdev); int netdev_dpdk_rte_flow_destroy(struct netdev *netdev, diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 71df291..1d203c7 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -1430,10 +1430,10 @@ find_offloaded_flow(const struct hmap *offloaded_flows, const ovs_u128 *ufid) } static int -netdev_dummy_flow_put(struct netdev *netdev, struct match *match, - struct nlattr *actions OVS_UNUSED, - size_t actions_len OVS_UNUSED, - const ovs_u128 *ufid, struct offload_info *info, +netdev_dummy_flow_put(struct dpif *dpif OVS_UNUSED, struct netdev *netdev, + struct match *match, struct nlattr *actions OVS_UNUSED, + size_t actions_len OVS_UNUSED, const ovs_u128 *ufid, + struct offload_info *info, struct dpif_flow_stats *stats) { struct netdev_dummy *dev = netdev_dummy_cast(netdev); diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index f7c8f2b..0a440eb 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -14,17 +14,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include - +#include "netdev-vport.h" #include #include +#include + #include +#include #include "cmap.h" #include "dpif-netdev.h" #include "netdev-offload-provider.h" +#include "openvswitch/ofp-meter.h" #include "netdev-provider.h" -#include "netdev-vport.h" #include "openvswitch/match.h" #include "openvswitch/vlog.h" #include "packets.h" @@ -1173,6 +1175,28 @@ parse_flow_match(struct flow_patterns *patterns, return 0; } +struct dpdk_meter_offload { + uint32_t port_id; + uint32_t max_rate; + uint32_t mp_id; + struct rte_flow_action_meter mc; +}; + +static void dpdk_meter_destroy(void *priv_data) +{ + struct dpdk_meter_offload *dmo = priv_data; + struct rte_mtr_error mtr_error; + + if (dmo) { + rte_mtr_meter_profile_delete(dmo->port_id, + dmo->mc.mtr_id, + &mtr_error); + rte_mtr_destroy(dmo->port_id, dmo->mc.mtr_id, + &mtr_error); + free(dmo); + } +} + static void add_flow_mark_rss_actions(struct flow_actions *actions, uint32_t flow_mark, @@ -1766,8 +1790,122 @@ parse_clone_actions(struct netdev *netdev, return 0; } +static struct rte_flow_action_meter* +dpdk_meter_create(struct dpif *dpif, struct netdev *netdev, uint32_t mid) +{ + uint32_t port_id = netdev_dpdk_get_portid(netdev); + struct netdev_offload_meter *nom; + struct dpdk_meter_offload *dmo; + struct ofputil_meter_config config; + ofproto_meter_id meter_id; + struct rte_mtr_meter_profile mp; + struct rte_mtr_params params; + struct rte_mtr_error mtr_error; + uint32_t max_rate; + int ret; + static struct netdev_offload_meter_api dpdk_meter_offload_api; + + meter_id.uint32 = mid; + + if (dpif_meter_get_config(dpif, meter_id, &config)) { + return NULL; + } + + nom = xmalloc(sizeof *nom); + dmo = xmalloc(sizeof *dmo); + + nom->meter_ops = &dpdk_meter_offload_api; + nom->priv_data = dmo; + + memset(&mp, 0, sizeof(struct rte_mtr_meter_profile)); + max_rate = ofputil_meter_config_max_rate(&config); + + dmo->mc.mtr_id = mid; + dmo->port_id = port_id; + dmo->max_rate = max_rate; + dmo->mp_id = mid; + + mp.alg = RTE_MTR_SRTCM_RFC2697; + mp.srtcm_rfc2697.cir = max_rate *1024 /8; /* rate_max Kbps*/ + mp.srtcm_rfc2697.cbs = max_rate *1024 /8; + mp.srtcm_rfc2697.ebs = 0; + + ret = rte_mtr_meter_profile_add(dmo->port_id, dmo->mc.mtr_id, + &mp, &mtr_error); + if (ret && ret != -EEXIST) { + VLOG_ERR("rte_mtr_meter_profile_add fail: err_type: %d err_msg: %s, portid: %d\n", + mtr_error.type, mtr_error.message, netdev_dpdk_get_portid(netdev)); + goto profile_err; + } + + enum rte_color dscp_table[2]; + dscp_table[0] = RTE_COLOR_YELLOW; + dscp_table[1] = RTE_COLOR_RED; + + params.meter_profile_id = dmo->mc.mtr_id; + params.dscp_table = dscp_table; + params.meter_enable = 1; + params.use_prev_mtr_color = 0; + params.action[RTE_COLOR_GREEN] = MTR_POLICER_ACTION_COLOR_GREEN; + params.action[RTE_COLOR_YELLOW] = MTR_POLICER_ACTION_DROP; + params.action[RTE_COLOR_RED] = MTR_POLICER_ACTION_DROP; + + ret = rte_mtr_create(dmo->port_id, dmo->mc.mtr_id, ¶ms, 0, &mtr_error); + if (ret && ret != -EEXIST) { + VLOG_ERR("rte_mtr_create fail: err_type: %d err_msg: %s, portid: %d\n", + mtr_error.type, mtr_error.message, netdev_dpdk_get_portid(netdev)); + goto mtr_err; + } + + dpif_meter_set_offload(dpif, meter_id, nom); + + free(config.bands); + return &dmo->mc; + +mtr_err: + rte_mtr_meter_profile_delete(dmo->port_id, dmo->mc.mtr_id, &mtr_error); + +profile_err: + free(nom); + free(dmo); + free(config.bands); + return NULL; +} + +static struct rte_flow_action_meter * +netdev_offload_dpdk_meter_conf(struct dpif *dpif, struct netdev *netdev, uint32_t mid) +{ + uint32_t port_id = netdev_dpdk_get_portid(netdev); + struct netdev_offload_meter *nom = NULL; + struct dpdk_meter_offload *dmo; + ofproto_meter_id meter_id; + uint32_t ret; + meter_id.uint32 = mid; + + ret = dpif_meter_get_offload(dpif, meter_id, (void **)&nom, + sizeof *nom + sizeof *dmo); + if (ret) { + VLOG_INFO("netdev offload dpdk meter, can't get the meter"); + return NULL; + } + + if (!nom) { + return dpdk_meter_create(dpif, netdev, mid); + } + + dmo = (struct dpdk_meter_offload *)nom->priv_data; + if (port_id != dmo->port_id) { + VLOG_INFO("dpdk meter %d is used on %d, can't be used for : %d", + mid, dmo->port_id, port_id); + return NULL; + } + + return &dmo->mc; +} + static int -parse_flow_actions(struct netdev *netdev, +parse_flow_actions(struct dpif *dpif, + struct netdev *netdev, struct flow_actions *actions, struct nlattr *nl_actions, size_t nl_actions_len, @@ -1840,7 +1978,17 @@ parse_flow_actions(struct netdev *netdev, add_flow_action(actions, RTE_FLOW_ACTION_TYPE_JUMP, jump); /* for ct && ct clear no need to translate*/ - } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_CT_CLEAR || + } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_METER) { + struct rte_flow_action_meter *mc; + mc = netdev_offload_dpdk_meter_conf(dpif, + netdev, + nl_attr_get_u32(nla)); + if (mc) { + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_METER, mc); + } + + } + else if (nl_attr_type(nla) == OVS_ACTION_ATTR_CT_CLEAR || nl_attr_type(nla) == OVS_ACTION_ATTR_CT ) { } else { VLOG_DBG_RL(&rl, "Unsupported action type %d", nl_attr_type(nla)); @@ -1875,7 +2023,8 @@ parse_flow_actions(struct netdev *netdev, } static struct rte_flow * -netdev_offload_dpdk_actions(struct netdev *netdev, +netdev_offload_dpdk_actions(struct dpif *dpif, + struct netdev *netdev, struct flow_patterns *patterns, struct nlattr *nl_actions, size_t actions_len, @@ -1889,7 +2038,7 @@ netdev_offload_dpdk_actions(struct netdev *netdev, struct rte_flow_error error; int ret,i; - ret = parse_flow_actions(netdev, &actions, nl_actions, actions_len, info); + ret = parse_flow_actions(dpif, netdev, &actions, nl_actions, actions_len, info); if (ret) { VLOG_DBG("TIMO DBG: after parse_flow_actions, ret is -1"); goto out; @@ -1927,13 +2076,79 @@ out: return flow; } +#define DPDK_METER_UPATE_UP 65536 + +static void dpdk_meter_update(void *priv_data, void *config) +{ + struct dpdk_meter_offload *dmo = priv_data; + struct rte_mtr_meter_profile mp; + struct rte_mtr_error mtr_error; + uint32_t mp_id, new_mp_id; + uint32_t max_rate; + uint32_t ret; + + if (!priv_data || !config) { + return; + } + + max_rate = ofputil_meter_config_max_rate(config); + if (dmo->max_rate == max_rate) { + return; + } + + memset(&mp, 0, sizeof(struct rte_mtr_meter_profile)); + mp.alg = RTE_MTR_SRTCM_RFC2697; + mp.srtcm_rfc2697.cir = max_rate *1024 /8; + mp.srtcm_rfc2697.cbs = max_rate *1024 /8; + mp.srtcm_rfc2697.ebs = 0; + + if (dmo->mp_id < DPDK_METER_UPATE_UP) { + new_mp_id = dmo->mp_id + DPDK_METER_UPATE_UP; + } else { + new_mp_id = dmo->mp_id - DPDK_METER_UPATE_UP; + } + + ret = rte_mtr_meter_profile_add(dmo->port_id, new_mp_id, + &mp, &mtr_error); + if (ret) { + VLOG_ERR("rte_mtr_meter_profile_add fail: err_type: %d err_msg: %s\n", + mtr_error.type, mtr_error.message); + return; + } + + ret = rte_mtr_meter_profile_update(dmo->port_id, dmo->mc.mtr_id, + new_mp_id, &mtr_error); + if (ret) { + VLOG_ERR("rte_mtr_meter_profile_update fail: err_type: %d err_msg: %s\n", + mtr_error.type, mtr_error.message); + mp_id = new_mp_id; + goto out; + } + + mp_id = dmo->mp_id; + dmo->mp_id = new_mp_id; +out: + ret = rte_mtr_meter_profile_delete(dmo->port_id, mp_id, &mtr_error); + if (ret) { + VLOG_ERR("rte_mtr_meter_profile_update fail: err_type: %d err_msg: %s\n", + mtr_error.type, mtr_error.message); + } +} + +static struct netdev_offload_meter_api dpdk_meter_offload_api = { + .meter_destroy = dpdk_meter_destroy, + .meter_update = dpdk_meter_update, +}; + + + static int -netdev_offload_dpdk_add_flow(struct netdev *netdev, +netdev_offload_dpdk_add_flow(struct dpif *dpif, struct netdev *netdev, struct match *match, struct nlattr *nl_actions, size_t actions_len, const ovs_u128 *ufid, - struct offload_info *info) + struct offload_info *info OVS_UNUSED) { struct flow_patterns patterns = { .items = NULL, .cnt = 0 }; bool actions_offloaded = true; @@ -1943,10 +2158,12 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, ret = parse_flow_match(&patterns, match, netdev, info); if (ret) { goto out; + VLOG_DBG("yunxiang_debug_netdev_offload_dpdk_add_flow: ret %p \n",ret); } - - flow = netdev_offload_dpdk_actions(netdev, &patterns, nl_actions, + + flow = netdev_offload_dpdk_actions(dpif, netdev, &patterns, nl_actions, actions_len, info); + VLOG_DBG("yunxiang_debug_netdev_offload_dpdk_add_flow: flow %p \n",flow); if (!flow) { /* If we failed to offload the rule actions fallback to MARK+RSS * actions. @@ -2075,9 +2292,10 @@ netdev_offload_dpdk_destroy_flow(struct netdev *netdev, } static int -netdev_offload_dpdk_flow_put(struct netdev *netdev, struct match *match, - struct nlattr *actions, size_t actions_len, - const ovs_u128 *ufid, struct offload_info *info, +netdev_offload_dpdk_flow_put(struct dpif *dpif, struct netdev *netdev, + struct match *match, struct nlattr *actions, + size_t actions_len, const ovs_u128 *ufid, + struct offload_info *info, struct dpif_flow_stats *stats) { struct ufid_to_rte_flow_data *rte_flow_data; @@ -2088,10 +2306,12 @@ 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); + VLOG_DBG("yunxiang_debug_netdev_offload_dpdk_flow_put,rte_flow_data=%p",rte_flow_data); if (rte_flow_data && rte_flow_data->rte_flow) { ret = netdev_offload_dpdk_destroy_flow(netdev, ufid, rte_flow_data->rte_flow); if (ret < 0) { + VLOG_DBG("yunxiang_debug_netdev_offload_dpdk_flow_put,ret=%p",ret); return ret; } } @@ -2104,7 +2324,7 @@ netdev_offload_dpdk_flow_put(struct netdev *netdev, struct match *match, if (stats) { memset(stats, 0, sizeof *stats); } - return netdev_offload_dpdk_add_flow(netdev, match, actions, + return netdev_offload_dpdk_add_flow(dpif, netdev, match, actions, actions_len, ufid, info); } diff --git a/lib/netdev-offload-provider.h b/lib/netdev-offload-provider.h index 5a809c0..f1830f8 100644 --- a/lib/netdev-offload-provider.h +++ b/lib/netdev-offload-provider.h @@ -63,9 +63,10 @@ struct netdev_flow_api { * 'stats' is populated according to the rules set out in the description * above 'struct dpif_flow_put'. * Return 0 if successful, otherwise returns a positive errno value. */ - int (*flow_put)(struct netdev *, struct match *, struct nlattr *actions, - size_t actions_len, const ovs_u128 *ufid, - struct offload_info *info, struct dpif_flow_stats *); + int (*flow_put)(struct dpif *, struct netdev *, struct match *, + struct nlattr *actions, size_t actions_len, + const ovs_u128 *ufid, struct offload_info *info, + struct dpif_flow_stats *); /* Queries a flow specified by ufid on netdev. * Fills output buffer as 'wbuffer' in flow_dump_next, which @@ -87,6 +88,16 @@ struct netdev_flow_api { int (*init_flow_api)(struct netdev *); }; +struct netdev_offload_meter_api { + void (*meter_destroy)(void *); + void (*meter_update)(void *, void *); +}; + +struct netdev_offload_meter { + void *priv_data; + struct netdev_offload_meter_api *meter_ops; +}; + int netdev_register_flow_api_provider(const struct netdev_flow_api *); int netdev_unregister_flow_api_provider(const char *type); bool netdev_flow_api_equals(const struct netdev *, const struct netdev *); diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c index 6c76f69..ba4bd67 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -1354,9 +1354,10 @@ flower_match_to_tun_opt(struct tc_flower *flower, const struct flow_tnl *tnl, } static int -netdev_tc_flow_put(struct netdev *netdev, struct match *match, - struct nlattr *actions, size_t actions_len, - const ovs_u128 *ufid, struct offload_info *info, +netdev_tc_flow_put(struct dpif *dpif OVS_UNUSED, struct netdev *netdev, + struct match *match, struct nlattr *actions, + size_t actions_len, const ovs_u128 *ufid, + struct offload_info *info, struct dpif_flow_stats *stats) { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c index e054bb0..135a29a 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -239,17 +239,18 @@ netdev_flow_dump_next(struct netdev_flow_dump *dump, struct match *match, int -netdev_flow_put(struct netdev *netdev, struct match *match, - struct nlattr *actions, size_t act_len, - const ovs_u128 *ufid, struct offload_info *info, +netdev_flow_put(struct dpif *dpif, struct netdev *netdev, + struct match *match, struct nlattr *actions, + size_t act_len, const ovs_u128 *ufid, + struct offload_info *info, struct dpif_flow_stats *stats) { const struct netdev_flow_api *flow_api = ovsrcu_get(const struct netdev_flow_api *, &netdev->flow_api); return (flow_api && flow_api->flow_put) - ? flow_api->flow_put(netdev, match, actions, act_len, ufid, - info, stats) + ? flow_api->flow_put(dpif, netdev, match, actions, + act_len, ufid, info, stats) : EOPNOTSUPP; } diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index f2c4fbc..2d43059 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -20,8 +20,12 @@ #include "openvswitch/netdev.h" #include "openvswitch/types.h" +#include "dpif-provider.h" #include "packets.h" #include "flow.h" + + + #include "conntrack.h" #ifdef __cplusplus @@ -62,6 +66,7 @@ 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 */ @@ -96,7 +101,8 @@ bool netdev_flow_dump_next(struct netdev_flow_dump *, struct match *, struct nlattr **actions, struct dpif_flow_stats *, struct dpif_flow_attrs *, ovs_u128 *ufid, struct ofpbuf *rbuffer, struct ofpbuf *wbuffer); -int netdev_flow_put(struct netdev *, struct match *, struct nlattr *actions, +int netdev_flow_put(struct dpif *, struct netdev *, + struct match *, struct nlattr *actions, size_t actions_len, const ovs_u128 *, struct offload_info *, struct dpif_flow_stats *); int netdev_flow_get(struct netdev *, struct match *, struct nlattr **actions, diff --git a/lib/ofp-meter.c b/lib/ofp-meter.c index 9ea40a0..633924e 100644 --- a/lib/ofp-meter.c +++ b/lib/ofp-meter.c @@ -807,3 +807,17 @@ ofputil_format_meter_mod(struct ds *s, const struct ofputil_meter_mod *mm) ofputil_format_meter_config(s, &mm->meter); } + +uint32_t +ofputil_meter_config_max_rate(struct ofputil_meter_config *conf) +{ + uint32_t i, max_rate = 0; + for (i = 0; i < conf->n_bands; i++) { + if (max_rate < conf->bands[i].rate) { + max_rate = conf->bands[i].rate; + } + } + + return max_rate; +} + From patchwork Mon Dec 28 09:25:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420989 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qd01qnsz9sVv for ; Tue, 29 Dec 2020 05:12:36 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 57160872F6; Mon, 28 Dec 2020 18:12:34 +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 05GIVgwpytz3; Mon, 28 Dec 2020 18:12:27 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 85CEE87171; Mon, 28 Dec 2020 18:11:39 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 32CC8C1F12; Mon, 28 Dec 2020 18:11:39 +0000 (UTC) X-Original-To: ovs-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 B586FC0891 for ; Mon, 28 Dec 2020 09:26:19 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id B0F3986C46 for ; Mon, 28 Dec 2020 09:26: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 3J7uCbGTCEAG for ; Mon, 28 Dec 2020 09:26:16 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by whitealder.osuosl.org (Postfix) with ESMTP id E0BE286C73 for ; Mon, 28 Dec 2020 09:26:15 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app02-12002 (RichMail) with SMTP id 2ee25fe9a4a9da3-bec2c; Mon, 28 Dec 2020 17:26:02 +0800 (CST) X-RM-TRANSID: 2ee25fe9a4a9da3-bec2c X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b90b; Mon, 28 Dec 2020 17:26:01 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b90b From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:13 -0800 Message-Id: <20201228092520.11807-56-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 55/62] Fix crash and port get bug with meter 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: Fix crash and port get bug when offload meter and vxlan Jira: #[Optional] 市场项目编号(名称):[Optional] --- include/openvswitch/ofp-meter.h | 2 +- lib/dpif-netdev.c | 10 -- lib/netdev-offload-dpdk.c | 319 ++++++++++++++++++++++++++-------------- lib/ofp-meter.c | 15 +- 4 files changed, 219 insertions(+), 127 deletions(-) diff --git a/include/openvswitch/ofp-meter.h b/include/openvswitch/ofp-meter.h index c6678f5..2490c0e 100644 --- a/include/openvswitch/ofp-meter.h +++ b/include/openvswitch/ofp-meter.h @@ -62,7 +62,7 @@ int ofputil_decode_meter_config(struct ofpbuf *, struct ofpbuf *bands); void ofputil_format_meter_config(struct ds *, const struct ofputil_meter_config *); -uint32_t ofputil_meter_config_max_rate(struct ofputil_meter_config *conf); +uint32_t *ofputil_meter_config_rate_burst(struct ofputil_meter_config *conf); struct ofputil_meter_mod { uint16_t command; diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index b03a2ab..e127396 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2773,16 +2773,6 @@ queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd, return; } - VLOG_DBG("TIMO DBG: in queue_netdev_flow_put:recirc %x mod %x \n", match->flow.recirc_id, - match->flow.skb_priority); - VLOG_DBG("TIMO DBG: in queue_netdev_flow_put:nw_src %x ct_nw_src %x \n", - ntohl(match->flow.nw_src), ntohl(match->flow.ct_nw_src)); - VLOG_DBG("TIMO DBG: in queue_netdev_flow_put:nat action %x \n", - nat_action.nat_action); - VLOG_DBG("TIMO DBG: in queue_netdev_flow_put:nat min addr %x \n", - ntohl(nat_action.min_addr.ipv4)); - VLOG_DBG("TIMO DBG: in queue_netdev_flow_put:nat max addr %x \n", - ntohl(nat_action.max_addr.ipv4)); if (ovsthread_once_start(&offload_thread_once)) { xpthread_cond_init(&dp_flow_offload.cond, NULL); ovs_thread_create("dp_netdev_flow_offload", diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 0a440eb..9fc8cb2 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -21,6 +21,7 @@ #include #include +#include #include "cmap.h" #include "dpif-netdev.h" @@ -642,6 +643,16 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) ds_put_format(s, " Set-Jump to : %"PRIu32"\n", jump->group); } else if (actions->type == RTE_FLOW_ACTION_TYPE_CT) { ds_put_cstr(s, " Set-CT-enable bit\n"); + + } else if (actions->type == RTE_FLOW_ACTION_TYPE_METER) { + const struct rte_flow_action_meter *meter = actions->conf; + + ds_put_cstr(s, "rte flow meter action:\n"); + if (meter) { + ds_put_format(s, " Meter: %d\n", meter->mtr_id); + } else { + ds_put_cstr(s, " Meter = null\n"); + } } else { ds_put_format(s, "unknown rte flow action (%d)\n", actions->type); } @@ -864,7 +875,6 @@ parse_geneve_match(struct flow_patterns *patterns, uint8_t val = *(buf+i); opt_data = opt_data | val ; opt_data = (i==data_len-1)? opt_data: opt_data<< 8; - VLOG_DBG("TIMO DBG. geneve op hdr =0x%08x",opt_data); } /* GENEVE option */ op_spec = xzalloc(sizeof *op_spec); @@ -1162,8 +1172,6 @@ parse_flow_match(struct flow_patterns *patterns, *next_proto_mask = 0; } } - VLOG_DBG("TIMO DBG. ct_state mask =0x%04x,ct_state =0x%04x", - match->wc.masks.ct_state, match->flow.ct_state); /* ct state */ if (match->wc.masks.ct_state && (match->wc.masks.ct_state & match->flow.ct_state & CS_ESTABLISHED) ){ @@ -1186,13 +1194,25 @@ static void dpdk_meter_destroy(void *priv_data) { struct dpdk_meter_offload *dmo = priv_data; struct rte_mtr_error mtr_error; - + int ret; + if (dmo) { - rte_mtr_meter_profile_delete(dmo->port_id, + ret = rte_mtr_meter_profile_delete(dmo->port_id, dmo->mc.mtr_id, &mtr_error); - rte_mtr_destroy(dmo->port_id, dmo->mc.mtr_id, + if (ret && ret != -EEXIST) { + VLOG_ERR("rte_mtr_meter_profile_delete fail: err_type: %d err_msg: %s, portid: %d\n", + mtr_error.type, mtr_error.message, dmo->port_id); + } + VLOG_DBG("yunxiang_DBG:in dpdk_meter_destroy1, port_id is %d,mtr_id is %d", dmo->port_id, dmo->mc.mtr_id); + + ret = rte_mtr_destroy(dmo->port_id, dmo->mc.mtr_id, &mtr_error); + if (ret && ret != -EEXIST) { + VLOG_ERR("rte_mtr_destroy fail: err_type: %d err_msg: %s, portid: %d\n", + mtr_error.type, mtr_error.message, dmo->port_id); + } + VLOG_DBG("yunxiang_DBG:in dpdk_meter_destroy2, port_id is %d,mtr_id is %d", dmo->port_id, dmo->mc.mtr_id); free(dmo); } } @@ -1743,8 +1763,6 @@ parse_clone_actions(struct netdev *netdev, NL_ATTR_FOR_EACH_UNSAFE (ca, cleft, clone_actions, clone_actions_len) { int clone_type = nl_attr_type(ca); - VLOG_DBG("TIMO DBG: in parse_clone_action %0d:%d",i++,clone_type); - if (clone_type == OVS_ACTION_ATTR_TUNNEL_PUSH) { const struct ovs_action_push_tnl *tnl_push = nl_attr_get(ca); @@ -1790,10 +1808,81 @@ parse_clone_actions(struct netdev *netdev, return 0; } +#define DPDK_METER_UPATE_UP 65536 + +static void dpdk_meter_update(void *priv_data, void *config) +{ + struct dpdk_meter_offload *dmo = priv_data; + struct rte_mtr_meter_profile mp; + struct rte_mtr_error mtr_error; + uint32_t mp_id, new_mp_id; + uint32_t *rate_and_burst; + uint32_t max_rate; + uint32_t burst_size; + uint32_t ret; + + if (!priv_data || !config) { + return; + } + + rate_and_burst = ofputil_meter_config_rate_burst(config); + max_rate = *rate_and_burst; + burst_size = *(rate_and_burst + 1); + VLOG_DBG("yunxiang_DBG:in dpdk_meter_update, max_rate is %d,burst is %d,dmo->nax_rate is %d", max_rate, burst_size, dmo->max_rate); + + if (dmo->max_rate == max_rate) { + return; + } + + memset(&mp, 0, sizeof(struct rte_mtr_meter_profile)); + mp.alg = RTE_MTR_TRTCM_RFC2698; + mp.trtcm_rfc2698.cir = max_rate *1000 /8; /* rate_max Kbps*/ + mp.trtcm_rfc2698.cbs = burst_size /8; /* busrt_size bit*/ + + if (dmo->mp_id < DPDK_METER_UPATE_UP) { + new_mp_id = dmo->mp_id + DPDK_METER_UPATE_UP; + } else { + new_mp_id = dmo->mp_id - DPDK_METER_UPATE_UP; + } + + ret = rte_mtr_meter_profile_add(dmo->port_id, new_mp_id, + &mp, &mtr_error); + VLOG_DBG("yunxiang_DBG: in dpdk_meter_update_profile_add, port_id is %d,device name is %s, new_mp_id is %d, max_rate is %d, burst_size is %d", dmo->port_id, rte_eth_devices[dmo->port_id].data->name, new_mp_id,max_rate, burst_size); + if (ret) { + VLOG_ERR("rte_mtr_meter_profile_add fail: err_type: %d err_msg: %s\n", + mtr_error.type, mtr_error.message); + return; + } + + ret = rte_mtr_meter_profile_update(dmo->port_id, dmo->mc.mtr_id, + new_mp_id, &mtr_error); + VLOG_DBG("yunxiang_DBG: in dpdk_meter_update_profile_update, max_rate is %d, burst_size is %d, mid is %d, new_mp_id is %d", max_rate, burst_size, dmo->mc.mtr_id, new_mp_id); + if (ret) { + VLOG_ERR("rte_mtr_meter_profile_update fail: err_type: %d err_msg: %s\n", + mtr_error.type, mtr_error.message); + mp_id = new_mp_id; + goto out; + } + + mp_id = dmo->mp_id; + dmo->mp_id = new_mp_id; +out: + ret = rte_mtr_meter_profile_delete(dmo->port_id, mp_id, &mtr_error); + if (ret) { + VLOG_ERR("rte_mtr_meter_profile_update fail: err_type: %d err_msg: %s\n", + mtr_error.type, mtr_error.message); + } +} + +static struct netdev_offload_meter_api dpdk_meter_offload_api = { + .meter_destroy = dpdk_meter_destroy, + .meter_update = dpdk_meter_update, +}; + static struct rte_flow_action_meter* dpdk_meter_create(struct dpif *dpif, struct netdev *netdev, uint32_t mid) { - uint32_t port_id = netdev_dpdk_get_portid(netdev); + uint32_t port_id; struct netdev_offload_meter *nom; struct dpdk_meter_offload *dmo; struct ofputil_meter_config config; @@ -1801,9 +1890,10 @@ dpdk_meter_create(struct dpif *dpif, struct netdev *netdev, uint32_t mid) struct rte_mtr_meter_profile mp; struct rte_mtr_params params; struct rte_mtr_error mtr_error; + uint32_t *rate_and_burst; uint32_t max_rate; + uint32_t burst_size; int ret; - static struct netdev_offload_meter_api dpdk_meter_offload_api; meter_id.uint32 = mid; @@ -1811,6 +1901,34 @@ dpdk_meter_create(struct dpif *dpif, struct netdev *netdev, uint32_t mid) return NULL; } + /* check if the device port is a useful rep port. If it is a vport, we + * we will get any rep port from all netdev */ + if (netdev_vport_is_vport_class(netdev->netdev_class)) { + struct netdev_flow_dump **netdev_dumps; + int num_ports = 0; + int i; + + netdev_dumps = netdev_ports_flow_dump_create(netdev->dpif_type, + &num_ports); + for (i = 0; i < num_ports; i++) { + if (!netdev_dpdk_is_vfrep_port(netdev_dumps[i]->netdev)) { + continue; + } + port_id = netdev_dpdk_get_portid(netdev_dumps[i]->netdev); + break; + } + 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)); + } + } + + } else { + port_id = netdev_dpdk_get_portid(netdev); + } + nom = xmalloc(sizeof *nom); dmo = xmalloc(sizeof *dmo); @@ -1818,39 +1936,39 @@ dpdk_meter_create(struct dpif *dpif, struct netdev *netdev, uint32_t mid) nom->priv_data = dmo; memset(&mp, 0, sizeof(struct rte_mtr_meter_profile)); - max_rate = ofputil_meter_config_max_rate(&config); + rate_and_burst = ofputil_meter_config_rate_burst(&config); + max_rate = *rate_and_burst; + burst_size = *(rate_and_burst + 1); dmo->mc.mtr_id = mid; dmo->port_id = port_id; dmo->max_rate = max_rate; dmo->mp_id = mid; - mp.alg = RTE_MTR_SRTCM_RFC2697; - mp.srtcm_rfc2697.cir = max_rate *1024 /8; /* rate_max Kbps*/ - mp.srtcm_rfc2697.cbs = max_rate *1024 /8; - mp.srtcm_rfc2697.ebs = 0; - + mp.alg = RTE_MTR_TRTCM_RFC2698; + mp.trtcm_rfc2698.cir = max_rate *1000 /8; /* rate_max Kbps*/ + mp.trtcm_rfc2698.cbs = burst_size /8; /* busrt_size bit*/ + + VLOG_DBG("yunxiang_DBG: in dpdk_meter_create, port_id1 is %d,device name is %s", dmo->port_id, rte_eth_devices[port_id].data->name); ret = rte_mtr_meter_profile_add(dmo->port_id, dmo->mc.mtr_id, &mp, &mtr_error); + VLOG_DBG("yunxiang_DBG: in dpdk_meter_create, max_rate is %d, burst_size is %d, mid is %d", max_rate, burst_size, dmo->mc.mtr_id); if (ret && ret != -EEXIST) { VLOG_ERR("rte_mtr_meter_profile_add fail: err_type: %d err_msg: %s, portid: %d\n", mtr_error.type, mtr_error.message, netdev_dpdk_get_portid(netdev)); goto profile_err; } - enum rte_color dscp_table[2]; - dscp_table[0] = RTE_COLOR_YELLOW; - dscp_table[1] = RTE_COLOR_RED; params.meter_profile_id = dmo->mc.mtr_id; - params.dscp_table = dscp_table; params.meter_enable = 1; params.use_prev_mtr_color = 0; + params.stats_mask = 0; params.action[RTE_COLOR_GREEN] = MTR_POLICER_ACTION_COLOR_GREEN; params.action[RTE_COLOR_YELLOW] = MTR_POLICER_ACTION_DROP; params.action[RTE_COLOR_RED] = MTR_POLICER_ACTION_DROP; - ret = rte_mtr_create(dmo->port_id, dmo->mc.mtr_id, ¶ms, 0, &mtr_error); + ret = rte_mtr_create(dmo->port_id, dmo->mc.mtr_id, ¶ms, 1, &mtr_error); if (ret && ret != -EEXIST) { VLOG_ERR("rte_mtr_create fail: err_type: %d err_msg: %s, portid: %d\n", mtr_error.type, mtr_error.message, netdev_dpdk_get_portid(netdev)); @@ -1875,7 +1993,7 @@ profile_err: static struct rte_flow_action_meter * netdev_offload_dpdk_meter_conf(struct dpif *dpif, struct netdev *netdev, uint32_t mid) { - uint32_t port_id = netdev_dpdk_get_portid(netdev); + /*uint32_t port_id = netdev_dpdk_get_portid(netdev);*/ struct netdev_offload_meter *nom = NULL; struct dpdk_meter_offload *dmo; ofproto_meter_id meter_id; @@ -1891,16 +2009,11 @@ netdev_offload_dpdk_meter_conf(struct dpif *dpif, struct netdev *netdev, uint32_ if (!nom) { return dpdk_meter_create(dpif, netdev, mid); + } else { + dmo = (struct dpdk_meter_offload *)(nom->priv_data); + return &(dmo->mc); } - dmo = (struct dpdk_meter_offload *)nom->priv_data; - if (port_id != dmo->port_id) { - VLOG_INFO("dpdk meter %d is used on %d, can't be used for : %d", - mid, dmo->port_id, port_id); - return NULL; - } - - return &dmo->mc; } static int @@ -1980,12 +2093,17 @@ parse_flow_actions(struct dpif *dpif, /* for ct && ct clear no need to translate*/ } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_METER) { struct rte_flow_action_meter *mc; - mc = netdev_offload_dpdk_meter_conf(dpif, + struct rte_flow_action_meter *mc_ori; + mc_ori = netdev_offload_dpdk_meter_conf(dpif, netdev, nl_attr_get_u32(nla)); - if (mc) { + if (mc_ori) { + mc = xzalloc(sizeof *mc); + mc->mtr_id = nl_attr_get_u32(nla); add_flow_action(actions, RTE_FLOW_ACTION_TYPE_METER, mc); - } + } else { + return -1; + } } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_CT_CLEAR || @@ -2053,7 +2171,6 @@ netdev_offload_dpdk_actions(struct dpif *dpif, if (!netdev_dpdk_is_uplink_port(netdev_dumps[i]->netdev)) { continue; } - VLOG_DBG("TIMO DBG: in netdev_offload_dpdk_flow_create, netdev dpdk"); flow = netdev_offload_dpdk_flow_create(netdev_dumps[i]->netdev, &flow_attr, patterns->items, actions.actions, &error); @@ -2063,7 +2180,7 @@ netdev_offload_dpdk_actions(struct dpif *dpif, int err = netdev_flow_dump_destroy(netdev_dumps[i]); if (err != 0 && err != EOPNOTSUPP) { - VLOG_ERR("failed dumping netdev: %s", ovs_strerror(err)); + VLOG_ERR("dpdk_action:failed dumping netdev: %s", ovs_strerror(err)); } } @@ -2076,71 +2193,6 @@ out: return flow; } -#define DPDK_METER_UPATE_UP 65536 - -static void dpdk_meter_update(void *priv_data, void *config) -{ - struct dpdk_meter_offload *dmo = priv_data; - struct rte_mtr_meter_profile mp; - struct rte_mtr_error mtr_error; - uint32_t mp_id, new_mp_id; - uint32_t max_rate; - uint32_t ret; - - if (!priv_data || !config) { - return; - } - - max_rate = ofputil_meter_config_max_rate(config); - if (dmo->max_rate == max_rate) { - return; - } - - memset(&mp, 0, sizeof(struct rte_mtr_meter_profile)); - mp.alg = RTE_MTR_SRTCM_RFC2697; - mp.srtcm_rfc2697.cir = max_rate *1024 /8; - mp.srtcm_rfc2697.cbs = max_rate *1024 /8; - mp.srtcm_rfc2697.ebs = 0; - - if (dmo->mp_id < DPDK_METER_UPATE_UP) { - new_mp_id = dmo->mp_id + DPDK_METER_UPATE_UP; - } else { - new_mp_id = dmo->mp_id - DPDK_METER_UPATE_UP; - } - - ret = rte_mtr_meter_profile_add(dmo->port_id, new_mp_id, - &mp, &mtr_error); - if (ret) { - VLOG_ERR("rte_mtr_meter_profile_add fail: err_type: %d err_msg: %s\n", - mtr_error.type, mtr_error.message); - return; - } - - ret = rte_mtr_meter_profile_update(dmo->port_id, dmo->mc.mtr_id, - new_mp_id, &mtr_error); - if (ret) { - VLOG_ERR("rte_mtr_meter_profile_update fail: err_type: %d err_msg: %s\n", - mtr_error.type, mtr_error.message); - mp_id = new_mp_id; - goto out; - } - - mp_id = dmo->mp_id; - dmo->mp_id = new_mp_id; -out: - ret = rte_mtr_meter_profile_delete(dmo->port_id, mp_id, &mtr_error); - if (ret) { - VLOG_ERR("rte_mtr_meter_profile_update fail: err_type: %d err_msg: %s\n", - mtr_error.type, mtr_error.message); - } -} - -static struct netdev_offload_meter_api dpdk_meter_offload_api = { - .meter_destroy = dpdk_meter_destroy, - .meter_update = dpdk_meter_update, -}; - - static int netdev_offload_dpdk_add_flow(struct dpif *dpif, struct netdev *netdev, @@ -2158,12 +2210,10 @@ netdev_offload_dpdk_add_flow(struct dpif *dpif, struct netdev *netdev, ret = parse_flow_match(&patterns, match, netdev, info); if (ret) { goto out; - VLOG_DBG("yunxiang_debug_netdev_offload_dpdk_add_flow: ret %p \n",ret); } flow = netdev_offload_dpdk_actions(dpif, netdev, &patterns, nl_actions, actions_len, info); - VLOG_DBG("yunxiang_debug_netdev_offload_dpdk_add_flow: flow %p \n",flow); if (!flow) { /* If we failed to offload the rule actions fallback to MARK+RSS * actions. @@ -2197,7 +2247,6 @@ netdev_offload_dpdk_validate_flow(const struct match *match) /* Create a wc-zeroed version of flow. */ match_init(&match_zero_wc, &match->flow, &match->wc); - /* support tunnel now so mark this checker if (!is_all_zeros(&match_zero_wc.flow.tunnel, sizeof match_zero_wc.flow.tunnel)) { @@ -2306,12 +2355,35 @@ netdev_offload_dpdk_flow_put(struct dpif *dpif, struct netdev *netdev, * Here destroy the old rte flow first before adding a new one. */ rte_flow_data = ufid_to_rte_flow_data_find(ufid); - VLOG_DBG("yunxiang_debug_netdev_offload_dpdk_flow_put,rte_flow_data=%p",rte_flow_data); if (rte_flow_data && rte_flow_data->rte_flow) { - ret = netdev_offload_dpdk_destroy_flow(netdev, ufid, - rte_flow_data->rte_flow); + if (netdev_vport_is_vport_class(netdev->netdev_class)) { + struct netdev_flow_dump **netdev_dumps; + int num_ports = 0; + int i; + + netdev_dumps = netdev_ports_flow_dump_create(netdev->dpif_type, + &num_ports); + for (i = 0; i < num_ports; i++) { + if (!netdev_dpdk_is_uplink_port(netdev_dumps[i]->netdev)) { + continue; + } + ret = netdev_offload_dpdk_destroy_flow(netdev_dumps[i]->netdev, ufid, + rte_flow_data->rte_flow); + break; + } + for (i = 0; i < num_ports; i++) { + int err = netdev_flow_dump_destroy(netdev_dumps[i]); + + if (err != 0 && err != EOPNOTSUPP) { + VLOG_ERR("flow_del:failed dumping netdev: %s", ovs_strerror(err)); + } + } + + } else { + ret = netdev_offload_dpdk_destroy_flow(netdev, ufid, + rte_flow_data->rte_flow); + } if (ret < 0) { - VLOG_DBG("yunxiang_debug_netdev_offload_dpdk_flow_put,ret=%p",ret); return ret; } } @@ -2333,17 +2405,44 @@ netdev_offload_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid, struct dpif_flow_stats *stats) { struct ufid_to_rte_flow_data *rte_flow_data; + int ret = -1; rte_flow_data = ufid_to_rte_flow_data_find(ufid); if (!rte_flow_data || !rte_flow_data->rte_flow) { - return -1; + return ret; } if (stats) { memset(stats, 0, sizeof *stats); } - return netdev_offload_dpdk_destroy_flow(netdev, ufid, - rte_flow_data->rte_flow); + if (netdev_vport_is_vport_class(netdev->netdev_class)) { + struct netdev_flow_dump **netdev_dumps; + int num_ports = 0; + int i; + + netdev_dumps = netdev_ports_flow_dump_create(netdev->dpif_type, + &num_ports); + for (i = 0; i < num_ports; i++) { + if (!netdev_dpdk_is_uplink_port(netdev_dumps[i]->netdev)) { + continue; + } + ret = netdev_offload_dpdk_destroy_flow(netdev_dumps[i]->netdev, ufid, + rte_flow_data->rte_flow); + break; + } + for (i = 0; i < num_ports; i++) { + int err = netdev_flow_dump_destroy(netdev_dumps[i]); + + if (err != 0 && err != EOPNOTSUPP) { + VLOG_ERR("flow_del:failed dumping netdev: %s", ovs_strerror(err)); + } + } + + } else { + ret = netdev_offload_dpdk_destroy_flow(netdev, ufid, + rte_flow_data->rte_flow); + } + return ret; } static int diff --git a/lib/ofp-meter.c b/lib/ofp-meter.c index 633924e..cc36aea 100644 --- a/lib/ofp-meter.c +++ b/lib/ofp-meter.c @@ -808,16 +808,19 @@ ofputil_format_meter_mod(struct ds *s, const struct ofputil_meter_mod *mm) ofputil_format_meter_config(s, &mm->meter); } -uint32_t -ofputil_meter_config_max_rate(struct ofputil_meter_config *conf) +uint32_t * +ofputil_meter_config_rate_burst(struct ofputil_meter_config *conf) { - uint32_t i, max_rate = 0; + uint32_t i, max_rate = 0, burst_size = 0; + uint32_t rate_and_burst[2]; for (i = 0; i < conf->n_bands; i++) { if (max_rate < conf->bands[i].rate) { max_rate = conf->bands[i].rate; + burst_size = conf->bands[i].burst_size; } } - - return max_rate; + rate_and_burst[0] = max_rate; + rate_and_burst[1] = burst_size; + + return rate_and_burst; } - From patchwork Mon Dec 28 09:25:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420957 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QbP46R1z9sVv for ; Tue, 29 Dec 2020 05:11:13 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 08D6087123; Mon, 28 Dec 2020 18:11:12 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from hemlock.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 3ElnZo0-jbid; Mon, 28 Dec 2020 18:11:08 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id D534E87021; Mon, 28 Dec 2020 18:11:06 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 8CE60C1DEC; Mon, 28 Dec 2020 18:11:06 +0000 (UTC) X-Original-To: ovs-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 C74B7C0893 for ; Mon, 28 Dec 2020 09:26:06 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id B14F286C73 for ; Mon, 28 Dec 2020 09:26:06 +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 fEk+d-s9MHZZ for ; Mon, 28 Dec 2020 09:26:04 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by whitealder.osuosl.org (Postfix) with ESMTP id B009986C9A for ; Mon, 28 Dec 2020 09:26:03 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app11-12011 (RichMail) with SMTP id 2eeb5fe9a4aa53c-c1be3; Mon, 28 Dec 2020 17:26:02 +0800 (CST) X-RM-TRANSID: 2eeb5fe9a4aa53c-c1be3 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b911; Mon, 28 Dec 2020 17:26:02 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b911 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:14 -0800 Message-Id: <20201228092520.11807-57-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 56/62] ofproto-dpif-xlate: ovs-tcpdump cannot capture incomming vxlan packets 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: when running ovs-tcpdump -i ethX and the port is used as the incomming port for a vxlan port. The callstack for the upcall: mirror_ingress_packet mirror_packet output_normal compose_output_action compose_output_action__ terminate_native_tunnel it will xlate the action into a tnl_pop action, not an output action to the mirror port. So eventually the translated actions will be 'tnl_pop(x), tnl_pop(x)'. However, the right action should be '(mirror port), tnl_pop(x)' This patch adds a flag in xlate_ctx indicating the current output_normal is used by mirroring. Note that we cannot use ctx->mirrors as the indicator as in the mirror code, the ctx->mirrors will not be cleared after mirror action finished. Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 11 ++++++++++- ofproto/ofproto-dpif-xlate.c | 10 ++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index e127396..85e1fe4 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2362,17 +2362,20 @@ mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd, return ret; } +/* static void flow_mark_flush(struct dp_netdev_pmd_thread *pmd) { struct dp_netdev_flow *flow; + VLOG_DBG("TIMO DBG: in flow_mark_flush\n"); CMAP_FOR_EACH (flow, mark_node, &flow_mark.mark_to_flow) { if (flow->pmd_id == pmd->core_id) { queue_netdev_flow_del(pmd, flow); } } } +*/ static struct dp_netdev_flow * mark_to_flow_find(const struct dp_netdev_pmd_thread *pmd, @@ -2466,6 +2469,8 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) } if (modification) { + VLOG_DBG("TIMO DBG: mod flow ufid:"UUID_FMT" \n", + UUID_ARGS((struct uuid *)&flow->ufid)); mark = flow->mark; ovs_assert(mark != INVALID_FLOW_MARK); } else { @@ -5032,7 +5037,11 @@ reload_affected_pmds(struct dp_netdev *dp) CMAP_FOR_EACH (pmd, node, &dp->poll_threads) { if (pmd->need_reload) { - flow_mark_flush(pmd); + /* For dp port add/del, don't need to + * delete hw flows, only sw flow delete + * would trigger hw flow delete + * flow_mark_flush(pmd); + */ dp_netdev_reload_pmd__(pmd); } } diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index 54cfbfb..5e2b676 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -269,6 +269,7 @@ struct xlate_ctx { bool exit; /* No further actions should be processed. */ mirror_mask_t mirrors; /* Bitmap of associated mirrors. */ int mirror_snaplen; /* Max size of a mirror packet in byte. */ + bool in_mirror_output; /* Freezing Translation * ==================== @@ -2147,7 +2148,9 @@ mirror_packet(struct xlate_ctx *ctx, struct xbundle *xbundle, if (out) { struct xbundle *out_xbundle = xbundle_lookup(ctx->xcfg, out); if (out_xbundle) { + ctx->in_mirror_output = true; output_normal(ctx, out_xbundle, &xvlan); + ctx->in_mirror_output = false; } } else if (xvlan.v[0].vid != out_vlan && !eth_addr_is_reserved(ctx->xin->flow.dl_dst)) { @@ -2158,7 +2161,9 @@ mirror_packet(struct xlate_ctx *ctx, struct xbundle *xbundle, LIST_FOR_EACH (xb, list_node, &xbridge->xbundles) { if (xbundle_includes_vlan(xb, &xvlan) && !xbundle_mirror_out(xbridge, xb)) { + ctx->in_mirror_output = true; output_normal(ctx, xb, &xvlan); + ctx->in_mirror_output = false; } } xvlan.v[0].vid = old_vid; @@ -4223,8 +4228,8 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port, native_tunnel_output(ctx, xport, flow, odp_port, truncate); flow->tunnel = flow_tnl; /* Restore tunnel metadata */ - } else if (terminate_native_tunnel(ctx, flow, wc, - &odp_tnl_port)) { + } else if (!ctx->in_mirror_output && + terminate_native_tunnel(ctx, flow, wc, &odp_tnl_port)) { /* Intercept packet to be received on native tunnel port. */ nl_msg_put_odp_port(ctx->odp_actions, OVS_ACTION_ATTR_TUNNEL_POP, odp_tnl_port); @@ -7462,6 +7467,7 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout) .exit = false, .error = XLATE_OK, .mirrors = 0, + .in_mirror_output = false, .freezing = false, .recirc_update_dp_hash = false, From patchwork Mon Dec 28 09:25:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420990 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qd60XlFz9sVv for ; Tue, 29 Dec 2020 05:12:42 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id A63068751C; Mon, 28 Dec 2020 18:12:40 +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 pFaFb38ndyWS; Mon, 28 Dec 2020 18:12:38 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 9BB1687293; Mon, 28 Dec 2020 18:11:42 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 4C2BDC1EA3; Mon, 28 Dec 2020 18:11:42 +0000 (UTC) X-Original-To: ovs-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 A397CC0893 for ; Mon, 28 Dec 2020 09:26:20 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 8B1CC85F50 for ; Mon, 28 Dec 2020 09:26:20 +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 lBTYmhYXEEke for ; Mon, 28 Dec 2020 09:26:18 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta3.chinamobile.com (cmccmta3.chinamobile.com [221.176.66.81]) by fraxinus.osuosl.org (Postfix) with ESMTP id E8E8385F4E for ; Mon, 28 Dec 2020 09:26:17 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app10-12010 (RichMail) with SMTP id 2eea5fe9a4aaa10-c3410; Mon, 28 Dec 2020 17:26:02 +0800 (CST) X-RM-TRANSID: 2eea5fe9a4aaa10-c3410 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b916; Mon, 28 Dec 2020 17:26:02 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b916 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:15 -0800 Message-Id: <20201228092520.11807-58-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 57/62] netdev-offload-dpdk: Add flow_flush 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: This commit is to solve HW flow delete error when SW call port delete. Now when we del port on bridge, all the offloaded flows correspond to this port has to be flushed. Also we add netdev name into ufid_to_rte_flow mapping, so we can flush SW cmap node when we delete HW flows Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 20 +++++++++++++++++--- lib/netdev-dpdk.c | 13 +++++++++++++ lib/netdev-offload-dpdk.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 85e1fe4..1eaad3e 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2066,6 +2066,18 @@ do_del_port(struct dp_netdev *dp, struct dp_netdev_port *port) hmap_remove(&dp->ports, &port->node); seq_change(dp->port_seq); + if (netdev_is_flow_api_enabled()) { + int error; + /*Before del port, we should delete correspond hw flows*/ + error = netdev_flow_flush(port->netdev); + if (error) { + VLOG_ERR("Failed to flush hw flow on port %s!\n", + port->netdev->name); + } else { + VLOG_INFO("Success to flush hw flow on port %s!\n", + port->netdev->name); + } + } reconfigure_datapath(dp); port_destroy(port); @@ -2513,7 +2525,6 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) info.ori_nw_dst = offload->ori_nw_dst; info.ct_enable = false; info.group_id = 0; - info.dpif_class = pmd->dp->class; port = netdev_ports_get(in_port, dpif_type_str); if (!port) { @@ -2596,8 +2607,9 @@ dp_netdev_flow_offload_main(void *data OVS_UNUSED) OVS_NOT_REACHED(); } - VLOG_DBG("%s to %s netdev flow\n", - ret == 0 ? "succeed" : "failed", op); + VLOG_DBG("%s to %s netdev flow "UUID_FMT"\n", + ret == 0 ? "succeed" : "failed", op, + UUID_ARGS((struct uuid *) &offload->flow->ufid)); dp_netdev_free_flow_offload(offload); ovsrcu_quiesce(); } @@ -3650,6 +3662,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/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 9f382ea..5c5edb9 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -5422,6 +5422,19 @@ netdev_dpdk_rte_flow_destroy(struct netdev *netdev, return ret; } +int +netdev_dpdk_rte_flow_flush(struct netdev *netdev, + struct rte_flow_error *error) +{ + struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); + int ret; + + ovs_mutex_lock(&dev->mutex); + ret = rte_flow_flush(dev->port_id, error); + ovs_mutex_unlock(&dev->mutex); + return ret; +} + struct rte_flow * netdev_dpdk_rte_flow_create(struct netdev *netdev, const struct rte_flow_attr *attr, diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 9fc8cb2..bef2349 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -32,6 +33,7 @@ #include "openvswitch/vlog.h" #include "packets.h" #include "uuid.h" +#include "netdev-vport-private.h" #include #include "id-pool.h" #include "odp-util.h" @@ -68,6 +70,7 @@ struct ufid_to_rte_flow_data { struct rte_flow *rte_flow; bool actions_offloaded; struct dpif_flow_stats stats; + char *netdev_name; }; /* maybe little-endian */ @@ -126,7 +129,9 @@ 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, + char *netdev_name) { size_t hash = hash_bytes(ufid, sizeof *ufid, 0); struct ufid_to_rte_flow_data *data = xzalloc(sizeof *data); @@ -146,6 +151,7 @@ ufid_to_rte_flow_associate(const ovs_u128 *ufid, data->ufid = *ufid; data->rte_flow = rte_flow; data->actions_offloaded = actions_offloaded; + data->netdev_name = netdev_name; cmap_insert(&ufid_to_rte_flow, CONST_CAST(struct cmap_node *, &data->node), hash); @@ -170,6 +176,22 @@ ufid_to_rte_flow_disassociate(const ovs_u128 *ufid) UUID_ARGS((struct uuid *) ufid)); } +static inline void +ufid_to_rte_flow_disassociate_by_name(char *netdev_name) +{ + struct ufid_to_rte_flow_data *data; + + CMAP_FOR_EACH (data, node, &ufid_to_rte_flow) { + if (!strcmp(netdev_name, data->netdev_name)) { + size_t hash = hash_bytes(&(data->ufid), sizeof(ovs_u128), 0); + cmap_remove(&ufid_to_rte_flow, + CONST_CAST(struct cmap_node *, &data->node), hash); + ovsrcu_postpone(free, data); + } + } + + VLOG_INFO("%s is not associated with any rte flow\n", netdev_name); +} /* * To avoid individual xrealloc calls for each new element, a 'curent_max' * is used to keep track of current allocated number of elements. Starts @@ -2227,7 +2249,7 @@ netdev_offload_dpdk_add_flow(struct dpif *dpif, 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,netdev->name); VLOG_DBG("%s: installed flow %p by ufid "UUID_FMT"\n", netdev_get_name(netdev), flow, UUID_ARGS((struct uuid *)ufid)); @@ -2446,6 +2468,24 @@ netdev_offload_dpdk_flow_del(struct netdev *netdev, const ovs_u128 *ufid, } static int +netdev_offload_dpdk_flow_flush(struct netdev *netdev) +{ + int ret = -1; + struct rte_flow_error error; + + ret = netdev_dpdk_rte_flow_flush(netdev, &error); + if (ret == 0) { + ufid_to_rte_flow_disassociate_by_name(netdev->name); + VLOG_DBG("removed rte flow associated with %s\n", + netdev_get_name(netdev)); + } else { + VLOG_ERR("%s: rte flow flush error: %u : message : %s\n", + netdev_get_name(netdev), error.type, error.message); + } + return ret; +} + +static int netdev_offload_dpdk_init_flow_api(struct netdev *netdev) { return netdev_dpdk_flow_api_supported(netdev) ? 0 : EOPNOTSUPP; @@ -2547,6 +2587,7 @@ 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, + .flow_flush = netdev_offload_dpdk_flow_flush, .init_flow_api = netdev_offload_dpdk_init_flow_api, .flow_get = netdev_offload_dpdk_flow_get, .flow_dump_create = netdev_offload_dpdk_flow_dump_create, From patchwork Mon Dec 28 09:25:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1421011 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qg55HqWz9sVv for ; Tue, 29 Dec 2020 05:14:25 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 41BDA86D29; Mon, 28 Dec 2020 18:14:24 +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 eM9R733UeW0R; Mon, 28 Dec 2020 18:14:19 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id 507A586DE0; Mon, 28 Dec 2020 18:11:31 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0FA88C1E7F; Mon, 28 Dec 2020 18:11:31 +0000 (UTC) X-Original-To: ovs-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 A7908C0891 for ; Mon, 28 Dec 2020 09:26:18 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id A139B2046B for ; Mon, 28 Dec 2020 09:26: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 pTv25AMkmKOs for ; Mon, 28 Dec 2020 09:26:17 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by silver.osuosl.org (Postfix) with ESMTP id 22F0220464 for ; Mon, 28 Dec 2020 09:26:16 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app07-12007 (RichMail) with SMTP id 2ee75fe9a4abb56-c33ae; Mon, 28 Dec 2020 17:26:03 +0800 (CST) X-RM-TRANSID: 2ee75fe9a4abb56-c33ae X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b918; Mon, 28 Dec 2020 17:26:03 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b918 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:16 -0800 Message-Id: <20201228092520.11807-59-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 58/62] netdev-offload-dpdk: Add offload mod_tos 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: netdev-offload-dpdk: Add offload mod_tos actions Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/netdev-offload-dpdk.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index bef2349..3ee4f33 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -647,6 +647,15 @@ dump_flow_action(struct ds *s, const struct rte_flow_action *actions) } else { ds_put_cstr(s, " Set-ttl = null\n"); } + } else if (actions->type == RTE_FLOW_ACTION_TYPE_SET_IP_TOS) { + const struct rte_flow_action_set_iptos *set_tos = actions->conf; + + ds_put_cstr(s, "rte flow set-tos action:\n"); + if (set_tos) { + ds_put_format(s, " Set-tos: 0x%02x\n", set_tos->ip_tos); + } else { + ds_put_cstr(s, " Set-tos = null\n"); + } } else if (actions->type == RTE_FLOW_ACTION_TYPE_SET_TP_SRC || actions->type == RTE_FLOW_ACTION_TYPE_SET_TP_DST) { const struct rte_flow_action_set_tp *set_tp = actions->conf; @@ -1354,7 +1363,8 @@ add_set_flow_action__(struct flow_actions *actions, if (is_all_zeros(mask, size)) { return 0; } - if (!is_all_ones(mask, size)) { + if (!is_all_ones(mask, size) && + (attr != RTE_FLOW_ACTION_TYPE_SET_IP_TOS )) { VLOG_DBG_RL(&rl, "Partial mask is not supported"); return -1; } @@ -1377,6 +1387,8 @@ BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_mac) == MEMBER_SIZEOF(struct ovs_key_ethernet, eth_dst)); BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_ipv4) == MEMBER_SIZEOF(struct ovs_key_ipv4, ipv4_src)); +BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_iptos) == + MEMBER_SIZEOF(struct ovs_key_ipv4, ipv4_tos)); BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_ipv4) == MEMBER_SIZEOF(struct ovs_key_ipv4, ipv4_dst)); BUILD_ASSERT_DECL(sizeof(struct rte_flow_action_set_ttl) == @@ -1425,6 +1437,7 @@ parse_set_actions(struct flow_actions *actions, add_set_flow_action(ipv4_src, RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC); add_set_flow_action(ipv4_dst, RTE_FLOW_ACTION_TYPE_SET_IPV4_DST); add_set_flow_action(ipv4_ttl, RTE_FLOW_ACTION_TYPE_SET_TTL); + add_set_flow_action(ipv4_tos, RTE_FLOW_ACTION_TYPE_SET_IP_TOS); if (mask && !is_all_zeros(mask, sizeof *mask)) { VLOG_DBG_RL(&rl, "Unsupported IPv4 set action"); From patchwork Mon Dec 28 09:25:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1420994 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4QdJ57qzz9sVv for ; Tue, 29 Dec 2020 05:12:52 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 11E0D8765B; Mon, 28 Dec 2020 18:12:51 +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 41V0Pk5WsHmV; Mon, 28 Dec 2020 18:12:49 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id EE05E87367; Mon, 28 Dec 2020 18:11:45 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 9927EC1F4F; Mon, 28 Dec 2020 18:11:45 +0000 (UTC) X-Original-To: ovs-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 887D0C1DA2 for ; Mon, 28 Dec 2020 09:26:22 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 69EDF20464 for ; Mon, 28 Dec 2020 09:26: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 q18u6mcA6gx6 for ; Mon, 28 Dec 2020 09:26:22 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by silver.osuosl.org (Postfix) with ESMTP id 63A272045F for ; Mon, 28 Dec 2020 09:26:21 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app01-12001 (RichMail) with SMTP id 2ee15fe9a4ab701-bca6b; Mon, 28 Dec 2020 17:26:03 +0800 (CST) X-RM-TRANSID: 2ee15fe9a4ab701-bca6b X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b91f; Mon, 28 Dec 2020 17:26:03 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b91f From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:17 -0800 Message-Id: <20201228092520.11807-60-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: LIU CHANG Subject: [ovs-dev] [PATCH 59/62] dpif-netdev: fix functional test errors 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: LIU CHANG --- lib/dpif-netdev.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 1eaad3e..cf89d6c 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -3662,8 +3662,6 @@ 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, From patchwork Mon Dec 28 09:25:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1421002 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qf76L5sz9sVv for ; Tue, 29 Dec 2020 05:13:35 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 5E8012E15D; Mon, 28 Dec 2020 18:13: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 sROa21I8FWSi; Mon, 28 Dec 2020 18:13:27 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by silver.osuosl.org (Postfix) with ESMTP id 5155C2E145; Mon, 28 Dec 2020 18:11:24 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id C5EF2C1E5E; Mon, 28 Dec 2020 18:11:23 +0000 (UTC) X-Original-To: ovs-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 576C8C0891 for ; Mon, 28 Dec 2020 09:26:17 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 5449086C71 for ; Mon, 28 Dec 2020 09:26:17 +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 VPB1kZoeWf8F for ; Mon, 28 Dec 2020 09:26:16 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by whitealder.osuosl.org (Postfix) with ESMTP id E2B1B86C77 for ; Mon, 28 Dec 2020 09:26:15 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app02-12002 (RichMail) with SMTP id 2ee25fe9a4acdac-bec35; Mon, 28 Dec 2020 17:26:04 +0800 (CST) X-RM-TRANSID: 2ee25fe9a4acdac-bec35 X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b920; Mon, 28 Dec 2020 17:26:04 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b920 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:18 -0800 Message-Id: <20201228092520.11807-61-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> MIME-Version: 1.0 X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: Taoyunxiang Subject: [ovs-dev] [PATCH 60/62] dpif-netdev: modify max supported number of meter 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Taoyunxiang Code Source From: Self Code Description: The max number is assigned by dpif_netdev_meter_get_features. The max supported number in BSC card is 256. So we need to modify the default max number from 65536 to 256. In ofproto-dpif.c, meter_set will verify max number by id_pool_alloc_id. Jira: #[Optional] 市场项目编号(名称):[Optional] --- lib/dpif-netdev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index cf89d6c..1f5fce5 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -98,7 +98,8 @@ DEFINE_STATIC_PER_THREAD_DATA(uint32_t, recirc_depth, 0) /* Configuration parameters. */ enum { MAX_FLOWS = 65536 }; /* Maximum number of flows in flow table. */ -enum { MAX_METERS = 65536 }; /* Maximum number of meters. */ +enum { MAX_METERS = 256 }; /* Maximum number of meters. + 256 is the max supported number in Intel BSC card*/ enum { MAX_BANDS = 8 }; /* Maximum number of bands / meter. */ enum { N_METER_LOCKS = 64 }; /* Maximum number of meters. */ From patchwork Mon Dec 28 09:25:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1421008 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qfd39ynz9sVv for ; Tue, 29 Dec 2020 05:14:01 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id C5A0B870C9; Mon, 28 Dec 2020 18:13:59 +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 n3PsV-owrbQC; Mon, 28 Dec 2020 18:13:57 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 97A3487562; Mon, 28 Dec 2020 18:12:12 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 76556C1FF5; Mon, 28 Dec 2020 18:12:12 +0000 (UTC) X-Original-To: ovs-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 BB329C0891 for ; Mon, 28 Dec 2020 09:26:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by silver.osuosl.org (Postfix) with ESMTP id 9F0F42046B for ; Mon, 28 Dec 2020 09:26: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 bCxoRWMq+SPc for ; Mon, 28 Dec 2020 09:26:35 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta1.chinamobile.com (cmccmta1.chinamobile.com [221.176.66.79]) by silver.osuosl.org (Postfix) with ESMTP id 7B06320512 for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app03-12003 (RichMail) with SMTP id 2ee35fe9a4ab594-bee9b; Mon, 28 Dec 2020 17:26:04 +0800 (CST) X-RM-TRANSID: 2ee35fe9a4ab594-bee9b X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b926; Mon, 28 Dec 2020 17:26:04 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b926 From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:19 -0800 Message-Id: <20201228092520.11807-62-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: LIU CHANG Subject: [ovs-dev] [PATCH 61/62] [netdev-offload-dpdk] fix some multicast output action errors. 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: LIU CHANG when unsupported multicast output action happens, the datapath flow will be NOT offloaded, but datapath flow statistics show offloaded status is yes rather than partial. At the same time, ovs-vswitchd log shows the dp flow successed to add the corresponding netdev flow wrongly. --- lib/netdev-offload-dpdk.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 3ee4f33..58e6bc9 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -768,7 +768,7 @@ add_flow_pattern(struct flow_patterns *patterns, enum rte_flow_item_type type, patterns->cnt++; } -static void +static int add_flow_action(struct flow_actions *actions, enum rte_flow_action_type type, const void *conf) { @@ -777,7 +777,7 @@ add_flow_action(struct flow_actions *actions, enum rte_flow_action_type type, if ( (actions->valid_ucast == true) && (type == RTE_FLOW_ACTION_TYPE_PORT_ID) ) { VLOG_DBG_RL(&rl, "Unsupported multicast output action"); - return ; + return -1; } if (cnt == 0) { actions->current_max = 8; @@ -1303,15 +1303,22 @@ add_port_id_action(struct flow_actions *actions, { struct rte_flow_action_port_id *port_id; int outdev_id; + int ret; VLOG_DBG("TIMO DBG: in add_port_id_action"); + outdev_id = netdev_dpdk_get_port_id(outdev); if (outdev_id < 0) { return -1; } + port_id = xzalloc(sizeof *port_id); port_id->id = outdev_id; - add_flow_action(actions, RTE_FLOW_ACTION_TYPE_PORT_ID, port_id); + ret=add_flow_action(actions, RTE_FLOW_ACTION_TYPE_PORT_ID, port_id); + if (ret < 0){ + return -1; + } + return 0; } @@ -2256,12 +2263,10 @@ netdev_offload_dpdk_add_flow(struct dpif *dpif, struct netdev *netdev, info->flow_mark); */ actions_offloaded = false; - } - - if (!flow) { ret = -1; goto out; } + ufid_to_rte_flow_associate(ufid, flow, actions_offloaded,netdev->name); VLOG_DBG("%s: installed flow %p by ufid "UUID_FMT"\n", netdev_get_name(netdev), flow, UUID_ARGS((struct uuid *)ufid)); From patchwork Mon Dec 28 09:25:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: taoyunxiang X-Patchwork-Id: 1421000 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=none (p=none dis=none) header.from=cmss.chinamobile.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 4D4Qdw6DZcz9sVv for ; Tue, 29 Dec 2020 05:13:24 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 3FE78870D7; Mon, 28 Dec 2020 18:13:23 +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 aBr524j4KvCw; Mon, 28 Dec 2020 18:13:17 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by hemlock.osuosl.org (Postfix) with ESMTP id 82DBC87020; Mon, 28 Dec 2020 18:11:57 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 5AB8DC1E67; Mon, 28 Dec 2020 18:11:57 +0000 (UTC) X-Original-To: ovs-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 833C6C0893 for ; Mon, 28 Dec 2020 09:26:34 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by hemlock.osuosl.org (Postfix) with ESMTP id 7015B819CF for ; Mon, 28 Dec 2020 09:26:34 +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 C2k0t9rpe4M1 for ; Mon, 28 Dec 2020 09:26:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from cmccmta2.chinamobile.com (cmccmta2.chinamobile.com [221.176.66.80]) by hemlock.osuosl.org (Postfix) with ESMTP id 83AE283BBA for ; Mon, 28 Dec 2020 09:26:32 +0000 (UTC) Received: from spf.mail.chinamobile.com (unknown[172.16.121.3]) by rmmx-syy-dmz-app08-12008 (RichMail) with SMTP id 2ee85fe9a4adf8f-c082e; Mon, 28 Dec 2020 17:26:05 +0800 (CST) X-RM-TRANSID: 2ee85fe9a4adf8f-c082e X-RM-TagInfo: emlType=0 X-RM-SPAM-FLAG: 00000000 Received: from yun.localdomain (unknown[112.25.154.146]) by rmsmtp-syy-appsvr02-12002 (RichMail) with SMTP id 2ee25fe9a48a90b-7b92f; Mon, 28 Dec 2020 17:26:05 +0800 (CST) X-RM-TRANSID: 2ee25fe9a48a90b-7b92f From: Tao YunXiang To: ovs-dev@openvswitch.org Date: Mon, 28 Dec 2020 01:25:20 -0800 Message-Id: <20201228092520.11807-63-taoyunxiang@cmss.chinamobile.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> References: <8> <20201228092520.11807-1-taoyunxiang@cmss.chinamobile.com> X-Mailman-Approved-At: Mon, 28 Dec 2020 18:10:34 +0000 Cc: LIU CHANG , Rong Yin Subject: [ovs-dev] [PATCH 62/62] Fix some vxlan&&vlan offload problems. 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: Rong Yin fix vlan push issue with RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN fix vlan pop issue with ethertype error and ip_0_protocol error fix vxlan decap offload with vxlan flags fix ipv4 pattern ttl dump with 0x Signed-off-by: LIU CHANG --- lib/netdev-dpdk.c | 6 ++++-- lib/netdev-offload-dpdk.c | 46 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 5c5edb9..3d95d1b 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -2014,9 +2014,11 @@ netdev_dpdk_set_config(struct netdev *netdev, const struct smap *args, err = EINVAL; } /* update is_uplink_port && is_vf_rep_port flag */ - if (strstr(dev->devargs,"representor=[10")) { + if (strstr(new_devargs,"representor=[10")) { dev->is_uplink_port = true; - } else if (strstr(dev->devargs,"representor")) { + } else if (strstr(new_devargs,"representor=[64")) { + dev->is_uplink_port = true; + } else if (strstr(new_devargs,"representor")) { dev->is_vf_rep_port = true; } diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 58e6bc9..d407431 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -275,7 +275,7 @@ dump_flow_pattern(struct ds *s, const struct rte_flow_item *item) ds_put_cstr(s, "rte flow ipv4 pattern:\n"); if (ipv4_spec) { ds_put_format(s, - " Spec: tos=0x%"PRIx8", ttl=%"PRIx8 + " Spec: tos=0x%"PRIx8", ttl=0x%"PRIx8 ", proto=0x%"PRIx8 ", src="IP_FMT", dst="IP_FMT"\n", ipv4_spec->hdr.type_of_service, @@ -288,7 +288,7 @@ dump_flow_pattern(struct ds *s, const struct rte_flow_item *item) } if (ipv4_mask) { ds_put_format(s, - " Mask: tos=0x%"PRIx8", ttl=%"PRIx8 + " Mask: tos=0x%"PRIx8", ttl=0x%"PRIx8 ", proto=0x%"PRIx8 ", src="IP_FMT", dst="IP_FMT"\n", ipv4_mask->hdr.type_of_service, @@ -857,6 +857,14 @@ parse_vxlan_match(struct flow_patterns *patterns, put_unaligned_be32((ovs_be32 *)vx_mask->vni, htonl(ntohll(match->wc.masks.tunnel.tun_id) << 8)); + /* + memcpy(&vx_spec->flags, 0x08, sizeof vx_spec->flags); + memcpy(&vx_mask->flags, 0x0, sizeof vx_mask->flags); + */ + + vx_spec->flags=0x08; + vx_mask->flags=0x0; + add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_VXLAN, vx_spec, vx_mask); return 0; } @@ -942,6 +950,7 @@ parse_flow_match(struct flow_patterns *patterns, } info->group_id = match->flow.recirc_id; + /* Eth */ if (match->flow.packet_type == htonl(PT_ETH)) { struct rte_flow_item_eth *spec, *mask; @@ -951,7 +960,12 @@ parse_flow_match(struct flow_patterns *patterns, memcpy(&spec->dst, &match->flow.dl_dst, sizeof spec->dst); memcpy(&spec->src, &match->flow.dl_src, sizeof spec->src); - spec->type = match->flow.dl_type; + + if (match->wc.masks.vlans[0].tci && match->flow.vlans[0].tci) { + spec->type = htons(ETH_TYPE_VLAN_8021Q); + } else { + spec->type = match->flow.dl_type; + } memcpy(&mask->dst, &match->wc.masks.dl_dst, sizeof mask->dst); memcpy(&mask->src, &match->wc.masks.dl_src, sizeof mask->src); @@ -980,7 +994,15 @@ parse_flow_match(struct flow_patterns *patterns, spec->tci = match->flow.vlans[0].tci & ~htons(VLAN_CFI); mask->tci = match->wc.masks.vlans[0].tci & ~htons(VLAN_CFI); - /* Match any protocols. */ + if (match->flow.dl_type == htons(ETH_TYPE_IP)) { + spec->inner_type = htons(ETH_TYPE_IP); + } else if (match->flow.dl_type == htons(ETH_TYPE_IPV6)) { + spec->inner_type = htons(ETH_TYPE_IPV6); + } else { + spec->inner_type = 0; + } + + /* Match ipv4 or ipv6 protocols. */ mask->inner_type = 0; add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_VLAN, spec, mask); @@ -1830,12 +1852,16 @@ parse_clone_actions(struct netdev *netdev, } vlan_tci = xzalloc(sizeof *vlan_tci); vlan_tci->ethertype = vlan->vlan_tpid; + + /* add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN, vlan_tci); - vid = xzalloc(sizeof *vid); vid->vlan_vid = vlan->vlan_tci & ~htons(VLAN_CFI); - add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID, vid); + */ + + vlan_tci->vlan_vid = vlan->vlan_tci & ~htons(VLAN_CFI); + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN, vlan_tci); } else if (clone_type == OVS_ACTION_ATTR_POP_VLAN) { add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_POP_VLAN, NULL); @@ -2116,12 +2142,16 @@ parse_flow_actions(struct dpif *dpif, vlan_tci = xzalloc(sizeof *vlan_tci); vlan_tci->ethertype = vlan->vlan_tpid; + + /* add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN, vlan_tci); - vid = xzalloc(sizeof *vid); vid->vlan_vid = vlan->vlan_tci & ~htons(VLAN_CFI); - add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID, vid); + */ + + vlan_tci->vlan_vid = vlan->vlan_tci & ~htons(VLAN_CFI); + add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN, vlan_tci); } else if (nl_attr_type(nla) == OVS_ACTION_ATTR_POP_VLAN) { add_flow_action(actions, RTE_FLOW_ACTION_TYPE_OF_POP_VLAN, NULL);