diff options
| author | hasso <hasso> | 2004-05-10 07:43:59 +0000 | 
|---|---|---|
| committer | hasso <hasso> | 2004-05-10 07:43:59 +0000 | 
| commit | dd669bb0e7102a5896925f98203fa991560748b7 (patch) | |
| tree | 80edd1c4792789a41226af378d8fb99f444b88b6 | |
| parent | 2a56df976d3fb0800921ef561c346b85e7acb6be (diff) | |
* Make updating redistributions work if prefix list is changed and it's
  used in route-map used to filter redistributions.
* Move ospf_prefix_list_update() function from ospfd.c to ospf_zebra.c.
| -rw-r--r-- | ospfd/ChangeLog | 7 | ||||
| -rw-r--r-- | ospfd/ospf_main.c | 1 | ||||
| -rw-r--r-- | ospfd/ospf_zebra.c | 60 | ||||
| -rw-r--r-- | ospfd/ospfd.c | 50 | 
4 files changed, 66 insertions, 52 deletions
| diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog index 77ffbe59..fa901ced 100644 --- a/ospfd/ChangeLog +++ b/ospfd/ChangeLog @@ -1,3 +1,10 @@ +2004-05-10 Hasso Tepper <hasso@estpak.ee> + +	* ospf_zebra.c, ospfd.c: Move ospf_prefix_list_update() function +	  to ospf_zebra.c from ospfd.c and add redistribution updates if +	  route-map is used in redistribution. +	* ospf_main.c: Remove now useless call to ospf_init(). +  2004-05-08 Paul Jakma <paul@dishone.st>  	* ospf_zebra.c: Sync with lib/zclient changes diff --git a/ospfd/ospf_main.c b/ospfd/ospf_main.c index d80aa26c..1ebc9e9e 100644 --- a/ospfd/ospf_main.c +++ b/ospfd/ospf_main.c @@ -268,7 +268,6 @@ main (int argc, char **argv)    prefix_list_init ();    /* OSPFd inits. */ -  ospf_init ();    ospf_if_init ();    ospf_zebra_init (); diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c index 518f554a..e42373c8 100644 --- a/ospfd/ospf_zebra.c +++ b/ospfd/ospf_zebra.c @@ -32,6 +32,7 @@  #include "memory.h"  #include "zclient.h"  #include "filter.h" +#include "plist.h"  #include "log.h"  #include "ospfd/ospfd.h" @@ -1038,7 +1039,62 @@ ospf_filter_update (struct access_list *access)    if (IS_OSPF_ABR (ospf) && abr_inv)      ospf_schedule_abr_task (ospf);  } - + +/* If prefix-list is updated, do some updates. */ +void +ospf_prefix_list_update (struct prefix_list *plist) +{ +  struct ospf *ospf; +  int type; +  int abr_inv = 0; +  struct ospf_area *area; +  listnode node; + +  /* If OSPF instatnce does not exist, return right now. */ +  ospf = ospf_lookup (); +  if (ospf == NULL) +    return; + +  /* Update all route-maps which are used as redistribution filters. +   * They might use prefix-list. +   */ +  for (type = 0; type < ZEBRA_ROUTE_MAX; type++) +    { +      if (ROUTEMAP (ospf, type) != NULL) +        { +          /* If route-map is not NULL it may be using this prefix list */ +          ospf_distribute_list_update (ospf, type); +          continue; +        } +    } + +  /* Update area filter-lists. */ +  for (node = listhead (ospf->areas); node; nextnode (node)) +    if ((area = getdata (node)) != NULL) +      { +      	/* Update filter-list in. */ +      	if (PREFIX_NAME_IN (area)) +          if (strcmp (PREFIX_NAME_IN (area), plist->name) == 0) +            { +              PREFIX_LIST_IN (area) = +                prefix_list_lookup (AFI_IP, PREFIX_NAME_IN (area)); +              abr_inv++; +            } + +        /* Update filter-list out. */ +        if (PREFIX_NAME_OUT (area)) +          if (strcmp (PREFIX_NAME_OUT (area), plist->name) == 0) +            { +              PREFIX_LIST_IN (area) = +                prefix_list_lookup (AFI_IP, PREFIX_NAME_OUT (area)); +              abr_inv++; +            } +      } + +  /* Schedule ABR task. */ +  if (IS_OSPF_ABR (ospf) && abr_inv) +    ospf_schedule_abr_task (ospf); +}  struct ospf_distance *  ospf_distance_new () @@ -1203,4 +1259,6 @@ ospf_zebra_init ()    access_list_add_hook (ospf_filter_update);    access_list_delete_hook (ospf_filter_update); +  prefix_list_add_hook (ospf_prefix_list_update); +  prefix_list_delete_hook (ospf_prefix_list_update);  } diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c index abf898ca..3cf93a67 100644 --- a/ospfd/ospfd.c +++ b/ospfd/ospfd.c @@ -1638,49 +1638,6 @@ ospf_nbr_nbma_poll_interval_unset (struct ospf *ospf, struct in_addr addr)    return 1;  } - -void -ospf_prefix_list_update (struct prefix_list *plist) -{ -  struct ospf *ospf; -  struct ospf_area *area; -  listnode node; -  int abr_inv = 0; - -  /* If OSPF instatnce does not exist, return right now. */ -  ospf = ospf_lookup (); -  if (ospf == NULL) -    return; - -  /* Update Area prefix-list. */ -  for (node = listhead (ospf->areas); node; nextnode (node)) -    { -      area = getdata (node); - -      /* Update filter-list in. */ -      if (PREFIX_NAME_IN (area)) -	if (strcmp (PREFIX_NAME_IN (area), plist->name) == 0) -	  { -	    PREFIX_LIST_IN (area) =  -	      prefix_list_lookup (AFI_IP, PREFIX_NAME_IN (area)); -	    abr_inv++; -	  } - -      /* Update filter-list out. */ -      if (PREFIX_NAME_OUT (area)) -	if (strcmp (PREFIX_NAME_OUT (area), plist->name) == 0) -	  { -	    PREFIX_LIST_IN (area) =  -	      prefix_list_lookup (AFI_IP, PREFIX_NAME_OUT (area)); -	    abr_inv++; -	  } -    } - -  /* Schedule ABR tasks. */ -  if (IS_OSPF_ABR (ospf) && abr_inv) -    ospf_schedule_abr_task (ospf); -} -  void  ospf_master_init ()  { @@ -1691,10 +1648,3 @@ ospf_master_init ()    om->master = thread_master_create ();    om->start_time = time (NULL);  } - -void -ospf_init () -{ -  prefix_list_add_hook (ospf_prefix_list_update); -  prefix_list_delete_hook (ospf_prefix_list_update); -} | 
