Currently, netdevsim supports TC offloads only for filter blocks and the 'taprio' qdisc. This improves coverage for situations where .ndo_setup_tc(dev, TC_SETUP_QDISC_TAPRIO, ...) returns 0, but the code can be generalized for offloading most of the Linux qdiscs we have at the moment. Generalize netdevsim qdisc offload, by providing: - a function that returns 0 on 'setup'/'destroy'/'get_stats' commands read from qdisc-specific offload parameters, and returns -EOPNOTSUPP otherwise, namely "handle_()" - a case label handling TC_SETUP_QDISC_ in nsim_setup_tc(). This commit has no functional change. Signed-off-by: Davide Caratti --- drivers/net/netdevsim/tc.c | 57 ++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/drivers/net/netdevsim/tc.c b/drivers/net/netdevsim/tc.c index 8a1960f5f99e..358fa5bb835f 100644 --- a/drivers/net/netdevsim/tc.c +++ b/drivers/net/netdevsim/tc.c @@ -11,32 +11,31 @@ nsim_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv) return nsim_bpf_setup_tc_block_cb(type, type_data, cb_priv); } -static void nsim_taprio_stats(struct tc_taprio_qopt_stats *stats) -{ - stats->window_drops = 0; - stats->tx_overruns = 0; -} +static LIST_HEAD(nsim_block_cb_list); -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; - } +#define QDISC_OFFLOAD_HANDLERS(X) \ + X(taprio, tc_taprio_qopt_offload, cmd, TAPRIO_CMD_REPLACE, \ + TAPRIO_CMD_DESTROY, TAPRIO_CMD_STATS, stats) \ - return err; +#define QH(NAME, OL_TYPE, CMD_FLD, O_REPLACE, O_DESTROY, O_STATS, STATS_FLD) \ +static int handle_##NAME(struct net_device *dev, struct OL_TYPE *offload) \ +{ \ + switch (offload->CMD_FLD) { \ + case O_REPLACE: \ + case O_DESTROY: \ + /* Do nothing, accept offload */ \ + return 0; \ + case O_STATS: \ + /* Zero out the requested stats block */ \ + memset(&offload->STATS_FLD, 0, sizeof(offload->STATS_FLD)); \ + return 0; \ + default: \ + return -EOPNOTSUPP; \ + } \ } -static LIST_HEAD(nsim_block_cb_list); +QDISC_OFFLOAD_HANDLERS(QH) +#undef QH int nsim_setup_tc(struct net_device *dev, enum tc_setup_type type, void *type_data) @@ -44,8 +43,18 @@ 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); +#define TC_QDISC_SETUP_CASES(X) \ + X(TC_SETUP_QDISC_TAPRIO, tc_taprio_qopt_offload, taprio) \ + +#define SC(SETUP_LABEL, OL_TYPE, NAME) \ + case SETUP_LABEL: \ + { \ + return handle_##NAME(dev, (struct OL_TYPE *)type_data); \ + } + + TC_QDISC_SETUP_CASES(SC) +#undef SC + case TC_SETUP_BLOCK: return flow_block_cb_setup_simple(type_data, &nsim_block_cb_list, -- 2.52.0