Re: how to add local name in scan response when setting MGMT_ADV_FLAG_LOCAL_NAME in Bluez

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Yunhan,

On Tue, Aug 1, 2017 at 1:21 PM, Luiz Augusto von Dentz
<luiz.dentz@xxxxxxxxx> wrote:
> Hi Yunhan,
>
> On Tue, Aug 1, 2017 at 10:37 AM, Yunhan Wang <yunhanw@xxxxxxxxxx> wrote:
>> Hi
>>
>> I am trying to do some small experiments that add local name in the
>> scan response,  should I use data[0] to store both adv_data and
>> scan_rsp?
>>
>> I tried to add local name(’TEST’) in data[0] under
>> mgmt_cp_add_advertising on
>> https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/src/advertising.c#n484,
>> it seems it does not work, any idea?
>
> Seems to be a limitation in the kernel, also setting the adapter name
> doesn't change anything either so it seems it simply does not include
> any scan response. I guess we would have to add support for that.

Actually the kernel does seem to set the scan response data, but is empty:

< HCI Command: LE Set Scan Response Data (0x08|0x0009) plen 32
#8499 13:40:40.663565
        Length: 0
> HCI Event: Command Complete (0x0e) plen 4                         #8500 13:40:40.664554
      LE Set Scan Response Data (0x08|0x0009) ncmd 1
        Status: Success (0x00)

>> Thanks
>> Best wishes
>> Yunhan
>>
>> static DBusMessage *refresh_advertisement(struct btd_adv_client *client)
>> {
>> struct mgmt_cp_add_advertising *cp;
>> uint8_t param_len;
>> uint8_t *adv_data;
>> size_t adv_data_len;
>> uint32_t flags = 0;
>>
>> uint8_t scan_rsp[] = {
>> ’T’,
>> ’E’,
>> ’S’,
>> ’T’
>> };
>> size_t scan_rsp_len = sizeof(scan_rsp);
>>
>> DBG("Refreshing advertisement: %s", client->path);
>>
>> if (client->type == AD_TYPE_PERIPHERAL)
>> flags = MGMT_ADV_FLAG_CONNECTABLE | MGMT_ADV_FLAG_DISCOV |
>> MGMT_ADV_FLAG_LOCAL_NAME;
>>
>> if (client->include_tx_power)
>> flags |= MGMT_ADV_FLAG_TX_POWER;
>>
>> adv_data = bt_ad_generate(client->data, &adv_data_len);
>>
>> if (!adv_data || (adv_data_len > calc_max_adv_len(client, flags))) {
>> error("Advertising data too long or couldn't be generated.");
>>
>> return g_dbus_create_error(client->reg, ERROR_INTERFACE
>> ".InvalidLength",
>> "Advertising data too long.");
>> }
>>
>> param_len = sizeof(struct mgmt_cp_add_advertising) + adv_data_len +
>> scan_rsp_len;
>>
>> cp = malloc0(param_len);
>>
>> if (!cp) {
>> error("Couldn't allocate for MGMT!");
>>
>> free(adv_data);
>>
>> return btd_error_failed(client->reg, "Failed");
>> }
>>
>> cp->flags = htobl(flags);
>> cp->instance = client->instance;
>> cp->adv_data_len = adv_data_len;
>> cp->scan_rsp_len = scan_rsp_len;
>> memcpy(cp->data, adv_data, adv_data_len);
>> memcpy(cp->data + adv_data_len, scan_rsp_data, scan_rsp_len);
>> free(adv_data);
>>
>> if (!mgmt_send(client->manager->mgmt, MGMT_OP_ADD_ADVERTISING,
>> client->manager->mgmt_index, param_len, cp,
>> add_adv_callback, client, NULL)) {
>> DBG("Failed to add Advertising Data");
>>
>> free(cp);
>>
>> return btd_error_failed(client->reg, "Failed");
>> }
>>
>> free(cp);
>>
>> return NULL;
>> }
>>
>> Reference:
>> In lib/mgmt.h,
>>
>> #define MGMT_OP_ADD_ADVERTISING 0x003E
>> struct mgmt_cp_add_advertising {
>> uint8_t  instance;
>> uint32_t flags;
>> uint16_t duration;
>> uint16_t timeout;
>> uint8_t  adv_data_len;
>> uint8_t  scan_rsp_len;
>> uint8_t  data[0];
>> } __packed;
>> From mgmt-api.txt, I am
>>
>> Add Advertising Command
>> =======================
>>
>> Command Code: 0x003e
>> Controller Index: <controller id>
>> Command Parameters: Instance (1 Octet)
>> Flags (4 Octets)
>> Duration (2 Octets)
>> Timeout (2 Octets)
>> Adv_Data_Len (1 Octet)
>> Scan_Rsp_len (1 Octet)
>> Adv_Data (0-255 Octets)
>> Scan_Rsp (0-255 Octets)
>> …...
>> With the Flags value the type of advertising is controlled and
>> the following flags are defined:
>>
>> 0 Switch into Connectable mode
>> 1 Advertise as Discoverable
>> 2 Advertise as Limited Discoverable
>> 3 Add Flags field to Adv_Data
>> 4 Add TX Power field to Adv_Data
>> 5 Add Appearance field to Scan_Rsp
>> 6 Add Local Name in Scan_Rsp
>> --
>> 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
>
>
>
> --
> Luiz Augusto von Dentz



-- 
Luiz Augusto von Dentz
--
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




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux