]> git.proxmox.com Git - mirror_frr.git/commitdiff
ospfd: re-fix default origination check
authorDavid Lamparter <equinox@diac24.net>
Mon, 29 Jul 2019 12:44:26 +0000 (14:44 +0200)
committerDavid Lamparter <equinox@diac24.net>
Mon, 29 Jul 2019 12:58:01 +0000 (14:58 +0200)
ospf->external[DEFAULT_ROUTE] and zclient->default_information don't
line up with each other; the former is only used for "originate always".

Fixes: #4237
Signed-off-by: David Lamparter <equinox@diac24.net>
ospfd/ospf_flood.c

index 168dcee4495b5654761d64cab8dccbb6be504c64..1d85a0498400981dbc06e530f22e4b474621fea1 100644 (file)
@@ -83,6 +83,9 @@ struct external_info *ospf_external_info_check(struct ospf *ospf,
        struct as_external_lsa *al;
        struct prefix_ipv4 p;
        struct route_node *rn;
+       struct list *ext_list;
+       struct listnode *node;
+       struct ospf_external *ext;
        int type;
 
        al = (struct as_external_lsa *)lsa->data;
@@ -105,10 +108,6 @@ struct external_info *ospf_external_info_check(struct ospf *ospf,
                                              ospf->vrf_id));
                // Pending: check for MI above.
                if (redist_on) {
-                       struct list *ext_list;
-                       struct listnode *node;
-                       struct ospf_external *ext;
-
                        ext_list = ospf->external[type];
                        if (!ext_list)
                                continue;
@@ -129,6 +128,22 @@ struct external_info *ospf_external_info_check(struct ospf *ospf,
                }
        }
 
+       if (is_prefix_default(&p) && ospf->external[DEFAULT_ROUTE]) {
+               ext_list = ospf->external[DEFAULT_ROUTE];
+
+               for (ALL_LIST_ELEMENTS_RO(ext_list, node, ext)) {
+                       if (!ext->external_info)
+                               continue;
+
+                       rn = route_node_lookup(ext->external_info,
+                                              (struct prefix *)&p);
+                       if (!rn)
+                               continue;
+                       route_unlock_node(rn);
+                       if (rn->info != NULL)
+                               return (struct external_info *)rn->info;
+               }
+       }
        return NULL;
 }