diff options
Diffstat (limited to 'ospf6d/ospf6_hook.c')
-rw-r--r-- | ospf6d/ospf6_hook.c | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/ospf6d/ospf6_hook.c b/ospf6d/ospf6_hook.c new file mode 100644 index 000000000..fc9e185db --- /dev/null +++ b/ospf6d/ospf6_hook.c @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2001 Yasuhiro Ohara + * + * This file is part of GNU Zebra. + * + * GNU Zebra is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * GNU Zebra is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Zebra; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <zebra.h> + +#include "log.h" +#include "memory.h" + +#include "ospf6_hook.h" + +struct ospf6_hook_master neighbor_hook; +struct ospf6_hook_master interface_hook; +struct ospf6_hook_master area_hook; +struct ospf6_hook_master top_hook; +struct ospf6_hook_master database_hook; +struct ospf6_hook_master intra_topology_hook; +struct ospf6_hook_master inter_topology_hook; +struct ospf6_hook_master route_hook; +struct ospf6_hook_master redistribute_hook; + +static struct ospf6_hook * +ospf6_hook_create () +{ + struct ospf6_hook *new; + new = XMALLOC (MTYPE_OSPF6_OTHER, sizeof (struct ospf6_hook)); + if (new == NULL) + return NULL; + memset (new, 0, sizeof (struct ospf6_hook)); + return new; +} + +static void +ospf6_hook_delete (struct ospf6_hook *hook) +{ + XFREE (MTYPE_OSPF6_OTHER, hook); +} + +static int +ospf6_hook_issame (struct ospf6_hook *hook1, struct ospf6_hook *hook2) +{ + if (hook1->name && hook2->name && + strcmp (hook1->name, hook2->name) != 0) + return 0; + if (hook1->hook_add != hook2->hook_add) + return 0; + if (hook1->hook_change != hook2->hook_change) + return 0; + if (hook1->hook_remove != hook2->hook_remove) + return 0; + return 1; +} + +void +ospf6_hook_register (struct ospf6_hook *hook, + struct ospf6_hook_master *master) +{ + struct ospf6_hook *new; + + new = ospf6_hook_create (); + + if (hook->name) + new->name = strdup (hook->name); + new->hook_add = hook->hook_add; + new->hook_change = hook->hook_change; + new->hook_remove = hook->hook_remove; + + new->prev = master->tail; + if (master->tail) + master->tail->next = new; + + master->tail = new; + if (! master->head) + master->head = new; + + master->count++; + + if (IS_OSPF6_DUMP_HOOK) + { + zlog_info ("HOOK: Register hook%s%s%s%s", + (hook->name ? " " : ""), + (hook->name ? hook->name : ""), + (master->name ? " to " : ""), + (master->name ? master->name : "")); + } +} + +void +ospf6_hook_unregister (struct ospf6_hook *req, + struct ospf6_hook_master *master) +{ + struct ospf6_hook *hook; + + for (hook = master->head; hook; hook = hook->next) + { + if (ospf6_hook_issame (hook, req)) + break; + } + if (! hook) + return; + + if (hook->prev) + hook->prev->next = hook->next; + if (hook->next) + hook->next->prev = hook->prev; + if (master->head == hook) + master->head = hook->next; + if (master->tail == hook) + master->tail = hook->prev; + + master->count--; + + if (IS_OSPF6_DUMP_HOOK) + { + zlog_info ("HOOK: Unregister hook%s%s%s%s", + (hook->name ? " " : ""), + (hook->name ? hook->name : ""), + (master->name ? " to " : ""), + (master->name ? master->name : "")); + } + + if (hook->name) + free (hook->name); + ospf6_hook_delete (hook); +} + +void +ospf6_hook_unregister_all (struct ospf6_hook_master *master) +{ + struct ospf6_hook *hook, *next; + + for (hook = master->head; hook; hook = next) + { + next = hook->next; + ospf6_hook_delete (hook); + } + + master->head = NULL; + master->tail = NULL; + master->count = 0; +} + + +void +ospf6_hook_init () +{ + neighbor_hook.name = "Neighbor Hooklist"; + interface_hook.name = "Interface Hooklist"; + area_hook.name = "Area Hooklist"; + top_hook.name = "Top Hooklist"; + database_hook.name = "Database Hooklist"; + intra_topology_hook.name = "IntraTopology Hooklist"; + inter_topology_hook.name = "InterTopology Hooklist"; + route_hook.name = "Route Hooklist"; +} + + |