144d362409d5469aed47d19e7908d19bd194493aThomas Graf/* 244d362409d5469aed47d19e7908d19bd194493aThomas Graf * lib/route/qdisc_api.c Queueing Discipline Module API 344d362409d5469aed47d19e7908d19bd194493aThomas Graf * 444d362409d5469aed47d19e7908d19bd194493aThomas Graf * This library is free software; you can redistribute it and/or 544d362409d5469aed47d19e7908d19bd194493aThomas Graf * modify it under the terms of the GNU Lesser General Public 644d362409d5469aed47d19e7908d19bd194493aThomas Graf * License as published by the Free Software Foundation version 2.1 744d362409d5469aed47d19e7908d19bd194493aThomas Graf * of the License. 844d362409d5469aed47d19e7908d19bd194493aThomas Graf * 944d362409d5469aed47d19e7908d19bd194493aThomas Graf * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch> 1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 1144d362409d5469aed47d19e7908d19bd194493aThomas Graf 1244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 1344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @ingroup qdisc 1444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @defgroup qdisc_api Queueing Discipline Modules 1544d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 1644d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 1744d362409d5469aed47d19e7908d19bd194493aThomas Graf 1844d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink-local.h> 1944d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink-tc.h> 2044d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/netlink.h> 2144d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/utils.h> 2244d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/link.h> 2344d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/tc.h> 2444d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/qdisc.h> 2544d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/class.h> 2644d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/classifier.h> 2744d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/qdisc-modules.h> 2844d362409d5469aed47d19e7908d19bd194493aThomas Graf 2944d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic struct rtnl_qdisc_ops *qdisc_ops_list; 3044d362409d5469aed47d19e7908d19bd194493aThomas Graf 3144d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 3244d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Module API 3344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 3444d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 3544d362409d5469aed47d19e7908d19bd194493aThomas Graf 3644d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 3744d362409d5469aed47d19e7908d19bd194493aThomas Graf * Register a qdisc module 3844d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg qops qdisc module operations 3944d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 4044d362409d5469aed47d19e7908d19bd194493aThomas Grafint rtnl_qdisc_register(struct rtnl_qdisc_ops *qops) 4144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 4244d362409d5469aed47d19e7908d19bd194493aThomas Graf struct rtnl_qdisc_ops *o, **op; 4344d362409d5469aed47d19e7908d19bd194493aThomas Graf 4444d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!qops->qo_kind[0]) 4544d362409d5469aed47d19e7908d19bd194493aThomas Graf BUG(); 4644d362409d5469aed47d19e7908d19bd194493aThomas Graf 4744d362409d5469aed47d19e7908d19bd194493aThomas Graf for (op = &qdisc_ops_list; (o = *op) != NULL; op = &o->qo_next) 4844d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!strcasecmp(qops->qo_kind, o->qo_kind)) 498a3efffa5b3fde252675239914118664d36a2c24Thomas Graf return -NLE_EXIST; 5044d362409d5469aed47d19e7908d19bd194493aThomas Graf 5144d362409d5469aed47d19e7908d19bd194493aThomas Graf qops->qo_next = NULL; 5244d362409d5469aed47d19e7908d19bd194493aThomas Graf *op = qops; 5344d362409d5469aed47d19e7908d19bd194493aThomas Graf 5444d362409d5469aed47d19e7908d19bd194493aThomas Graf return 0; 5544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 5644d362409d5469aed47d19e7908d19bd194493aThomas Graf 5744d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 5844d362409d5469aed47d19e7908d19bd194493aThomas Graf * Unregister a qdisc module 5944d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg qops qdisc module operations 6044d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 6144d362409d5469aed47d19e7908d19bd194493aThomas Grafint rtnl_qdisc_unregister(struct rtnl_qdisc_ops *qops) 6244d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 6344d362409d5469aed47d19e7908d19bd194493aThomas Graf struct rtnl_qdisc_ops *o, **op; 6444d362409d5469aed47d19e7908d19bd194493aThomas Graf 6544d362409d5469aed47d19e7908d19bd194493aThomas Graf for (op = &qdisc_ops_list; (o = *op) != NULL; op = &o->qo_next) 6644d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!strcasecmp(qops->qo_kind, o->qo_kind)) 6744d362409d5469aed47d19e7908d19bd194493aThomas Graf break; 6844d362409d5469aed47d19e7908d19bd194493aThomas Graf 6944d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!o) 708a3efffa5b3fde252675239914118664d36a2c24Thomas Graf return -NLE_OBJ_NOTFOUND; 7144d362409d5469aed47d19e7908d19bd194493aThomas Graf 7244d362409d5469aed47d19e7908d19bd194493aThomas Graf *op = qops->qo_next; 7344d362409d5469aed47d19e7908d19bd194493aThomas Graf 7444d362409d5469aed47d19e7908d19bd194493aThomas Graf return 0; 7544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 7644d362409d5469aed47d19e7908d19bd194493aThomas Graf 7744d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_qdisc_ops *__rtnl_qdisc_lookup_ops(const char *kind) 7844d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 7944d362409d5469aed47d19e7908d19bd194493aThomas Graf struct rtnl_qdisc_ops *qops; 8044d362409d5469aed47d19e7908d19bd194493aThomas Graf 8144d362409d5469aed47d19e7908d19bd194493aThomas Graf for (qops = qdisc_ops_list; qops; qops = qops->qo_next) 8244d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!strcmp(kind, qops->qo_kind)) 8344d362409d5469aed47d19e7908d19bd194493aThomas Graf return qops; 8444d362409d5469aed47d19e7908d19bd194493aThomas Graf 8544d362409d5469aed47d19e7908d19bd194493aThomas Graf return NULL; 8644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 8744d362409d5469aed47d19e7908d19bd194493aThomas Graf 8844d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_qdisc_ops *rtnl_qdisc_lookup_ops(struct rtnl_qdisc *qdisc) 8944d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 9044d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!qdisc->q_ops) 9144d362409d5469aed47d19e7908d19bd194493aThomas Graf qdisc->q_ops = __rtnl_qdisc_lookup_ops(qdisc->q_kind); 9244d362409d5469aed47d19e7908d19bd194493aThomas Graf 9344d362409d5469aed47d19e7908d19bd194493aThomas Graf return qdisc->q_ops; 9444d362409d5469aed47d19e7908d19bd194493aThomas Graf} 9544d362409d5469aed47d19e7908d19bd194493aThomas Graf 9644d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 9744d362409d5469aed47d19e7908d19bd194493aThomas Graf 9844d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 99