]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ospfd: clean up default route logic
authorDavid Lamparter <equinox@diac24.net>
Mon, 29 Jul 2019 12:46:05 +0000 (14:46 +0200)
committerDavid Lamparter <equinox@diac24.net>
Fri, 2 Aug 2019 09:29:03 +0000 (11:29 +0200)
What a mess...

Signed-off-by: David Lamparter <equinox@diac24.net>
ospfd/ospf_lsa.c
ospfd/ospf_vty.c
ospfd/ospf_zebra.c
ospfd/ospfd.c

index 47327ad25c465cbd7d32825f2549dea3148e6d7a..db41df7c479bb96557f2e25792c52dc418bd9c17 100644 (file)
@@ -2202,28 +2202,20 @@ void ospf_external_lsa_refresh_default(struct ospf *ospf)
        ei = ospf_default_external_info(ospf);
        lsa = ospf_external_info_find_lsa(ospf, &p);
 
-       if (ei) {
-               if (lsa) {
-                       if (IS_DEBUG_OSPF_EVENT)
-                               zlog_debug(
-                                       "LSA[Type5:0.0.0.0]: Refresh AS-external-LSA %p",
-                                       (void *)lsa);
-                       ospf_external_lsa_refresh(ospf, lsa, ei,
-                                                 LSA_REFRESH_FORCE);
-               } else {
-                       if (IS_DEBUG_OSPF_EVENT)
-                               zlog_debug(
-                                       "LSA[Type5:0.0.0.0]: Originate AS-external-LSA");
-                       ospf_external_lsa_originate(ospf, ei);
-               }
-       } else {
-               if (lsa) {
-                       if (IS_DEBUG_OSPF_EVENT)
-                               zlog_debug(
-                                       "LSA[Type5:0.0.0.0]: Flush AS-external-LSA");
-                       ospf_refresher_unregister_lsa(ospf, lsa);
-                       ospf_lsa_flush_as(ospf, lsa);
-               }
+       if (ei && lsa) {
+               if (IS_DEBUG_OSPF_EVENT)
+                       zlog_debug("LSA[Type5:0.0.0.0]: Refresh AS-external-LSA %p",
+                                  (void *)lsa);
+               ospf_external_lsa_refresh(ospf, lsa, ei, LSA_REFRESH_FORCE);
+       } else if (ei && !lsa) {
+               if (IS_DEBUG_OSPF_EVENT)
+                       zlog_debug(
+                               "LSA[Type5:0.0.0.0]: Originate AS-external-LSA");
+               ospf_external_lsa_originate(ospf, ei);
+       } else if (lsa) {
+               if (IS_DEBUG_OSPF_EVENT)
+                       zlog_debug("LSA[Type5:0.0.0.0]: Flush AS-external-LSA");
+               ospf_external_lsa_flush(ospf, DEFAULT_ROUTE, &p, 0);
        }
 }
 
