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:
parent
4e5fb4b60c
commit
9d1ee13887
1 changed files with 22 additions and 3 deletions
|
@ -242,6 +242,19 @@ ospf_pkt_checkauth(struct ospf_neighbor *n, struct ospf_iface *ifa, struct ospf_
|
|||
|
||||
#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
|
||||
|
@ -419,10 +432,16 @@ ospf_rx_hook(sock *sk, int size)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* This is deviation from RFC 2328 - neighbours should be identified by
|
||||
* IP address on broadcast and NBMA networks.
|
||||
*/
|
||||
#ifdef OSPFv2
|
||||
/* 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);
|
||||
#endif
|
||||
|
||||
if(!n && (ps->type != HELLO_P))
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue