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);  | 
