diff options
author | Thomas Graf <tgraf@suug.ch> | 2011-03-21 15:51:52 +0100 |
---|---|---|
committer | Thomas Graf <tgraf@suug.ch> | 2011-03-21 15:51:52 +0100 |
commit | 8eb5b5532eae985a5f0911dccf2db8cb4e0a5de4 (patch) | |
tree | 0fec48d114edbb535bd234f2684acccf81447d13 /src/lib | |
parent | 5dc897d5de9f54078221b241e0122713207f5e0c (diff) |
Unified TC API
Finally got rid of all the qdisc/class/cls code duplication in
the tc module API. The API takes care of allocation/freeing the
tc object specific data.
I hope I got it right this time.
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/class.c | 10 | ||||
-rw-r--r-- | src/lib/cls.c | 65 | ||||
-rw-r--r-- | src/lib/qdisc.c | 96 | ||||
-rw-r--r-- | src/lib/tc.c | 77 |
4 files changed, 82 insertions, 166 deletions
diff --git a/src/lib/class.c b/src/lib/class.c index c6b5525..96f60cd 100644 --- a/src/lib/class.c +++ b/src/lib/class.c @@ -6,7 +6,7 @@ * License as published by the Free Software Foundation version 2.1 * of the License. * - * Copyright (c) 2010 Thomas Graf <tgraf@suug.ch> + * Copyright (c) 2010-2011 Thomas Graf <tgraf@suug.ch> */ /** @@ -22,8 +22,7 @@ struct rtnl_class *nl_cli_class_alloc(void) { struct rtnl_class *class; - class = rtnl_class_alloc(); - if (!class) + if (!(class = rtnl_class_alloc())) nl_cli_fatal(ENOMEM, "Unable to allocate class object"); return class; @@ -43,9 +42,4 @@ struct nl_cache *nl_cli_class_alloc_cache(struct nl_sock *sock, int ifindex) return cache; } -void nl_cli_class_parse_kind(struct rtnl_class *class, char *arg) -{ - rtnl_class_set_kind(class, arg); -} - /** @} */ diff --git a/src/lib/cls.c b/src/lib/cls.c index 7ada3d6..86d775d 100644 --- a/src/lib/cls.c +++ b/src/lib/cls.c @@ -6,7 +6,7 @@ * License as published by the Free Software Foundation version 2.1 * of the License. * - * Copyright (c) 2010 Thomas Graf <tgraf@suug.ch> + * Copyright (c) 2010-2011 Thomas Graf <tgraf@suug.ch> */ /** @@ -23,8 +23,7 @@ struct rtnl_cls *nl_cli_cls_alloc(void) { struct rtnl_cls *cls; - cls = rtnl_cls_alloc(); - if (!cls) + if (!(cls = rtnl_cls_alloc())) nl_cli_fatal(ENOMEM, "Unable to allocate classifier object"); return cls; @@ -43,11 +42,6 @@ struct nl_cache *nl_cli_cls_alloc_cache(struct nl_sock *sock, int ifindex, return cache; } -void nl_cli_cls_parse_kind(struct rtnl_cls *cls, char *arg) -{ - rtnl_cls_set_kind(cls, arg); -} - void nl_cli_cls_parse_proto(struct rtnl_cls *cls, char *arg) { int proto; @@ -74,59 +68,4 @@ struct rtnl_ematch_tree *nl_cli_cls_parse_ematch(struct rtnl_cls *cls, char *arg return tree; } -static NL_LIST_HEAD(cls_modules); - -struct nl_cli_cls_module *__nl_cli_cls_lookup(struct rtnl_cls_ops *ops) -{ - struct nl_cli_cls_module *cm; - - nl_list_for_each_entry(cm, &cls_modules, cm_list) - if (cm->cm_ops == ops) - return cm; - - return NULL; -} - -struct nl_cli_cls_module *nl_cli_cls_lookup(struct rtnl_cls_ops *ops) -{ - struct nl_cli_cls_module *cm; - - if ((cm = __nl_cli_cls_lookup(ops))) - return cm; - - nl_cli_load_module("cli/cls", ops->co_kind); - - if (!(cm = __nl_cli_cls_lookup(ops))) { - nl_cli_fatal(EINVAL, "Application bug: The shared library for " - "the classifier \"%s\" was successfully loaded but it " - "seems that module did not register itself"); - } - - return cm; -} - -void nl_cli_cls_register(struct nl_cli_cls_module *cm) -{ - struct rtnl_cls_ops *ops; - - if (!(ops = __rtnl_cls_lookup_ops(cm->cm_name))) { - nl_cli_fatal(ENOENT, "Unable to register CLI classifier module " - "\"%s\": No matching libnl cls module found.", cm->cm_name); - } - - if (__nl_cli_cls_lookup(ops)) { - nl_cli_fatal(EEXIST, "Unable to register CLI classifier module " - "\"%s\": Module already registered.", cm->cm_name); - } - - cm->cm_ops = ops; - - nl_list_add_tail(&cm->cm_list, &cls_modules); -} - -void nl_cli_cls_unregister(struct nl_cli_cls_module *cm) -{ - nl_list_del(&cm->cm_list); -} - /** @} */ diff --git a/src/lib/qdisc.c b/src/lib/qdisc.c index 4c64e7b..ccf7d26 100644 --- a/src/lib/qdisc.c +++ b/src/lib/qdisc.c @@ -6,7 +6,7 @@ * License as published by the Free Software Foundation version 2.1 * of the License. * - * Copyright (c) 2008-2010 Thomas Graf <tgraf@suug.ch> + * Copyright (c) 2008-2011 Thomas Graf <tgraf@suug.ch> */ /** @@ -18,107 +18,15 @@ #include <netlink/cli/utils.h> #include <netlink/cli/qdisc.h> #include <netlink/route/class.h> -#include <netlink/route/class-modules.h> struct rtnl_qdisc *nl_cli_qdisc_alloc(void) { struct rtnl_qdisc *qdisc; - qdisc = rtnl_qdisc_alloc(); - if (!qdisc) + if (!(qdisc = rtnl_qdisc_alloc())) nl_cli_fatal(ENOMEM, "Unable to allocate qdisc object"); return qdisc; } -void nl_cli_qdisc_parse_kind(struct rtnl_qdisc *qdisc, char *arg) -{ - rtnl_qdisc_set_kind(qdisc, arg); -} - -static NL_LIST_HEAD(qdisc_modules); - -struct nl_cli_qdisc_module *__nl_cli_qdisc_lookup(struct rtnl_qdisc_ops *ops) -{ - struct nl_cli_qdisc_module *qm; - - nl_list_for_each_entry(qm, &qdisc_modules, qm_list) - if (qm->qm_ops == ops) - return qm; - - return NULL; -} - -struct nl_cli_qdisc_module *__nl_cli_class_lookup(struct rtnl_class_ops *ops) -{ - struct nl_cli_qdisc_module *qm; - - nl_list_for_each_entry(qm, &qdisc_modules, qm_list) - if (qm->qm_class_ops == ops) - return qm; - - return NULL; -} - -struct nl_cli_qdisc_module *nl_cli_qdisc_lookup(struct rtnl_qdisc_ops *ops) -{ - struct nl_cli_qdisc_module *qm; - - if ((qm = __nl_cli_qdisc_lookup(ops))) - return qm; - - nl_cli_load_module("cli/qdisc", ops->qo_kind); - - if (!(qm = __nl_cli_qdisc_lookup(ops))) { - nl_cli_fatal(EINVAL, "Application bug: The shared library for " - "the qdisc \"%s\" was successfully loaded but it " - "seems that module did not register itself"); - } - - return qm; -} - -struct nl_cli_qdisc_module *nl_cli_qdisc_lookup_by_class(struct rtnl_class_ops *ops) -{ - struct nl_cli_qdisc_module *qm; - - if ((qm = __nl_cli_class_lookup(ops))) - return qm; - - nl_cli_load_module("cli/qdisc", ops->co_kind); - - if (!(qm = __nl_cli_class_lookup(ops))) { - nl_cli_fatal(EINVAL, "Application bug: The shared library for " - "the class \"%s\" was successfully loaded but it " - "seems that module did not register itself"); - } - - return qm; -} - -void nl_cli_qdisc_register(struct nl_cli_qdisc_module *qm) -{ - struct rtnl_qdisc_ops *ops; - - if (!(ops = __rtnl_qdisc_lookup_ops(qm->qm_name))) { - nl_cli_fatal(ENOENT, "Unable to register CLI qdisc module " - "\"%s\": No matching libnl qdisc module found.", qm->qm_name); - } - - if (__nl_cli_qdisc_lookup(ops)) { - nl_cli_fatal(EEXIST, "Unable to register CLI qdisc module " - "\"%s\": Module already registered.", qm->qm_name); - } - - qm->qm_ops = ops; - qm->qm_class_ops = __rtnl_class_lookup_ops(qm->qm_name); - - nl_list_add_tail(&qm->qm_list, &qdisc_modules); -} - -void nl_cli_qdisc_unregister(struct nl_cli_qdisc_module *qm) -{ - nl_list_del(&qm->qm_list); -} - /** @} */ diff --git a/src/lib/tc.c b/src/lib/tc.c index 72407cf..8d013f9 100644 --- a/src/lib/tc.c +++ b/src/lib/tc.c @@ -11,7 +11,7 @@ #include <netlink/cli/utils.h> #include <netlink/cli/tc.h> -#include <netlink/route/tc.h> +#include <netlink/route/tc-api.h> /** * @ingroup cli @@ -76,6 +76,11 @@ void nl_cli_tc_parse_overhead(struct rtnl_tc *tc, char *arg) rtnl_tc_set_overhead(tc, nl_cli_parse_u32(arg)); } +void nl_cli_tc_parse_kind(struct rtnl_tc *tc, char *arg) +{ + rtnl_tc_set_kind(tc, arg); +} + void nl_cli_tc_parse_linktype(struct rtnl_tc *tc, char *arg) { int type; @@ -87,4 +92,74 @@ void nl_cli_tc_parse_linktype(struct rtnl_tc *tc, char *arg) rtnl_tc_set_linktype(tc, type); } +static NL_LIST_HEAD(tc_modules); + +struct nl_cli_tc_module *__nl_cli_tc_lookup(struct rtnl_tc_ops *ops) +{ + struct nl_cli_tc_module *tm; + + nl_list_for_each_entry(tm, &tc_modules, tm_list) + if (tm->tm_ops == ops) + return tm; + + return NULL; +} + +struct nl_cli_tc_module *nl_cli_tc_lookup(struct rtnl_tc_ops *ops) +{ + struct nl_cli_tc_module *tm; + + if ((tm = __nl_cli_tc_lookup(ops))) + return tm; + + switch (ops->to_type) { + case RTNL_TC_TYPE_QDISC: + case RTNL_TC_TYPE_CLASS: + nl_cli_load_module("cli/qdisc", ops->to_kind); + break; + + case RTNL_TC_TYPE_CLS: + nl_cli_load_module("cli/cls", ops->to_kind); + break; + + default: + nl_cli_fatal(EINVAL, "BUG: unhandled TC object type %d", + ops->to_type); + } + + if (!(tm = __nl_cli_tc_lookup(ops))) { + nl_cli_fatal(EINVAL, "Application bug: The shared library for " + "the tc object \"%s\" was successfully loaded but it " + "seems that module did not register itself", + ops->to_kind); + } + + return tm; +} + +void nl_cli_tc_register(struct nl_cli_tc_module *tm) +{ + struct rtnl_tc_ops *ops; + + if (!(ops = rtnl_tc_lookup_ops(tm->tm_type, tm->tm_name))) { + nl_cli_fatal(ENOENT, "Unable to register CLI TC module " + "\"%s\": No matching libnl TC module found.", tm->tm_name); + } + + if (__nl_cli_tc_lookup(ops)) { + nl_cli_fatal(EEXIST, "Unable to register CLI TC module " + "\"%s\": Module already registered.", tm->tm_name); + } + + tm->tm_ops = ops; + + nl_list_add_tail(&tm->tm_list, &tc_modules); +} + +void nl_cli_tc_unregister(struct nl_cli_tc_module *tm) +{ + nl_list_del(&tm->tm_list); +} + + /** @} */ |