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

version 1.1.1.4, 2013/07/21 23:54:40 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 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; }
   
Line 1821  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);
Line 1831  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh Line 1827  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
          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) 
         {          {
           /* (4a) Response Link State Acknowledgment. */            /* (4a) Response Link State Acknowledgment. */
           ospf_ls_ack_send (nbr, lsa);            ospf_ls_ack_send (nbr, lsa);
Line 1846  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh Line 1841  ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
           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 1894  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 changed. 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
Line 1922  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 2035  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 2098  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 2477  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 2485  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 2928  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 3116  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 3159  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 3168  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 3304  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 3710  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 3832  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.4  
changed lines
  Added in v.1.1.1.5


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