/* * 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 #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"; }