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-2008 Thomas Graf <tgraf (at) 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 */ 37 int rtnl_class_register(struct rtnl_class_ops *cops) 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 -NLE_EXIST; 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 */ 58 int rtnl_class_unregister(struct rtnl_class_ops *cops) 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 -NLE_OBJ_NOTFOUND; 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 /** @} */ 103