index 98ddd6a79eb54faad184c97e87ecc257e5a8761e..2564c6f3301397ebabf383102b71cd7612d933f8 100644 (file)
@@ -8487,22 +8487,8 @@ DEFUN (no_ospf_default_information_originate,
        "Pointer to route-map entries\n")
 {
        VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
-       struct prefix_ipv4 p;
-       struct ospf_external *ext;
        struct ospf_redist *red;
 
-       p.family = AF_INET;
-       p.prefix.s_addr = 0;
-       p.prefixlen = 0;
-
-       ospf_external_lsa_flush(ospf, DEFAULT_ROUTE, &p, 0);
-
-       ext = ospf_external_lookup(ospf, DEFAULT_ROUTE, 0);
-       if (ext && EXTERNAL_INFO(ext)) {
-               ospf_external_info_delete(ospf, DEFAULT_ROUTE, 0, p);
-               ospf_external_del(ospf, DEFAULT_ROUTE, 0);
-       }
-
        red = ospf_redist_lookup(ospf, DEFAULT_ROUTE, 0);
        if (!red)
                return CMD_SUCCESS;
@@ -8510,7 +8496,8 @@ DEFUN (no_ospf_default_information_originate,
        ospf_routemap_unset(red);
        ospf_redist_del(ospf, DEFAULT_ROUTE, 0);
 
-       return ospf_redistribute_default_unset(ospf);
+       return ospf_redistribute_default_set(ospf, DEFAULT_ORIGINATE_NONE,
+                                            0, 0);
 }
 
 DEFUN (ospf_default_metric,
index 0519092e40276beede0b7d5d39db7ea76e708257..47438b985e2aa58fe50ea350530f9e10f05fb9e7 100644 (file)
@@ -744,10 +744,10 @@ int ospf_redistribute_unset(struct ospf *ospf, int type,
 int ospf_redistribute_default_set(struct ospf *ospf, int originate, int mtype,
                                  int mvalue)
 {
-       struct ospf_external *ext;
        struct prefix_ipv4 p;
        struct in_addr nexthop;
        int cur_originate = ospf->default_originate;
+       const char *type_str = NULL;
 
        nexthop.s_addr = 0;
        p.family = AF_INET;
@@ -756,39 +756,7 @@ int ospf_redistribute_default_set(struct ospf *ospf, int originate, int mtype,
 
        ospf->default_originate = originate;
 
-       ospf_external_add(ospf, DEFAULT_ROUTE, 0);
-
-       if (cur_originate == DEFAULT_ORIGINATE_NONE) {
-               /* First time configuration */
-               if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE))
-                       zlog_debug("Redistribute[DEFAULT]: Start Type[%d], Metric[%d]",
-                       metric_type(ospf, DEFAULT_ROUTE, 0),
-                       metric_value(ospf, DEFAULT_ROUTE, 0));
-
-               if ((originate == DEFAULT_ORIGINATE_ALWAYS)
-                         && (ospf->router_id.s_addr)) {
-
-                       /* always , so originate lsa even it doesn't
-                        * exist in RIB.
-                        */
-                       ospf_external_info_add(ospf, DEFAULT_ROUTE, 0,
-                                                p, 0, nexthop, 0);
-                       ospf_external_lsa_refresh_default(ospf);
-
-               } else if (originate == DEFAULT_ORIGINATE_ZEBRA) {
-                       /* Send msg to Zebra to validate default route
-                        * existance.
-                        */
-                       zclient_redistribute_default(
-                               ZEBRA_REDISTRIBUTE_DEFAULT_ADD, zclient, AFI_IP,
-                               ospf->vrf_id);
-               }
-
-               ospf_asbr_status_update(ospf, ++ospf->redistribute);
-               return CMD_SUCCESS;
-
-
-       } else if (originate == cur_originate) {
+       if (cur_originate == originate) {
                /* Refresh the lsa since metric might different */
                if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE))
                        zlog_debug(
@@ -798,70 +766,51 @@ int ospf_redistribute_default_set(struct ospf *ospf, int originate, int mtype,
                                metric_value(ospf, DEFAULT_ROUTE, 0));
 
                ospf_external_lsa_refresh_default(ospf);
-
-       } else {
-               /* "default-info originate always" configured now,
-                * where "default-info originate" configured previoulsly.
-                */
-               if (originate == DEFAULT_ORIGINATE_ALWAYS) {
-
-                       zclient_redistribute_default(
-                                       ZEBRA_REDISTRIBUTE_DEFAULT_DELETE,
-                                       zclient, AFI_IP, ospf->vrf_id);
-                       /* here , ex-info should be added since ex-info might
-                        * have not updated earlier if def route is not exist.
-                        * If ex-iinfo ex-info already exist , it will return
-                        * smoothly.
-                        */
-                       ospf_external_info_add(ospf, DEFAULT_ROUTE, 0,
-                                                p, 0, nexthop, 0);
-                       ospf_external_lsa_refresh_default(ospf);
-
-               } else {
-                       /* "default-info originate" configured now,where
-                        * "default-info originate always" configured
-                        * previoulsy.
-                        */
-
-                       ospf_external_lsa_flush(ospf, DEFAULT_ROUTE, &p, 0);
-
-                       ext = ospf_external_lookup(ospf, DEFAULT_ROUTE, 0);
-                       if (ext && EXTERNAL_INFO(ext))
-                               ospf_external_info_delete(ospf,
-                                                DEFAULT_ROUTE, 0, p);
-
-                       zclient_redistribute_default(
-                                       ZEBRA_REDISTRIBUTE_DEFAULT_ADD,
-                                       zclient, AFI_IP, ospf->vrf_id);
-               }
+               return CMD_SUCCESS;
        }
 
-       return CMD_SUCCESS;
-}
-int ospf_redistribute_default_unset(struct ospf *ospf)
-{
-       if (ospf->default_originate == DEFAULT_ORIGINATE_ZEBRA) {
-               if (!ospf_is_type_redistributed(ospf, DEFAULT_ROUTE, 0))
-                       return CMD_SUCCESS;
+       switch (cur_originate) {
+       case DEFAULT_ORIGINATE_NONE:
+               break;
+       case DEFAULT_ORIGINATE_ZEBRA:
                zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_DELETE,
                                 zclient, AFI_IP, ospf->vrf_id);
-       } else if (ospf->default_originate == DEFAULT_ORIGINATE_ALWAYS) {
-               struct prefix_ipv4 p;
-
-               p.family = AF_INET;
-               p.prefix.s_addr = 0;
-               p.prefixlen = 0;
-
-               ospf_external_info_delete(ospf, DEFAULT_ROUTE, 0, &p);
+               ospf->redistribute--;
+               break;
+       case DEFAULT_ORIGINATE_ALWAYS:
+               ospf_external_info_delete(ospf, DEFAULT_ROUTE, 0, p);
+               ospf_external_del(ospf, DEFAULT_ROUTE, 0);
+               ospf->redistribute--;
+               break;
        }
 
-       ospf->default_originate = DEFAULT_ORIGINATE_NONE;
+       switch (originate) {
+       case DEFAULT_ORIGINATE_NONE:
+               type_str = "none";
+               break;
+       case DEFAULT_ORIGINATE_ZEBRA:
+               type_str = "normal";
+               ospf->redistribute++;
+               zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_ADD,
+                                            zclient, AFI_IP, ospf->vrf_id);
+               break;
+       case DEFAULT_ORIGINATE_ALWAYS:
+               type_str = "always";
+               ospf->redistribute++;
+               ospf_external_add(ospf, DEFAULT_ROUTE, 0);
+               ospf_external_info_add(ospf, DEFAULT_ROUTE, 0, p, 0, nexthop,
+                                      0);
+               break;
+       }
 
        if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE))
-               zlog_debug("Redistribute[DEFAULT]: Stop");
-
-       ospf_asbr_status_update(ospf, --ospf->redistribute);
+               zlog_debug("Redistribute[DEFAULT]: %s Type[%d], Metric[%d]",
+               type_str,
+               metric_type(ospf, DEFAULT_ROUTE, 0),
+               metric_value(ospf, DEFAULT_ROUTE, 0));
 
+       ospf_external_lsa_refresh_default(ospf);
+       ospf_asbr_status_update(ospf, ospf->redistribute);
        return CMD_SUCCESS;
 }
 
index 739cb280a68cb6ab7a506000a44255d6b8aba999..b91a55f6351049ea467be0e0231758358e1dc0e1 100644 (file)
@@ -608,7 +608,7 @@ static void ospf_finish_final(struct ospf *ospf)
                        ospf_redist_del(ospf, i, red->instance);
                }
        }
-       ospf_redistribute_default_unset(ospf);
+       ospf_redistribute_default_set(ospf, DEFAULT_ORIGINATE_NONE, 0, 0);
 
        for (ALL_LIST_ELEMENTS(ospf->areas, node, nnode, area))
                ospf_remove_vls_through_area(ospf, area);