[PATCH net-next 2/2] flow_offload: reject offload for all drivers with invalid police parameters
From: Jianbo Liu <hidden>
Date: 2022-02-14 10:47:20
Subsystem:
cxgb4 ethernet driver (cxgb4), freescale enetc ethernet drivers, marvell octeontx2 physical function driver, mellanox ethernet driver (mlx5e), mellanox ethernet switch drivers, mellanox mlx5 core vpi driver, netronome ethernet drivers, networking drivers, networking [dsa], ocelot ethernet switch driver, the rest · Maintainers:
Potnuri Bharat Teja, Claudiu Manoil, Vladimir Oltean, Wei Fang, Clark Wang, Sunil Goutham, Geetha sowjanya, Ratheesh Kannoth, Subbaraya Sundeep, Bharat Bhushan, Saeed Mahameed, Tariq Toukan, Mark Bloch, Ido Schimmel, Petr Machata, Leon Romanovsky, Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Andrew Lunn, Vladimir Oltean, Linus Torvalds
As more police parameters are passed to flow_offload, driver can check them to make sure hardware handles packets in the way indicated by tc. The conform-exceed control should be drop/pipe or drop/ok. As hardware can't configure peakrate/avrate/overhead, offload should not be supported if any of them is configured. Signed-off-by: Jianbo Liu <redacted> Reviewed-by: Ido Schimmel <idosch@nvidia.com> --- drivers/net/dsa/sja1105/sja1105_flower.c | 15 +++++++++ .../chelsio/cxgb4/cxgb4_tc_matchall.c | 31 +++++++++++++++++++ .../net/ethernet/freescale/enetc/enetc_qos.c | 17 ++++++++++ .../ethernet/marvell/octeontx2/nic/otx2_tc.c | 30 ++++++++++++++++++ .../net/ethernet/mellanox/mlx5/core/en_tc.c | 15 +++++++++ .../ethernet/mellanox/mlxsw/spectrum_flower.c | 15 +++++++++ drivers/net/ethernet/mscc/ocelot_flower.c | 16 ++++++++++ drivers/net/ethernet/mscc/ocelot_net.c | 15 +++++++++ .../ethernet/netronome/nfp/flower/qos_conf.c | 16 ++++++++++ 9 files changed, 170 insertions(+)
diff --git a/drivers/net/dsa/sja1105/sja1105_flower.c b/drivers/net/dsa/sja1105/sja1105_flower.c
index 7dcdd784aea4..85f4e321a7a2 100644
--- a/drivers/net/dsa/sja1105/sja1105_flower.c
+++ b/drivers/net/dsa/sja1105/sja1105_flower.c@@ -321,6 +321,21 @@ int sja1105_cls_flower_add(struct dsa_switch *ds, int port, flow_action_for_each(i, act, &rule->action) { switch (act->id) { case FLOW_ACTION_POLICE: + if ((act->police.notexceed.act_id != FLOW_ACTION_ACCEPT && + act->police.notexceed.act_id != FLOW_ACTION_PIPE) || + act->police.exceed.act_id != FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when conform-exceed is not drop/pipe or drop/ok"); + return -EOPNOTSUPP; + } + + if (act->police.peakrate_bytes_ps || + act->police.avrate || act->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when peakrate/avrate/overhead is configured"); + return -EOPNOTSUPP; + } + if (act->police.rate_pkt_ps) { NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second");
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c
index 28fd2de9e4cf..84a785e7a68f 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c@@ -48,6 +48,21 @@ static int cxgb4_matchall_egress_validate(struct net_device *dev, flow_action_for_each(i, entry, actions) { switch (entry->id) { case FLOW_ACTION_POLICE: + if ((entry->police.notexceed.act_id != FLOW_ACTION_ACCEPT && + entry->police.notexceed.act_id != FLOW_ACTION_PIPE) || + entry->police.exceed.act_id != FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when conform-exceed is not drop/pipe or drop/ok"); + return -EOPNOTSUPP; + } + + if (entry->police.peakrate_bytes_ps || + entry->police.avrate || entry->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when peakrate/avrate/overhead is configured"); + return -EOPNOTSUPP; + } + if (entry->police.rate_pkt_ps) { NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second");
@@ -150,6 +165,22 @@ static int cxgb4_matchall_alloc_tc(struct net_device *dev, flow_action_for_each(i, entry, &cls->rule->action) if (entry->id == FLOW_ACTION_POLICE) break; + + if ((entry->police.notexceed.act_id != FLOW_ACTION_ACCEPT && + entry->police.notexceed.act_id != FLOW_ACTION_PIPE) || + entry->police.exceed.act_id != FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when conform-exceed is not drop/pipe or drop/ok"); + return -EOPNOTSUPP; + } + + if (entry->police.peakrate_bytes_ps || + entry->police.avrate || entry->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when peakrate/avrate/overhead is configured"); + return -EOPNOTSUPP; + } + if (entry->police.rate_pkt_ps) { NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second");
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_qos.c b/drivers/net/ethernet/freescale/enetc/enetc_qos.c
index 3555c12edb45..183318e7255f 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_qos.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_qos.c@@ -1230,6 +1230,23 @@ static int enetc_psfp_parse_clsflower(struct enetc_ndev_priv *priv, /* Flow meter and max frame size */ if (entryp) { + if ((entryp->police.notexceed.act_id != FLOW_ACTION_ACCEPT && + entryp->police.notexceed.act_id != FLOW_ACTION_PIPE) || + entryp->police.exceed.act_id != FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when conform-exceed is not drop/pipe or drop/ok"); + err = -EOPNOTSUPP; + goto free_sfi; + } + + if (entryp->police.peakrate_bytes_ps || + entryp->police.avrate || entryp->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when peakrate/avrate/overhead is configured"); + err = -EOPNOTSUPP; + goto free_sfi; + } + if (entryp->police.rate_pkt_ps) { NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second"); err = -EOPNOTSUPP;
diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c
index 626961a41089..15aa73cd0383 100644
--- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c
+++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c@@ -212,6 +212,21 @@ static int otx2_tc_egress_matchall_install(struct otx2_nic *nic, entry = &cls->rule->action.entries[0]; switch (entry->id) { case FLOW_ACTION_POLICE: + if ((entry->police.notexceed.act_id != FLOW_ACTION_ACCEPT && + entry->police.notexceed.act_id != FLOW_ACTION_PIPE) || + entry->police.exceed.act_id != FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when conform-exceed is not drop/pipe or drop/ok"); + return -EOPNOTSUPP; + } + + if (entry->police.peakrate_bytes_ps || + entry->police.avrate || entry->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when peakrate/avrate/overhead is configured"); + return -EOPNOTSUPP; + } + if (entry->police.rate_pkt_ps) { NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second"); return -EOPNOTSUPP;
@@ -355,6 +370,21 @@ static int otx2_tc_parse_actions(struct otx2_nic *nic, return -EOPNOTSUPP; } + if ((act->police.notexceed.act_id != FLOW_ACTION_ACCEPT && + act->police.notexceed.act_id != FLOW_ACTION_PIPE) || + act->police.exceed.act_id != FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when conform-exceed is not drop/pipe or drop/ok"); + return -EOPNOTSUPP; + } + + if (act->police.peakrate_bytes_ps || + act->police.avrate || act->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when peakrate/avrate/overhead is configured"); + return -EOPNOTSUPP; + } + if (act->police.rate_bytes_ps > 0) { rate = act->police.rate_bytes_ps * 8; burst = act->police.burst;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index 1287193a019b..829b09029cb0 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c@@ -4197,6 +4197,21 @@ static int scan_tc_matchall_fdb_actions(struct mlx5e_priv *priv, flow_action_for_each(i, act, flow_action) { switch (act->id) { case FLOW_ACTION_POLICE: + if ((act->police.notexceed.act_id != FLOW_ACTION_ACCEPT && + act->police.notexceed.act_id != FLOW_ACTION_PIPE) || + act->police.exceed.act_id != FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when conform-exceed is not drop/pipe or drop/ok"); + return -EOPNOTSUPP; + } + + if (act->police.peakrate_bytes_ps || + act->police.avrate || act->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when peakrate/avrate/overhead is configured"); + return -EOPNOTSUPP; + } + if (act->police.rate_pkt_ps) { NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second"); return -EOPNOTSUPP;
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
index bb417db773b9..2de3eed6c637 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c@@ -191,6 +191,21 @@ static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp, return -EOPNOTSUPP; } + if ((act->police.notexceed.act_id != FLOW_ACTION_ACCEPT && + act->police.notexceed.act_id != FLOW_ACTION_PIPE) || + act->police.exceed.act_id != FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when conform-exceed is not drop/pipe or drop/ok"); + return -EOPNOTSUPP; + } + + if (act->police.peakrate_bytes_ps || + act->police.avrate || act->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when peakrate/avrate/overhead is configured"); + return -EOPNOTSUPP; + } + if (act->police.rate_pkt_ps) { NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second"); return -EOPNOTSUPP;
diff --git a/drivers/net/ethernet/mscc/ocelot_flower.c b/drivers/net/ethernet/mscc/ocelot_flower.c
index 949858891973..e8c0c32b9050 100644
--- a/drivers/net/ethernet/mscc/ocelot_flower.c
+++ b/drivers/net/ethernet/mscc/ocelot_flower.c@@ -296,6 +296,22 @@ static int ocelot_flower_parse_action(struct ocelot *ocelot, int port, "Last action must be GOTO"); return -EOPNOTSUPP; } + + if ((a->police.notexceed.act_id != FLOW_ACTION_ACCEPT && + a->police.notexceed.act_id != FLOW_ACTION_PIPE) || + a->police.exceed.act_id != FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when conform-exceed is not drop/pipe or drop/ok"); + return -EOPNOTSUPP; + } + + if (a->police.peakrate_bytes_ps || + a->police.avrate || a->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when peakrate/avrate/overhead is configured"); + return -EOPNOTSUPP; + } + if (a->police.rate_pkt_ps) { NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second");
diff --git a/drivers/net/ethernet/mscc/ocelot_net.c b/drivers/net/ethernet/mscc/ocelot_net.c
index e271b6225b72..afef105b0c3b 100644
--- a/drivers/net/ethernet/mscc/ocelot_net.c
+++ b/drivers/net/ethernet/mscc/ocelot_net.c@@ -258,6 +258,21 @@ static int ocelot_setup_tc_cls_matchall(struct ocelot_port_private *priv, return -EEXIST; } + if ((action->police.notexceed.act_id != FLOW_ACTION_ACCEPT && + action->police.notexceed.act_id != FLOW_ACTION_PIPE) || + action->police.exceed.act_id != FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when conform-exceed is not drop/pipe or drop/ok"); + return -EOPNOTSUPP; + } + + if (action->police.peakrate_bytes_ps || + action->police.avrate || action->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when peakrate/avrate/overhead is configured"); + return -EOPNOTSUPP; + } + if (action->police.rate_pkt_ps) { NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second");
diff --git a/drivers/net/ethernet/netronome/nfp/flower/qos_conf.c b/drivers/net/ethernet/netronome/nfp/flower/qos_conf.c
index 784c6dbf8bc4..09cfbda6a9ba 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/qos_conf.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/qos_conf.c@@ -132,6 +132,22 @@ nfp_flower_install_rate_limiter(struct nfp_app *app, struct net_device *netdev, "unsupported offload: qos rate limit offload requires police action"); return -EOPNOTSUPP; } + + if ((action->police.notexceed.act_id != FLOW_ACTION_ACCEPT && + action->police.notexceed.act_id != FLOW_ACTION_PIPE) || + action->police.exceed.act_id != FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when conform-exceed is not drop/pipe or drop/ok"); + return -EOPNOTSUPP; + } + + if (action->police.peakrate_bytes_ps || + action->police.avrate || action->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Police action is not supported when peakrate/avrate/overhead is configured"); + return -EOPNOTSUPP; + } + if (action->police.rate_bytes_ps > 0) { if (bps_num++) { NL_SET_ERR_MSG_MOD(extack,
--
2.26.2