diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c index 8eb08c34..b79029d9 100644 --- a/tc/tc_qdisc.c +++ b/tc/tc_qdisc.c @@ -478,6 +478,9 @@ static int tc_qdisc_block_exists_cb(struct nlmsghdr *n, void *arg) struct tcmsg *t = NLMSG_DATA(n); struct rtattr *tb[TCA_MAX+1]; int len = n->nlmsg_len; + struct qdisc_util *q; + const char *kind; + int err; if (n->nlmsg_type != RTM_NEWQDISC) return 0; @@ -506,6 +509,21 @@ 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) { + bool found = false; + + err = q->has_block(q, tb[TCA_OPTIONS], ctx->block_index, &found); + if (err) + return err; + if (found) + ctx->found = true; + } + 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 #include #include @@ -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 #include +#include #include #include @@ -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;