diff options
| -rw-r--r-- | ospfd/ospf_interface.c | 16 | ||||
| -rw-r--r-- | ospfd/ospf_interface.h | 3 | ||||
| -rw-r--r-- | ospfd/ospf_packet.c | 4 | 
3 files changed, 15 insertions, 8 deletions
| diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index 4eccee76..afe3acf1 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -439,11 +439,12 @@ ospf_if_lookup_by_prefix (struct ospf *ospf, struct prefix_ipv4 *p)    return NULL;  } -/* determine receiving interface by source of packet */ +/* determine receiving interface by ifp and source address */  struct ospf_interface * -ospf_if_lookup_recv_if (struct ospf *ospf, struct in_addr src) +ospf_if_lookup_recv_if (struct ospf *ospf, struct in_addr src, +			struct interface *ifp)  { -  struct listnode *node; +  struct route_node *rn;    struct prefix_ipv4 addr;    struct ospf_interface *oi, *match; @@ -453,11 +454,16 @@ ospf_if_lookup_recv_if (struct ospf *ospf, struct in_addr src)    match = NULL; -  for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi)) +  for (rn = route_top (IF_OIFS (ifp)); rn; rn = route_next (rn))      { +      oi = rn->info; + +      if (!oi) /* oi can be NULL for PtP aliases */ +	continue; +        if (oi->type == OSPF_IFTYPE_VIRTUALLINK)  	continue; -       +        if (if_is_loopback (oi->ifp))          continue; diff --git a/ospfd/ospf_interface.h b/ospfd/ospf_interface.h index 0fc4ccba..ab0b7580 100644 --- a/ospfd/ospf_interface.h +++ b/ospfd/ospf_interface.h @@ -252,7 +252,8 @@ extern struct ospf_interface *ospf_if_table_lookup (struct interface *,  						    struct prefix *);  extern struct ospf_interface *ospf_if_addr_local (struct in_addr);  extern struct ospf_interface *ospf_if_lookup_recv_if (struct ospf *, -						      struct in_addr); +						      struct in_addr, +						      struct interface *);  extern struct ospf_interface *ospf_if_is_configured (struct ospf *,  						     struct in_addr *); diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c index 7ebf114e..effef390 100644 --- a/ospfd/ospf_packet.c +++ b/ospfd/ospf_packet.c @@ -2373,7 +2373,7 @@ ospf_read (struct thread *thread)    ospfh = (struct ospf_header *) STREAM_PNT (ibuf);    /* associate packet with ospf interface */ -  oi = ospf_if_lookup_recv_if (ospf, iph->ip_src); +  oi = ospf_if_lookup_recv_if (ospf, iph->ip_src, ifp);    /* If incoming interface is passive one, ignore it. */    if (oi && OSPF_IF_PASSIVE_STATUS (oi) == OSPF_IF_PASSIVE) @@ -2419,7 +2419,7 @@ ospf_read (struct thread *thread)            return 0;          }      } -     +    /* else it must be a local ospf interface, check it was received on      * correct link      */ | 
