Home | History | Annotate | Download | only in route
      1 /*
      2  * lib/route/qdisc_api.c            Queueing Discipline 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 (at) suug.ch>
     10  */
     11 
     12 /**
     13  * @ingroup qdisc
     14  * @defgroup qdisc_api Queueing Discipline Modules
     15  * @{
     16  */
     17 
     18 #include <netlink-local.h>
     19 #include <netlink-tc.h>
     20 #include <netlink/netlink.h>
     21 #include <netlink/utils.h>
     22 #include <netlink/route/link.h>
     23 #include <netlink/route/tc.h>
     24 #include <netlink/route/qdisc.h>
     25 #include <netlink/route/class.h>
     26 #include <netlink/route/classifier.h>
     27 #include <netlink/route/qdisc-modules.h>
     28 
     29 static struct rtnl_qdisc_ops *qdisc_ops_list;
     30 
     31 /**
     32  * @name Module API
     33  * @{
     34  */
     35 
     36 /**
     37  * Register a qdisc module
     38  * @arg qops		qdisc module operations
     39  */
     40 int rtnl_qdisc_register(struct rtnl_qdisc_ops *qops)
     41 {
     42 	struct rtnl_qdisc_ops *o, **op;
     43 
     44 	if (!qops->qo_kind[0])
     45 		BUG();
     46 
     47 	for (op = &qdisc_ops_list; (o = *op) != NULL; op = &o->qo_next)
     48 		if (!strcasecmp(qops->qo_kind, o->qo_kind))
     49 			return -NLE_EXIST;
     50 
     51 	qops->qo_next = NULL;
     52 	*op = qops;
     53 
     54 	return 0;
     55 }
     56 
     57 /**
     58  * Unregister a qdisc module
     59  * @arg qops		qdisc module operations
     60  */
     61 int rtnl_qdisc_unregister(struct rtnl_qdisc_ops *qops)
     62 {
     63 	struct rtnl_qdisc_ops *o, **op;
     64 
     65 	for (op = &qdisc_ops_list; (o = *op) != NULL; op = &o->qo_next)
     66 		if (!strcasecmp(qops->qo_kind, o->qo_kind))
     67 			break;
     68 
     69 	if (!o)
     70 		return -NLE_OBJ_NOTFOUND;
     71 
     72 	*op = qops->qo_next;
     73 
     74 	return 0;
     75 }
     76 
     77 struct rtnl_qdisc_ops *__rtnl_qdisc_lookup_ops(const char *kind)
     78 {
     79 	struct rtnl_qdisc_ops *qops;
     80 
     81 	for (qops = qdisc_ops_list; qops; qops = qops->qo_next)
     82 		if (!strcmp(kind, qops->qo_kind))
     83 			return qops;
     84 
     85 	return NULL;
     86 }
     87 
     88 struct rtnl_qdisc_ops *rtnl_qdisc_lookup_ops(struct rtnl_qdisc *qdisc)
     89 {
     90 	if (!qdisc->q_ops)
     91 		qdisc->q_ops = __rtnl_qdisc_lookup_ops(qdisc->q_kind);
     92 
     93 	return qdisc->q_ops;
     94 }
     95 
     96 /** @} */
     97 
     98 /** @} */
     99