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