diff --git a/include/netlink/route/tc-api.h b/include/netlink/route/tc-api.h index 8ed940a..d89408f 100644 --- a/include/netlink/route/tc-api.h +++ b/include/netlink/route/tc-api.h @@ -124,6 +124,8 @@ extern int rtnl_tc_compare(struct nl_object *, uint32_t, int); extern void * rtnl_tc_data(struct rtnl_tc *); +extern void * rtnl_tc_data_check(struct rtnl_tc *, + struct rtnl_tc_ops *); extern struct rtnl_tc_ops * rtnl_tc_lookup_ops(enum rtnl_tc_type, const char *); diff --git a/lib/route/tc.c b/lib/route/tc.c index da8c75f..983555a 100644 --- a/lib/route/tc.c +++ b/lib/route/tc.c @@ -1010,6 +1010,21 @@ void *rtnl_tc_data(struct rtnl_tc *tc) return nl_data_get(tc->tc_subdata); } +void *rtnl_tc_data_check(struct rtnl_tc *tc, struct rtnl_tc_ops *ops) +{ + if (tc->tc_ops != ops) { + char buf[64]; + + snprintf(buf, sizeof(buf), + "tc object %p used in %s context but is of type %s", + tc, ops->to_kind, tc->tc_ops->to_kind); + + return NULL; + } + + return rtnl_tc_data(tc); +} + void rtnl_tc_type_register(struct rtnl_tc_type_ops *ops) { if (ops->tt_type > RTNL_TC_TYPE_MAX)