36#include "nl-default.h"
38#include <netlink/netlink.h>
39#include <netlink/utils.h>
40#include <netlink/route/link.h>
45static NL_LIST_HEAD(info_ops);
48static NL_RW_LOCK(info_lock);
54 nl_list_for_each_entry(ops, &info_ops, io_list)
55 if (!strcmp(ops->
io_name, name))
78 nl_write_lock(&info_lock);
79 if ((ops = __rtnl_link_info_ops_lookup(name)))
81 nl_write_unlock(&info_lock);
95 nl_write_lock(&info_lock);
97 nl_write_unlock(&info_lock);
109 nl_write_lock(&info_lock);
112 nl_write_unlock(&info_lock);
134 nl_write_lock(&info_lock);
135 if (__rtnl_link_info_ops_lookup(ops->
io_name)) {
140 NL_DBG(1,
"Registered link info operations %s\n", ops->
io_name);
142 nl_list_add_tail(&ops->io_list, &info_ops);
144 nl_write_unlock(&info_lock);
165 int err = -NLE_OPNOTSUPP;
167 nl_write_lock(&info_lock);
169 nl_list_for_each_entry(t, &info_ops, io_list) {
177 nl_list_del(&t->io_list);
179 NL_DBG(1,
"Unregistered link info operations %s\n",
187 nl_write_unlock(&info_lock);
211 if (family == AF_UNSPEC || family >= AF_MAX)
214 nl_write_lock(&info_lock);
217 nl_write_unlock(&info_lock);
219 return af_ops[family];
229 nl_write_lock(&info_lock);
231 nl_write_unlock(&info_lock);
259 if (!link->l_af_data[family]) {
263 link->l_af_data[family] = ops->
ao_alloc(link);
264 if (!link->l_af_data[family])
268 return link->l_af_data[family];
312 nl_write_lock(&info_lock);
321 NL_DBG(1,
"Registered link address family operations %u\n",
325 nl_write_unlock(&info_lock);
346 int err = -NLE_INVAL;
351 nl_write_lock(&info_lock);
353 err = -NLE_OBJ_NOTFOUND;
364 NL_DBG(1,
"Unregistered link address family operations %u\n",
368 nl_write_unlock(&info_lock);
391 if (!a->l_af_data[family] && !b->l_af_data[family])
394 if (!a->l_af_data[family] || !b->l_af_data[family])
406 ret = af_ops->
ao_compare(a, b, family, ~0, 0);
427 if (a->l_info_ops != b->l_info_ops)
430 if (!a->l_info_ops || !a->l_info_ops->
io_compare)
433 return a->l_info_ops->
io_compare(a, b, flags);
void rtnl_link_af_ops_put(struct rtnl_link_af_ops *ops)
Give back reference to a set of operations.
int rtnl_link_register_info(struct rtnl_link_info_ops *ops)
Register operations for a link info type.
void * rtnl_link_af_alloc(struct rtnl_link *link, const struct rtnl_link_af_ops *ops)
Allocate and return data buffer for link address family modules.
int rtnl_link_info_data_compare(struct rtnl_link *a, struct rtnl_link *b, int flags)
Compare link info data.
int rtnl_link_unregister_info(struct rtnl_link_info_ops *ops)
Unregister operations for a link info type.
void rtnl_link_info_ops_get(struct rtnl_link_info_ops *ops)
Take reference to a set of operations.
int rtnl_link_af_unregister(struct rtnl_link_af_ops *ops)
Unregister operations for a link address family.
int rtnl_link_af_register(struct rtnl_link_af_ops *ops)
Register operations for a link address family.
struct rtnl_link_info_ops * rtnl_link_info_ops_lookup(const char *name)
Return operations of a specific link info type.
int rtnl_link_af_data_compare(struct rtnl_link *a, struct rtnl_link *b, int family)
Compare af data for a link address family.
void rtnl_link_info_ops_put(struct rtnl_link_info_ops *ops)
Give back reference to a set of operations.
struct rtnl_link_af_ops * rtnl_link_af_ops_lookup(const unsigned int family)
Return operations of a specific link address family.
void * rtnl_link_af_data(const struct rtnl_link *link, const struct rtnl_link_af_ops *ops)
Return data buffer for link address family modules.
Available operations to modules implementing a link address family.
void *(* ao_alloc)(struct rtnl_link *)
Called after address family has been assigned to link.
int(* ao_compare)(struct rtnl_link *, struct rtnl_link *, int, uint32_t, int)
Comparison function.
const unsigned int ao_family
The address family this operations set implements.
int ao_refcnt
Number of users of this operations, DO NOT MODIFY.
Available operations to modules implementing a link info type.
char * io_name
Name of link info type, must match name on kernel side.
int io_refcnt
Reference count, DO NOT MODIFY.
int(* io_compare)(struct rtnl_link *, struct rtnl_link *, int flags)
Called to compare link info parameters between two links.