diff options
Diffstat (limited to 'ospfd')
-rw-r--r-- | ospfd/ChangeLog | 5 | ||||
-rw-r--r-- | ospfd/ospf_interface.c | 27 |
2 files changed, 22 insertions, 10 deletions
diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog index 6b15fe64..7bff0a36 100644 --- a/ospfd/ChangeLog +++ b/ospfd/ChangeLog @@ -12,7 +12,10 @@ not by peer_addr (which breaks for asymmetric vlinks) (ospf_nbr_lookup) add a wrapper for nbr lookups to deal with above. - + * ospf_interface.c: (ospf_vl_set_params) Catch changes of interface + address for either end of a virtual-link, and hence potential cost + changes. + 2004-04-22 Hasso Tepper <hasso@estpak.ee> * ospf_zebra.c: Don't ignore reject/bh routes, it's the only way diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index b4872914..4787ca6f 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -917,6 +917,7 @@ ospf_vl_set_params (struct ospf_vl_data *vl_data, struct vertex *v) if (voi->output_cost != v->distance) { + voi->output_cost = v->distance; changed = 1; } @@ -924,12 +925,16 @@ ospf_vl_set_params (struct ospf_vl_data *vl_data, struct vertex *v) for (node = listhead (v->nexthop); node; nextnode (node)) if ((nh = getdata (node)) != NULL) { - vl_data->out_oi = (struct ospf_interface *) nh->oi; - - voi->address->u.prefix4 = vl_data->out_oi->address->u.prefix4; - voi->address->prefixlen = vl_data->out_oi->address->prefixlen; - - break; /* We take the first interface. */ + vl_data->out_oi = (struct ospf_interface *) nh->oi; + + if (!IPV4_ADDR_SAME(&voi->address->u.prefix4, + &vl_data->out_oi->address->u.prefix4)) + changed = 1; + + voi->address->u.prefix4 = vl_data->out_oi->address->u.prefix4; + voi->address->prefixlen = vl_data->out_oi->address->prefixlen; + + break; /* We take the first interface. */ } rl = (struct router_lsa *)v->lsa; @@ -961,9 +966,12 @@ ospf_vl_set_params (struct ospf_vl_data *vl_data, struct vertex *v) zlog_info ("found back link through VL"); case LSA_LINK_TYPE_TRANSIT: case LSA_LINK_TYPE_POINTOPOINT: + if (!IPV4_ADDR_SAME (&vl_data->peer_addr, + &rl->link[i].link_data)) + changed = 1; vl_data->peer_addr = rl->link[i].link_data; if (IS_DEBUG_OSPF_EVENT) - zlog_info ("%s peer address is %s\n", + zlog_info ("ospf_vl_set_params: %s peer address is %s\n", vl_data->vl_oi->ifp->name, inet_ntoa(vl_data->peer_addr)); return changed; @@ -1030,9 +1038,10 @@ ospf_vl_up_check (struct ospf_area *area, struct in_addr rid, if (ospf_vl_set_params (vl_data, v)) { if (IS_DEBUG_OSPF (ism, ISM_EVENTS)) - zlog_info ("ospf_vl_up_check: VL cost change, scheduling router lsa refresh"); + zlog_info ("ospf_vl_up_check: VL cost change," + " scheduling router lsa refresh"); if(ospf->backbone) - ospf_router_lsa_timer_add(ospf->backbone); + ospf_router_lsa_timer_add (ospf->backbone); else if (IS_DEBUG_OSPF (ism, ISM_EVENTS)) zlog_info ("ospf_vl_up_check: VL cost change, no backbone!"); } |