From patchwork Sun Jan 27 11:06:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tonghao Zhang X-Patchwork-Id: 1031540 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="sfdJ0gZe"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43nVMD6Zxtz9s9G for ; Sun, 27 Jan 2019 22:06:48 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726585AbfA0LGq (ORCPT ); Sun, 27 Jan 2019 06:06:46 -0500 Received: from mail-pl1-f193.google.com ([209.85.214.193]:39576 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726453AbfA0LGq (ORCPT ); Sun, 27 Jan 2019 06:06:46 -0500 Received: by mail-pl1-f193.google.com with SMTP id 101so6491193pld.6 for ; Sun, 27 Jan 2019 03:06:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=r2V46+GOCWU8y6KKCzf3heZHYZVbmMjvLyAi1Jt4FKc=; b=sfdJ0gZeeyjpKgtaQxYUD7jRdTy1af9zDzs0Ht5UCaxBvdJAmBBERXBi92CyWsrtp0 M+mo0yR4PVWSDTF0LJiKFIn12xLm6nGLNxUZd7zVWi3wj/1H4nk/0uFx8Qo8Cc8eoyDo D/U3ofXCbIDDCez6M2Ew0xeVgOY8B84orc/8uobKpWVjv9QrnzLc0qPBdapb0tei44Fd qBd9mjtPgVVqMAbAkyfyaar/li5xSahk8SHEE+z6hGpiDGbcvtxgQqgUIizufbOTMQcl V1ixZgdjzpNIJo2d+rqt0OhJzv06vA51Gc2qPSU5PZ4paEsU2HmjKaXbcaachVnXo7HK +ITA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=r2V46+GOCWU8y6KKCzf3heZHYZVbmMjvLyAi1Jt4FKc=; b=WdzWy4Aib3ie7GFPRlFiS8RCjdzlSV7o+3hKYPyvqZysnYM2QLjIptdnmfB+6oCpsI ZJmjuW+04X5RSnfERsTXta7xdFIkBWGviJ/ofscZeZUKOZHk+q6U2au7my1DzqHmT1vL 5wSvhVUwmG5PqqtLQM1dRyUc4icFG4v3+eKuj3DNgoIeFZwuhb1j2DLP6XHIeZKvvvjq my56kCQgbWHkQn9z1M8iSaq/Eu+voT4ClysLWrxzlyADvqh/589aYxHtUeE67TU3kwYw xjEpTk2zn32WR1eufFotsX5v3Ai8PGQVjPM5f75r+0k8PVGYAAC8qpvZrAOB/vcM/WGm sdMg== X-Gm-Message-State: AJcUukfTCodJJ39XSDOOP8ojFf8bgQJP9f8TlQKG9jafIotCTzyaSlQB 6o4pbcJBGWf3dOt4Y5161v4= X-Google-Smtp-Source: ALg8bN5s7al1FXaBJUqZjPrzp7WLdDC/TeuHne9qjzETdqfsiyDPIlwfLfSk+RFEfv/Krv40PCmPoA== X-Received: by 2002:a17:902:1d4a:: with SMTP id u10mr17131307plu.122.1548587205525; Sun, 27 Jan 2019 03:06:45 -0800 (PST) Received: from local.opencloud.tech.localdomain ([106.120.33.223]) by smtp.gmail.com with ESMTPSA id x12sm30663989pgr.55.2019.01.27.03.06.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 27 Jan 2019 03:06:44 -0800 (PST) From: xiangxia.m.yue@gmail.com To: saeedm@mellanox.com, gerlitz.or@gmail.com Cc: netdev@vger.kernel.org, Tonghao Zhang , Hadar Hen Zion Subject: [PATCH net v4 1/2] net/mlx5e: Update hw flows when encap source mac changed Date: Sun, 27 Jan 2019 03:06:35 -0800 Message-Id: <1548587196-10746-1-git-send-email-xiangxia.m.yue@gmail.com> X-Mailer: git-send-email 1.8.3.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Tonghao Zhang When we offload tc filters to hardware, hardware flows can be updated when mac of encap destination ip is changed. But we ignore one case, that the mac of local encap ip can be changed too, so we should also update them. To fix it, add route_dev in mlx5e_encap_entry struct to save the local encap netdevice, and when mac changed, kernel will flush all the neighbour on the netdevice and send NETEVENT_NEIGH_UPDATE event. The mlx5 driver will delete the flows and add them when neighbour available again. Fixes: 232c001398ae ("net/mlx5e: Add support to neighbour update flow") Cc: Hadar Hen Zion Signed-off-by: Tonghao Zhang Reviewed-by: Or Gerlitz --- drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c | 2 ++ drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 4 ++++ drivers/net/ethernet/mellanox/mlx5/core/en_rep.h | 1 + 3 files changed, 7 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c index 046948e..114e0a2 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c @@ -256,6 +256,7 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv, e->m_neigh.family = n->ops->family; memcpy(&e->m_neigh.dst_ip, n->primary_key, n->tbl->key_len); e->out_dev = out_dev; + e->route_dev = route_dev; /* It's important to add the neigh to the hash table before checking * the neigh validity state. So if we'll get a notification, in case the @@ -369,6 +370,7 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv, e->m_neigh.family = n->ops->family; memcpy(&e->m_neigh.dst_ip, n->primary_key, n->tbl->key_len); e->out_dev = out_dev; + e->route_dev = route_dev; /* It's importent to add the neigh to the hash table before checking * the neigh validity state. So if we'll get a notification, in case the diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c index 96cc0c6..c4b9073 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c @@ -594,6 +594,10 @@ static void mlx5e_rep_update_flows(struct mlx5e_priv *priv, if (neigh_connected && !(e->flags & MLX5_ENCAP_ENTRY_VALID)) { ether_addr_copy(e->h_dest, ha); ether_addr_copy(eth->h_dest, ha); + /* Update the encap source mac, in case that we delete + * the flows when encap source mac changed. + */ + ether_addr_copy(eth->h_source, e->route_dev->dev_addr); mlx5e_tc_encap_flows_add(priv, e); } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h index edd7228..36eafc8 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.h @@ -148,6 +148,7 @@ struct mlx5e_encap_entry { unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ struct net_device *out_dev; + struct net_device *route_dev; int tunnel_type; int tunnel_hlen; int reformat_type; From patchwork Sun Jan 27 11:06:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tonghao Zhang X-Patchwork-Id: 1031541 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="MLbjZerS"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43nVMG64JXz9s9G for ; Sun, 27 Jan 2019 22:06:50 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726683AbfA0LGt (ORCPT ); Sun, 27 Jan 2019 06:06:49 -0500 Received: from mail-pf1-f195.google.com ([209.85.210.195]:37471 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726453AbfA0LGt (ORCPT ); Sun, 27 Jan 2019 06:06:49 -0500 Received: by mail-pf1-f195.google.com with SMTP id y126so6721559pfb.4 for ; Sun, 27 Jan 2019 03:06:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=BFJNOE+sB3IGZC25Fa0pESPWUmqUQ1o4SqeKM7mCA84=; b=MLbjZerSsRCNBEnn7f9XJsbxfGkPjcSEbvhBww1d6jQao4cXPEfhEwpBdBuRN3B/hM wy+CIfVM8PStnxSU7woYaF/7iZvxE/wFrKMKrunDAsr9rJK8/JvUgtKNByDEI69jDKy/ ZqC/HKV4+44wXsDhlp+dG/aA1H9L5dk2nkf86ZYAw6ZAlIP5KFkBR3QTEfIHNMu7lvLC mQmw9nKBI6OpCW6KV/Y1WB7LQ9Y2ryjauxPc4wK1VgyuXL3AausxruidEeYTuQMDFTXS l+DNFTrEmENRE+PQnFybF9plfDoURvReZd+2ECQY/PqDahsKtg9p29mAWYH1Wf7qKBYb QyzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=BFJNOE+sB3IGZC25Fa0pESPWUmqUQ1o4SqeKM7mCA84=; b=aXTJKqa8UXTFshhb61xpWW8y9MYX8UTHRATCl2EYNzAj9xljXHrLmTO31WzKEW+aGr ho9dO8i9T7N9e4E3i55Yv5lpLQAImihDdOKVYk2gqN0fMLCeZ3AhdwjGX0rOQ8GAGBJ1 ClRaIKG3g04XKTDTvGAhVV/ESrNVk8lh3it7ZDb8/MPoUukukmG8/dKZy7lg0Hkv+UWa rnlUrUIPQ9DW8lE8GiMlGe7L5Gu5e0fi9ygt7XJC+1ntqsQQ2LpTGMrAHfPejVfixOXs gYZvEgZrOTZI8Nd840PrjA+BKzOBQj0qrpHP0BjvIL5LSZIsefjDjlwMbbFZZPfEKLT8 Cw8A== X-Gm-Message-State: AJcUukdf5BIDsoWZ6TadXCa9N4Mop6pdw1HiAt1qxb8DKMpr7JjjjOhW jT+eQB2SKkOoLjlIRjGnuBM= X-Google-Smtp-Source: ALg8bN7ncH/Vq15IUcdsIcRQChhksUpIBVFLU8EnurSYPDkfFSP7I5EkK6eDnTj9Z2snHadRMRxFPg== X-Received: by 2002:aa7:83c6:: with SMTP id j6mr17942316pfn.91.1548587207658; Sun, 27 Jan 2019 03:06:47 -0800 (PST) Received: from local.opencloud.tech.localdomain ([106.120.33.223]) by smtp.gmail.com with ESMTPSA id x12sm30663989pgr.55.2019.01.27.03.06.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 27 Jan 2019 03:06:47 -0800 (PST) From: xiangxia.m.yue@gmail.com To: saeedm@mellanox.com, gerlitz.or@gmail.com Cc: netdev@vger.kernel.org, Tonghao Zhang , Or Gerlitz Subject: [PATCH net v4 2/2] net/mlx5e: Don't overwrite pedit action when multiple pedit used Date: Sun, 27 Jan 2019 03:06:36 -0800 Message-Id: <1548587196-10746-2-git-send-email-xiangxia.m.yue@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1548587196-10746-1-git-send-email-xiangxia.m.yue@gmail.com> References: <1548587196-10746-1-git-send-email-xiangxia.m.yue@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Tonghao Zhang In some case, we may use multiple pedit actions to modify packets. The command shown as below: the last pedit action is effective. $ tc filter add dev netdev_rep parent ffff: protocol ip prio 1 \ flower skip_sw ip_proto icmp dst_ip 3.3.3.3 \ action pedit ex munge ip dst set 192.168.1.100 pipe \ action pedit ex munge eth src set 00:00:00:00:00:01 pipe \ action pedit ex munge eth dst set 00:00:00:00:00:02 pipe \ action csum ip pipe \ action tunnel_key set src_ip 1.1.1.100 dst_ip 1.1.1.200 dst_port 4789 id 100 \ action mirred egress redirect dev vxlan0 To fix it, we add max_mod_hdr_actions to mlx5e_tc_flow_parse_attr struction, max_mod_hdr_actions will store the max pedit action number we support and num_mod_hdr_actions indicates how many pedit action we used, and store all pedit action to mod_hdr_actions. Fixes: d79b6df6b10a ("net/mlx5e: Add parsing of TC pedit actions to HW format") Cc: Or Gerlitz Signed-off-by: Tonghao Zhang Reviewed-by: Or Gerlitz --- v2: Fix comment message and change tag from net-next to net. --- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 26 +++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index cae6c6d..833a29a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c @@ -128,6 +128,7 @@ struct mlx5e_tc_flow_parse_attr { struct net_device *filter_dev; struct mlx5_flow_spec spec; int num_mod_hdr_actions; + int max_mod_hdr_actions; void *mod_hdr_actions; int mirred_ifindex[MLX5_MAX_FLOW_FWD_VPORTS]; }; @@ -1934,9 +1935,9 @@ struct mlx5_fields { OFFLOAD(UDP_DPORT, 2, udp.dest, 0), }; -/* On input attr->num_mod_hdr_actions tells how many HW actions can be parsed at - * max from the SW pedit action. On success, it says how many HW actions were - * actually parsed. +/* On input attr->max_mod_hdr_actions tells how many HW actions can be parsed at + * max from the SW pedit action. On success, attr->num_mod_hdr_actions + * says how many HW actions were actually parsed. */ static int offload_pedit_fields(struct pedit_headers *masks, struct pedit_headers *vals, @@ -1960,9 +1961,11 @@ static int offload_pedit_fields(struct pedit_headers *masks, add_vals = &vals[TCA_PEDIT_KEY_EX_CMD_ADD]; action_size = MLX5_UN_SZ_BYTES(set_action_in_add_action_in_auto); - action = parse_attr->mod_hdr_actions; - max_actions = parse_attr->num_mod_hdr_actions; - nactions = 0; + action = parse_attr->mod_hdr_actions + + parse_attr->num_mod_hdr_actions * action_size; + + max_actions = parse_attr->max_mod_hdr_actions; + nactions = parse_attr->num_mod_hdr_actions; for (i = 0; i < ARRAY_SIZE(fields); i++) { f = &fields[i]; @@ -2073,7 +2076,8 @@ static int alloc_mod_hdr_actions(struct mlx5e_priv *priv, if (!parse_attr->mod_hdr_actions) return -ENOMEM; - parse_attr->num_mod_hdr_actions = max_actions; + parse_attr->max_mod_hdr_actions = max_actions; + parse_attr->num_mod_hdr_actions = 0; return 0; } @@ -2119,9 +2123,11 @@ static int parse_tc_pedit_action(struct mlx5e_priv *priv, goto out_err; } - err = alloc_mod_hdr_actions(priv, a, namespace, parse_attr); - if (err) - goto out_err; + if (!parse_attr->mod_hdr_actions) { + err = alloc_mod_hdr_actions(priv, a, namespace, parse_attr); + if (err) + goto out_err; + } err = offload_pedit_fields(masks, vals, parse_attr, extack); if (err < 0)