xref: /linux/drivers/net/netdevsim/tc.c (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
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