1544921efSDavide Caratti // SPDX-License-Identifier: GPL-2.0 2544921efSDavide Caratti 3544921efSDavide Caratti #include <linux/netdevice.h> 4544921efSDavide Caratti #include <net/pkt_sched.h> 5*abdf5133SDavide Caratti #include <net/pkt_cls.h> 6544921efSDavide Caratti 7544921efSDavide Caratti #include "netdevsim.h" 8544921efSDavide Caratti 9544921efSDavide Caratti static int 10544921efSDavide Caratti nsim_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv) 11544921efSDavide Caratti { 12544921efSDavide Caratti return nsim_bpf_setup_tc_block_cb(type, type_data, cb_priv); 13544921efSDavide Caratti } 14544921efSDavide Caratti 15544921efSDavide Caratti static void nsim_taprio_stats(struct tc_taprio_qopt_stats *stats) 16544921efSDavide Caratti { 17544921efSDavide Caratti stats->window_drops = 0; 18544921efSDavide Caratti stats->tx_overruns = 0; 19544921efSDavide Caratti } 20544921efSDavide Caratti 21544921efSDavide Caratti static int nsim_setup_tc_taprio(struct net_device *dev, 22544921efSDavide Caratti struct tc_taprio_qopt_offload *offload) 23544921efSDavide Caratti { 24544921efSDavide Caratti int err = 0; 25544921efSDavide Caratti 26544921efSDavide Caratti switch (offload->cmd) { 27544921efSDavide Caratti case TAPRIO_CMD_REPLACE: 28544921efSDavide Caratti case TAPRIO_CMD_DESTROY: 29544921efSDavide Caratti break; 30544921efSDavide Caratti case TAPRIO_CMD_STATS: 31544921efSDavide Caratti nsim_taprio_stats(&offload->stats); 32544921efSDavide Caratti break; 33544921efSDavide Caratti default: 34544921efSDavide Caratti err = -EOPNOTSUPP; 35544921efSDavide Caratti } 36544921efSDavide Caratti 37544921efSDavide Caratti return err; 38544921efSDavide Caratti } 39544921efSDavide Caratti 40*abdf5133SDavide Caratti static int nsim_setup_tc_ets(struct net_device *dev, 41*abdf5133SDavide Caratti struct tc_ets_qopt_offload *offload) 42*abdf5133SDavide Caratti { 43*abdf5133SDavide Caratti int err = 0; 44*abdf5133SDavide Caratti 45*abdf5133SDavide Caratti switch (offload->command) { 46*abdf5133SDavide Caratti case TC_ETS_REPLACE: 47*abdf5133SDavide Caratti case TC_ETS_DESTROY: 48*abdf5133SDavide Caratti break; 49*abdf5133SDavide Caratti case TC_ETS_STATS: 50*abdf5133SDavide Caratti _bstats_update(offload->stats.bstats, 0, 0); 51*abdf5133SDavide Caratti break; 52*abdf5133SDavide Caratti default: 53*abdf5133SDavide Caratti err = -EOPNOTSUPP; 54*abdf5133SDavide Caratti } 55*abdf5133SDavide Caratti 56*abdf5133SDavide Caratti return err; 57*abdf5133SDavide Caratti } 58*abdf5133SDavide Caratti 59544921efSDavide Caratti static LIST_HEAD(nsim_block_cb_list); 60544921efSDavide Caratti 61544921efSDavide Caratti int 62544921efSDavide Caratti nsim_setup_tc(struct net_device *dev, enum tc_setup_type type, void *type_data) 63544921efSDavide Caratti { 64544921efSDavide Caratti struct netdevsim *ns = netdev_priv(dev); 65544921efSDavide Caratti 66544921efSDavide Caratti switch (type) { 67544921efSDavide Caratti case TC_SETUP_QDISC_TAPRIO: 68544921efSDavide Caratti return nsim_setup_tc_taprio(dev, type_data); 69*abdf5133SDavide Caratti case TC_SETUP_QDISC_ETS: 70*abdf5133SDavide Caratti return nsim_setup_tc_ets(dev, type_data); 71544921efSDavide Caratti case TC_SETUP_BLOCK: 72544921efSDavide Caratti return flow_block_cb_setup_simple(type_data, 73544921efSDavide Caratti &nsim_block_cb_list, 74544921efSDavide Caratti nsim_setup_tc_block_cb, 75544921efSDavide Caratti ns, ns, true); 76544921efSDavide Caratti default: 77544921efSDavide Caratti return -EOPNOTSUPP; 78544921efSDavide Caratti } 79544921efSDavide Caratti } 80