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
26static 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
74struct 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 */
91struct 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/** @} */
int rtnl_class_unregister(struct rtnl_class_ops *cops)
Unregister a class module.
Definition: class_api.c:58
int rtnl_class_register(struct rtnl_class_ops *cops)
Register a class module.
Definition: class_api.c:37
struct rtnl_class_ops * rtnl_class_lookup_ops(struct rtnl_class *class)
Lookup class operations for a class object.
Definition: class_api.c:91
Class operations.
Definition: class-modules.h:26
char co_kind[32]
Kind/Name of class.
Definition: class-modules.h:30
struct rtnl_class_ops * co_next
INTERNAL (Do not use)
Definition: class-modules.h:61