nfp: flower: add qos offload framework
authorPieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
Sat, 4 May 2019 11:46:26 +0000 (04:46 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 6 May 2019 04:49:24 +0000 (21:49 -0700)
Introduce matchall filter offload infrastructure that is needed to
offload qos features like policing. Subsequent patches will make
use of police-filters for ingress rate limiting.

Signed-off-by: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/Makefile
drivers/net/ethernet/netronome/nfp/flower/main.h
drivers/net/ethernet/netronome/nfp/flower/offload.c
drivers/net/ethernet/netronome/nfp/flower/qos_conf.c [new file with mode: 0644]

index 0673f3aa2c8df9bae63282f8dc4fadf9e8b160f8..87bf784f8e8f8c596d7c7eea389ab7eb81cec663 100644 (file)
@@ -43,7 +43,8 @@ nfp-objs += \
            flower/match.o \
            flower/metadata.o \
            flower/offload.o \
-           flower/tunnel_conf.o
+           flower/tunnel_conf.o \
+           flower/qos_conf.o
 endif
 
 ifeq ($(CONFIG_BPF_SYSCALL),y)
index 675f43f06526c86144641d8dc3c0c717a451edcb..16f0b8dcd8e19de18d82068563ec35e2c4fb922c 100644 (file)
@@ -39,6 +39,7 @@ struct nfp_app;
 #define NFP_FL_NBI_MTU_SETTING         BIT(1)
 #define NFP_FL_FEATS_GENEVE_OPT                BIT(2)
 #define NFP_FL_FEATS_VLAN_PCP          BIT(3)
+#define NFP_FL_FEATS_VF_RLIM           BIT(4)
 #define NFP_FL_FEATS_FLOW_MOD          BIT(5)
 #define NFP_FL_FEATS_FLOW_MERGE                BIT(30)
 #define NFP_FL_FEATS_LAG               BIT(31)
@@ -366,6 +367,8 @@ int nfp_flower_lag_populate_pre_action(struct nfp_app *app,
                                       struct nfp_fl_pre_lag *pre_act);
 int nfp_flower_lag_get_output_id(struct nfp_app *app,
                                 struct net_device *master);
+int nfp_flower_setup_qos_offload(struct nfp_app *app, struct net_device *netdev,
+                                struct tc_cls_matchall_offload *flow);
 int nfp_flower_reg_indir_block_handler(struct nfp_app *app,
                                       struct net_device *netdev,
                                       unsigned long event);
index aefe211da82c9e2d6884daaead31a1b45a29024b..9c6bcc6e9d68be3402da0b03541d26f455d38ce9 100644 (file)
@@ -1185,6 +1185,9 @@ static int nfp_flower_setup_tc_block_cb(enum tc_setup_type type,
        case TC_SETUP_CLSFLOWER:
                return nfp_flower_repr_offload(repr->app, repr->netdev,
                                               type_data);
+       case TC_SETUP_CLSMATCHALL:
+               return nfp_flower_setup_qos_offload(repr->app, repr->netdev,
+                                                   type_data);
        default:
                return -EOPNOTSUPP;
        }
diff --git a/drivers/net/ethernet/netronome/nfp/flower/qos_conf.c b/drivers/net/ethernet/netronome/nfp/flower/qos_conf.c
new file mode 100644 (file)
index 0000000..82422af
--- /dev/null
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+/* Copyright (C) 2019 Netronome Systems, Inc. */
+
+#include <net/pkt_cls.h>
+
+#include "cmsg.h"
+#include "main.h"
+
+int nfp_flower_setup_qos_offload(struct nfp_app *app, struct net_device *netdev,
+                                struct tc_cls_matchall_offload *flow)
+{
+       struct netlink_ext_ack *extack = flow->common.extack;
+       struct nfp_flower_priv *fl_priv = app->priv;
+
+       if (!(fl_priv->flower_ext_feats & NFP_FL_FEATS_VF_RLIM)) {
+               NL_SET_ERR_MSG_MOD(extack, "unsupported offload: loaded firmware does not support qos rate limit offload");
+               return -EOPNOTSUPP;
+       }
+
+       return -EOPNOTSUPP;
+}