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

Commit 994fe0f0 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 10919181 from a92ac6f7 to udc-qpr1-release

Change-Id: I4ec1c2733d662369c1954261eee50d394141808e
parents cb38e414 a92ac6f7
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -374,7 +374,9 @@ bool bta_ag_sdp_find_attr(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK service) {
      }
      /* get features if HFP */
      p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES);
      if (p_attr != nullptr) {
      if (p_attr != nullptr &&
          SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
          SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) {
        /* Found attribute. Get value. */
        /* There might be race condition between SDP and BRSF.  */
        /* Do not update if we already received BRSF.           */
@@ -417,7 +419,9 @@ bool bta_ag_sdp_find_attr(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK service) {
      /* get features if HSP */
      p_attr =
          SDP_FindAttributeInRec(p_rec, ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL);
      if (p_attr != nullptr) {
      if (p_attr != nullptr &&
            SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == BOOLEAN_DESC_TYPE &&
            SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 1) {
        /* Remote volume control of HSP */
        if (p_attr->attr_value.v.u8)
          p_scb->peer_features |= BTA_AG_PEER_FEAT_VOL;
+6 −2
Original line number Diff line number Diff line
@@ -1751,7 +1751,9 @@ tBTA_AV_FEAT bta_av_check_peer_features(uint16_t service_uuid) {
      if (peer_rc_version >= AVRC_REV_1_4) {
        /* get supported categories */
        p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES);
        if (p_attr != NULL) {
        if (p_attr != NULL &&
            SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
            SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) {
          categories = p_attr->attr_value.v.u16;
          if (categories & AVRC_SUPF_CT_CAT2)
            peer_features |= (BTA_AV_FEAT_ADV_CTRL);
@@ -1815,7 +1817,9 @@ tBTA_AV_FEAT bta_avk_check_peer_features(uint16_t service_uuid) {
      /* Get supported features */
      tSDP_DISC_ATTR* p_attr =
          SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES);
      if (p_attr != NULL) {
      if (p_attr != NULL &&
          SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
          SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) {
        uint16_t categories = p_attr->attr_value.v.u16;
        /*
         * Though Absolute Volume came after in 1.4 and above, but there are
+3 −1
Original line number Diff line number Diff line
@@ -1109,7 +1109,9 @@ void bta_dm_disc_rmt_name(tBTA_DM_MSG* p_data) {
static void store_avrcp_profile_feature(tSDP_DISC_REC* sdp_rec) {
  tSDP_DISC_ATTR* p_attr =
      SDP_FindAttributeInRec(sdp_rec, ATTR_ID_SUPPORTED_FEATURES);
  if (p_attr == NULL) {
  if (p_attr == NULL ||
      SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != UINT_DESC_TYPE ||
      SDP_DISC_ATTR_LEN(p_attr->attr_len_type) < 2) {
    return;
  }

+6 −2
Original line number Diff line number Diff line
@@ -250,7 +250,9 @@ bool bta_hf_client_sdp_find_attr(tBTA_HF_CLIENT_CB* client_cb) {

    /* get features */
    p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES);
    if (p_attr != NULL) {
    if (p_attr != NULL &&
        SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) {
      /* Found attribute. Get value. */
      /* There might be race condition between SDP and BRSF.  */
      /* Do not update if we already received BRSF.           */
@@ -265,7 +267,9 @@ bool bta_hf_client_sdp_find_attr(tBTA_HF_CLIENT_CB* client_cb) {

        /* get network for ability to reject calls */
        p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_NETWORK);
        if (p_attr != NULL) {
        if (p_attr != NULL &&
            SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
            SDP_DISC_ATTR_LEN(p_attr->attr_len_type) >= 2) {
          if (p_attr->attr_value.v.u16 == 0x01) {
            client_cb->peer_features |= BTA_HF_CLIENT_PEER_REJECT;
          }
+191 −46
Original line number Diff line number Diff line
@@ -50,14 +50,27 @@ static void bta_create_mns_sdp_record(bluetooth_sdp_record* record,

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 4) {
      record->mns.supported_features = p_attr->attr_value.v.u32;
    } else {
      LOG_ERROR("ATTR_ID_MAP_SUPPORTED_FEATURES attr type or size wrong!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_MAP_SUPPORTED_FEATURES attr not found!!");
  }

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) {
      record->mns.hdr.service_name_length =
          SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
      record->mns.hdr.service_name = (char*)p_attr->attr_value.v.array;
    } else {
      LOG_ERROR("ATTR_ID_SERVICE_NAME attr type not TEXT_STR_DESC_TYPE!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!");
  }

  if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_MAP_PROFILE,
@@ -71,7 +84,14 @@ static void bta_create_mns_sdp_record(bluetooth_sdp_record* record,

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) {
      record->mns.hdr.l2cap_psm = p_attr->attr_value.v.u16;
    } else {
      LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr type or len wrong!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr not found!!");
  }
}

@@ -93,24 +113,51 @@ static void bta_create_mas_sdp_record(bluetooth_sdp_record* record,

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAS_INSTANCE_ID);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 1) {
      record->mas.mas_instance_id = p_attr->attr_value.v.u8;
    } else {
      LOG_ERROR("ATTR_ID_MAS_INSTANCE_ID attr type or len wrong!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_MAS_INSTANCE_ID attr not found!!");
  }

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_MSG_TYPE);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 1) {
      record->mas.supported_message_types = p_attr->attr_value.v.u8;
    } else {
      LOG_ERROR("ATTR_ID_SUPPORTED_MSG_TYPE attr type or len wrong!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_SUPPORTED_MSG_TYPE attr not found!!");
  }

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAP_SUPPORTED_FEATURES);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 4) {
      record->mas.supported_features = p_attr->attr_value.v.u32;
    } else {
      LOG_ERROR("ATTR_ID_MAP_SUPPORTED_FEATURES attr type or len wrong!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_MAP_SUPPORTED_FEATURES attr not found!!");
  }

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) {
      record->mas.hdr.service_name_length =
          SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
      record->mas.hdr.service_name = (char*)p_attr->attr_value.v.array;
    } else {
      LOG_ERROR("ATTR_ID_SERVICE_NAME attr type wrong!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!");
  }

  if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_MAP_PROFILE,
@@ -124,7 +171,14 @@ static void bta_create_mas_sdp_record(bluetooth_sdp_record* record,

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) {
      record->mas.hdr.l2cap_psm = p_attr->attr_value.v.u16;
    } else {
      LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr type or len wrong!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr not found!!");
  }
}

@@ -145,18 +199,39 @@ static void bta_create_pse_sdp_record(bluetooth_sdp_record* record,

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_REPOSITORIES);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 1) {
      record->pse.supported_repositories = p_attr->attr_value.v.u8;
    } else {
      LOG_ERROR("ATTR_ID_SUPPORTED_REPOSITORIES attr type or len wrong!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_SUPPORTED_REPOSITORIES attr not found!!");
  }
  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PBAP_SUPPORTED_FEATURES);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 4) {
      record->pse.supported_features = p_attr->attr_value.v.u32;
    } else {
      LOG_ERROR("ATTR_ID_PBAP_SUPPORTED_FEATURES attr type or len wrong!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_PBAP_SUPPORTED_FEATURES attr not found!!");
  }

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) {
      record->pse.hdr.service_name_length =
          SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
      // TODO: validate the lifetime of this value
      record->pse.hdr.service_name = (char*)p_attr->attr_value.v.array;
    } else {
      LOG_ERROR("ATTR_ID_SERVICE_NAME attr type NOT string!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!");
  }

  if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_PHONE_ACCESS,
