Jiri Pirko <j...@resnulli.us> writes:
>>diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c >>index 8eb08c34..bea8d3c0 100644 >>--- a/tc/tc_qdisc.c >>+++ b/tc/tc_qdisc.c >>@@ -477,7 +477,9 @@ static int tc_qdisc_block_exists_cb(struct nlmsghdr *n, >>void *arg) >> struct tc_qdisc_block_exists_ctx *ctx = arg; >> struct tcmsg *t = NLMSG_DATA(n); >> struct rtattr *tb[TCA_MAX+1]; >>+ struct qdisc_util *q = NULL; > > Pointless initialization. Ack. >> int len = n->nlmsg_len; >>+ const char *kind; >> >> if (n->nlmsg_type != RTM_NEWQDISC) >> return 0; >>@@ -506,6 +508,14 @@ static int tc_qdisc_block_exists_cb(struct nlmsghdr *n, >>void *arg) >> if (block == ctx->block_index) >> ctx->found = true; >> } >>+ >>+ kind = rta_getattr_str(tb[TCA_KIND]); >>+ q = get_qdisc_kind(kind); >>+ if (!q) >>+ return -1; >>+ if (q->has_block) >>+ q->has_block(q, tb[TCA_OPTIONS], ctx->block_index, &ctx->found); > > Op returns int yet you don't use it. Perhaps it can directly return > bool? In theory it could return actual errors (such as an attribute reporting block 0). I'll have it handle the return value through the usual "err =" stanza. > >>+ >> return 0; >> } >> >>diff --git a/tc/tc_qevent.c b/tc/tc_qevent.c >>index 1f8e6506..2c010fcf 100644 >>--- a/tc/tc_qevent.c >>+++ b/tc/tc_qevent.c >>@@ -92,6 +92,21 @@ void qevents_print(struct qevent_util *qevents, FILE *f) >> close_json_array(PRINT_ANY, ""); >> } >> >>+bool qevents_have_block(struct qevent_util *qevents, __u32 block_idx) >>+{ >>+ if (!qevents) >>+ return false; >>+ >>+ for (; qevents->id; qevents++) { >>+ struct qevent_base *qeb = qevents->data; >>+ >>+ if (qeb->block_idx == block_idx) >>+ return true; >>+ } >>+ >>+ return false; >>+} >>+ >> int qevents_dump(struct qevent_util *qevents, struct nlmsghdr *n) >> { >> int err; >>diff --git a/tc/tc_qevent.h b/tc/tc_qevent.h >>index 574e7cff..d60c3f75 100644 >>--- a/tc/tc_qevent.h >>+++ b/tc/tc_qevent.h >>@@ -2,6 +2,7 @@ >> #ifndef _TC_QEVENT_H_ >> #define _TC_QEVENT_H_ >> >>+#include <stdbool.h> >> #include <linux/types.h> >> #include <libnetlink.h> >> >>@@ -37,6 +38,7 @@ int qevent_parse(struct qevent_util *qevents, int *p_argc, >>char ***p_argv); >> int qevents_read(struct qevent_util *qevents, struct rtattr **tb); >> int qevents_dump(struct qevent_util *qevents, struct nlmsghdr *n); >> void qevents_print(struct qevent_util *qevents, FILE *f); >>+bool qevents_have_block(struct qevent_util *qevents, __u32 block_idx); >> >> struct qevent_plain { >> struct qevent_base base; >>diff --git a/tc/tc_util.h b/tc/tc_util.h >>index edc39138..c8af4e95 100644 >>--- a/tc/tc_util.h >>+++ b/tc/tc_util.h >>@@ -5,6 +5,7 @@ >> #define MAX_MSG 16384 >> #include <limits.h> >> #include <linux/if.h> >>+#include <stdbool.h> >> >> #include <linux/pkt_sched.h> >> #include <linux/pkt_cls.h> >>@@ -40,6 +41,7 @@ struct qdisc_util { >> int (*parse_copt)(struct qdisc_util *qu, int argc, >> char **argv, struct nlmsghdr *n, const char *dev); >> int (*print_copt)(struct qdisc_util *qu, FILE *f, struct rtattr *opt); >>+ int (*has_block)(struct qdisc_util *qu, struct rtattr *opt, __u32 >>block_idx, bool *p_has); >> }; >> >> extern __u16 f_proto; >>-- >>2.20.1 >>