On Monday 02 of February 2015 16:09:34 Szymon Janc wrote: > If remote device has both HFP AG and HFP HF records then we were > always selecting first record. This could result in not being able > to connect to HF if AG record happens to be first one. > > Issue found on UPF 50. > --- > android/handsfree.c | 34 ++++++++++++++-------------------- > 1 file changed, 14 insertions(+), 20 deletions(-) > > diff --git a/android/handsfree.c b/android/handsfree.c > index 98d40b3..ee6de10 100644 > --- a/android/handsfree.c > +++ b/android/handsfree.c > @@ -1621,10 +1621,10 @@ static int sdp_search_hsp(struct hf_device *dev) > static void sdp_hfp_search_cb(sdp_list_t *recs, int err, gpointer data) > { > struct hf_device *dev = data; > - sdp_list_t *protos, *classes; > + sdp_list_t *protos; > GError *gerr = NULL; > GIOChannel *io; > - uuid_t uuid; > + uuid_t class; > int channel; > > DBG(""); > @@ -1635,6 +1635,16 @@ static void sdp_hfp_search_cb(sdp_list_t *recs, int err, gpointer data) > goto fail; > } > > + sdp_uuid16_create(&class, HANDSFREE_SVCLASS_ID); > + > + /* Find record with proper service class */ > + for (; recs; recs = recs->next) { > + sdp_record_t *rec = recs->data; > + > + if (rec && !sdp_uuid_cmp(&rec->svclass, &class)) > + break; > + } > + > if (!recs || !recs->data) { > info("handsfree: no HFP SDP records found, trying HSP"); > > @@ -1646,26 +1656,8 @@ static void sdp_hfp_search_cb(sdp_list_t *recs, int err, gpointer data) > return; > } > > - if (sdp_get_service_classes(recs->data, &classes) < 0 || !classes) { > - error("handsfree: unable to get service classes from record"); > - goto fail; > - } > - > if (sdp_get_access_protos(recs->data, &protos) < 0) { > error("handsfree: unable to get access protocols from record"); > - sdp_list_free(classes, free); > - goto fail; > - } > - > - /* TODO read remote version? */ > - > - memcpy(&uuid, classes->data, sizeof(uuid)); > - sdp_list_free(classes, free); > - > - if (!sdp_uuid128_to_uuid(&uuid) || uuid.type != SDP_UUID16 || > - uuid.value.uuid16 != HANDSFREE_SVCLASS_ID) { > - sdp_list_free(protos, NULL); > - error("handsfree: invalid service record or not HFP"); > goto fail; > } > > @@ -1677,6 +1669,8 @@ static void sdp_hfp_search_cb(sdp_list_t *recs, int err, gpointer data) > goto fail; > } > > + /* TODO read remote version? */ > + > io = bt_io_connect(connect_cb, dev, NULL, &gerr, > BT_IO_OPT_SOURCE_BDADDR, &adapter_addr, > BT_IO_OPT_DEST_BDADDR, &dev->bdaddr, > Applied. -- Best regards, Szymon Janc -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html