xref: /linux/drivers/net/netdevsim/tc.c (revision 544921efd4e4b1f135c87335dd59114a302c574d)
1*544921efSDavide Caratti // SPDX-License-Identifier: GPL-2.0
2*544921efSDavide Caratti 
3*544921efSDavide Caratti #include <linux/netdevice.h>
4*544921efSDavide Caratti #include <net/pkt_sched.h>
5*544921efSDavide Caratti 
6*544921efSDavide Caratti #include "netdevsim.h"
7*544921efSDavide Caratti 
8*544921efSDavide Caratti static int
9*544921efSDavide Caratti nsim_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
10*544921efSDavide Caratti {
11*544921efSDavide Caratti 	return nsim_bpf_setup_tc_block_cb(type, type_data, cb_priv);
12*544921efSDavide Caratti }
13*544921efSDavide Caratti 
14*544921efSDavide Caratti static void nsim_taprio_stats(struct tc_taprio_qopt_stats *stats)
15*544921efSDavide Caratti {
16*544921efSDavide Caratti 	stats->window_drops = 0;
17*544921efSDavide Caratti 	stats->tx_overruns = 0;
18*544921efSDavide Caratti }
19*544921efSDavide Caratti 
20*544921efSDavide Caratti static int nsim_setup_tc_taprio(struct net_device *dev,
21*544921efSDavide Caratti 				struct tc_taprio_qopt_offload *offload)
22*544921efSDavide Caratti {
23*544921efSDavide Caratti 	int err = 0;
24*544921efSDavide Caratti 
25*544921efSDavide Caratti 	switch (offload->cmd) {
26*544921efSDavide Caratti 	case TAPRIO_CMD_REPLACE:
27*544921efSDavide Caratti 	case TAPRIO_CMD_DESTROY:
28*544921efSDavide Caratti 		break;
29*544921efSDavide Caratti 	case TAPRIO_CMD_STATS:
30*544921efSDavide Caratti 		nsim_taprio_stats(&offload->stats);
31*544921efSDavide Caratti 		break;
32*544921efSDavide Caratti 	default:
33*544921efSDavide Caratti 		err = -EOPNOTSUPP;
34*544921efSDavide Caratti 	}
35*544921efSDavide Caratti 
36*544921efSDavide Caratti 	return err;
37*544921efSDavide Caratti }
38*544921efSDavide Caratti 
39*544921efSDavide Caratti static LIST_HEAD(nsim_block_cb_list);
40*544921efSDavide Caratti 
41*544921efSDavide Caratti int
42*544921efSDavide Caratti nsim_setup_tc(struct net_device *dev, enum tc_setup_type type, void *type_data)
43*544921efSDavide Caratti {
44*544921efSDavide Caratti 	struct netdevsim *ns = netdev_priv(dev);
45*544921efSDavide Caratti 
46*544921efSDavide Caratti 	switch (type) {
47*544921efSDavide Caratti 	case TC_SETUP_QDISC_TAPRIO:
48*544921efSDavide Caratti 		return nsim_setup_tc_taprio(dev, type_data);
49*544921efSDavide Caratti 	case TC_SETUP_BLOCK:
50*544921efSDavide Caratti 		return flow_block_cb_setup_simple(type_data,
51*544921efSDavide Caratti 						  &nsim_block_cb_list,
52*544921efSDavide Caratti 						  nsim_setup_tc_block_cb,
53*544921efSDavide Caratti 						  ns, ns, true);
54*544921efSDavide Caratti 	default:
55*544921efSDavide Caratti 		return -EOPNOTSUPP;
56*544921efSDavide Caratti 	}
57*544921efSDavide Caratti }
58