]>
git.proxmox.com Git - mirror_frr.git/blob - lib/qobj.c
8a386d24862e35a0cdf5e81c34f49d56a35aaaf0
2 * Copyright (c) 2015-16 David Lamparter, for NetDEF, Inc.
4 * This file is part of Quagga
6 * Quagga is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * Quagga is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with Quagga; see the file COPYING. If not, write to the Free
18 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
30 static struct hash
*nodes
= NULL
;
32 static unsigned int qobj_key (void *data
)
34 struct qobj_node
*node
= data
;
35 return (unsigned int)node
->nid
;
38 static int qobj_cmp (const void *a
, const void *b
)
40 const struct qobj_node
*na
= a
, *nb
= b
;
41 return na
->nid
== nb
->nid
;
44 void qobj_reg(struct qobj_node
*node
, struct qobj_nodetype
*type
)
49 node
->nid
= (uint64_t)random();
50 node
->nid
^= (uint64_t)random() << 32;
52 while (!node
->nid
|| hash_get (nodes
, node
, hash_alloc_intern
) != node
);
55 void qobj_unreg(struct qobj_node
*node
)
57 hash_release (nodes
, node
);
60 struct qobj_node
*qobj_get(uint64_t id
)
62 struct qobj_node dummy
= { .nid
= id
};
63 return hash_lookup (nodes
, &dummy
);
66 void *qobj_get_typed(uint64_t id
, struct qobj_nodetype
*type
)
68 struct qobj_node
*node
= qobj_get(id
);
69 if (!node
|| node
->type
!= type
)
71 return (char *)node
- node
->type
->node_member_offset
;
77 nodes
= hash_create (qobj_key
, qobj_cmp
);
80 void qobj_finish (void)
82 hash_clean (nodes
, NULL
);