mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-10 08:39:33 +00:00
ospfd: clean up default route logic
What a mess... Signed-off-by: David Lamparter <equinox@diac24.net>
This commit is contained in:
parent
f1cf5af6da
commit
d5eac1e0ca
@ -2202,28 +2202,20 @@ void ospf_external_lsa_refresh_default(struct ospf *ospf)
|
|||||||
ei = ospf_default_external_info(ospf);
|
ei = ospf_default_external_info(ospf);
|
||||||
lsa = ospf_external_info_find_lsa(ospf, &p);
|
lsa = ospf_external_info_find_lsa(ospf, &p);
|
||||||
|
|
||||||
if (ei) {
|
if (ei && lsa) {
|
||||||
if (lsa) {
|
if (IS_DEBUG_OSPF_EVENT)
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
zlog_debug("LSA[Type5:0.0.0.0]: Refresh AS-external-LSA %p",
|
||||||
zlog_debug(
|
(void *)lsa);
|
||||||
"LSA[Type5:0.0.0.0]: Refresh AS-external-LSA %p",
|
ospf_external_lsa_refresh(ospf, lsa, ei, LSA_REFRESH_FORCE);
|
||||||
(void *)lsa);
|
} else if (ei && !lsa) {
|
||||||
ospf_external_lsa_refresh(ospf, lsa, ei,
|
if (IS_DEBUG_OSPF_EVENT)
|
||||||
LSA_REFRESH_FORCE);
|
zlog_debug(
|
||||||
} else {
|
"LSA[Type5:0.0.0.0]: Originate AS-external-LSA");
|
||||||
if (IS_DEBUG_OSPF_EVENT)
|
ospf_external_lsa_originate(ospf, ei);
|
||||||
zlog_debug(
|
} else if (lsa) {
|
||||||
"LSA[Type5:0.0.0.0]: Originate AS-external-LSA");
|
if (IS_DEBUG_OSPF_EVENT)
|
||||||
ospf_external_lsa_originate(ospf, ei);
|
zlog_debug("LSA[Type5:0.0.0.0]: Flush AS-external-LSA");
|
||||||
}
|
ospf_external_lsa_flush(ospf, DEFAULT_ROUTE, &p, 0);
|
||||||
} 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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8487,22 +8487,8 @@ DEFUN (no_ospf_default_information_originate,
|
|||||||
"Pointer to route-map entries\n")
|
"Pointer to route-map entries\n")
|
||||||
{
|
{
|
||||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||||
struct prefix_ipv4 p;
|
|
||||||
struct ospf_external *ext;
|
|
||||||
struct ospf_redist *red;
|
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);
|
red = ospf_redist_lookup(ospf, DEFAULT_ROUTE, 0);
|
||||||
if (!red)
|
if (!red)
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
@ -8510,7 +8496,8 @@ DEFUN (no_ospf_default_information_originate,
|
|||||||
ospf_routemap_unset(red);
|
ospf_routemap_unset(red);
|
||||||
ospf_redist_del(ospf, DEFAULT_ROUTE, 0);
|
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,
|
DEFUN (ospf_default_metric,
|
||||||
|
@ -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 ospf_redistribute_default_set(struct ospf *ospf, int originate, int mtype,
|
||||||
int mvalue)
|
int mvalue)
|
||||||
{
|
{
|
||||||
struct ospf_external *ext;
|
|
||||||
struct prefix_ipv4 p;
|
struct prefix_ipv4 p;
|
||||||
struct in_addr nexthop;
|
struct in_addr nexthop;
|
||||||
int cur_originate = ospf->default_originate;
|
int cur_originate = ospf->default_originate;
|
||||||
|
const char *type_str = NULL;
|
||||||
|
|
||||||
nexthop.s_addr = 0;
|
nexthop.s_addr = 0;
|
||||||
p.family = AF_INET;
|
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->default_originate = originate;
|
||||||
|
|
||||||
ospf_external_add(ospf, DEFAULT_ROUTE, 0);
|
if (cur_originate == originate) {
|
||||||
|
|
||||||
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) {
|
|
||||||
/* Refresh the lsa since metric might different */
|
/* Refresh the lsa since metric might different */
|
||||||
if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE))
|
if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE))
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
@ -798,70 +766,51 @@ int ospf_redistribute_default_set(struct ospf *ospf, int originate, int mtype,
|
|||||||
metric_value(ospf, DEFAULT_ROUTE, 0));
|
metric_value(ospf, DEFAULT_ROUTE, 0));
|
||||||
|
|
||||||
ospf_external_lsa_refresh_default(ospf);
|
ospf_external_lsa_refresh_default(ospf);
|
||||||
|
return CMD_SUCCESS;
|
||||||
} 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;
|
switch (cur_originate) {
|
||||||
}
|
case DEFAULT_ORIGINATE_NONE:
|
||||||
int ospf_redistribute_default_unset(struct ospf *ospf)
|
break;
|
||||||
{
|
case DEFAULT_ORIGINATE_ZEBRA:
|
||||||
if (ospf->default_originate == DEFAULT_ORIGINATE_ZEBRA) {
|
|
||||||
if (!ospf_is_type_redistributed(ospf, DEFAULT_ROUTE, 0))
|
|
||||||
return CMD_SUCCESS;
|
|
||||||
zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_DELETE,
|
zclient_redistribute_default(ZEBRA_REDISTRIBUTE_DEFAULT_DELETE,
|
||||||
zclient, AFI_IP, ospf->vrf_id);
|
zclient, AFI_IP, ospf->vrf_id);
|
||||||
} else if (ospf->default_originate == DEFAULT_ORIGINATE_ALWAYS) {
|
ospf->redistribute--;
|
||||||
struct prefix_ipv4 p;
|
break;
|
||||||
|
case DEFAULT_ORIGINATE_ALWAYS:
|
||||||
p.family = AF_INET;
|
ospf_external_info_delete(ospf, DEFAULT_ROUTE, 0, p);
|
||||||
p.prefix.s_addr = 0;
|
ospf_external_del(ospf, DEFAULT_ROUTE, 0);
|
||||||
p.prefixlen = 0;
|
ospf->redistribute--;
|
||||||
|
break;
|
||||||
ospf_external_info_delete(ospf, DEFAULT_ROUTE, 0, &p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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))
|
if (IS_DEBUG_OSPF(zebra, ZEBRA_REDISTRIBUTE))
|
||||||
zlog_debug("Redistribute[DEFAULT]: Stop");
|
zlog_debug("Redistribute[DEFAULT]: %s Type[%d], Metric[%d]",
|
||||||
|
type_str,
|
||||||
ospf_asbr_status_update(ospf, --ospf->redistribute);
|
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;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -608,7 +608,7 @@ static void ospf_finish_final(struct ospf *ospf)
|
|||||||
ospf_redist_del(ospf, i, red->instance);
|
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))
|
for (ALL_LIST_ELEMENTS(ospf->areas, node, nnode, area))
|
||||||
ospf_remove_vls_through_area(ospf, area);
|
ospf_remove_vls_through_area(ospf, area);
|
||||||
|
Loading…
Reference in New Issue
Block a user