Home | History | Annotate | Download | only in route
      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