| // SPDX-License-Identifier: GPL-2.0 | |
| #include <linux/netdevice.h> | |
| #include <net/pkt_sched.h> | |
| #include <net/pkt_cls.h> | |
| #include "netdevsim.h" | |
| static int | |
| nsim_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv) | |
| { | |
| struct flow_cls_common_offload *common = type_data; | |
| int err = 0; | |
| switch (type) { | |
| case TC_SETUP_CLSBPF: | |
| err = nsim_bpf_setup_tc_block_cb(type, type_data, cb_priv); | |
| break; | |
| case TC_SETUP_CLSFLOWER: | |
| break; | |
| default: | |
| NSIM_EA(common->extack, "offload type not supported"); | |
| err = -EOPNOTSUPP; | |
| break; | |
| } | |
| return err; | |
| } | |
| static void nsim_taprio_stats(struct tc_taprio_qopt_stats *stats) | |
| { | |
| stats->window_drops = 0; | |
| stats->tx_overruns = 0; | |
| } | |
| static int nsim_setup_tc_taprio(struct net_device *dev, | |
| struct tc_taprio_qopt_offload *offload) | |
| { | |
| int err = 0; | |
| switch (offload->cmd) { | |
| case TAPRIO_CMD_REPLACE: | |
| case TAPRIO_CMD_DESTROY: | |
| break; | |
| case TAPRIO_CMD_STATS: | |
| nsim_taprio_stats(&offload->stats); | |
| break; | |
| default: | |
| err = -EOPNOTSUPP; | |
| } | |
| return err; | |
| } | |
| static int nsim_setup_tc_ets(struct net_device *dev, | |
| struct tc_ets_qopt_offload *offload) | |
| { | |
| int err = 0; | |
| switch (offload->command) { | |
| case TC_ETS_REPLACE: | |
| case TC_ETS_DESTROY: | |
| break; | |
| case TC_ETS_STATS: | |
| _bstats_update(offload->stats.bstats, 0, 0); | |
| break; | |
| default: | |
| err = -EOPNOTSUPP; | |
| } | |
| return err; | |
| } | |
| static LIST_HEAD(nsim_block_cb_list); | |
| int | |
| nsim_setup_tc(struct net_device *dev, enum tc_setup_type type, void *type_data) | |
| { | |
| struct netdevsim *ns = netdev_priv(dev); | |
| switch (type) { | |
| case TC_SETUP_QDISC_TAPRIO: | |
| return nsim_setup_tc_taprio(dev, type_data); | |
| case TC_SETUP_QDISC_ETS: | |
| return nsim_setup_tc_ets(dev, type_data); | |
| case TC_SETUP_BLOCK: | |
| return flow_block_cb_setup_simple(type_data, | |
| &nsim_block_cb_list, | |
| nsim_setup_tc_block_cb, | |
| ns, ns, true); | |
| case TC_SETUP_FT: | |
| return 0; | |
| default: | |
| return -EOPNOTSUPP; | |
| } | |
| } | |
| ALLOW_ERROR_INJECTION(nsim_setup_tc, ERRNO); |