summaryrefslogtreecommitdiff
path: root/ospfd/ospf_interface.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospfd/ospf_interface.c')
-rw-r--r--ospfd/ospf_interface.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c
index d9845f6eb9..adc3037598 100644
--- a/ospfd/ospf_interface.c
+++ b/ospfd/ospf_interface.c
@@ -1004,7 +1004,8 @@ void ospf_vl_delete(struct ospf *ospf, struct ospf_vl_data *vl_data)
ospf_vl_data_free(vl_data);
}
-static int ospf_vl_set_params(struct ospf_vl_data *vl_data, struct vertex *v)
+static int ospf_vl_set_params(struct ospf_area *area,
+ struct ospf_vl_data *vl_data, struct vertex *v)
{
int changed = 0;
struct ospf_interface *voi;
@@ -1012,6 +1013,7 @@ static int ospf_vl_set_params(struct ospf_vl_data *vl_data, struct vertex *v)
struct vertex_parent *vp = NULL;
unsigned int i;
struct router_lsa *rl;
+ struct ospf_interface *oi;
voi = vl_data->vl_oi;
@@ -1022,17 +1024,24 @@ static int ospf_vl_set_params(struct ospf_vl_data *vl_data, struct vertex *v)
}
for (ALL_LIST_ELEMENTS_RO(v->parents, node, vp)) {
- vl_data->nexthop.oi = vp->nexthop->oi;
+ vl_data->nexthop.lsa_pos = vp->nexthop->lsa_pos;
vl_data->nexthop.router = vp->nexthop->router;
- if (!IPV4_ADDR_SAME(&voi->address->u.prefix4,
- &vl_data->nexthop.oi->address->u.prefix4))
- changed = 1;
+ /*
+ * Only deal with interface data when the local
+ * (calculating) node is the SPF root node
+ */
+ if (!area->spf_dry_run) {
+ oi = ospf_if_lookup_by_lsa_pos(
+ area, vl_data->nexthop.lsa_pos);
- voi->address->u.prefix4 =
- vl_data->nexthop.oi->address->u.prefix4;
- voi->address->prefixlen =
- vl_data->nexthop.oi->address->prefixlen;
+ if (!IPV4_ADDR_SAME(&voi->address->u.prefix4,
+ &oi->address->u.prefix4))
+ changed = 1;
+
+ voi->address->u.prefix4 = oi->address->u.prefix4;
+ voi->address->prefixlen = oi->address->prefixlen;
+ }
break; /* We take the first interface. */
}
@@ -1123,7 +1132,7 @@ void ospf_vl_up_check(struct ospf_area *area, struct in_addr rid,
OSPF_ISM_EVENT_EXECUTE(oi, ISM_InterfaceUp);
}
- if (ospf_vl_set_params(vl_data, v)) {
+ if (ospf_vl_set_params(area, vl_data, v)) {
if (IS_DEBUG_OSPF(ism, ISM_EVENTS))
zlog_debug(
"ospf_vl_up_check: VL cost change, scheduling router lsa refresh");