144d362409d5469aed47d19e7908d19bd194493aThomas Graf/*
244d362409d5469aed47d19e7908d19bd194493aThomas Graf * lib/route/class_api.c            Queueing Classes 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 *
98a3efffa5b3fde252675239914118664d36a2c24Thomas Graf * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch>
1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf
1244d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
1344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @ingroup class
1444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @defgroup class_api Class 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/route/tc.h>
2244d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/class.h>
2344d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/class-modules.h>
2444d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/utils.h>
2544d362409d5469aed47d19e7908d19bd194493aThomas Graf
2644d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic struct rtnl_class_ops *class_ops_list;
2744d362409d5469aed47d19e7908d19bd194493aThomas Graf
2844d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
2944d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Module API
3044d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{
3144d362409d5469aed47d19e7908d19bd194493aThomas Graf */
3244d362409d5469aed47d19e7908d19bd194493aThomas Graf
3344d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
3444d362409d5469aed47d19e7908d19bd194493aThomas Graf * Register a class module
3544d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg cops		class module operations
3644d362409d5469aed47d19e7908d19bd194493aThomas Graf */
3744d362409d5469aed47d19e7908d19bd194493aThomas Grafint rtnl_class_register(struct rtnl_class_ops *cops)
3844d362409d5469aed47d19e7908d19bd194493aThomas Graf{
3944d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_class_ops *o, **op;
4044d362409d5469aed47d19e7908d19bd194493aThomas Graf
4144d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (!cops->co_kind[0])
4244d362409d5469aed47d19e7908d19bd194493aThomas Graf		BUG();
4344d362409d5469aed47d19e7908d19bd194493aThomas Graf
4444d362409d5469aed47d19e7908d19bd194493aThomas Graf	for (op = &class_ops_list; (o = *op) != NULL; op = &o->co_next)
4544d362409d5469aed47d19e7908d19bd194493aThomas Graf		if (!strcasecmp(cops->co_kind, o->co_kind))
468a3efffa5b3fde252675239914118664d36a2c24Thomas Graf			return -NLE_EXIST;
4744d362409d5469aed47d19e7908d19bd194493aThomas Graf
4844d362409d5469aed47d19e7908d19bd194493aThomas Graf	cops->co_next = NULL;
4944d362409d5469aed47d19e7908d19bd194493aThomas Graf	*op = cops;
5044d362409d5469aed47d19e7908d19bd194493aThomas Graf
5144d362409d5469aed47d19e7908d19bd194493aThomas Graf	return 0;
5244d362409d5469aed47d19e7908d19bd194493aThomas Graf}
5344d362409d5469aed47d19e7908d19bd194493aThomas Graf
5444d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
5544d362409d5469aed47d19e7908d19bd194493aThomas Graf * Unregister a class module
5644d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg cops		class module operations
5744d362409d5469aed47d19e7908d19bd194493aThomas Graf */
5844d362409d5469aed47d19e7908d19bd194493aThomas Grafint rtnl_class_unregister(struct rtnl_class_ops *cops)
5944d362409d5469aed47d19e7908d19bd194493aThomas Graf{
6044d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_class_ops *o, **op;
6144d362409d5469aed47d19e7908d19bd194493aThomas Graf
6244d362409d5469aed47d19e7908d19bd194493aThomas Graf	for (op = &class_ops_list; (o = *op) != NULL; op = &o->co_next)
6344d362409d5469aed47d19e7908d19bd194493aThomas Graf		if (!strcasecmp(cops->co_kind, o->co_kind))
6444d362409d5469aed47d19e7908d19bd194493aThomas Graf			break;
6544d362409d5469aed47d19e7908d19bd194493aThomas Graf
6644d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (!o)
678a3efffa5b3fde252675239914118664d36a2c24Thomas Graf		return -NLE_OBJ_NOTFOUND;
6844d362409d5469aed47d19e7908d19bd194493aThomas Graf
6944d362409d5469aed47d19e7908d19bd194493aThomas Graf	*op = cops->co_next;
7044d362409d5469aed47d19e7908d19bd194493aThomas Graf
7144d362409d5469aed47d19e7908d19bd194493aThomas Graf	return 0;
7244d362409d5469aed47d19e7908d19bd194493aThomas Graf}
7344d362409d5469aed47d19e7908d19bd194493aThomas Graf
7444d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_class_ops *__rtnl_class_lookup_ops(const char *kind)
7544d362409d5469aed47d19e7908d19bd194493aThomas Graf{
7644d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_class_ops *cops;
7744d362409d5469aed47d19e7908d19bd194493aThomas Graf
7844d362409d5469aed47d19e7908d19bd194493aThomas Graf	for (cops = class_ops_list; cops; cops = cops->co_next)
7944d362409d5469aed47d19e7908d19bd194493aThomas Graf		if (!strcmp(kind, cops->co_kind))
8044d362409d5469aed47d19e7908d19bd194493aThomas Graf			return cops;
8144d362409d5469aed47d19e7908d19bd194493aThomas Graf
8244d362409d5469aed47d19e7908d19bd194493aThomas Graf	return NULL;
8344d362409d5469aed47d19e7908d19bd194493aThomas Graf}
8444d362409d5469aed47d19e7908d19bd194493aThomas Graf
8544d362409d5469aed47d19e7908d19bd194493aThomas Graf/**
8644d362409d5469aed47d19e7908d19bd194493aThomas Graf * Lookup class operations for a class object
8744d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg class		Class object.
8844d362409d5469aed47d19e7908d19bd194493aThomas Graf *
8944d362409d5469aed47d19e7908d19bd194493aThomas Graf * @return Class operations or NULL if not found.
9044d362409d5469aed47d19e7908d19bd194493aThomas Graf */
9144d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct rtnl_class_ops *rtnl_class_lookup_ops(struct rtnl_class *class)
9244d362409d5469aed47d19e7908d19bd194493aThomas Graf{
9344d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (!class->c_ops)
9444d362409d5469aed47d19e7908d19bd194493aThomas Graf		class->c_ops = __rtnl_class_lookup_ops(class->c_kind);
9544d362409d5469aed47d19e7908d19bd194493aThomas Graf
9644d362409d5469aed47d19e7908d19bd194493aThomas Graf	return class->c_ops;
9744d362409d5469aed47d19e7908d19bd194493aThomas Graf}
9844d362409d5469aed47d19e7908d19bd194493aThomas Graf
9944d362409d5469aed47d19e7908d19bd194493aThomas Graf
10044d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */
10144d362409d5469aed47d19e7908d19bd194493aThomas Graf
10244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */
103