diff options
Diffstat (limited to 'ospfd')
| -rw-r--r-- | ospfd/ospf_route.c | 18 | ||||
| -rw-r--r-- | ospfd/ospf_route.h | 3 | ||||
| -rw-r--r-- | ospfd/ospf_spf.c | 34 | 
3 files changed, 33 insertions, 22 deletions
diff --git a/ospfd/ospf_route.c b/ospfd/ospf_route.c index 3a1fa999..50fba750 100644 --- a/ospfd/ospf_route.c +++ b/ospfd/ospf_route.c @@ -481,7 +481,8 @@ ospf_intra_add_transit (struct route_table *rt, struct vertex *v,  /* RFC2328 16.1. second stage. */  void  ospf_intra_add_stub (struct route_table *rt, struct router_lsa_link *link, -		     struct vertex *v, struct ospf_area *area) +		     struct vertex *v, struct ospf_area *area, +		     int parent_is_root)  {    u_int32_t cost;    struct route_node *rn; @@ -514,7 +515,20 @@ ospf_intra_add_stub (struct route_table *rt, struct router_lsa_link *link,    if (IS_DEBUG_OSPF_EVENT)      zlog_debug ("ospf_intra_add_stub(): calculated cost is %d + %d = %d",   	       v->distance, ntohs(link->m[0].metric), cost); - +   +  /* PtP links with /32 masks adds host routes to remote, directly +   * connected hosts, see RFC 2328, 12.4.1.1, Option 1. +   * Such routes can just be ignored for the sake of tidyness. +   */ +  if (parent_is_root && link->link_data.s_addr == 0xffffffff && +      ospf_if_lookup_by_local_addr (area->ospf, NULL, link->link_id)) +    { +      if (IS_DEBUG_OSPF_EVENT) +        zlog_debug ("%s: ignoring host route %s/32 to self.", +                    __func__, inet_ntoa (link->link_id)); +      return; +    } +      rn = route_node_get (rt, (struct prefix *) &p);    /* Lookup current routing table. */ diff --git a/ospfd/ospf_route.h b/ospfd/ospf_route.h index 351e014d..0d37436d 100644 --- a/ospfd/ospf_route.h +++ b/ospfd/ospf_route.h @@ -140,7 +140,8 @@ extern void ospf_intra_add_transit (struct route_table *, struct vertex *,  extern void ospf_intra_add_stub (struct route_table *,  				 struct router_lsa_link *, struct vertex *, -				 struct ospf_area *); +				 struct ospf_area *, +				 int parent_is_root);  extern int ospf_route_cmp (struct ospf *, struct ospf_route *,  			   struct ospf_route *); diff --git a/ospfd/ospf_spf.c b/ospfd/ospf_spf.c index 15d27be7..82f0fedd 100644 --- a/ospfd/ospf_spf.c +++ b/ospfd/ospf_spf.c @@ -946,7 +946,8 @@ ospf_spf_dump (struct vertex *v, int i)  /* Second stage of SPF calculation. */  static void  ospf_spf_process_stubs (struct ospf_area *area, struct vertex *v, -                        struct route_table *rt) +                        struct route_table *rt, +                        int parent_is_root)  {    struct listnode *cnode, *cnnode;    struct vertex *child; @@ -981,21 +982,7 @@ ospf_spf_process_stubs (struct ospf_area *area, struct vertex *v,                  (l->m[0].tos_count * ROUTER_LSA_TOS_SIZE));            if (l->m[0].type == LSA_LINK_TYPE_STUB) -	    { -	      /* PtP links with /32 masks adds host routes to the remote host, -		 see RFC 2328, 12.4.1.1, Option 1. -		 Make sure that such routes are ignored */ -	      /* XXX: Change to breadth-first and avoid the lookup */ -	      if (l->link_data.s_addr == 0xffffffff && -		  ospf_if_lookup_by_local_addr (area->ospf, NULL, l->link_id)) -		{ -		  if (IS_DEBUG_OSPF_EVENT) -		    zlog_debug ("ospf_spf_process_stubs(): ignoring host route " -				"%s/32 to self.", inet_ntoa (l->link_id)); -		  continue; -		} -	      ospf_intra_add_stub (rt, l, v, area); -	    } +            ospf_intra_add_stub (rt, l, v, area, parent_is_root);          }      } @@ -1005,8 +992,17 @@ ospf_spf_process_stubs (struct ospf_area *area, struct vertex *v,      {        if (CHECK_FLAG (child->flags, OSPF_VERTEX_PROCESSED))          continue; - -      ospf_spf_process_stubs (area, child, rt); +       +      /* the first level of routers connected to the root +       * should have 'parent_is_root' set, including those  +       * connected via a network vertex. +       */ +      if (area->spf == v) +        parent_is_root = 1; +      else if (v->type == OSPF_VERTEX_ROUTER) +        parent_is_root = 0; +         +      ospf_spf_process_stubs (area, child, rt, parent_is_root);        SET_FLAG (child->flags, OSPF_VERTEX_PROCESSED);      } @@ -1193,7 +1189,7 @@ ospf_spf_calculate (struct ospf_area *area, struct route_table *new_table,      }    /* Second stage of SPF calculation procedure's  */ -  ospf_spf_process_stubs (area, area->spf, new_table); +  ospf_spf_process_stubs (area, area->spf, new_table, 0);    /* Free candidate queue. */    pqueue_delete (candidate);  | 
