return 1;
}
-\f
+/* 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)
{
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;
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);
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);