void eigrp_if_update(struct interface *ifp)
{
- struct listnode *node, *nnode;
struct route_node *rn;
struct eigrp *eigrp;
* In the event there are multiple eigrp autonymnous systems running,
* we need to check eac one and add the interface as approperate
*/
- for (ALL_LIST_ELEMENTS(eigrp_om->eigrp, node, nnode, eigrp)) {
+ frr_each (eigrp_master_hash, &eigrp_om->eigrp, eigrp) {
if (ifp->vrf->vrf_id != eigrp->vrf_id)
continue;
extern struct zclient *zclient;
extern struct in_addr router_id_zebra;
+int eigrp_master_hash_cmp(const struct eigrp *a, const struct eigrp *b)
+{
+ return a->vrf_id - b->vrf_id;
+}
+
+uint32_t eigrp_master_hash_hash(const struct eigrp *a)
+{
+ return a->vrf_id;
+}
/*
* void eigrp_router_id_update(struct eigrp *eigrp)
memset(&eigrp_master, 0, sizeof(eigrp_master));
eigrp_om = &eigrp_master;
- eigrp_om->eigrp = list_new();
+ eigrp_master_hash_init(&eigrp_om->eigrp);
monotime(&tv);
eigrp_om->start_time = tv.tv_sec;
eigrp = eigrp_lookup(vrf_id);
if (eigrp == NULL) {
eigrp = eigrp_new(as, vrf_id);
- listnode_add(eigrp_om->eigrp, eigrp);
+ eigrp_master_hash_add(&eigrp_om->eigrp, eigrp);
}
return eigrp;
void eigrp_terminate(void)
{
struct eigrp *eigrp;
- struct listnode *node, *nnode;
/* shutdown already in progress */
if (CHECK_FLAG(eigrp_om->options, EIGRP_MASTER_SHUTDOWN))
SET_FLAG(eigrp_om->options, EIGRP_MASTER_SHUTDOWN);
- for (ALL_LIST_ELEMENTS(eigrp_om->eigrp, node, nnode, eigrp))
+ frr_each (eigrp_master_hash, &eigrp_om->eigrp, eigrp)
eigrp_finish(eigrp);
+ eigrp_master_hash_fini(&eigrp_om->eigrp);
frr_fini();
}
eigrp_finish_final(eigrp);
/* eigrp being shut-down? If so, was this the last eigrp instance? */
- if (CHECK_FLAG(eigrp_om->options, EIGRP_MASTER_SHUTDOWN)
- && (listcount(eigrp_om->eigrp) == 0)) {
+ if (CHECK_FLAG(eigrp_om->options, EIGRP_MASTER_SHUTDOWN) &&
+ (eigrp_master_hash_count(&eigrp_om->eigrp) == 0)) {
if (zclient) {
zclient_stop(zclient);
zclient_free(zclient);
list_delete(&eigrp->topology_changes_externalIPV4);
list_delete(&eigrp->topology_changes_internalIPV4);
- listnode_delete(eigrp_om->eigrp, eigrp);
+ eigrp_master_hash_del(&eigrp_om->eigrp, eigrp);
stream_free(eigrp->ibuf);
distribute_list_delete(&eigrp->distribute_ctx);
/*Look for existing eigrp process*/
struct eigrp *eigrp_lookup(vrf_id_t vrf_id)
{
- struct eigrp *eigrp;
- struct listnode *node, *nnode;
+ struct eigrp *eigrp, lookup;
- for (ALL_LIST_ELEMENTS(eigrp_om->eigrp, node, nnode, eigrp))
- if (eigrp->vrf_id == vrf_id)
- return eigrp;
+ lookup.vrf_id = vrf_id;
+ eigrp = eigrp_master_hash_find(&eigrp_om->eigrp, &lookup);
- return NULL;
+ return eigrp;
}
#define EIGRP_TLV_MTR_VERSION 3 /* MTR TLVs with 32bit metric *Not Supported */
#define EIGRP_TLV_SAF_VERSION 4 /* SAF TLVs with 64bit metric *Not Supported */
+//PREDECL_HASH(eigrp_master_hash);
+
struct eigrp_master {
/* EIGRP instance. */
- struct list *eigrp;
+ struct eigrp_master_hash_head eigrp;
/* EIGRP thread master. */
struct event_loop *master;
extern struct eigrp *eigrp_lookup(vrf_id_t vrf_id);
extern void eigrp_router_id_update(struct eigrp *eigrp);
+extern int eigrp_master_hash_cmp(const struct eigrp *a, const struct eigrp *b);
+extern uint32_t eigrp_master_hash_hash(const struct eigrp *a);
+
+DECLARE_HASH(eigrp_master_hash, struct eigrp, eigrp_item, eigrp_master_hash_cmp,
+ eigrp_master_hash_hash);
+
#endif /* _ZEBRA_EIGRPD_H */