Diff for /embedaddon/quagga/ospfd/ospf_packet.c between versions 1.1.1.3 and 1.1.1.5

version 1.1.1.3, 2012/10/09 09:22:29 version 1.1.1.5, 2016/11/02 10:09:12
Line 323  ospf_packet_max (struct ospf_interface *oi) Line 323  ospf_packet_max (struct ospf_interface *oi)
   return max;    return max;
 }  }
   
 static int  static int
 ospf_check_md5_digest (struct ospf_interface *oi, struct ospf_header *ospfh)  ospf_check_md5_digest (struct ospf_interface *oi, struct ospf_header *ospfh)
 {  {
Line 383  static int Line 383  static int
 ospf_make_md5_digest (struct ospf_interface *oi, struct ospf_packet *op)  ospf_make_md5_digest (struct ospf_interface *oi, struct ospf_packet *op)
 {  {
   struct ospf_header *ospfh;    struct ospf_header *ospfh;
  unsigned char digest[OSPF_AUTH_MD5_SIZE];  unsigned char digest[OSPF_AUTH_MD5_SIZE] = {0};
   MD5_CTX ctx;    MD5_CTX ctx;
   void *ibuf;    void *ibuf;
   u_int32_t t;    u_int32_t t;
Line 410  ospf_make_md5_digest (struct ospf_interface *oi, struc Line 410  ospf_make_md5_digest (struct ospf_interface *oi, struc
   
   /* Get MD5 Authentication key from auth_key list. */    /* Get MD5 Authentication key from auth_key list. */
   if (list_isempty (OSPF_IF_PARAM (oi, auth_crypt)))    if (list_isempty (OSPF_IF_PARAM (oi, auth_crypt)))
    auth_key = (const u_int8_t *) "";    auth_key = (const u_int8_t *) digest;
   else    else
     {      {
       ck = listgetdata (listtail(OSPF_IF_PARAM (oi, auth_crypt)));        ck = listgetdata (listtail(OSPF_IF_PARAM (oi, auth_crypt)));
Line 438  ospf_make_md5_digest (struct ospf_interface *oi, struc Line 438  ospf_make_md5_digest (struct ospf_interface *oi, struc
   return OSPF_AUTH_MD5_SIZE;    return OSPF_AUTH_MD5_SIZE;
 }  }
   
 static int  static int
 ospf_ls_req_timer (struct thread *thread)  ospf_ls_req_timer (struct thread *thread)
 {  {
Line 644  ospf_write (struct thread *thread) Line 644  ospf_write (struct thread *thread)
   struct listnode *node;    struct listnode *node;
 #ifdef WANT_OSPF_WRITE_FRAGMENT  #ifdef WANT_OSPF_WRITE_FRAGMENT
   static u_int16_t ipid = 0;    static u_int16_t ipid = 0;
 #endif /* WANT_OSPF_WRITE_FRAGMENT */  
   u_int16_t maxdatasize;    u_int16_t maxdatasize;
   #endif /* WANT_OSPF_WRITE_FRAGMENT */
 #define OSPF_WRITE_IPHL_SHIFT 2  #define OSPF_WRITE_IPHL_SHIFT 2
       
   ospf->t_write = NULL;    ospf->t_write = NULL;
Line 659  ospf_write (struct thread *thread) Line 659  ospf_write (struct thread *thread)
   /* seed ipid static with low order bits of time */    /* seed ipid static with low order bits of time */
   if (ipid == 0)    if (ipid == 0)
     ipid = (time(NULL) & 0xffff);      ipid = (time(NULL) & 0xffff);
 #endif /* WANT_OSPF_WRITE_FRAGMENT */  
   
   /* convenience - max OSPF data per packet,    /* convenience - max OSPF data per packet,
    * and reliability - not more data, than our     * and reliability - not more data, than our
Line 667  ospf_write (struct thread *thread) Line 666  ospf_write (struct thread *thread)
    */     */
   maxdatasize = MIN (oi->ifp->mtu, ospf->maxsndbuflen) -    maxdatasize = MIN (oi->ifp->mtu, ospf->maxsndbuflen) -
     sizeof (struct ip);      sizeof (struct ip);
   #endif /* WANT_OSPF_WRITE_FRAGMENT */
       
   /* Get one packet from queue. */    /* Get one packet from queue. */
   op = ospf_fifo_head (oi->obuf);    op = ospf_fifo_head (oi->obuf);
Line 789  ospf_write (struct thread *thread) Line 789  ospf_write (struct thread *thread)
   /* Now delete packet from queue. */    /* Now delete packet from queue. */
   ospf_packet_delete (oi);    ospf_packet_delete (oi);
   
     /* Move this interface to the tail of write_q to
            serve everyone in a round robin fashion */
     listnode_move_to_tail (ospf->oi_write_q, node);
   if (ospf_fifo_head (oi->obuf) == NULL)    if (ospf_fifo_head (oi->obuf) == NULL)
     {      {
       oi->on_write_q = 0;        oi->on_write_q = 0;
Line 891  ospf_hello (struct ip *iph, struct ospf_header *ospfh, Line 894  ospf_hello (struct ip *iph, struct ospf_header *ospfh,
     }      }
 #endif /* REJECT_IF_TBIT_ON */  #endif /* REJECT_IF_TBIT_ON */
   
 #ifdef HAVE_OPAQUE_LSA  
   if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE)    if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE)
       && CHECK_FLAG (hello->options, OSPF_OPTION_O))        && CHECK_FLAG (hello->options, OSPF_OPTION_O))
     {      {
Line 907  ospf_hello (struct ip *iph, struct ospf_header *ospfh, Line 909  ospf_hello (struct ip *iph, struct ospf_header *ospfh,
       UNSET_FLAG (hello->options, OSPF_OPTION_O); /* Ignore O-bit. */        UNSET_FLAG (hello->options, OSPF_OPTION_O); /* Ignore O-bit. */
 #endif /* STRICT_OBIT_USAGE_CHECK */  #endif /* STRICT_OBIT_USAGE_CHECK */
     }      }
 #endif /* HAVE_OPAQUE_LSA */  
   
   /* new for NSSA is to ensure that NP is on and E is off */    /* new for NSSA is to ensure that NP is on and E is off */
   
Line 1059  ospf_db_desc_proc (struct stream *s, struct ospf_inter Line 1060  ospf_db_desc_proc (struct stream *s, struct ospf_inter
           return;            return;
         }          }
   
 #ifdef HAVE_OPAQUE_LSA  
       if (IS_OPAQUE_LSA (lsah->type)        if (IS_OPAQUE_LSA (lsah->type)
       &&  ! CHECK_FLAG (nbr->options, OSPF_OPTION_O))        &&  ! CHECK_FLAG (nbr->options, OSPF_OPTION_O))
         {          {
Line 1067  ospf_db_desc_proc (struct stream *s, struct ospf_inter Line 1067  ospf_db_desc_proc (struct stream *s, struct ospf_inter
           OSPF_NSM_EVENT_SCHEDULE (nbr, NSM_SeqNumberMismatch);            OSPF_NSM_EVENT_SCHEDULE (nbr, NSM_SeqNumberMismatch);
           return;            return;
         }          }
 #endif /* HAVE_OPAQUE_LSA */  
   
       switch (lsah->type)        switch (lsah->type)
         {          {
         case OSPF_AS_EXTERNAL_LSA:          case OSPF_AS_EXTERNAL_LSA:
 #ifdef HAVE_OPAQUE_LSA  
         case OSPF_OPAQUE_AS_LSA:          case OSPF_OPAQUE_AS_LSA:
 #endif /* HAVE_OPAQUE_LSA */  
           /* Check for stub area.  Reject if AS-External from stub but            /* Check for stub area.  Reject if AS-External from stub but
              allow if from NSSA. */               allow if from NSSA. */
           if (oi->area->external_routing == OSPF_AREA_STUB)            if (oi->area->external_routing == OSPF_AREA_STUB)
Line 1245  ospf_db_desc (struct ip *iph, struct ospf_header *ospf Line 1242  ospf_db_desc (struct ip *iph, struct ospf_header *ospf
     }      }
 #endif /* REJECT_IF_TBIT_ON */  #endif /* REJECT_IF_TBIT_ON */
   
 #ifdef HAVE_OPAQUE_LSA  
   if (CHECK_FLAG (dd->options, OSPF_OPTION_O)    if (CHECK_FLAG (dd->options, OSPF_OPTION_O)
       && !CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE))        && !CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE))
     {      {
Line 1255  ospf_db_desc (struct ip *iph, struct ospf_header *ospf Line 1251  ospf_db_desc (struct ip *iph, struct ospf_header *ospf
        */         */
       UNSET_FLAG (dd->options, OSPF_OPTION_O);        UNSET_FLAG (dd->options, OSPF_OPTION_O);
     }      }
 #endif /* HAVE_OPAQUE_LSA */  
   
   /* Add event to thread. */    /* Add event to thread. */
   OSPF_NSM_EVENT_SCHEDULE (nbr, NSM_PacketReceived);    OSPF_NSM_EVENT_SCHEDULE (nbr, NSM_PacketReceived);
Line 1320  ospf_db_desc (struct ip *iph, struct ospf_header *ospf Line 1315  ospf_db_desc (struct ip *iph, struct ospf_header *ospf
       /* This is where the real Options are saved */        /* This is where the real Options are saved */
       nbr->options = dd->options;        nbr->options = dd->options;
   
 #ifdef HAVE_OPAQUE_LSA  
       if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE))        if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE))
         {          {
           if (IS_DEBUG_OSPF_EVENT)            if (IS_DEBUG_OSPF_EVENT)
Line 1338  ospf_db_desc (struct ip *iph, struct ospf_header *ospf Line 1332  ospf_db_desc (struct ip *iph, struct ospf_header *ospf
               /* This situation is undesirable, but not a real error. */                /* This situation is undesirable, but not a real error. */
             }              }
         }          }
 #endif /* HAVE_OPAQUE_LSA */  
   
       OSPF_NSM_EVENT_EXECUTE (nbr, NSM_NegotiationDone);        OSPF_NSM_EVENT_EXECUTE (nbr, NSM_NegotiationDone);
   
Line 1590  ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc Line 1583  ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
   
       /* Validate the LSA's LS checksum. */        /* Validate the LSA's LS checksum. */
       sum = lsah->checksum;        sum = lsah->checksum;
      if (sum != ospf_lsa_checksum (lsah))      if (! ospf_lsa_checksum_valid (lsah))
         {          {
           /* (bug #685) more details in a one-line message make it possible            /* (bug #685) more details in a one-line message make it possible
            * to identify problem source on the one hand and to have a better             * to identify problem source on the one hand and to have a better
Line 1616  ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc Line 1609  ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
       if (ntohs (lsah->ls_age) > OSPF_LSA_MAXAGE)        if (ntohs (lsah->ls_age) > OSPF_LSA_MAXAGE)
         lsah->ls_age = htons (OSPF_LSA_MAXAGE);          lsah->ls_age = htons (OSPF_LSA_MAXAGE);
   
 #ifdef HAVE_OPAQUE_LSA  
       if (CHECK_FLAG (nbr->options, OSPF_OPTION_O))        if (CHECK_FLAG (nbr->options, OSPF_OPTION_O))
         {          {
 #ifdef STRICT_OBIT_USAGE_CHECK  #ifdef STRICT_OBIT_USAGE_CHECK
Line 1648  ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc Line 1640  ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
           zlog_warn ("LSA[Type%d:%s]: Opaque capability mismatch?", lsah->type, inet_ntoa (lsah->id));            zlog_warn ("LSA[Type%d:%s]: Opaque capability mismatch?", lsah->type, inet_ntoa (lsah->id));
           continue;            continue;
         }          }
 #endif /* HAVE_OPAQUE_LSA */  
   
       /* Create OSPF LSA instance. */        /* Create OSPF LSA instance. */
       lsa = ospf_lsa_new ();        lsa = ospf_lsa_new ();
Line 1658  ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc Line 1649  ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
       switch (lsah->type)        switch (lsah->type)
         {          {
         case OSPF_AS_EXTERNAL_LSA:          case OSPF_AS_EXTERNAL_LSA:
 #ifdef HAVE_OPAQUE_LSA  
         case OSPF_OPAQUE_AS_LSA:          case OSPF_OPAQUE_AS_LSA:
           lsa->area = NULL;            lsa->area = NULL;
           break;            break;
         case OSPF_OPAQUE_LINK_LSA:          case OSPF_OPAQUE_LINK_LSA:
           lsa->oi = oi; /* Remember incoming interface for flooding control. */            lsa->oi = oi; /* Remember incoming interface for flooding control. */
           /* Fallthrough */            /* Fallthrough */
 #endif /* HAVE_OPAQUE_LSA */  
         default:          default:
           lsa->area = oi->area;            lsa->area = oi->area;
           break;            break;
Line 1676  ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc Line 1665  ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
   
       if (IS_DEBUG_OSPF_EVENT)        if (IS_DEBUG_OSPF_EVENT)
         zlog_debug("LSA[Type%d:%s]: %p new LSA created with Link State Update",          zlog_debug("LSA[Type%d:%s]: %p new LSA created with Link State Update",
                  lsa->data->type, inet_ntoa (lsa->data->id), lsa);                  lsa->data->type, inet_ntoa (lsa->data->id), (void *)lsa);
       listnode_add (lsas, lsa);        listnode_add (lsas, lsa);
     }      }
   
Line 1698  ospf_upd_list_clean (struct list *lsas) Line 1687  ospf_upd_list_clean (struct list *lsas)
   
 /* OSPF Link State Update message read -- RFC2328 Section 13. */  /* OSPF Link State Update message read -- RFC2328 Section 13. */
 static void  static void
ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh,ospf_ls_upd (struct ospf *ospf, struct ip *iph, struct ospf_header *ospfh,
              struct stream *s, struct ospf_interface *oi, u_int16_t size)               struct stream *s, struct ospf_interface *oi, u_int16_t size)
 {  {
   struct ospf_neighbor *nbr;    struct ospf_neighbor *nbr;
Line 1740  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh Line 1729  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
    */     */
   lsas = ospf_ls_upd_list_lsa (nbr, s, oi, size);    lsas = ospf_ls_upd_list_lsa (nbr, s, oi, size);
   
 #ifdef HAVE_OPAQUE_LSA  
   /*  
    * If self-originated Opaque-LSAs that have flooded before restart  
    * are contained in the received LSUpd message, corresponding LSReq  
    * messages to be sent may have to be modified.  
    * To eliminate possible race conditions such that flushing and normal  
    * updating for the same LSA would take place alternately, this trick  
    * must be done before entering to the loop below.  
    */  
    /* XXX: Why is this Opaque specific? Either our core code is deficient  
     * and this should be fixed generally, or Opaque is inventing strawman  
     * problems */  
    ospf_opaque_adjust_lsreq (nbr, lsas);  
 #endif /* HAVE_OPAQUE_LSA */  
   
 #define DISCARD_LSA(L,N) {\  #define DISCARD_LSA(L,N) {\
         if (IS_DEBUG_OSPF_EVENT) \          if (IS_DEBUG_OSPF_EVENT) \
          zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point %d: lsa %p Type-%d", N, lsa, (int) lsa->data->type); \          zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point %d: lsa %p" \
                       " Type-%d", N, (void *)lsa, (int) lsa->data->type); \
         ospf_lsa_discard (L); \          ospf_lsa_discard (L); \
         continue; }          continue; }
   
  /* Process each LSA received in the one packet. */  /* Process each LSA received in the one packet.
    *
    * Numbers in parentheses, e.g. (1), (2), etc., and the corresponding
    * text below are from the steps in RFC 2328, Section 13.
    */
   for (ALL_LIST_ELEMENTS (lsas, node, nnode, lsa))    for (ALL_LIST_ELEMENTS (lsas, node, nnode, lsa))
     {      {
       struct ospf_lsa *ls_ret, *current;        struct ospf_lsa *ls_ret, *current;
Line 1785  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh Line 1764  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
   
       listnode_delete (lsas, lsa); /* We don't need it in list anymore */        listnode_delete (lsas, lsa); /* We don't need it in list anymore */
   
      /* Validate Checksum - Done above by ospf_ls_upd_list_lsa() */      /* (1) Validate Checksum - Done above by ospf_ls_upd_list_lsa() */
   
      /* LSA Type  - Done above by ospf_ls_upd_list_lsa() */      /* (2) LSA Type  - Done above by ospf_ls_upd_list_lsa() */
         
      /* Do not take in AS External LSAs if we are a stub or NSSA. */      /* (3) Do not take in AS External LSAs if we are a stub or NSSA. */
   
       /* Do not take in AS NSSA if this neighbor and we are not NSSA */        /* Do not take in AS NSSA if this neighbor and we are not NSSA */
   
Line 1817  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh Line 1796  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
             DISCARD_LSA (lsa,2);              DISCARD_LSA (lsa,2);
           }            }
   
         /* VU229804: Router-LSA Adv-ID must be equal to LS-ID */
         if (lsa->data->type == OSPF_ROUTER_LSA)
           if (!IPV4_ADDR_SAME(&lsa->data->id, &lsa->data->adv_router))
             {
               char buf1[INET_ADDRSTRLEN];
               char buf2[INET_ADDRSTRLEN];
               char buf3[INET_ADDRSTRLEN];
   
               zlog_err("Incoming Router-LSA from %s with "
                         "Adv-ID[%s] != LS-ID[%s]",
                         inet_ntop (AF_INET, &ospfh->router_id,
                                    buf1, INET_ADDRSTRLEN),
                         inet_ntop (AF_INET, &lsa->data->id,
                                    buf2, INET_ADDRSTRLEN),
                         inet_ntop (AF_INET, &lsa->data->adv_router,
                                    buf3, INET_ADDRSTRLEN));
               zlog_err("OSPF domain compromised by attack or corruption. "
                        "Verify correct operation of -ALL- OSPF routers.");
               DISCARD_LSA (lsa, 0);
             }
   
       /* Find the LSA in the current database. */        /* Find the LSA in the current database. */
   
       current = ospf_lsa_lookup_by_header (oi->area, lsa->data);        current = ospf_lsa_lookup_by_header (oi->area, lsa->data);
   
      /* If the LSA's LS age is equal to MaxAge, and there is currently      /* (4) If the LSA's LS age is equal to MaxAge, and there is currently
          no instance of the LSA in the router's link state database,           no instance of the LSA in the router's link state database,
          and none of router's neighbors are in states Exchange or Loading,           and none of router's neighbors are in states Exchange or Loading,
         then take the following actions. */         then take the following actions: */
   
       if (IS_LSA_MAXAGE (lsa) && !current &&        if (IS_LSA_MAXAGE (lsa) && !current &&
          (ospf_nbr_count (oi, NSM_Exchange) +          ospf_check_nbr_status(oi->ospf))
           ospf_nbr_count (oi, NSM_Loading)) == 0) 
         {          {
          /* Response Link State Acknowledgment. */          /* (4a) Response Link State Acknowledgment. */
           ospf_ls_ack_send (nbr, lsa);            ospf_ls_ack_send (nbr, lsa);
   
          /* Discard LSA. */                    /* (4b) Discard LSA. */
          zlog_info ("Link State Update[%s]: LS age is equal to MaxAge.",          if (IS_DEBUG_OSPF (lsa, LSA))
                     dump_lsa_key(lsa));            {
                zlog_debug ("Link State Update[%s]: LS age is equal to MaxAge.",
                            dump_lsa_key(lsa));
             }
           DISCARD_LSA (lsa, 3);            DISCARD_LSA (lsa, 3);
         }          }
   
 #ifdef HAVE_OPAQUE_LSA  
       if (IS_OPAQUE_LSA (lsa->data->type)        if (IS_OPAQUE_LSA (lsa->data->type)
       &&  IPV4_ADDR_SAME (&lsa->data->adv_router, &oi->ospf->router_id))        &&  IPV4_ADDR_SAME (&lsa->data->adv_router, &oi->ospf->router_id))
         {          {
Line 1887  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh Line 1888  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
               continue;                continue;
             }              }
         }          }
 #endif /* HAVE_OPAQUE_LSA */  
   
       /* It might be happen that received LSA is self-originated network LSA, but        /* It might be happen that received LSA is self-originated network LSA, but
       * router ID is cahnged. So, we should check if LSA is a network-LSA whose       * router ID is changed. So, we should check if LSA is a network-LSA whose
        * Link State ID is one of the router's own IP interface addresses but whose         * Link State ID is one of the router's own IP interface addresses but whose
        * Advertising Router is not equal to the router's own Router ID         * Advertising Router is not equal to the router's own Router ID
        * According to RFC 2328 12.4.2 and 13.4 this LSA should be flushed.         * According to RFC 2328 12.4.2 and 13.4 this LSA should be flushed.
Line 1915  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh Line 1915  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
               ospf_lsa_flush_area(lsa,out_if->area);                ospf_lsa_flush_area(lsa,out_if->area);
               if(IS_DEBUG_OSPF_EVENT)                if(IS_DEBUG_OSPF_EVENT)
                 zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point 9: lsa %p Type-%d",                  zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point 9: lsa %p Type-%d",
                            lsa, (int) lsa->data->type);                            (void *)lsa, (int) lsa->data->type);
               ospf_lsa_discard (lsa);                ospf_lsa_discard (lsa);
               Flag = 1;                Flag = 1;
             }              }
Line 1929  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh Line 1929  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
       /* (5) Find the instance of this LSA that is currently contained        /* (5) Find the instance of this LSA that is currently contained
          in the router's link state database.  If there is no           in the router's link state database.  If there is no
          database copy, or the received LSA is more recent than           database copy, or the received LSA is more recent than
         the database copy the following steps must be performed. */         the database copy the following steps must be performed.
          (The sub steps from RFC 2328 section 13 step (5) will be performed in
          ospf_flood() ) */
   
       if (current == NULL ||        if (current == NULL ||
           (ret = ospf_lsa_more_recent (current, lsa)) < 0)            (ret = ospf_lsa_more_recent (current, lsa)) < 0)
Line 2026  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh Line 2028  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
               quagga_gettime (QUAGGA_CLK_MONOTONIC, &now);                quagga_gettime (QUAGGA_CLK_MONOTONIC, &now);
                               
               if (tv_cmp (tv_sub (now, current->tv_orig),                 if (tv_cmp (tv_sub (now, current->tv_orig), 
                          int2tv (OSPF_MIN_LS_ARRIVAL)) >= 0)                          msec2tv (ospf->min_ls_arrival)) >= 0)
                 /* Trap NSSA type later.*/                  /* Trap NSSA type later.*/
                 ospf_ls_upd_send_lsa (nbr, current, OSPF_SEND_PACKET_DIRECT);                  ospf_ls_upd_send_lsa (nbr, current, OSPF_SEND_PACKET_DIRECT);
               DISCARD_LSA (lsa, 8);                DISCARD_LSA (lsa, 8);
Line 2089  ospf_ls_ack (struct ip *iph, struct ospf_header *ospfh Line 2091  ospf_ls_ack (struct ip *iph, struct ospf_header *ospfh
   
       lsr = ospf_ls_retransmit_lookup (nbr, lsa);        lsr = ospf_ls_retransmit_lookup (nbr, lsa);
   
      if (lsr != NULL && lsr->data->ls_seqnum == lsa->data->ls_seqnum)      if (lsr != NULL && ospf_lsa_more_recent (lsr, lsa) == 0)
        {        ospf_ls_retransmit_delete (nbr, lsr);
#ifdef HAVE_OPAQUE_LSA 
          if (IS_OPAQUE_LSA (lsr->data->type)) 
            ospf_opaque_ls_ack_received (nbr, lsr); 
#endif /* HAVE_OPAQUE_LSA */ 
   
           ospf_ls_retransmit_delete (nbr, lsr);  
         }  
   
       lsa->data = NULL;        lsa->data = NULL;
       ospf_lsa_discard (lsa);        ospf_lsa_discard (lsa);
     }      }
   
   return;    return;
 }  }
 static struct stream *  static struct stream *
 ospf_recv_packet (int fd, struct interface **ifp, struct stream *ibuf)  ospf_recv_packet (int fd, struct interface **ifp, struct stream *ibuf)
 {  {
   int ret;    int ret;
   struct ip *iph;    struct ip *iph;
   u_int16_t ip_len;    u_int16_t ip_len;
  unsigned int ifindex = 0;  ifindex_t ifindex = 0;
   struct iovec iov;    struct iovec iov;
   /* Header and data both require alignment. */    /* Header and data both require alignment. */
   char buff [CMSG_SPACE(SOPT_SIZE_CMSG_IFINDEX_IPV4())];    char buff [CMSG_SPACE(SOPT_SIZE_CMSG_IFINDEX_IPV4())];
Line 2468  ospf_lsa_examin (struct lsa_header * lsah, const u_int Line 2463  ospf_lsa_examin (struct lsa_header * lsah, const u_int
   case OSPF_SUMMARY_LSA:    case OSPF_SUMMARY_LSA:
   case OSPF_ASBR_SUMMARY_LSA:    case OSPF_ASBR_SUMMARY_LSA:
     /* RFC2328 A.4.4, LSA header + 4 bytes followed by N>=1 4-bytes TOS blocks */      /* RFC2328 A.4.4, LSA header + 4 bytes followed by N>=1 4-bytes TOS blocks */
 #ifdef HAVE_OPAQUE_LSA  
   case OSPF_OPAQUE_LINK_LSA:    case OSPF_OPAQUE_LINK_LSA:
   case OSPF_OPAQUE_AREA_LSA:    case OSPF_OPAQUE_AREA_LSA:
   case OSPF_OPAQUE_AS_LSA:    case OSPF_OPAQUE_AS_LSA:
Line 2476  ospf_lsa_examin (struct lsa_header * lsah, const u_int Line 2470  ospf_lsa_examin (struct lsa_header * lsah, const u_int
      * data) padded to 32-bit alignment." This is considered equivalent       * data) padded to 32-bit alignment." This is considered equivalent
      * to 4-byte alignment of all other LSA types, see OSPF-ALIGNMENT.txt       * to 4-byte alignment of all other LSA types, see OSPF-ALIGNMENT.txt
      * file for the detailed analysis of this passage. */       * file for the detailed analysis of this passage. */
 #endif  
     ret = lsalen % 4 ? MSG_NG : MSG_OK;      ret = lsalen % 4 ? MSG_NG : MSG_OK;
     break;      break;
   default:    default:
Line 2919  ospf_read (struct thread *thread) Line 2912  ospf_read (struct thread *thread)
       ospf_ls_req (iph, ospfh, ibuf, oi, length);        ospf_ls_req (iph, ospfh, ibuf, oi, length);
       break;        break;
     case OSPF_MSG_LS_UPD:      case OSPF_MSG_LS_UPD:
      ospf_ls_upd (iph, ospfh, ibuf, oi, length);      ospf_ls_upd (ospf, iph, ospfh, ibuf, oi, length);
       break;        break;
     case OSPF_MSG_LS_ACK:      case OSPF_MSG_LS_ACK:
       ospf_ls_ack (iph, ospfh, ibuf, oi, length);        ospf_ls_ack (iph, ospfh, ibuf, oi, length);
Line 3107  ospf_make_db_desc (struct ospf_interface *oi, struct o Line 3100  ospf_make_db_desc (struct ospf_interface *oi, struct o
   
   /* Set Options. */    /* Set Options. */
   options = OPTIONS (oi);    options = OPTIONS (oi);
 #ifdef HAVE_OPAQUE_LSA  
   if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE))    if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE))
    {    SET_FLAG (options, OSPF_OPTION_O);
      if (IS_SET_DD_I (nbr->dd_flags) 
      ||  CHECK_FLAG (nbr->options, OSPF_OPTION_O)) 
        /* 
         * Set O-bit in the outgoing DD packet for capablity negotiation, 
         * if one of following case is applicable.  
         * 
         * 1) WaitTimer expiration event triggered the neighbor state to 
         *    change to Exstart, but no (valid) DD packet has received 
         *    from the neighbor yet. 
         * 
         * 2) At least one DD packet with O-bit on has received from the 
         *    neighbor. 
         */ 
        SET_FLAG (options, OSPF_OPTION_O); 
    } 
#endif /* HAVE_OPAQUE_LSA */ 
   stream_putc (s, options);    stream_putc (s, options);
   
   /* DD flags */    /* DD flags */
Line 3150  ospf_make_db_desc (struct ospf_interface *oi, struct o Line 3126  ospf_make_db_desc (struct ospf_interface *oi, struct o
       for (rn = route_top (table); rn; rn = route_next (rn))        for (rn = route_top (table); rn; rn = route_next (rn))
         if ((lsa = rn->info) != NULL)          if ((lsa = rn->info) != NULL)
           {            {
 #ifdef HAVE_OPAQUE_LSA  
             if (IS_OPAQUE_LSA (lsa->data->type)              if (IS_OPAQUE_LSA (lsa->data->type)
             && (! CHECK_FLAG (options, OSPF_OPTION_O)))              && (! CHECK_FLAG (options, OSPF_OPTION_O)))
               {                {
Line 3159  ospf_make_db_desc (struct ospf_interface *oi, struct o Line 3134  ospf_make_db_desc (struct ospf_interface *oi, struct o
                 ospf_lsdb_delete (lsdb, lsa);                  ospf_lsdb_delete (lsdb, lsa);
                 continue;                  continue;
               }                }
 #endif /* HAVE_OPAQUE_LSA */  
   
             if (!CHECK_FLAG (lsa->flags, OSPF_LSA_DISCARD))              if (!CHECK_FLAG (lsa->flags, OSPF_LSA_DISCARD))
               {                {
Line 3295  ospf_make_ls_upd (struct ospf_interface *oi, struct li Line 3269  ospf_make_ls_upd (struct ospf_interface *oi, struct li
       u_int16_t ls_age;        u_int16_t ls_age;
   
       if (IS_DEBUG_OSPF_EVENT)        if (IS_DEBUG_OSPF_EVENT)
        zlog_debug ("ospf_make_ls_upd: List Iteration");        zlog_debug ("ospf_make_ls_upd: List Iteration %d", count);
   
       lsa = listgetdata (node);        lsa = listgetdata (node);
   
Line 3701  ospf_ls_upd_queue_send (struct ospf_interface *oi, str Line 3675  ospf_ls_upd_queue_send (struct ospf_interface *oi, str
   u_int16_t length = OSPF_HEADER_SIZE;    u_int16_t length = OSPF_HEADER_SIZE;
   
   if (IS_DEBUG_OSPF_EVENT)    if (IS_DEBUG_OSPF_EVENT)
    zlog_debug ("listcount = %d, dst %s", listcount (update), inet_ntoa(addr));    zlog_debug ("listcount = %d, [%s]dst %s", listcount (update), IF_NAME(oi),
                             inet_ntoa(addr));
       
   op = ospf_ls_upd_packet_new (update, oi);    op = ospf_ls_upd_packet_new (update, oi);
   
Line 3823  ospf_ls_upd_send (struct ospf_neighbor *nbr, struct li Line 3798  ospf_ls_upd_send (struct ospf_neighbor *nbr, struct li
   
   if (rn->info == NULL)    if (rn->info == NULL)
     rn->info = list_new ();      rn->info = list_new ();
     else
       route_unlock_node (rn);
   
   for (ALL_LIST_ELEMENTS_RO (update, node, lsa))    for (ALL_LIST_ELEMENTS_RO (update, node, lsa))
     listnode_add (rn->info, ospf_lsa_lock (lsa)); /* oi->ls_upd_queue */      listnode_add (rn->info, ospf_lsa_lock (lsa)); /* oi->ls_upd_queue */

Removed from v.1.1.1.3  
changed lines
  Added in v.1.1.1.5


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>