]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Merge commit 'e550a37206528be39e4751865b46720885fd64ed' into integrated
authorOndrej Zajicek <santiago@crfreenet.org>
Tue, 29 Apr 2014 11:52:01 +0000 (13:52 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Tue, 29 Apr 2014 11:52:01 +0000 (13:52 +0200)
1  2 
proto/ospf/hello.c

index 5146f61ebe04680860486fc02c9fc825a1f0a519,58e87bbf17213e93ac064f55c68123c874e6b44f..7e737880290f9c3fa26621d9dcca32fa6d603812
@@@ -133,16 -101,16 +133,31 @@@ ospf_hello_receive(struct ospf_packet *
      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);