Home | History | Annotate | Download | only in link
      1 /*
      2  * lib/route/link/api.c		Link Info API
      3  *
      4  *	This library is free software; you can redistribute it and/or
      5  *	modify it under the terms of the GNU Lesser General Public
      6  *	License as published by the Free Software Foundation version 2.1
      7  *	of the License.
      8  *
      9  * Copyright (c) 2003-2008 Thomas Graf <tgraf (at) suug.ch>
     10  */
     11 
     12 /**
     13  * @ingroup link
     14  * @defgroup link_info Link Info API
     15  * @brief
     16  *
     17  * @par 1) Registering/Unregistering a new link info type
     18  * @code
     19  * static struct rtnl_link_info_ops vlan_info_ops = {
     20  * 	.io_name		= "vlan",
     21  * 	.io_alloc		= vlan_alloc,
     22  * 	.io_parse		= vlan_parse,
     23  * 	.io_dump[NL_DUMP_BRIEF]	= vlan_dump_brief,
     24  * 	.io_dump[NL_DUMP_FULL]	= vlan_dump_full,
     25  * 	.io_free		= vlan_free,
     26  * };
     27  *
     28  * static void __init vlan_init(void)
     29  * {
     30  * 	rtnl_link_register_info(&vlan_info_ops);
     31  * }
     32  *
     33  * static void __exit vlan_exit(void)
     34  * {
     35  * 	rtnl_link_unregister_info(&vlan_info_ops);
     36  * }
     37  * @endcode
     38  *
     39  * @{
     40  */
     41 
     42 #include <netlink-local.h>
     43 #include <netlink/netlink.h>
     44 #include <netlink/utils.h>
     45 #include <netlink/route/link.h>
     46 #include <netlink/route/link/info-api.h>
     47 
     48 static struct rtnl_link_info_ops *info_ops;
     49 
     50 struct rtnl_link_info_ops *rtnl_link_info_ops_lookup(const char *name)
     51 {
     52 	struct rtnl_link_info_ops *ops;
     53 
     54 	for (ops = info_ops; ops; ops = ops->io_next)
     55 		if (!strcmp(ops->io_name, name))
     56 			return ops;
     57 
     58 	return NULL;
     59 }
     60 
     61 int rtnl_link_register_info(struct rtnl_link_info_ops *ops)
     62 {
     63 	if (ops->io_name == NULL)
     64 		return -NLE_INVAL;
     65 
     66 	if (rtnl_link_info_ops_lookup(ops->io_name))
     67 		return -NLE_EXIST;
     68 
     69 	NL_DBG(1, "Registered link info operations %s\n", ops->io_name);
     70 
     71 	ops->io_next = info_ops;
     72 	info_ops = ops;
     73 
     74 	return 0;
     75 }
     76 
     77 int rtnl_link_unregister_info(struct rtnl_link_info_ops *ops)
     78 {
     79 	struct rtnl_link_info_ops *t, **tp;
     80 
     81 	for (tp = &info_ops; (t=*tp) != NULL; tp = &t->io_next)
     82 		if (t == ops)
     83 			break;
     84 
     85 	if (!t)
     86 		return -NLE_OPNOTSUPP;
     87 
     88 	if (t->io_refcnt > 0)
     89 		return -NLE_BUSY;
     90 
     91 	NL_DBG(1, "Unregistered link info perations %s\n", ops->io_name);
     92 
     93 	*tp = t->io_next;
     94 	return 0;
     95 }
     96 
     97 /** @} */
     98 
     99