/* * src/cls-utils.c Classifier Helpers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation version 2 of the License. * * Copyright (c) 2008-2009 Thomas Graf */ #include "utils.h" struct rtnl_cls *nlt_alloc_cls(void) { struct rtnl_cls *cls; cls = rtnl_cls_alloc(); if (!cls) fatal(ENOMEM, "Unable to allocate classifier object"); return cls; } void parse_dev(struct rtnl_cls *cls, struct nl_cache *link_cache, char *arg) { int ival; if (!(ival = rtnl_link_name2i(link_cache, arg))) fatal(ENOENT, "Link \"%s\" does not exist", arg); rtnl_cls_set_ifindex(cls, ival); } void parse_prio(struct rtnl_cls *cls, char *arg) { uint32_t prio = parse_u32(arg); rtnl_cls_set_prio(cls, prio); } void parse_parent(struct rtnl_cls *cls, char *arg) { uint32_t parent; int err; if ((err = rtnl_tc_str2handle(arg, &parent)) < 0) fatal(err, "Unable to parse handle \"%s\": %s", arg, nl_geterror(err)); rtnl_cls_set_parent(cls, parent); } void parse_handle(struct rtnl_cls *cls, char *arg) { uint32_t handle; int err; if ((err = rtnl_tc_str2handle(arg, &handle)) < 0) fatal(err, "Unable to parse handle \"%s\": %s", arg, nl_geterror(err)); rtnl_cls_set_handle(cls, handle); } void parse_proto(struct rtnl_cls *cls, char *arg) { int proto = nl_str2ether_proto(arg); if (proto < 0) fatal(proto, "Unable to parse protocol \"%s\": %s", arg, nl_geterror(proto)); rtnl_cls_set_protocol(cls, proto); } static NL_LIST_HEAD(cls_modules); struct cls_module *lookup_cls_mod(struct rtnl_cls_ops *ops) { struct cls_module *mod; nl_list_for_each_entry(mod, &cls_modules, list) { if (mod->ops == ops) return mod; } return NULL; } void register_cls_module(struct cls_module *mod) { struct rtnl_cls_ops *ops; if (!(ops = __rtnl_cls_lookup_ops(mod->name))) fatal(ENOENT, "Could not locate classifier module \"%s\"", mod->name); if (lookup_cls_mod(ops) != NULL) fatal(EEXIST, "Duplicate classifier module registration."); mod->ops = ops; nl_list_add_tail(&mod->list, &cls_modules); } void unregister_cls_module(struct cls_module *mod) { nl_list_del(&mod->list); }