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