@@ -170,7 +245,14 @@ static void bta_create_pse_sdp_record(bluetooth_sdp_record* record,

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) {
      record->pse.hdr.l2cap_psm = p_attr->attr_value.v.u16;
    } else {
      LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr type or len wrong!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr not found!!");
  }
}

@@ -190,9 +272,15 @@ static void bta_create_ops_sdp_record(bluetooth_sdp_record* record,

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) {
      record->ops.hdr.service_name_length =
          SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
      record->ops.hdr.service_name = (char*)p_attr->attr_value.v.array;
    } else {
      LOG_ERROR("ATTR_ID_SERVICE_NAME attr type NOT string!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!");
  }

  if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_OBEX_OBJECT_PUSH,
@@ -206,8 +294,16 @@ static void bta_create_ops_sdp_record(bluetooth_sdp_record* record,

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_GOEP_L2CAP_PSM);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) {
      record->ops.hdr.l2cap_psm = p_attr->attr_value.v.u16;
    } else {
      LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr type or len wrong!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_GOEP_L2CAP_PSM attr not found!!");
  }

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FORMATS_LIST);
  if (p_attr != NULL) {
    /* Safety check - each entry should itself be a sequence */
@@ -274,9 +370,15 @@ static void bta_create_sap_sdp_record(bluetooth_sdp_record* record,

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) {
      record->sap.hdr.service_name_length =
          SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
      record->sap.hdr.service_name = (char*)p_attr->attr_value.v.array;
    } else {
      LOG_ERROR("ATTR_ID_SERVICE_NAME attr type NOT string!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!");
  }

  if (SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_SAP, &pversion)) {
@@ -304,43 +406,80 @@ static void bta_create_dip_sdp_record(bluetooth_sdp_record* record,

  p_attr =
      SDP_FindAttributeInRec(p_rec, ATTR_ID_SPECIFICATION_ID);
  if (p_attr != nullptr)
  if (p_attr != nullptr) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) {
      record->dip.spec_id = p_attr->attr_value.v.u16;
  else
    } else {
      LOG_ERROR("ATTR_ID_SPECIFICATION_ID attr type or len wrong!!");
    }
  } else {
    APPL_TRACE_ERROR("%s() ATTR_ID_SPECIFICATION_ID not found", __func__);
  }

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_VENDOR_ID);
  if (p_attr != nullptr)
  if (p_attr != nullptr) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) {
      record->dip.vendor = p_attr->attr_value.v.u16;
  else
    } else {
      LOG_ERROR("ATTR_ID_VENDOR_ID attr type or len wrong!!");
    }
  } else {
    APPL_TRACE_ERROR("%s() ATTR_ID_VENDOR_ID not found", __func__);
  }

  p_attr =
      SDP_FindAttributeInRec(p_rec, ATTR_ID_VENDOR_ID_SOURCE);
  if (p_attr != nullptr)
  if (p_attr != nullptr) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) {
      record->dip.vendor_id_source = p_attr->attr_value.v.u16;
  else
    } else {
      LOG_ERROR("ATTR_ID_VENDOR_ID_SOURCE attr type or len wrong!!");
    }
  } else {
    APPL_TRACE_ERROR("%s() ATTR_ID_VENDOR_ID_SOURCE not found", __func__);
  }

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PRODUCT_ID);
  if (p_attr != nullptr)
  if (p_attr != nullptr) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) {
      record->dip.product = p_attr->attr_value.v.u16;
  else
    } else {
      LOG_ERROR("ATTR_ID_PRODUCT_ID attr type or len wrong!!");
    }
  } else {
    APPL_TRACE_ERROR("%s() ATTR_ID_PRODUCT_ID not found", __func__);
  }

  p_attr =
      SDP_FindAttributeInRec(p_rec, ATTR_ID_PRODUCT_VERSION);
  if (p_attr != nullptr)

  if (p_attr != nullptr) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == UINT_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 2) {
      record->dip.version = p_attr->attr_value.v.u16;
  else
    } else {
      LOG_ERROR("ATTR_ID_PRODUCT_VERSION attr type or len wrong!!");
    }
  } else {
    APPL_TRACE_ERROR("%s() ATTR_ID_PRODUCT_VERSION not found", __func__);
  }

  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PRIMARY_RECORD);
  if (p_attr != nullptr)
  if (p_attr != nullptr) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == BOOLEAN_DESC_TYPE &&
        SDP_DISC_ATTR_LEN(p_attr->attr_len_type) == 1) {
      record->dip.primary_record = !(!p_attr->attr_value.v.u8);
  else
    } else {
      LOG_ERROR("ATTR_ID_PRIMARY_RECORD attr type or len wrong!!");
    }
  } else {
    APPL_TRACE_ERROR("%s() ATTR_ID_PRIMARY_RECORD not found", __func__);
  }
}

static void bta_create_raw_sdp_record(bluetooth_sdp_record* record,
                                      tSDP_DISC_REC* p_rec) {
@@ -357,9 +496,15 @@ static void bta_create_raw_sdp_record(bluetooth_sdp_record* record,
  /* Try to extract a service name */
  p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME);
  if (p_attr != NULL) {
    if (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) == TEXT_STR_DESC_TYPE) {
      record->pse.hdr.service_name_length =
          SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
      record->pse.hdr.service_name = (char*)p_attr->attr_value.v.array;
    } else {
      LOG_ERROR("ATTR_ID_SERVICE_NAME attr type NOT string!!");
    }
  } else {
      LOG_ERROR("ATTR_ID_SERVICE_NAME attr not found!!");
  }

  /* Try to extract an RFCOMM channel */
Loading