diff options
Diffstat (limited to 'ospfd')
-rw-r--r-- | ospfd/ospfd.c | 35 | ||||
-rw-r--r-- | ospfd/ospfd.h | 1 |
2 files changed, 24 insertions, 12 deletions
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c index 19bc1e53..a1ad929d 100644 --- a/ospfd/ospfd.c +++ b/ospfd/ospfd.c @@ -665,7 +665,25 @@ ospf_network_unset (struct ospf *ospf, struct prefix_ipv4 *p, return 1; } - +/* Check whether interface matches given network + * returns: 1, true. 0, false + */ +int +ospf_network_match_iface(struct connected *co, struct prefix *net) +{ + /* Behaviour to match both Cisco where: + * iface address lies within network specified -> ospf + * and zebra 0.9[2ish-3]: + * PtP special case: network specified == iface peer addr -> ospf + */ + return ( + ((ifc_pointopoint (co) && + IPV4_ADDR_SAME ( &(co->destination->u.prefix4), &(net->u.prefix4))) + || prefix_match (net, co->address)) + ? 1 : 0 + ); +} + void ospf_network_run (struct ospf *ospf, struct prefix *p, struct ospf_area *area) { @@ -704,13 +722,9 @@ ospf_network_run (struct ospf *ospf, struct prefix *p, struct ospf_area *area) else addr = co->address; - if (p->family == co->address->family && - ! ospf_if_is_configured (&(addr->u.prefix4))) - if ((ifc_pointopoint (co) && - IPV4_ADDR_SAME (&(addr->u.prefix4), &(p->u.prefix4))) || - prefix_match (p, addr)) - { - struct ospf_interface *oi; + if (ospf_network_match_iface(co,p)) + { + struct ospf_interface *oi; oi = ospf_if_new (ifp, co->address); oi->connected = co; @@ -835,10 +849,7 @@ ospf_if_update () if (rn->info == NULL) continue; - if ((oi->type == OSPF_IFTYPE_POINTOPOINT - && IPV4_ADDR_SAME (&(co->destination->u.prefix4), - &(rn->p.u.prefix4))) - || prefix_match (&(rn->p), co->address)) + if (ospf_network_match_iface(co,&rn->p)) { found = 1; route_unlock_node (rn); diff --git a/ospfd/ospfd.h b/ospfd/ospfd.h index a83231b2..a46a7931 100644 --- a/ospfd/ospfd.h +++ b/ospfd/ospfd.h @@ -511,6 +511,7 @@ struct ospf *ospf_get (); void ospf_finish (struct ospf *); int ospf_router_id_update_timer (struct thread *); void ospf_router_id_update (); +int ospf_network_match_iface (struct connected *, struct prefix *); int ospf_network_set (struct ospf *, struct prefix_ipv4 *, struct in_addr); int ospf_network_unset (struct ospf *, struct prefix_ipv4 *, struct in_addr); int ospf_area_stub_set (struct ospf *, struct in_addr); |