]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Minor bug fix in neighbor state machine.
authorOndrej Filip <feela@network.cz>
Mon, 31 May 2004 13:22:49 +0000 (13:22 +0000)
committerOndrej Filip <feela@network.cz>
Mon, 31 May 2004 13:22:49 +0000 (13:22 +0000)
proto/ospf/dbdes.c
proto/ospf/hello.c
proto/ospf/iface.c
proto/ospf/neighbor.c

index 03e010e29941156fefc1dc589c0eee593734a989..1f9dd55e4e45c35ed43c5058cc9238d29fdc2929 100644 (file)
@@ -39,6 +39,7 @@ ospf_dbdes_tx(struct ospf_neighbor *n)
   switch(n->state)
   {
     case NEIGHBOR_EXSTART:             /* Send empty packets */
+      n->myimms.bit.i=1;
       pkt=(struct ospf_dbdes_packet *)(ifa->ip_sk->tbuf);
       op=(struct ospf_packet *)pkt;
       fill_ospf_pkt_hdr(ifa, pkt, DBDES_P);
@@ -55,6 +56,8 @@ ospf_dbdes_tx(struct ospf_neighbor *n)
       break;
 
     case NEIGHBOR_EXCHANGE:
+      n->myimms.bit.i=0;
+
       if(((n->myimms.bit.ms) && (n->dds==n->ddr+1)) ||
          ((!(n->myimms.bit.ms)) && (n->dds==n->ddr)))
       {
@@ -139,6 +142,7 @@ ospf_dbdes_tx(struct ospf_neighbor *n)
        {
           ospf_neigh_sm(n, INM_EXDONE);
          if(n->myimms.bit.ms) tm_stop(n->rxmt_timer);
+         else tm_start(n->rxmt_timer,ifa->rxmtint);
        }
       }
       break;
@@ -277,7 +281,7 @@ ospf_dbdes_rx(struct ospf_dbdes_packet *ps, struct proto *p,
             break;
           }
         }
-
+        if(ps->imms.bit.i) break;
     case NEIGHBOR_EXCHANGE:
        if((ps->imms.byte==n->imms.byte) && (ps->options==n->options) &&
          (ntohl(ps->ddseq)==n->ddr))
