Neighbors on OSPF broadcast networks should be identified by IP address, not RID.

Allows simple support for multiple interfaces to the same network.
This commit is contained in:
Ondrej Zajicek 2010-04-26 19:08:57 +02:00
parent 4e5fb4b60c
commit 9d1ee13887

View file

@ -242,6 +242,19 @@ ospf_pkt_checkauth(struct ospf_neighbor *n, struct ospf_iface *ifa, struct ospf_
#endif #endif
#ifdef OSPFv2
static inline struct ospf_neighbor *
find_neigh_by_ip(struct ospf_iface *ifa, ip_addr ip)
{
struct ospf_neighbor *n;
WALK_LIST(n, ifa->neigh_list)
if (ipa_equal(n->ip, ip))
return n;
return NULL;
}
#endif
/** /**
* ospf_rx_hook * ospf_rx_hook
@ -419,10 +432,16 @@ ospf_rx_hook(sock *sk, int size)
return 1; return 1;
} }
/* This is deviation from RFC 2328 - neighbours should be identified by #ifdef OSPFv2
* IP address on broadcast and NBMA networks. /* In OSPFv2, neighbors are identified by either IP or Router ID, base on network type */
*/ struct ospf_neighbor *n;
if ((ifa->type == OSPF_IT_BCAST) || (ifa->type == OSPF_IT_NBMA))
n = find_neigh_by_ip(ifa, sk->faddr);
else
n = find_neigh(ifa, rid);
#else
struct ospf_neighbor *n = find_neigh(ifa, rid); struct ospf_neighbor *n = find_neigh(ifa, rid);
#endif
if(!n && (ps->type != HELLO_P)) if(!n && (ps->type != HELLO_P))
{ {