Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba8ca9df authored by Wei Wang's avatar Wei Wang Committed by Android (Google) Code Review
Browse files

Merge "Fix ADV data exceeding max adv packet length" into lmp-dev

parents b37f2398 125d892a
Loading
Loading
Loading
Loading
+117 −81
Original line number Diff line number Diff line
@@ -265,6 +265,7 @@ BOOLEAN btif_gattc_copy_datacb(int cbindex, btif_adv_data_t *p_adv_data, BOOLEAN

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
    memset(&p_multi_adv_data_cb->inst_cb[cbindex].data, 0, sizeof(tBTA_BLE_ADV_DATA));
    p_multi_adv_data_cb->inst_cb[cbindex].mask = 0;

    p_multi_adv_data_cb->inst_cb[cbindex].is_scan_rsp = p_adv_data->set_scan_rsp ? 1 : 0;
    if (!p_adv_data->set_scan_rsp)
@@ -342,8 +343,6 @@ BOOLEAN btif_gattc_copy_datacb(int cbindex, btif_adv_data_t *p_adv_data, BOOLEAN
    }

    tBTA_BLE_PROP_ELEM *p_elem_service_data = NULL;
     tBTA_BLE_PROP_ELEM *p_elem_service_128 = NULL;

    if (p_adv_data->service_data_len > 0 && p_adv_data->p_service_data != NULL)
    {
         BTIF_TRACE_DEBUG("%s - In service_data", __FUNCTION__);
@@ -364,81 +363,118 @@ BOOLEAN btif_gattc_copy_datacb(int cbindex, btif_adv_data_t *p_adv_data, BOOLEAN
         }
    }

         if (p_adv_data->service_uuid_len > 0 && p_adv_data->p_service_uuid != NULL)
    if (NULL != p_elem_service_data)
    {
             p_multi_adv_data_cb->inst_cb[cbindex].data.p_services =
                                            GKI_getbuf(sizeof(tBTA_BLE_SERVICE));
             p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->list_cmpl = FALSE;
             p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->num_service = 0;
             p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid =
                 GKI_getbuf(p_adv_data->service_uuid_len / LEN_UUID_128 * LEN_UUID_16);
             if (p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid != NULL)
        p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary =
                                                   GKI_getbuf(sizeof(tBTA_BLE_PROPRIETARY));
        if (NULL != p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary)
        {
                 UINT16 *p_uuid_out = p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid;
            tBTA_BLE_PROP_ELEM *p_elem = NULL;
            tBTA_BLE_PROPRIETARY *p_prop = p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary;
            p_prop->num_elem = 0;
            p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_PROPRIETARY;
            p_prop->num_elem = 1;
            p_prop->p_elem = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM) * p_prop->num_elem);
            p_elem = p_prop->p_elem;
            if (NULL != p_elem)
                memcpy(p_elem++, p_elem_service_data, sizeof(tBTA_BLE_PROP_ELEM));
            GKI_freebuf(p_elem_service_data);
        }
    }

    if (p_adv_data->service_uuid_len > 0 && NULL != p_adv_data->p_service_uuid)
    {
        UINT16 *p_uuid_out16 = NULL;
        UINT32 *p_uuid_out32 = NULL;
        while (p_adv_data->service_uuid_len >= LEN_UUID_128)
        {
             bt_uuid_t uuid;
             memset(&uuid, 0, sizeof(bt_uuid_t));
             memcpy(&uuid.uu, p_adv_data->p_service_uuid, LEN_UUID_128);

             tBT_UUID bt_uuid;
             memset(&bt_uuid, 0, sizeof(tBT_UUID));
             btif_to_bta_uuid(&bt_uuid, &uuid);

                     if (bt_uuid.len == LEN_UUID_16)
             switch(bt_uuid.len)
             {
                         p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE;
                         ++p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->num_service;
                         *p_uuid_out++ = bt_uuid.uu.uuid16;
                     } else if (bt_uuid.len == LEN_UUID_128 && p_elem_service_128 == NULL) {
                         /* Currently, only one 128-bit UUID is supported */
                         p_elem_service_128 = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
                         if (p_elem_service_128 != NULL)
                case (LEN_UUID_16):
                {
                             p_elem_service_128->p_val = GKI_getbuf(LEN_UUID_128);
                             if (p_elem_service_128->p_val != NULL)
                  if (NULL == p_multi_adv_data_cb->inst_cb[cbindex].data.p_services)
                  {
                                 p_elem_service_128->adv_type = BTM_BLE_AD_TYPE_128SRV_PART;
                                 p_elem_service_128->len = LEN_UUID_128;
                                 memcpy(p_elem_service_128->p_val, bt_uuid.uu.uuid128, LEN_UUID_128);
                             } else {
                                 GKI_freebuf(p_elem_service_128);
                                 p_elem_service_128 = NULL;
                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_services =
                                                          GKI_getbuf(sizeof(tBTA_BLE_SERVICE));
                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->list_cmpl = FALSE;
                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->num_service = 0;
                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid =
                              GKI_getbuf(p_adv_data->service_uuid_len / LEN_UUID_128 * LEN_UUID_16);
                      p_uuid_out16 = p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid;
                  }

                  if (NULL != p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid)
                  {
                     BTIF_TRACE_DEBUG("%s - In 16-UUID_data", __FUNCTION__);
                     p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE;
                     ++p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->num_service;
                     *p_uuid_out16++ = bt_uuid.uu.uuid16;
                  }
                  break;
                }
                     p_adv_data->p_service_uuid += LEN_UUID_128;
                     p_adv_data->service_uuid_len -= LEN_UUID_128;

                case (LEN_UUID_32):
                {
                   if (NULL == p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b)
                   {
                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b =
                                                          GKI_getbuf(sizeof(tBTA_BLE_32SERVICE));
                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->list_cmpl = FALSE;
                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->num_service = 0;
                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->p_uuid =
                             GKI_getbuf(p_adv_data->service_uuid_len / LEN_UUID_128 * LEN_UUID_32);
                      p_uuid_out32 = p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->p_uuid;
                   }

                   if (NULL != p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->p_uuid)
                   {
                      BTIF_TRACE_DEBUG("%s - In 32-UUID_data", __FUNCTION__);
                      p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE_32;
                      ++p_multi_adv_data_cb->inst_cb[cbindex].data.p_service_32b->num_service;
                      *p_uuid_out32++ = bt_uuid.uu.uuid32;
                   }
                   break;
                }

         if (p_elem_service_data != NULL || p_elem_service_128 != NULL)
                case (LEN_UUID_128):
                {
             p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary =
                                                GKI_getbuf(sizeof(tBTA_BLE_PROPRIETARY));
             if (p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary != NULL)
                   /* Currently, only one 128-bit UUID is supported */
                   if (NULL == p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b)
                   {
                 tBTA_BLE_PROPRIETARY *p_prop = p_multi_adv_data_cb->inst_cb[cbindex].
                            data.p_proprietary;
                 tBTA_BLE_PROP_ELEM *p_elem = NULL;
                 p_prop->num_elem = 0;
                 p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_PROPRIETARY;
                 if (p_elem_service_128 != NULL)
                     ++p_prop->num_elem;
                 if (p_elem_service_data != NULL)
                     ++p_prop->num_elem;
                 p_prop->p_elem = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM) * p_prop->num_elem);
                 p_elem = p_prop->p_elem;
                 if (p_elem_service_128 != NULL)
                      p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b =
                                                          GKI_getbuf(sizeof(tBTA_BLE_128SERVICE));
                      if (NULL != p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b)
                      {
                     memcpy(p_elem++, p_elem_service_128, sizeof(tBTA_BLE_PROP_ELEM));
                     GKI_freebuf(p_elem_service_128);
                         BTIF_TRACE_DEBUG("%s - In 128-UUID_data", __FUNCTION__);
                         p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE_128;
                         memcpy(p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b->uuid128,
                                                         bt_uuid.uu.uuid128, LEN_UUID_128);
                         BTIF_TRACE_DEBUG("%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x", bt_uuid.uu.uuid128[0],
                            bt_uuid.uu.uuid128[1],bt_uuid.uu.uuid128[2], bt_uuid.uu.uuid128[3],
                            bt_uuid.uu.uuid128[4],bt_uuid.uu.uuid128[5],bt_uuid.uu.uuid128[6],
                            bt_uuid.uu.uuid128[7],bt_uuid.uu.uuid128[8],bt_uuid.uu.uuid128[9],
                            bt_uuid.uu.uuid128[10],bt_uuid.uu.uuid128[11],bt_uuid.uu.uuid128[12],
                            bt_uuid.uu.uuid128[13],bt_uuid.uu.uuid128[14],bt_uuid.uu.uuid128[15]);
                         p_multi_adv_data_cb->inst_cb[cbindex].data.p_services_128b->list_cmpl = TRUE;
                      }
                 if (p_elem_service_data != NULL)
                 {
                     memcpy(p_elem++, p_elem_service_data, sizeof(tBTA_BLE_PROP_ELEM));
                     GKI_freebuf(p_elem_service_data);
                   }
                   break;
                }

                default:
                     break;
             }

             p_adv_data->p_service_uuid += LEN_UUID_128;
             p_adv_data->service_uuid_len -= LEN_UUID_128;
        }
    }