@@ -295,14 +299,14 @@ ospf_dbdes_rx(struct ospf_dbdes_packet *ps, struct proto *p,
 
        if(ps->imms.bit.ms!=n->imms.bit.ms) /* M/S bit differs */
         {
-          DBG("SEQMIS-BIT-MS\n");
+          log("SEQMIS-BIT-MS\n");
           ospf_neigh_sm(n, INM_SEQMIS);
          break;
         }
 
        if(ps->imms.bit.i)      /* I bit is set */
         {
-          DBG("SEQMIS-BIT-I\n");
+          log("SEQMIS-BIT-I\n");
           ospf_neigh_sm(n, INM_SEQMIS);
          break;
         }
@@ -311,7 +315,7 @@ ospf_dbdes_rx(struct ospf_dbdes_packet *ps, struct proto *p,
 
        if(ps->options!=n->options)     /* Options differs */
         {
-          DBG("SEQMIS-OPT\n");
+          log("SEQMIS-OPT\n");
           ospf_neigh_sm(n, INM_SEQMIS);
          break;
         }
@@ -320,7 +324,7 @@ ospf_dbdes_rx(struct ospf_dbdes_packet *ps, struct proto *p,
         {
           if(ntohl(ps->ddseq)!=n->dds)         /* MASTER */
          {
-            DBG("SEQMIS-MASTER\n");
+            log("SEQMIS-MASTER\n");
            ospf_neigh_sm(n, INM_SEQMIS);
            break;
          }
@@ -341,7 +345,7 @@ ospf_dbdes_rx(struct ospf_dbdes_packet *ps, struct proto *p,
         {
           if(ntohl(ps->ddseq)!=(n->dds+1))     /* SLAVE */
          {
-            DBG("SEQMIS-SLAVE\n");
+            log("SEQMIS-SLAVE\n");
            ospf_neigh_sm(n, INM_SEQMIS);
            break;
          }
@@ -362,7 +366,7 @@ ospf_dbdes_rx(struct ospf_dbdes_packet *ps, struct proto *p,
         }
        else
         {
-         DBG("SEQMIS-FULL\n");
+         log("SEQMIS-FULL\n");
          ospf_neigh_sm(n, INM_SEQMIS);
         }
       break;
index a80dfa25df2d3302115b7e88131a40dadbd91597..5627d7ee318214a60a228629970741a4001436be 100644 (file)
@@ -7,6 +7,8 @@
  */
 
 #include "ospf.h"
+#include <sys/socket.h>
+#include "lib/sysio.h"
 
 void
 install_inactim(struct ospf_neighbor *n)
@@ -59,8 +61,7 @@ ospf_hello_rx(struct ospf_hello_packet *ps, struct proto *p,
 {
   u32 nrid, *pnrid;
   struct ospf_neighbor *neigh,*n;
-  u8 twoway,oldpriority;
-  u32 i;
+  u8 i,twoway,oldpriority;
   ip_addr olddr,oldbdr;
   ip_addr mask;
   char *beg=": Bad OSPF hello packet from ", *rec=" received: ";
index 2cbff6c9e94d7506a7c3a354efcdb5474bbf59ea..83f6ac309d09ef3320973d8d32cb7106a402f003 100644 (file)
@@ -47,8 +47,9 @@ iface_chstate(struct ospf_iface *ifa, u8 state)
           DBG("%s: Adding new multicast socket for (B)DR\n", p->name);
           ifa->dr_sk=sk_new(p->pool);
           ifa->dr_sk->type=SK_IP_MC;
+         ifa->dr_sk->sport=0;
          ifa->dr_sk->dport=OSPF_PROTO;
-          ifa->dr_sk->saddr=AllDRouters;
+          ifa->dr_sk->saddr=ipa_from_u32(0);
           ifa->dr_sk->daddr=AllDRouters;
           ifa->dr_sk->tos=IP_PREC_INTERNET_CONTROL;
           ifa->dr_sk->ttl=1;
@@ -222,8 +223,9 @@ ospf_open_mc_socket(struct ospf_iface *ifa)
 
   mcsk=sk_new(p->pool);
   mcsk->type=SK_IP_MC;
+  mcsk->sport=0;
   mcsk->dport=OSPF_PROTO;
-  mcsk->saddr=AllSPFRouters;
+  mcsk->saddr=ipa_from_u32(0);
   mcsk->daddr=AllSPFRouters;
   mcsk->tos=IP_PREC_INTERNET_CONTROL;
   mcsk->ttl=1;
index d9c9b1bea16cc6c200f4fb07ac2a113f4ccacd53..785e3bcaa39243493ee467680ed5ca2f9fc9165c 100644 (file)
@@ -67,6 +67,11 @@ neigh_chstate(struct ospf_neighbor *n, u8 state)
       schedule_rt_lsa(ifa->oa);
       schedule_net_lsa(ifa);
     }
+    if(oldstate>=NEIGHBOR_EXSTART && state<NEIGHBOR_EXSTART)
+    {
+      /* Stop RXMT timer */
+      tm_stop(n->rxmt_timer);
+    }
     if(state==NEIGHBOR_EXSTART)
     {
       if(n->adj==0)    /* First time adjacency */
@@ -294,6 +299,7 @@ ospf_neigh_sm(struct ospf_neighbor *n, int event)
         }
       break;
     case INM_SEQMIS:
+      OSPF_TRACE(D_EVENTS, "Seq mis!");
     case INM_BADLSREQ:
       OSPF_TRACE(D_EVENTS, "Bad LS req!");
       if(n->state>=NEIGHBOR_EXCHANGE)