This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2652R: Issue:When OTA-Server read "ATTRID_OTA_UPGRADE_UPGRADE_SERVER_ID" form CC2652R device, cc2652R will crash

Part Number: CC2652R

SDK version: SDK 5.20.00.52

The attribute "ATTRID_OTA_UPGRADE_UPGRADE_SERVER_ID" is "ZCL_DATATYPE_BITMAP64" type,  the function "zclGetDataTypeLength" could not support this type.

  • I suppose you can add code to handle this.

  • uint8_t *zclSerializeData( uint8_t dataType, void *attrData, uint8_t *buf )
    {
      uint8_t *pStr;
      uint16_t len;
    
      if ( attrData == NULL )
      {
        return ( buf );
      }
    
      switch ( dataType )
      {
        case ZCL_DATATYPE_DATA8:
        case ZCL_DATATYPE_BOOLEAN:
        case ZCL_DATATYPE_BITMAP8:
        case ZCL_DATATYPE_INT8:
        case ZCL_DATATYPE_UINT8:
        case ZCL_DATATYPE_ENUM8:
          *buf++ = *((uint8_t *)attrData);
           break;
    
        case ZCL_DATATYPE_DATA16:
        case ZCL_DATATYPE_BITMAP16:
        case ZCL_DATATYPE_UINT16:
        case ZCL_DATATYPE_INT16:
        case ZCL_DATATYPE_ENUM16:
        case ZCL_DATATYPE_SEMI_PREC:
        case ZCL_DATATYPE_CLUSTER_ID:
        case ZCL_DATATYPE_ATTR_ID:
          *buf++ = LO_UINT16( *((uint16_t*)attrData) );
          *buf++ = HI_UINT16( *((uint16_t*)attrData) );
          break;
    
        case ZCL_DATATYPE_DATA24:
        case ZCL_DATATYPE_BITMAP24:
        case ZCL_DATATYPE_UINT24:
        case ZCL_DATATYPE_INT24:
          *buf++ = BREAK_UINT32( *((uint32_t*)attrData), 0 );
          *buf++ = BREAK_UINT32( *((uint32_t*)attrData), 1 );
          *buf++ = BREAK_UINT32( *((uint32_t*)attrData), 2 );
          break;
    
        case ZCL_DATATYPE_DATA32:
        case ZCL_DATATYPE_BITMAP32:
        case ZCL_DATATYPE_UINT32:
        case ZCL_DATATYPE_INT32:
        case ZCL_DATATYPE_SINGLE_PREC:
        case ZCL_DATATYPE_TOD:
        case ZCL_DATATYPE_DATE:
        case ZCL_DATATYPE_UTC:
        case ZCL_DATATYPE_BAC_OID:
          buf = zcl_buffer_uint32( buf, *((uint32_t*)attrData) );
          break;
    
        case ZCL_DATATYPE_DATA40:
        case ZCL_DATATYPE_BITMAP40:
        case ZCL_DATATYPE_UINT40:
        case ZCL_DATATYPE_INT40:
          pStr = (uint8_t*)attrData;
          buf = zcl_memcpy( buf, pStr, 5 );
          break;
    
        case ZCL_DATATYPE_DATA48:
        case ZCL_DATATYPE_BITMAP48:
        case ZCL_DATATYPE_UINT48:
        case ZCL_DATATYPE_INT48:
          pStr = (uint8_t*)attrData;
          buf = zcl_memcpy( buf, pStr, 6 );
          break;
    
        case ZCL_DATATYPE_DATA56:
        case ZCL_DATATYPE_BITMAP56:
        case ZCL_DATATYPE_UINT56:
        case ZCL_DATATYPE_INT56:
          pStr = (uint8_t*)attrData;
          buf = zcl_memcpy( buf, pStr, 7 );
          break;
    
        case ZCL_DATATYPE_DATA64:
        case ZCL_DATATYPE_BITMAP64:
        case ZCL_DATATYPE_DOUBLE_PREC:
        case ZCL_DATATYPE_IEEE_ADDR:
        case ZCL_DATATYPE_UINT64:
        case ZCL_DATATYPE_INT64:
          pStr = (uint8_t*)attrData;
          buf = zcl_memcpy( buf, pStr, 8 );
          break;
    
        case ZCL_DATATYPE_CHAR_STR:
        case ZCL_DATATYPE_OCTET_STR:
          pStr = (uint8_t*)attrData;
          len = *pStr;
          buf = zcl_memcpy( buf, pStr, len+1 ); // Including length field
          break;
    
        case ZCL_DATATYPE_LONG_CHAR_STR:
        case ZCL_DATATYPE_LONG_OCTET_STR:
          pStr = (uint8_t*)attrData;
          len = BUILD_UINT16( pStr[0], pStr[1] );
          buf = zcl_memcpy( buf, pStr, len+2 ); // Including length field
          break;
    
        case ZCL_DATATYPE_128_BIT_SEC_KEY:
          pStr = (uint8_t*)attrData;
          buf = zcl_memcpy( buf, pStr, SEC_KEY_LEN );
          break;
    
        case ZCL_DATATYPE_NO_DATA:
        case ZCL_DATATYPE_UNKNOWN:
          // Fall through
    
        default:
          break;
      }
    
      return ( buf );
    }
    
    uint8_t zclGetDataTypeLength( uint8_t dataType )
    {
      uint8_t len;
    
      switch ( dataType )
      {
        case ZCL_DATATYPE_DATA8:
        case ZCL_DATATYPE_BOOLEAN:
        case ZCL_DATATYPE_BITMAP8:
        case ZCL_DATATYPE_INT8:
        case ZCL_DATATYPE_UINT8:
        case ZCL_DATATYPE_ENUM8:
          len = 1;
          break;
    
        case ZCL_DATATYPE_DATA16:
        case ZCL_DATATYPE_BITMAP16:
        case ZCL_DATATYPE_UINT16:
        case ZCL_DATATYPE_INT16:
        case ZCL_DATATYPE_ENUM16:
        case ZCL_DATATYPE_SEMI_PREC:
        case ZCL_DATATYPE_CLUSTER_ID:
        case ZCL_DATATYPE_ATTR_ID:
          len = 2;
          break;
    
        case ZCL_DATATYPE_DATA24:
        case ZCL_DATATYPE_BITMAP24:
        case ZCL_DATATYPE_UINT24:
        case ZCL_DATATYPE_INT24:
          len = 3;
          break;
    
        case ZCL_DATATYPE_DATA32:
        case ZCL_DATATYPE_BITMAP32:
        case ZCL_DATATYPE_UINT32:
        case ZCL_DATATYPE_INT32:
        case ZCL_DATATYPE_SINGLE_PREC:
        case ZCL_DATATYPE_TOD:
        case ZCL_DATATYPE_DATE:
        case ZCL_DATATYPE_UTC:
        case ZCL_DATATYPE_BAC_OID:
          len = 4;
          break;
    
        case ZCL_DATATYPE_DATA40:
        case ZCL_DATATYPE_BITMAP40:
        case ZCL_DATATYPE_UINT40:
        case ZCL_DATATYPE_INT40:
           len = 5;
           break;
    
        case ZCL_DATATYPE_DATA48:
        case ZCL_DATATYPE_BITMAP48:
        case ZCL_DATATYPE_UINT48:
        case ZCL_DATATYPE_INT48:
           len = 6;
           break;
    
        case ZCL_DATATYPE_DATA56:
        case ZCL_DATATYPE_BITMAP56:
        case ZCL_DATATYPE_UINT56:
        case ZCL_DATATYPE_INT56:
           len = 7;
           break;
    
        case ZCL_DATATYPE_DATA64:
        case ZCL_DATATYPE_BITMAP64:
        case ZCL_DATATYPE_UINT64:
        case ZCL_DATATYPE_INT64:
        case ZCL_DATATYPE_DOUBLE_PREC:
        case ZCL_DATATYPE_IEEE_ADDR:
          len = 8;
          break;
    
        case ZCL_DATATYPE_128_BIT_SEC_KEY:
         len = SEC_KEY_LEN;
         break;
    
        case ZCL_DATATYPE_NO_DATA:
        case ZCL_DATATYPE_UNKNOWN:
          // Fall through
    
        default:
          len = 0;
          break;
      }
    
      return ( len );
    }
    
    

  • Hello Aries,

    Thank you for bringing up this issue, I've created a ticket for the Software Development Team to address.

    Regards,
    Ryan