libnl  1.1.4
class_api.c
1 /*
2  * lib/route/class_api.c Queueing Classes Module API
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation version 2.1
7  * of the License.
8  *
9  * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch>
10  */
11 
12 /**
13  * @ingroup class
14  * @defgroup class_api Class Modules
15  * @{
16  */
17 
18 #include <netlink-local.h>
19 #include <netlink-tc.h>
20 #include <netlink/netlink.h>
21 #include <netlink/route/tc.h>
22 #include <netlink/route/class.h>
23 #include <netlink/route/class-modules.h>
24 #include <netlink/utils.h>
25 
26 static struct rtnl_class_ops *class_ops_list;
27 
28 /**
29  * @name Module API
30  * @{
31  */
32 
33 /**
34  * Register a class module
35  * @arg cops class module operations
36  */
38 {
39  struct rtnl_class_ops *o, **op;
40 
41  if (!cops->co_kind[0])
42  BUG();
43 
44  for (op = &class_ops_list; (o = *op) != NULL; op = &o->co_next)
45  if (!strcasecmp(cops->co_kind, o->co_kind))
46  return nl_errno(EEXIST);
47 
48  cops->co_next = NULL;
49  *op = cops;
50 
51  return 0;
52 }
53 
54 /**
55  * Unregister a class module
56  * @arg cops class module operations
57  */
59 {
60  struct rtnl_class_ops *o, **op;
61 
62  for (op = &class_ops_list; (o = *op) != NULL; op = &o->co_next)
63  if (!strcasecmp(cops->co_kind, o->co_kind))
64  break;
65 
66  if (!o)
67  return nl_errno(ENOENT);
68 
69  *op = cops->co_next;
70 
71  return 0;
72 }
73 
74 struct rtnl_class_ops *__rtnl_class_lookup_ops(const char *kind)
75 {
76  struct rtnl_class_ops *cops;
77 
78  for (cops = class_ops_list; cops; cops = cops->co_next)
79  if (!strcmp(kind, cops->co_kind))
80  return cops;
81 
82  return NULL;
83 }
84 
85 /**
86  * Lookup class operations for a class object
87  * @arg class Class object.
88  *
89  * @return Class operations or NULL if not found.
90  */
91 struct rtnl_class_ops *rtnl_class_lookup_ops(struct rtnl_class *class)
92 {
93  if (!class->c_ops)
94  class->c_ops = __rtnl_class_lookup_ops(class->c_kind);
95 
96  return class->c_ops;
97 }
98 
99 
100 /** @} */
101 
102 /** @} */