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