return;
}
- /* XXXX */
--#ifdef OSPFv2
- if (n && (n->rid != ntohl(pkt->routerid)))
- if (n && (n->rid != ntohl(ps_i->routerid)))
++ /* Check consistency of existing neighbor entry */
++ if (n)
{
- OSPF_TRACE(D_EVENTS, "Neighbor %I has changed router id from %R to %R",
- n->ip, n->rid, ntohl(pkt->routerid));
- OSPF_TRACE(D_EVENTS,
- "Neighbor %I has changed router id from %R to %R.",
- n->ip, n->rid, ntohl(ps_i->routerid));
-- ospf_neigh_remove(n);
-- n = NULL;
++ unsigned t = ifa->type;
++ if (ospf_is_v2(po) && ((t == OSPF_IT_BCAST) || (t == OSPF_IT_NBMA) || (t == OSPF_IT_PTMP)))
++ {
++ /* Neighbor identified by IP address; Router ID may change */
++ if (n->rid != ntohl(pkt->routerid))
++ {
++ OSPF_TRACE(D_EVENTS, "Neighbor %I has changed Router ID from %R to %R",
++ n->ip, n->rid, ntohl(pkt->routerid));
++ ospf_neigh_remove(n);
++ n = NULL;
++ }
++ }
++ else /* OSPFv3 or OSPFv2/PtP */
++ {
++ /* Neighbor identified by Router ID; IP address may change */
++ if (!ipa_equal(faddr, n->ip))
++ {
++ OSPF_TRACE(D_EVENTS, "Neighbor address changed from %I to %I", n->ip, faddr);
++ n->ip = faddr;
++ }
++ }
}
--#endif
if (!n)
{
n = ospf_neighbor_new(ifa);
- n->rid = ntohl(ps_i->routerid);
+ n->rid = ntohl(pkt->routerid);
n->ip = faddr;
- n->dr = ntohl(ps->dr);
- n->bdr = ntohl(ps->bdr);
- n->priority = ps->priority;
-#ifdef OSPFv3
- n->iface_id = ntohl(ps->iface_id);
-#endif
- }
- ospf_neigh_sm(n, INM_HELLOREC);
+ n->dr = rcv_dr;
+ n->bdr = rcv_bdr;
+ n->priority = rcv_priority;
+ n->iface_id = rcv_iface_id;
- pnrid = (u32 *) ((struct ospf_hello_packet *) (ps + 1));
+ if (n->ifa->cf->bfd)
+ ospf_neigh_update_bfd(n, n->ifa->bfd);
+ }
- /* XXXX */
- #ifdef OSPFv3 /* NOTE: this could also be relevant for OSPFv2 on PtP ifaces */
- else if (!ipa_equal(faddr, n->ip))
- {
- OSPF_TRACE(D_EVENTS, "Neighbor address changed from %I to %I", n->ip, faddr);
- n->ip = faddr;
- }
- #endif
-
- peers = (size - sizeof(struct ospf_hello_packet))/ sizeof(u32);
+ ospf_neigh_sm(n, INM_HELLOREC);
- twoway = 0;
- for (i = 0; i < peers; i++)
+ two_way = 0;
+ for (i = 0; i < neigh_count; i++)
{
- if (ntohl(pnrid[i]) == po->router_id)
+ if (ntohl(neighbors[i]) == po->router_id)
{
DBG("%s: Twoway received from %I\n", p->name, faddr);
ospf_neigh_sm(n, INM_2WAYREC);