Diff for /embedaddon/quagga/isisd/isis_tlv.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2012/10/09 09:22:28 version 1.1.1.3, 2013/07/21 23:54:39
Line 117  parse_tlvs (char *areatag, u_char * stream, int size,  Line 117  parse_tlvs (char *areatag, u_char * stream, int size, 
 #endif /* HAVE_IPV6 */  #endif /* HAVE_IPV6 */
   u_char virtual;    u_char virtual;
   int value_len, retval = ISIS_OK;    int value_len, retval = ISIS_OK;
  u_char *start = stream, *pnt = stream;  u_char *start = stream, *pnt = stream, *endpnt;
   
   *found = 0;    *found = 0;
   memset (tlvs, 0, sizeof (struct tlvs));    memset (tlvs, 0, sizeof (struct tlvs));
Line 584  parse_tlvs (char *areatag, u_char * stream, int size,  Line 584  parse_tlvs (char *areatag, u_char * stream, int size, 
           zlog_debug ("ISIS-TLV (%s): IPv4 extended Reachability length %d",            zlog_debug ("ISIS-TLV (%s): IPv4 extended Reachability length %d",
                       areatag, length);                        areatag, length);
 #endif /* EXTREME_TLV_DEBUG */  #endif /* EXTREME_TLV_DEBUG */
             endpnt = pnt + length;
           if (*expected & TLVFLAG_TE_IPV4_REACHABILITY)            if (*expected & TLVFLAG_TE_IPV4_REACHABILITY)
             {              {
               while (length > value_len)                while (length > value_len)
                 {                  {
                   te_ipv4_reach = (struct te_ipv4_reachability *) pnt;                    te_ipv4_reach = (struct te_ipv4_reachability *) pnt;
                     if ((te_ipv4_reach->control & 0x3F) > IPV4_MAX_BITLEN)
                       {
                         zlog_warn ("ISIS-TLV (%s): invalid IPv4 extended reach"
                                    "ability prefix length %d", areatag,
                                    te_ipv4_reach->control & 0x3F);
                         retval = ISIS_WARNING;
                         break;
                       }
                   if (!tlvs->te_ipv4_reachs)                    if (!tlvs->te_ipv4_reachs)
                     tlvs->te_ipv4_reachs = list_new ();                      tlvs->te_ipv4_reachs = list_new ();
                   listnode_add (tlvs->te_ipv4_reachs, te_ipv4_reach);                    listnode_add (tlvs->te_ipv4_reachs, te_ipv4_reach);
Line 600  parse_tlvs (char *areatag, u_char * stream, int size,  Line 609  parse_tlvs (char *areatag, u_char * stream, int size, 
                               ((((te_ipv4_reach->control & 0x3F) - 1) >> 3) + 1) : 0);                                ((((te_ipv4_reach->control & 0x3F) - 1) >> 3) + 1) : 0);
                 }                  }
             }              }
          else
            {          pnt = endpnt;
              pnt += length; 
            } 
           break;            break;
   
 #ifdef  HAVE_IPV6  #ifdef  HAVE_IPV6
Line 648  parse_tlvs (char *areatag, u_char * stream, int size,  Line 655  parse_tlvs (char *areatag, u_char * stream, int size, 
            * +---------------------------------------------------------------+             * +---------------------------------------------------------------+
            */             */
           *found |= TLVFLAG_IPV6_REACHABILITY;            *found |= TLVFLAG_IPV6_REACHABILITY;
             endpnt = pnt + length;
   
           if (*expected & TLVFLAG_IPV6_REACHABILITY)            if (*expected & TLVFLAG_IPV6_REACHABILITY)
             {              {
               while (length > value_len)                while (length > value_len)
                 {                  {
                   ipv6_reach = (struct ipv6_reachability *) pnt;                    ipv6_reach = (struct ipv6_reachability *) pnt;
                     if (ipv6_reach->prefix_len > IPV6_MAX_BITLEN)
                       {
                         zlog_warn ("ISIS-TLV (%s): invalid IPv6 extended reach"
                                    "ability prefix length %d", areatag,
                                    ipv6_reach->prefix_len);
                         retval = ISIS_WARNING;
                         break;
                       }
   
                   prefix_octets = ((ipv6_reach->prefix_len + 7) / 8);                    prefix_octets = ((ipv6_reach->prefix_len + 7) / 8);
                   value_len += prefix_octets + 6;                    value_len += prefix_octets + 6;
                   pnt += prefix_octets + 6;                    pnt += prefix_octets + 6;
Line 662  parse_tlvs (char *areatag, u_char * stream, int size,  Line 680  parse_tlvs (char *areatag, u_char * stream, int size, 
                   listnode_add (tlvs->ipv6_reachs, ipv6_reach);                    listnode_add (tlvs->ipv6_reachs, ipv6_reach);
                 }                  }
             }              }
          else
            {          pnt = endpnt;
              pnt += length; 
            } 
           break;            break;
 #endif /* HAVE_IPV6 */  #endif /* HAVE_IPV6 */
   
Line 696  parse_tlvs (char *areatag, u_char * stream, int size,  Line 712  parse_tlvs (char *areatag, u_char * stream, int size, 
             Neighbor Extended Local Circuit ID (four octets, if Neighbor              Neighbor Extended Local Circuit ID (four octets, if Neighbor
               System ID is present) */                System ID is present) */
                   pnt += length;                    pnt += length;
                     value_len += length;
                 }                  }
             }              }
           else            else
Line 916  tlv_add_ip_addrs (struct list *ip_addrs, struct stream Line 933  tlv_add_ip_addrs (struct list *ip_addrs, struct stream
     {      {
       if (pos - value + IPV4_MAX_BYTELEN > 255)        if (pos - value + IPV4_MAX_BYTELEN > 255)
         {          {
          retval = add_tlv (IPV4_ADDR, pos - value, value, stream);          /* RFC 1195 s4.2: only one tuple of 63 allowed. */
          if (retval != ISIS_OK)          zlog_warn ("tlv_add_ip_addrs(): cutting off at 63 IP addresses");
            return retval;          break;
          pos = value; 
         }          }
       *(u_int32_t *) pos = ipv4->prefix.s_addr;        *(u_int32_t *) pos = ipv4->prefix.s_addr;
       pos += IPV4_MAX_BYTELEN;        pos += IPV4_MAX_BYTELEN;

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


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