From patchwork Fri Oct 6 08:21:24 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 822266 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="mte8IAiJ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3y7jKc3wWyz9t41 for ; Fri, 6 Oct 2017 19:21:56 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751841AbdJFIVy (ORCPT ); Fri, 6 Oct 2017 04:21:54 -0400 Received: from mail-wm0-f43.google.com ([74.125.82.43]:54406 "EHLO mail-wm0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750908AbdJFIVj (ORCPT ); Fri, 6 Oct 2017 04:21:39 -0400 Received: by mail-wm0-f43.google.com with SMTP id i124so6347630wmf.3 for ; Fri, 06 Oct 2017 01:21:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=6wIAjG3RvL2NGy3200FI9FX4OVlpyMMXKTuv8DGrY3Q=; b=mte8IAiJDrV6MfZF6e2oDuOEllQ2ihM5ZJef1eUoaKFsJqHa2UF+apdNhJsMm197y6 Chj8Sjq70A258IyHCcZvp46jhMqKvI2tbVAd/08sIvkUzEOckTETv0lSgeyidTJQb1qx U8eGVvEoS0LCTwasOBu/TT2EqxgjcYtTzAsOFXIt/x3dz1JvX0Hc14qN4/59NXfXn3/L ei05CwJxULBnHqHg+8pP9G4uW6uTgp0efnmQYhoHFaneWZs78En+99NoSFxZvnYI2mEa 0v3nyfmbqv7x+IXPqXbKk1+WuE8O5cuaMT9EMS+kI0pZt77xZnMzMDOPM8QiycTV0N/6 riUA== 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=6wIAjG3RvL2NGy3200FI9FX4OVlpyMMXKTuv8DGrY3Q=; b=WTAkDt1S30F/J5S51NooM5OLQ7JK8LnQYRoQUUYQcGc1Lnn2AI6z+/DhWE/gE4ZWo3 iHLEfN7qb+4smC1/mU4bh3d4AtNuUbvVnfTM8XyhLoB5puEOjYw3qkU14JvVqmgWov5D qmhk6ACC9RFFZBRkz/gIsfD8cDtPtImklkwuxAHXnAthMg9yyi/Ny8N8tEH95VUiFIp2 1ry1qLiZWzv2OM015Ezx2Sr4Vf/uNNWmfmajas4UWgKmnrxbXLSWJTjrISv+dOVLGlB3 JDBfqE3GZFtT++tjR8V0RLkgEB81JZn7ocImd//L0Z7dcw6iT8yxyA9zIMv/fgLnqu22 EgZQ== X-Gm-Message-State: AMCzsaVlVyJDSkNxMmNYhC3s7xxg8HO/B6708HilILBxMB34grz5jalq 9//f+6nhVJYjGqecR71YnDqvjg== X-Google-Smtp-Source: AOwi7QD6OV8muEwm+QE+98dRsmaQWRhqx+JRMpJAiTShrZUubBEadE2CguSRuWDRnxz/9gViajlDvA== X-Received: by 10.28.229.149 with SMTP id c143mr891957wmh.156.1507278098139; Fri, 06 Oct 2017 01:21:38 -0700 (PDT) Received: from penelope.horms.nl ([217.111.208.18]) by smtp.gmail.com with ESMTPSA id s123sm885419wmd.29.2017.10.06.01.21.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 06 Oct 2017 01:21:37 -0700 (PDT) From: Simon Horman To: David Miller , Jakub Kicinski Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Pieter Jansen van Vuuren , Simon Horman Subject: [PATCH net-next 5/7] nfp: add set ipv4 header action flower offload Date: Fri, 6 Oct 2017 10:21:24 +0200 Message-Id: <1507278086-3102-6-git-send-email-simon.horman@netronome.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1507278086-3102-1-git-send-email-simon.horman@netronome.com> References: <1507278086-3102-1-git-send-email-simon.horman@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Pieter Jansen van Vuuren Previously we did not have offloading support for set IPv4 actions. This patch enables TC flower offload of set IPv4 src and dst address actions. Signed-off-by: Pieter Jansen van Vuuren Reviewed-by: Jakub Kicinski Signed-off-by: Simon Horman --- drivers/net/ethernet/netronome/nfp/flower/action.c | 46 ++++++++++++++++++++++ drivers/net/ethernet/netronome/nfp/flower/cmsg.h | 10 +++++ 2 files changed, 56 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/flower/action.c b/drivers/net/ethernet/netronome/nfp/flower/action.c index 631ea4b7d08e..2f886a529ee4 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/action.c +++ b/drivers/net/ethernet/netronome/nfp/flower/action.c @@ -266,14 +266,53 @@ nfp_fl_set_eth(const struct tc_action *action, int idx, u32 off, } static int +nfp_fl_set_ip4(const struct tc_action *action, int idx, u32 off, + struct nfp_fl_set_ip4_addrs *set_ip_addr) +{ + u16 tmp_set_ipv4_op; + __be32 exact, mask; + + /* We are expecting tcf_pedit to return a big endian value */ + mask = (__force __be32)~tcf_pedit_mask(action, idx); + exact = (__force __be32)tcf_pedit_val(action, idx); + + if (exact & ~mask) + return -EOPNOTSUPP; + + switch (off) { + case offsetof(struct iphdr, daddr): + set_ip_addr->ipv4_dst_mask = mask; + set_ip_addr->ipv4_dst = exact; + break; + case offsetof(struct iphdr, saddr): + set_ip_addr->ipv4_src_mask = mask; + set_ip_addr->ipv4_src = exact; + break; + default: + return -EOPNOTSUPP; + } + + set_ip_addr->reserved = cpu_to_be16(0); + tmp_set_ipv4_op = FIELD_PREP(NFP_FL_ACT_LEN_LW, + sizeof(*set_ip_addr) >> NFP_FL_LW_SIZ) | + FIELD_PREP(NFP_FL_ACT_JMP_ID, + NFP_FL_ACTION_OPCODE_SET_IPV4_ADDRS); + set_ip_addr->a_op = cpu_to_be16(tmp_set_ipv4_op); + + return 0; +} + +static int nfp_fl_pedit(const struct tc_action *action, char *nfp_action, int *a_len) { + struct nfp_fl_set_ip4_addrs set_ip_addr; struct nfp_fl_set_eth set_eth; enum pedit_header_type htype; int idx, nkeys, err; size_t act_size; u32 offset, cmd; + memset(&set_ip_addr, 0, sizeof(set_ip_addr)); memset(&set_eth, 0, sizeof(set_eth)); nkeys = tcf_pedit_nkeys(action); @@ -289,6 +328,9 @@ nfp_fl_pedit(const struct tc_action *action, char *nfp_action, int *a_len) case TCA_PEDIT_KEY_EX_HDR_TYPE_ETH: err = nfp_fl_set_eth(action, idx, offset, &set_eth); break; + case TCA_PEDIT_KEY_EX_HDR_TYPE_IP4: + err = nfp_fl_set_ip4(action, idx, offset, &set_ip_addr); + break; default: return -EOPNOTSUPP; } @@ -300,6 +342,10 @@ nfp_fl_pedit(const struct tc_action *action, char *nfp_action, int *a_len) act_size = sizeof(set_eth); memcpy(nfp_action, &set_eth, act_size); *a_len += act_size; + } else if (set_ip_addr.a_op) { + act_size = sizeof(set_ip_addr); + memcpy(nfp_action, &set_ip_addr, act_size); + *a_len += act_size; } return 0; diff --git a/drivers/net/ethernet/netronome/nfp/flower/cmsg.h b/drivers/net/ethernet/netronome/nfp/flower/cmsg.h index ffeaf85aa420..7ace557fdf84 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/cmsg.h +++ b/drivers/net/ethernet/netronome/nfp/flower/cmsg.h @@ -78,6 +78,7 @@ #define NFP_FL_ACTION_OPCODE_POP_VLAN 2 #define NFP_FL_ACTION_OPCODE_SET_IPV4_TUNNEL 6 #define NFP_FL_ACTION_OPCODE_SET_ETHERNET 7 +#define NFP_FL_ACTION_OPCODE_SET_IPV4_ADDRS 9 #define NFP_FL_ACTION_OPCODE_PRE_TUNNEL 17 #define NFP_FL_ACTION_OPCODE_NUM 32 @@ -115,6 +116,15 @@ struct nfp_fl_set_eth { u8 eth_addr_val[ETH_ALEN * 2]; }; +struct nfp_fl_set_ip4_addrs { + __be16 a_op; + __be16 reserved; + __be32 ipv4_src_mask; + __be32 ipv4_src; + __be32 ipv4_dst_mask; + __be32 ipv4_dst; +}; + struct nfp_fl_output { __be16 a_op; __be16 flags;