From ed69b2a79b8e0b71c230b5e75626aa620a0d5ff9 Mon Sep 17 00:00:00 2001 From: Thomas Graf Date: Thu, 9 Jun 2011 12:28:04 +0200 Subject: Add rtnl_tc_data_check() Behaves like rtnl_tc_data() but verifies that the traffic control object is of the expected type. --- include/netlink/route/tc-api.h | 2 ++ lib/route/tc.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+) 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) -- cgit v1.2.1