Re: [PATCH BlueZ 6/8] tools/btpclient: Add pair, unpair commands

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

 



Hi Szymon,

2018-01-23 14:53 GMT+01:00 Szymon Janc <szymon.janc@xxxxxxxxxxx>:
> Hi Grzegorz,
>
> On Friday, 19 January 2018 17:41:31 CET Grzegorz Kolodziejczyk wrote:
>> This patch adds pair and unpair commands for btp client.
>> ---
>>  tools/btpclient.c | 124
>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124
>> insertions(+)
>>
>> diff --git a/tools/btpclient.c b/tools/btpclient.c
>> index 53c0d4c05..9d44fba41 100644
>> --- a/tools/btpclient.c
>> +++ b/tools/btpclient.c
>> @@ -304,6 +304,8 @@ static void btp_gap_read_commands(uint8_t index, const
>> void *param, commands |= (1 << BTP_OP_GAP_CONNECT);
>>       commands |= (1 << BTP_OP_GAP_DISCONNECT);
>>       commands |= (1 << BTP_OP_GAP_SET_IO_CAPA);
>> +     commands |= (1 << BTP_OP_GAP_PAIR);
>> +     commands |= (1 << BTP_OP_GAP_UNPAIR);
>>
>>       commands = L_CPU_TO_LE16(commands);
>>
>> @@ -1875,6 +1877,122 @@ failed:
>>       btp_send_error(btp, BTP_GAP_SERVICE, index, status);
>>  }
>>
>> +static void pair_reply(struct l_dbus_proxy *proxy,
>> +                             struct l_dbus_message *result, void *user_data)
>> +{
>> +     uint8_t adapter_index = L_PTR_TO_UINT(user_data);
>> +     struct btp_adapter *adapter = find_adapter_by_index(adapter_index);
>> +
>> +     if (!adapter)
>> +             return;
>> +
>> +     if (l_dbus_message_is_error(result)) {
>> +             const char *name, *desc;
>> +
>> +             l_dbus_message_get_error(result, &name, &desc);
>> +             l_error("Failed to pair (%s), %s", name, desc);
>> +
>> +             return;
>> +     }
>> +}
>> +
>> +static void btp_gap_pair(uint8_t index, const void *param, uint16_t length,
>> +                                                             void *user_data)
>> +{
>> +     struct btp_adapter *adapter = find_adapter_by_index(index);
>> +     const struct btp_gap_pair_cp *cp = param;
>> +     uint8_t status = BTP_ERROR_FAIL;
>> +     struct btp_device *device;
>> +     bool prop;
>> +
>> +     if (!adapter) {
>> +             status = BTP_ERROR_INVALID_INDEX;
>> +             goto failed;
>> +     }
>> +
>> +     /* Adapter needs to be powered to be able to pair */
>> +     if (!l_dbus_proxy_get_property(adapter->proxy, "Powered", "b", &prop) ||
>> +                                                                     !prop)
>> +             goto failed;
>> +
>> +     device = find_device_by_address(adapter, &cp->address,
>> +                                                     cp->address_type);
>> +
>> +     if (!device)
>> +             goto failed;
>> +
>> +     btp_send(btp, BTP_GAP_SERVICE, BTP_OP_GAP_PAIR, adapter->index, 0,
>
> Please comment here that on BTP this command is suppose to initiate pairing
> only and successful pairing result is reported via event later on.
Ok
>
>> +                                                                     NULL);
>> +
>> +     l_dbus_proxy_method_call(device->proxy, "Pair", NULL, pair_reply,
>> +                                     L_UINT_TO_PTR(adapter->index), NULL);
>> +
>> +     return;
>> +
>> +failed:
>> +     btp_send_error(btp, BTP_GAP_SERVICE, index, status);
>> +}
>> +
>> +static void unpair_reply(struct l_dbus_proxy *proxy,
>> +                             struct l_dbus_message *result, void *user_data)
>> +{
>> +     uint8_t adapter_index = L_PTR_TO_UINT(user_data);
>> +     struct btp_adapter *adapter = find_adapter_by_index(adapter_index);
>> +
>> +     if (!adapter) {
>> +             btp_send_error(btp, BTP_GAP_SERVICE, BTP_INDEX_NON_CONTROLLER,
>> +                                                             BTP_ERROR_FAIL);
>> +             return;
>> +     }
>> +
>> +     if (l_dbus_message_is_error(result)) {
>> +             const char *name, *desc;
>> +
>> +             l_dbus_message_get_error(result, &name, &desc);
>> +             l_error("Failed to unpair (%s), %s", name, desc);
>> +
>> +             btp_send_error(btp, BTP_GAP_SERVICE, adapter_index,
>> +                                                             BTP_ERROR_FAIL);
>> +             return;
>> +     }
>> +
>> +     btp_send(btp, BTP_GAP_SERVICE, BTP_OP_GAP_UNPAIR, adapter_index, 0, NULL);
>> +}
>> +
>> +static void btp_gap_unpair(uint8_t index, const void *param, uint16_t
>> length, +                                                             void *user_data)
>> +{
>> +     struct btp_adapter *adapter = find_adapter_by_index(index);
>> +     const struct btp_gap_pair_cp *cp = param;
>> +     uint8_t status = BTP_ERROR_FAIL;
>> +     struct btp_device *device;
>> +     bool prop;
>> +
>> +     if (!adapter) {
>> +             status = BTP_ERROR_INVALID_INDEX;
>> +             goto failed;
>> +     }
>> +
>> +     /* Adapter needs to be powered to be able to unpair */
>> +     if (!l_dbus_proxy_get_property(adapter->proxy, "Powered", "b", &prop) ||
>> +                                                                     !prop)
>> +             goto failed;
>> +
>> +     device = find_device_by_address(adapter, &cp->address,
>> +                                                     cp->address_type);
>> +
>> +     if (!device)
>> +             goto failed;
>> +
>> +     l_dbus_proxy_method_call(device->proxy, "Unpair", NULL, unpair_reply,
>> +                                     L_UINT_TO_PTR(adapter->index), NULL);
>
> There is no "Unpair" command in Device1 interface :)  Use RemoveDevice from
> Adapter1.
Right, that was copy-paste mistake
>
>> +     return;
>> +
>> +failed:
>> +     btp_send_error(btp, BTP_GAP_SERVICE, index, status);
>> +}
>> +
>>  static void btp_gap_device_found_ev(struct l_dbus_proxy *proxy)
>>  {
>>       struct btp_device_found_ev ev;
>> @@ -1999,6 +2117,12 @@ static void register_gap_service(void)
>>
>>       btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_SET_IO_CAPA,
>>                               btp_gap_set_io_capabilities, NULL, NULL);
>> +
>> +     btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_PAIR, btp_gap_pair, NULL,
>> +                                                                     NULL);
>> +
>> +     btp_register(btp, BTP_GAP_SERVICE, BTP_OP_GAP_UNPAIR, btp_gap_unpair,
>> +                                                             NULL, NULL);
>>  }
>>
>>  static void btp_core_read_commands(uint8_t index, const void *param,
>
>
> --
> pozdrawiam
> Szymon Janc
>
>

pozdrawiam,
Grzegorz Kołodziejczyk
--
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