42 #include <netlink-private/netlink.h>
43 #include <netlink/netlink.h>
44 #include <netlink/utils.h>
45 #include <netlink/route/link.h>
46 #include <netlink-private/route/link/api.h>
48 static NL_LIST_HEAD(info_ops);
51 static NL_RW_LOCK(info_lock);
53 static struct rtnl_link_info_ops *__rtnl_link_info_ops_lookup(
const char *name)
55 struct rtnl_link_info_ops *ops;
57 nl_list_for_each_entry(ops, &info_ops, io_list)
58 if (!strcmp(ops->io_name, name))
79 struct rtnl_link_info_ops *ops;
81 nl_write_lock(&info_lock);
82 if ((ops = __rtnl_link_info_ops_lookup(name)))
84 nl_write_unlock(&info_lock);
115 if (ops->io_name == NULL)
118 nl_write_lock(&info_lock);
119 if (__rtnl_link_info_ops_lookup(ops->io_name)) {
124 NL_DBG(1,
"Registered link info operations %s\n", ops->io_name);
126 nl_list_add_tail(&ops->io_list, &info_ops);
128 nl_write_unlock(&info_lock);
148 struct rtnl_link_info_ops *t;
149 int err = -NLE_OPNOTSUPP;
151 nl_write_lock(&info_lock);
153 nl_list_for_each_entry(t, &info_ops, io_list) {
155 if (t->io_refcnt > 0) {
160 nl_list_del(&t->io_list);
162 NL_DBG(1,
"Unregistered link info operations %s\n",
170 nl_write_unlock(&info_lock);
182 static struct rtnl_link_af_ops *af_ops[AF_MAX];
194 if (family == AF_UNSPEC || family >= AF_MAX)
197 nl_write_lock(&info_lock);
199 af_ops[family]->ao_refcnt++;
200 nl_write_unlock(&info_lock);
202 return af_ops[family];
230 const struct rtnl_link_af_ops *ops)
237 family = ops->ao_family;
239 if (!link->l_af_data[family]) {
243 link->l_af_data[family] = ops->ao_alloc(link);
244 if (!link->l_af_data[family])
248 return link->l_af_data[family];
265 const struct rtnl_link_af_ops *ops)
270 return link->l_af_data[ops->ao_family];
289 if (ops->ao_family == AF_UNSPEC || ops->ao_family >= AF_MAX)
292 nl_write_lock(&info_lock);
293 if (af_ops[ops->ao_family]) {
299 af_ops[ops->ao_family] = ops;
301 NL_DBG(1,
"Registered link address family operations %u\n",
305 nl_write_unlock(&info_lock);
326 int err = -NLE_INVAL;
331 nl_write_lock(&info_lock);
332 if (!af_ops[ops->ao_family]) {
333 err = -NLE_OBJ_NOTFOUND;
337 if (ops->ao_refcnt > 0) {
342 af_ops[ops->ao_family] = NULL;
344 NL_DBG(1,
"Unregistered link address family operations %u\n",
348 nl_write_unlock(&info_lock);
368 struct rtnl_link_af_ops *af_ops;
371 if (!a->l_af_data[family] && !b->l_af_data[family])
374 if (!a->l_af_data[family] || !b->l_af_data[family])
381 if (af_ops->ao_compare == NULL) {
386 ret = af_ops->ao_compare(a, b, family, ~0, 0);