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. */ };