summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorThomas Graf <tgraf@suug.ch>2011-03-21 15:51:52 +0100
committerThomas Graf <tgraf@suug.ch>2011-03-21 15:51:52 +0100
commit8eb5b5532eae985a5f0911dccf2db8cb4e0a5de4 (patch)
tree0fec48d114edbb535bd234f2684acccf81447d13 /src/lib
parent5dc897d5de9f54078221b241e0122713207f5e0c (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.c10
-rw-r--r--src/lib/cls.c65
-rw-r--r--src/lib/qdisc.c96
-rw-r--r--src/lib/tc.c77
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);
+}
+
+
/** @} */