Browse Source

ospf: forward ref. of areas for "max-metric router-lsa administrative" cmd

In the event areas are created at a later point of time with respect
to the playback of the "max-metric router-lsa administrative" command,
those areas do not get into indefinite max-metric mode. This patch is
inteneded to store the configuration and apply it to all future areas
that may be created.

In the process, some other bugs that were there with respect to restart
etc are fixed up.

Tested locally to see that the fix works across multiple
areas and across multiple restarts.

Signed-off-by: Ayan Banerjee <ayan@cumulusnetworks.com>
Reviewed-by: Scott Feldman <sfeldma@cumulusnetworks.com>
Reviewed-by: JR Rivers <jrrivers@cumulusnetworks.com>
Signed-off-by: Scott Feldman <sfeldma@cumulusnetworks.com>
Ayan Banerjee 7 years ago
parent
commit
4ba4fc8576
3 changed files with 14 additions and 1 deletions
  1. 5 0
      ospfd/ospf_vty.c
  2. 6 1
      ospfd/ospfd.c
  3. 3 0
      ospfd/ospfd.h

+ 5 - 0
ospfd/ospf_vty.c

@@ -7020,6 +7020,10 @@ DEFUN (ospf_max_metric_router_lsa_admin,
       if (!CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
           ospf_router_lsa_update_area (area);
     }
+
+  /* Allows for areas configured later to get the property */
+  ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_SET;
+
   return CMD_SUCCESS;
 }
 
@@ -7047,6 +7051,7 @@ DEFUN (no_ospf_max_metric_router_lsa_admin,
           ospf_router_lsa_update_area (area);
         }
     }
+  ospf->stub_router_admin_set = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
   return CMD_SUCCESS;
 }
 

+ 6 - 1
ospfd/ospfd.c

@@ -182,7 +182,8 @@ ospf_new (void)
   
   new->stub_router_startup_time = OSPF_STUB_ROUTER_UNCONFIGURED;
   new->stub_router_shutdown_time = OSPF_STUB_ROUTER_UNCONFIGURED;
-  
+  new->stub_router_admin_set     = OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET;
+
   /* Distribute parameter init. */
   for (i = 0; i <= ZEBRA_ROUTE_MAX; i++)
     {
@@ -676,6 +677,10 @@ ospf_area_get (struct ospf *ospf, struct in_addr area_id, int format)
       area->format = format;
       listnode_add_sort (ospf->areas, area);
       ospf_check_abr_status (ospf);  
+      if (ospf->stub_router_admin_set == OSPF_STUB_ROUTER_ADMINISTRATIVE_SET)
+        {
+          SET_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED);
+        }
     }
 
   return area;

+ 3 - 0
ospfd/ospfd.h

@@ -195,6 +195,9 @@ struct ospf
   unsigned int stub_router_startup_time;	/* seconds */
   unsigned int stub_router_shutdown_time;	/* seconds */
 #define OSPF_STUB_ROUTER_UNCONFIGURED	  0
+  u_char       stub_router_admin_set;
+#define OSPF_STUB_ROUTER_ADMINISTRATIVE_SET     1
+#define OSPF_STUB_ROUTER_ADMINISTRATIVE_UNSET   0
 
 #define OSPF_STUB_MAX_METRIC_SUMMARY_COST	0x00ff0000