net: sched: push cls related args into cls_common structure
As ndo_setup_tc is generic offload op for whole tc subsystem, does not really make sense to have cls-specific args. So move them under cls_common structurure which is embedded in all cls structs. Signed-off-by: Jiri Pirko <jiri@mellanox.com> Acked-by: Jamal Hadi Salim <jhs@mojatatu.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
74897ef0a5
commit
5fd9fc4e20
@@ -1919,7 +1919,6 @@ static void xgbe_poll_controller(struct net_device *netdev)
|
||||
#endif /* End CONFIG_NET_POLL_CONTROLLER */
|
||||
|
||||
static int xgbe_setup_tc(struct net_device *netdev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc_to_netdev)
|
||||
{
|
||||
struct xgbe_prv_data *pdata = netdev_priv(netdev);
|
||||
|
@@ -4285,7 +4285,6 @@ int bnx2x_setup_tc(struct net_device *dev, u8 num_tc)
|
||||
}
|
||||
|
||||
int __bnx2x_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
if (type != TC_SETUP_MQPRIO)
|
||||
|
@@ -487,7 +487,6 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev);
|
||||
/* setup_tc callback */
|
||||
int bnx2x_setup_tc(struct net_device *dev, u8 num_tc);
|
||||
int __bnx2x_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc);
|
||||
|
||||
int bnx2x_get_vf_config(struct net_device *dev, int vf,
|
||||
|
@@ -7238,7 +7238,6 @@ int bnxt_setup_mq_tc(struct net_device *dev, u8 tc)
|
||||
}
|
||||
|
||||
static int bnxt_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *ntc)
|
||||
{
|
||||
if (type != TC_SETUP_MQPRIO)
|
||||
|
@@ -2890,27 +2890,24 @@ static int cxgb_set_tx_maxrate(struct net_device *dev, int index, u32 rate)
|
||||
}
|
||||
|
||||
static int cxgb_setup_tc_cls_u32(struct net_device *dev,
|
||||
enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_cls_u32_offload *cls_u32)
|
||||
{
|
||||
if (TC_H_MAJ(handle) != TC_H_MAJ(TC_H_INGRESS) ||
|
||||
chain_index)
|
||||
if (TC_H_MAJ(cls_u32->common.handle) != TC_H_MAJ(TC_H_INGRESS) ||
|
||||
cls_u32->common.chain_index)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (cls_u32->command) {
|
||||
case TC_CLSU32_NEW_KNODE:
|
||||
case TC_CLSU32_REPLACE_KNODE:
|
||||
return cxgb4_config_knode(dev, proto, cls_u32);
|
||||
return cxgb4_config_knode(dev, cls_u32);
|
||||
case TC_CLSU32_DELETE_KNODE:
|
||||
return cxgb4_delete_knode(dev, proto, cls_u32);
|
||||
return cxgb4_delete_knode(dev, cls_u32);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
static int cxgb_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
struct port_info *pi = netdev2pinfo(dev);
|
||||
@@ -2925,8 +2922,7 @@ static int cxgb_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
|
||||
switch (type) {
|
||||
case TC_SETUP_CLSU32:
|
||||
return cxgb_setup_tc_cls_u32(dev, type, handle, chain_index,
|
||||
proto, tc->cls_u32);
|
||||
return cxgb_setup_tc_cls_u32(dev, tc->cls_u32);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
@@ -146,11 +146,11 @@ static int fill_action_fields(struct adapter *adap,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cxgb4_config_knode(struct net_device *dev, __be16 protocol,
|
||||
struct tc_cls_u32_offload *cls)
|
||||
int cxgb4_config_knode(struct net_device *dev, struct tc_cls_u32_offload *cls)
|
||||
{
|
||||
const struct cxgb4_match_field *start, *link_start = NULL;
|
||||
struct adapter *adapter = netdev2adap(dev);
|
||||
__be16 protocol = cls->common.protocol;
|
||||
struct ch_filter_specification fs;
|
||||
struct cxgb4_tc_u32_table *t;
|
||||
struct cxgb4_link *link;
|
||||
@@ -338,8 +338,7 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int cxgb4_delete_knode(struct net_device *dev, __be16 protocol,
|
||||
struct tc_cls_u32_offload *cls)
|
||||
int cxgb4_delete_knode(struct net_device *dev, struct tc_cls_u32_offload *cls)
|
||||
{
|
||||
struct adapter *adapter = netdev2adap(dev);
|
||||
unsigned int filter_id, max_tids, i, j;
|
||||
|
@@ -44,10 +44,8 @@ static inline bool can_tc_u32_offload(struct net_device *dev)
|
||||
return (dev->features & NETIF_F_HW_TC) && adap->tc_u32 ? true : false;
|
||||
}
|
||||
|
||||
int cxgb4_config_knode(struct net_device *dev, __be16 protocol,
|
||||
struct tc_cls_u32_offload *cls);
|
||||
int cxgb4_delete_knode(struct net_device *dev, __be16 protocol,
|
||||
struct tc_cls_u32_offload *cls);
|
||||
int cxgb4_config_knode(struct net_device *dev, struct tc_cls_u32_offload *cls);
|
||||
int cxgb4_delete_knode(struct net_device *dev, struct tc_cls_u32_offload *cls);
|
||||
|
||||
void cxgb4_cleanup_tc_u32(struct adapter *adapter);
|
||||
struct cxgb4_tc_u32_table *cxgb4_init_tc_u32(struct adapter *adap);
|
||||
|
@@ -343,7 +343,6 @@ static void dpaa_get_stats64(struct net_device *net_dev,
|
||||
}
|
||||
|
||||
static int dpaa_setup_tc(struct net_device *net_dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
struct dpaa_priv *priv = netdev_priv(net_dev);
|
||||
|
@@ -1220,7 +1220,6 @@ static int hns3_setup_tc(struct net_device *netdev, u8 tc)
|
||||
}
|
||||
|
||||
static int hns3_nic_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 protocol,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
if (type != TC_SETUP_MQPRIO)
|
||||
|
@@ -1266,7 +1266,6 @@ err_queueing_scheme:
|
||||
}
|
||||
|
||||
static int __fm10k_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
if (type != TC_SETUP_MQPRIO)
|
||||
|
@@ -5657,7 +5657,6 @@ exit:
|
||||
}
|
||||
|
||||
static int __i40e_setup_tc(struct net_device *netdev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
if (type != TC_SETUP_MQPRIO)
|
||||
|
@@ -8851,7 +8851,6 @@ static int ixgbe_delete_clsu32(struct ixgbe_adapter *adapter,
|
||||
}
|
||||
|
||||
static int ixgbe_configure_clsu32_add_hnode(struct ixgbe_adapter *adapter,
|
||||
__be16 protocol,
|
||||
struct tc_cls_u32_offload *cls)
|
||||
{
|
||||
u32 uhtid = TC_U32_USERHTID(cls->hnode.handle);
|
||||
@@ -9037,9 +9036,9 @@ static int ixgbe_clsu32_build_input(struct ixgbe_fdir_filter *input,
|
||||
}
|
||||
|
||||
static int ixgbe_configure_clsu32(struct ixgbe_adapter *adapter,
|
||||
__be16 protocol,
|
||||
struct tc_cls_u32_offload *cls)
|
||||
{
|
||||
__be16 protocol = cls->common.protocol;
|
||||
u32 loc = cls->knode.handle & 0xfffff;
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
struct ixgbe_mat_field *field_ptr;
|
||||
@@ -9227,25 +9226,23 @@ free_jump:
|
||||
}
|
||||
|
||||
static int ixgbe_setup_tc_cls_u32(struct net_device *dev,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_cls_u32_offload *cls_u32)
|
||||
{
|
||||
struct ixgbe_adapter *adapter = netdev_priv(dev);
|
||||
|
||||
if (TC_H_MAJ(handle) != TC_H_MAJ(TC_H_INGRESS) ||
|
||||
chain_index)
|
||||
if (TC_H_MAJ(cls_u32->common.handle) != TC_H_MAJ(TC_H_INGRESS) ||
|
||||
cls_u32->common.chain_index)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (cls_u32->command) {
|
||||
case TC_CLSU32_NEW_KNODE:
|
||||
case TC_CLSU32_REPLACE_KNODE:
|
||||
return ixgbe_configure_clsu32(adapter, proto, cls_u32);
|
||||
return ixgbe_configure_clsu32(adapter, cls_u32);
|
||||
case TC_CLSU32_DELETE_KNODE:
|
||||
return ixgbe_delete_clsu32(adapter, cls_u32);
|
||||
case TC_CLSU32_NEW_HNODE:
|
||||
case TC_CLSU32_REPLACE_HNODE:
|
||||
return ixgbe_configure_clsu32_add_hnode(adapter, proto,
|
||||
cls_u32);
|
||||
return ixgbe_configure_clsu32_add_hnode(adapter, cls_u32);
|
||||
case TC_CLSU32_DELETE_HNODE:
|
||||
return ixgbe_configure_clsu32_del_hnode(adapter, cls_u32);
|
||||
default:
|
||||
@@ -9261,13 +9258,11 @@ static int ixgbe_setup_tc_mqprio(struct net_device *dev,
|
||||
}
|
||||
|
||||
static int __ixgbe_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
switch (type) {
|
||||
case TC_SETUP_CLSU32:
|
||||
return ixgbe_setup_tc_cls_u32(dev, handle, chain_index, proto,
|
||||
tc->cls_u32);
|
||||
return ixgbe_setup_tc_cls_u32(dev, tc->cls_u32);
|
||||
case TC_SETUP_MQPRIO:
|
||||
return ixgbe_setup_tc_mqprio(dev, tc->mqprio);
|
||||
default:
|
||||
|
@@ -131,7 +131,6 @@ out:
|
||||
}
|
||||
|
||||
static int __mlx4_en_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
if (type != TC_SETUP_MQPRIO)
|
||||
|
@@ -3032,18 +3032,17 @@ out:
|
||||
}
|
||||
|
||||
static int mlx5e_setup_tc_cls_flower(struct net_device *dev,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_cls_flower_offload *cls_flower)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
|
||||
if (TC_H_MAJ(handle) != TC_H_MAJ(TC_H_INGRESS) ||
|
||||
chain_index)
|
||||
if (TC_H_MAJ(cls_flower->common.handle) != TC_H_MAJ(TC_H_INGRESS) ||
|
||||
cls_flower->common.chain_index)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (cls_flower->command) {
|
||||
case TC_CLSFLOWER_REPLACE:
|
||||
return mlx5e_configure_flower(priv, proto, cls_flower);
|
||||
return mlx5e_configure_flower(priv, cls_flower);
|
||||
case TC_CLSFLOWER_DESTROY:
|
||||
return mlx5e_delete_flower(priv, cls_flower);
|
||||
case TC_CLSFLOWER_STATS:
|
||||
@@ -3054,13 +3053,11 @@ static int mlx5e_setup_tc_cls_flower(struct net_device *dev,
|
||||
}
|
||||
|
||||
static int mlx5e_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
switch (type) {
|
||||
case TC_SETUP_CLSFLOWER:
|
||||
return mlx5e_setup_tc_cls_flower(dev, handle, chain_index,
|
||||
proto, tc->cls_flower);
|
||||
return mlx5e_setup_tc_cls_flower(dev, tc->cls_flower);
|
||||
case TC_SETUP_MQPRIO:
|
||||
return mlx5e_setup_tc_mqprio(dev, tc->mqprio);
|
||||
default:
|
||||
|
@@ -652,15 +652,13 @@ static int mlx5e_rep_get_phys_port_name(struct net_device *dev,
|
||||
}
|
||||
|
||||
static int mlx5e_rep_setup_tc_cls_flower(struct net_device *dev,
|
||||
u32 handle, u32 chain_index,
|
||||
__be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
struct tc_cls_flower_offload *cls_flower = tc->cls_flower;
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
|
||||
if (TC_H_MAJ(handle) != TC_H_MAJ(TC_H_INGRESS) ||
|
||||
chain_index)
|
||||
if (TC_H_MAJ(cls_flower->common.handle) != TC_H_MAJ(TC_H_INGRESS) ||
|
||||
cls_flower->common.chain_index)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (cls_flower->egress_dev) {
|
||||
@@ -668,13 +666,12 @@ static int mlx5e_rep_setup_tc_cls_flower(struct net_device *dev,
|
||||
|
||||
dev = mlx5_eswitch_get_uplink_netdev(esw);
|
||||
return dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_CLSFLOWER,
|
||||
handle, chain_index,
|
||||
proto, tc);
|
||||
tc);
|
||||
}
|
||||
|
||||
switch (cls_flower->command) {
|
||||
case TC_CLSFLOWER_REPLACE:
|
||||
return mlx5e_configure_flower(priv, proto, cls_flower);
|
||||
return mlx5e_configure_flower(priv, cls_flower);
|
||||
case TC_CLSFLOWER_DESTROY:
|
||||
return mlx5e_delete_flower(priv, cls_flower);
|
||||
case TC_CLSFLOWER_STATS:
|
||||
@@ -685,13 +682,11 @@ static int mlx5e_rep_setup_tc_cls_flower(struct net_device *dev,
|
||||
}
|
||||
|
||||
static int mlx5e_rep_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
switch (type) {
|
||||
case TC_SETUP_CLSFLOWER:
|
||||
return mlx5e_rep_setup_tc_cls_flower(dev, handle, chain_index,
|
||||
proto, tc);
|
||||
return mlx5e_rep_setup_tc_cls_flower(dev, tc);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
@@ -1939,7 +1939,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
|
||||
return err;
|
||||
}
|
||||
|
||||
int mlx5e_configure_flower(struct mlx5e_priv *priv, __be16 protocol,
|
||||
int mlx5e_configure_flower(struct mlx5e_priv *priv,
|
||||
struct tc_cls_flower_offload *f)
|
||||
{
|
||||
struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
|
||||
|
@@ -38,7 +38,7 @@
|
||||
int mlx5e_tc_init(struct mlx5e_priv *priv);
|
||||
void mlx5e_tc_cleanup(struct mlx5e_priv *priv);
|
||||
|
||||
int mlx5e_configure_flower(struct mlx5e_priv *priv, __be16 protocol,
|
||||
int mlx5e_configure_flower(struct mlx5e_priv *priv,
|
||||
struct tc_cls_flower_offload *f);
|
||||
int mlx5e_delete_flower(struct mlx5e_priv *priv,
|
||||
struct tc_cls_flower_offload *f);
|
||||
|
@@ -1617,11 +1617,11 @@ mlxsw_sp_port_del_cls_matchall_sample(struct mlxsw_sp_port *mlxsw_sp_port)
|
||||
}
|
||||
|
||||
static int mlxsw_sp_port_add_cls_matchall(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
__be16 protocol,
|
||||
struct tc_cls_matchall_offload *f,
|
||||
bool ingress)
|
||||
{
|
||||
struct mlxsw_sp_port_mall_tc_entry *mall_tc_entry;
|
||||
__be16 protocol = f->common.protocol;
|
||||
const struct tc_action *a;
|
||||
LIST_HEAD(actions);
|
||||
int err;
|
||||
@@ -1694,18 +1694,16 @@ static void mlxsw_sp_port_del_cls_matchall(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
}
|
||||
|
||||
static int mlxsw_sp_setup_tc_cls_matchall(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
u32 handle, u32 chain_index,
|
||||
__be16 proto,
|
||||
struct tc_cls_matchall_offload *f)
|
||||
{
|
||||
bool ingress = TC_H_MAJ(handle) == TC_H_MAJ(TC_H_INGRESS);
|
||||
bool ingress = TC_H_MAJ(f->common.handle) == TC_H_MAJ(TC_H_INGRESS);
|
||||
|
||||
if (chain_index)
|
||||
if (f->common.chain_index)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (f->command) {
|
||||
case TC_CLSMATCHALL_REPLACE:
|
||||
return mlxsw_sp_port_add_cls_matchall(mlxsw_sp_port, proto, f,
|
||||
return mlxsw_sp_port_add_cls_matchall(mlxsw_sp_port, f,
|
||||
ingress);
|
||||
case TC_CLSMATCHALL_DESTROY:
|
||||
mlxsw_sp_port_del_cls_matchall(mlxsw_sp_port, f);
|
||||
@@ -1717,18 +1715,16 @@ static int mlxsw_sp_setup_tc_cls_matchall(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
|
||||
static int
|
||||
mlxsw_sp_setup_tc_cls_flower(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_cls_flower_offload *f)
|
||||
{
|
||||
bool ingress = TC_H_MAJ(handle) == TC_H_MAJ(TC_H_INGRESS);
|
||||
bool ingress = TC_H_MAJ(f->common.handle) == TC_H_MAJ(TC_H_INGRESS);
|
||||
|
||||
if (chain_index)
|
||||
if (f->common.chain_index)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (f->command) {
|
||||
case TC_CLSFLOWER_REPLACE:
|
||||
return mlxsw_sp_flower_replace(mlxsw_sp_port, ingress,
|
||||
proto, f);
|
||||
return mlxsw_sp_flower_replace(mlxsw_sp_port, ingress, f);
|
||||
case TC_CLSFLOWER_DESTROY:
|
||||
mlxsw_sp_flower_destroy(mlxsw_sp_port, ingress, f);
|
||||
return 0;
|
||||
@@ -1740,19 +1736,16 @@ mlxsw_sp_setup_tc_cls_flower(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
}
|
||||
|
||||
static int mlxsw_sp_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
|
||||
|
||||
switch (type) {
|
||||
case TC_SETUP_CLSMATCHALL:
|
||||
return mlxsw_sp_setup_tc_cls_matchall(mlxsw_sp_port, handle,
|
||||
chain_index, proto,
|
||||
return mlxsw_sp_setup_tc_cls_matchall(mlxsw_sp_port,
|
||||
tc->cls_mall);
|
||||
case TC_SETUP_CLSFLOWER:
|
||||
return mlxsw_sp_setup_tc_cls_flower(mlxsw_sp_port, handle,
|
||||
chain_index, proto,
|
||||
return mlxsw_sp_setup_tc_cls_flower(mlxsw_sp_port,
|
||||
tc->cls_flower);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
|
@@ -508,7 +508,7 @@ extern const struct mlxsw_sp_acl_ops mlxsw_sp_acl_tcam_ops;
|
||||
|
||||
/* spectrum_flower.c */
|
||||
int mlxsw_sp_flower_replace(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
|
||||
__be16 protocol, struct tc_cls_flower_offload *f);
|
||||
struct tc_cls_flower_offload *f);
|
||||
void mlxsw_sp_flower_destroy(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
|
||||
struct tc_cls_flower_offload *f);
|
||||
int mlxsw_sp_flower_stats(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
|
||||
|
@@ -368,7 +368,7 @@ static int mlxsw_sp_flower_parse(struct mlxsw_sp *mlxsw_sp,
|
||||
}
|
||||
|
||||
int mlxsw_sp_flower_replace(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
|
||||
__be16 protocol, struct tc_cls_flower_offload *f)
|
||||
struct tc_cls_flower_offload *f)
|
||||
{
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
||||
struct net_device *dev = mlxsw_sp_port->dev;
|
||||
|
@@ -121,20 +121,22 @@ static void nfp_bpf_vnic_clean(struct nfp_app *app, struct nfp_net *nn)
|
||||
}
|
||||
|
||||
static int nfp_bpf_setup_tc(struct nfp_app *app, struct net_device *netdev,
|
||||
enum tc_setup_type type, u32 handle, __be16 proto,
|
||||
enum tc_setup_type type,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
struct tc_cls_bpf_offload *cls_bpf = tc->cls_bpf;
|
||||
struct nfp_net *nn = netdev_priv(netdev);
|
||||
|
||||
if (type != TC_SETUP_CLSBPF || !nfp_net_ebpf_capable(nn) ||
|
||||
TC_H_MAJ(handle) != TC_H_MAJ(TC_H_INGRESS) ||
|
||||
proto != htons(ETH_P_ALL))
|
||||
TC_H_MAJ(cls_bpf->common.handle) != TC_H_MAJ(TC_H_INGRESS) ||
|
||||
cls_bpf->common.protocol != htons(ETH_P_ALL) ||
|
||||
cls_bpf->common.chain_index)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (nn->dp.bpf_offload_xdp)
|
||||
return -EBUSY;
|
||||
|
||||
return nfp_net_bpf_offload(nn, tc->cls_bpf);
|
||||
return nfp_net_bpf_offload(nn, cls_bpf);
|
||||
}
|
||||
|
||||
static bool nfp_bpf_tc_busy(struct nfp_app *app, struct nfp_net *nn)
|
||||
|
@@ -135,8 +135,7 @@ int nfp_flower_metadata_init(struct nfp_app *app);
|
||||
void nfp_flower_metadata_cleanup(struct nfp_app *app);
|
||||
|
||||
int nfp_flower_setup_tc(struct nfp_app *app, struct net_device *netdev,
|
||||
enum tc_setup_type type, u32 handle, __be16 proto,
|
||||
struct tc_to_netdev *tc);
|
||||
enum tc_setup_type type, struct tc_to_netdev *tc);
|
||||
int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow,
|
||||
struct nfp_fl_key_ls *key_ls,
|
||||
struct net_device *netdev,
|
||||
|
@@ -385,13 +385,15 @@ nfp_flower_repr_offload(struct nfp_app *app, struct net_device *netdev,
|
||||
}
|
||||
|
||||
int nfp_flower_setup_tc(struct nfp_app *app, struct net_device *netdev,
|
||||
enum tc_setup_type type, u32 handle, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
enum tc_setup_type type, struct tc_to_netdev *tc)
|
||||
{
|
||||
struct tc_cls_flower_offload *cls_flower = tc->cls_flower;
|
||||
|
||||
if (type != TC_SETUP_CLSFLOWER ||
|
||||
TC_H_MAJ(handle) != TC_H_MAJ(TC_H_INGRESS) ||
|
||||
!eth_proto_is_802_3(proto))
|
||||
TC_H_MAJ(cls_flower->common.handle) != TC_H_MAJ(TC_H_INGRESS) ||
|
||||
!eth_proto_is_802_3(cls_flower->common.protocol) ||
|
||||
cls_flower->common.chain_index)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return nfp_flower_repr_offload(app, netdev, tc->cls_flower);
|
||||
return nfp_flower_repr_offload(app, netdev, cls_flower);
|
||||
}
|
||||
|
@@ -109,8 +109,7 @@ struct nfp_app_type {
|
||||
void (*ctrl_msg_rx)(struct nfp_app *app, struct sk_buff *skb);
|
||||
|
||||
int (*setup_tc)(struct nfp_app *app, struct net_device *netdev,
|
||||
enum tc_setup_type type, u32 handle, __be16 proto,
|
||||
struct tc_to_netdev *tc);
|
||||
enum tc_setup_type type, struct tc_to_netdev *tc);
|
||||
bool (*tc_busy)(struct nfp_app *app, struct nfp_net *nn);
|
||||
int (*xdp_offload)(struct nfp_app *app, struct nfp_net *nn,
|
||||
struct bpf_prog *prog);
|
||||
@@ -240,12 +239,11 @@ static inline bool nfp_app_tc_busy(struct nfp_app *app, struct nfp_net *nn)
|
||||
static inline int nfp_app_setup_tc(struct nfp_app *app,
|
||||
struct net_device *netdev,
|
||||
enum tc_setup_type type,
|
||||
u32 handle, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
if (!app || !app->type->setup_tc)
|
||||
return -EOPNOTSUPP;
|
||||
return app->type->setup_tc(app, netdev, type, handle, proto, tc);
|
||||
return app->type->setup_tc(app, netdev, type, tc);
|
||||
}
|
||||
|
||||
static inline int nfp_app_xdp_offload(struct nfp_app *app, struct nfp_net *nn,
|
||||
|
@@ -89,19 +89,15 @@ const struct switchdev_ops nfp_port_switchdev_ops = {
|
||||
};
|
||||
|
||||
int nfp_port_setup_tc(struct net_device *netdev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
struct nfp_port *port;
|
||||
|
||||
if (chain_index)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
port = nfp_port_from_netdev(netdev);
|
||||
if (!port)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return nfp_app_setup_tc(port->app, netdev, type, handle, proto, tc);
|
||||
return nfp_app_setup_tc(port->app, netdev, type, tc);
|
||||
}
|
||||
|
||||
struct nfp_port *
|
||||
|
@@ -110,7 +110,6 @@ struct nfp_port {
|
||||
extern const struct switchdev_ops nfp_port_switchdev_ops;
|
||||
|
||||
int nfp_port_setup_tc(struct net_device *netdev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc);
|
||||
|
||||
struct nfp_port *nfp_port_from_netdev(struct net_device *netdev);
|
||||
|
@@ -33,7 +33,6 @@ netdev_tx_t efx_hard_start_xmit(struct sk_buff *skb,
|
||||
netdev_tx_t efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb);
|
||||
void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index);
|
||||
int efx_setup_tc(struct net_device *net_dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc);
|
||||
unsigned int efx_tx_max_skb_descs(struct efx_nic *efx);
|
||||
extern unsigned int efx_piobuf_size;
|
||||
|
@@ -33,7 +33,6 @@ netdev_tx_t ef4_hard_start_xmit(struct sk_buff *skb,
|
||||
netdev_tx_t ef4_enqueue_skb(struct ef4_tx_queue *tx_queue, struct sk_buff *skb);
|
||||
void ef4_xmit_done(struct ef4_tx_queue *tx_queue, unsigned int index);
|
||||
int ef4_setup_tc(struct net_device *net_dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc);
|
||||
unsigned int ef4_tx_max_skb_descs(struct ef4_nic *efx);
|
||||
extern bool ef4_separate_tx_channels;
|
||||
|
@@ -426,7 +426,6 @@ void ef4_init_tx_queue_core_txq(struct ef4_tx_queue *tx_queue)
|
||||
}
|
||||
|
||||
int ef4_setup_tc(struct net_device *net_dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *ntc)
|
||||
{
|
||||
struct ef4_nic *efx = netdev_priv(net_dev);
|
||||
|
@@ -654,7 +654,6 @@ void efx_init_tx_queue_core_txq(struct efx_tx_queue *tx_queue)
|
||||
}
|
||||
|
||||
int efx_setup_tc(struct net_device *net_dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *ntc)
|
||||
{
|
||||
struct efx_nic *efx = netdev_priv(net_dev);
|
||||
|
@@ -1878,7 +1878,6 @@ static u16 netcp_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
}
|
||||
|
||||
static int netcp_setup_tc(struct net_device *dev, enum tc_setup_type type,
|
||||
u32 handle, u32 chain_index, __be16 proto,
|
||||
struct tc_to_netdev *tc)
|
||||
{
|
||||
u8 num_tc;
|
||||
|
Reference in New Issue
Block a user