* [PATCH_v6 3/5] android/hid: Fill send data command struct in hal-hidhost
From: Ravi kumar Veeramally @ 2013-11-08 13:23 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Ravi kumar Veeramally
In-Reply-To: <1383916984-11010-1-git-send-email-ravikumar.veeramally@linux.intel.com>
---
android/hal-hidhost.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/android/hal-hidhost.c b/android/hal-hidhost.c
index e8570bc..97a1aa0 100644
--- a/android/hal-hidhost.c
+++ b/android/hal-hidhost.c
@@ -334,7 +334,8 @@ static bt_status_t set_report(bt_bdaddr_t *bd_addr,
static bt_status_t send_data(bt_bdaddr_t *bd_addr, char *data)
{
- struct hal_cmd_hidhost_send_data cmd;
+ uint8_t buf[BLUEZ_HAL_MTU];
+ struct hal_cmd_hidhost_send_data *cmd = (void *) buf;
DBG("");
@@ -344,10 +345,12 @@ static bt_status_t send_data(bt_bdaddr_t *bd_addr, char *data)
if (!bd_addr || !data)
return BT_STATUS_PARM_INVALID;
- memcpy(cmd.bdaddr, bd_addr, sizeof(cmd.bdaddr));
+ memcpy(cmd->bdaddr, bd_addr, sizeof(cmd->bdaddr));
+ cmd->len = strlen(data);
+ memcpy(cmd->data, data, cmd->len);
return hal_ipc_cmd(HAL_SERVICE_ID_HIDHOST, HAL_OP_HIDHOST_SEND_DATA,
- sizeof(cmd), &cmd, 0, NULL, NULL);
+ sizeof(*cmd) + cmd->len, buf, 0, NULL, NULL);
}
static bt_status_t init(bthh_callbacks_t *callbacks)
--
1.8.3.2
^ permalink raw reply related
* [PATCH_v6 1/5] android/hid: Fill send data command struct in hal-hidhost
From: Ravi kumar Veeramally @ 2013-11-08 13:23 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Ravi kumar Veeramally
---
android/hal-hidhost.c | 18 ++++++++++--------
android/hal-msg.h | 2 +-
2 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/android/hal-hidhost.c b/android/hal-hidhost.c
index 94f7e01..e8570bc 100644
--- a/android/hal-hidhost.c
+++ b/android/hal-hidhost.c
@@ -18,6 +18,7 @@
#include <stdbool.h>
#include <stddef.h>
#include <string.h>
+#include <stdlib.h>
#include "hal-log.h"
#include "hal.h"
@@ -298,7 +299,8 @@ static bt_status_t set_report(bt_bdaddr_t *bd_addr,
bthh_report_type_t report_type,
char *report)
{
- struct hal_cmd_hidhost_set_report cmd;
+ uint8_t buf[BLUEZ_HAL_MTU];
+ struct hal_cmd_hidhost_set_report *cmd = (void *) buf;
DBG("");
@@ -308,26 +310,26 @@ static bt_status_t set_report(bt_bdaddr_t *bd_addr,
if (!bd_addr || !report)
return BT_STATUS_PARM_INVALID;
- memcpy(cmd.bdaddr, bd_addr, sizeof(cmd.bdaddr));
- cmd.len = strlen(report);
- memcpy(cmd.data, report, cmd.len);
+ memcpy(cmd->bdaddr, bd_addr, sizeof(cmd->bdaddr));
+ cmd->len = strlen(report);
+ memcpy(cmd->data, report, cmd->len);
switch (report_type) {
case BTHH_INPUT_REPORT:
- cmd.type = HAL_HIDHOST_INPUT_REPORT;
+ cmd->type = HAL_HIDHOST_INPUT_REPORT;
break;
case BTHH_OUTPUT_REPORT:
- cmd.type = HAL_HIDHOST_OUTPUT_REPORT;
+ cmd->type = HAL_HIDHOST_OUTPUT_REPORT;
break;
case BTHH_FEATURE_REPORT:
- cmd.type = HAL_HIDHOST_FEATURE_REPORT;
+ cmd->type = HAL_HIDHOST_FEATURE_REPORT;
break;
default:
return BT_STATUS_PARM_INVALID;
}
return hal_ipc_cmd(HAL_SERVICE_ID_HIDHOST, HAL_OP_HIDHOST_SET_REPORT,
- sizeof(cmd), &cmd, 0, NULL, NULL);
+ sizeof(*cmd) + cmd->len, buf, 0, NULL, NULL);
}
static bt_status_t send_data(bt_bdaddr_t *bd_addr, char *data)
diff --git a/android/hal-msg.h b/android/hal-msg.h
index 4af86de..4c7d344 100644
--- a/android/hal-msg.h
+++ b/android/hal-msg.h
@@ -293,7 +293,7 @@ struct hal_cmd_hidhost_set_report {
uint8_t bdaddr[6];
uint8_t type;
uint16_t len;
- uint8_t data[670];
+ uint8_t data[0];
} __attribute__((packed));
#define HAL_OP_HIDHOST_SEND_DATA 0x09
--
1.8.3.2
^ permalink raw reply related
* Re: [PATCH 0/8] Improve user experience
From: Johan Hedberg @ 2013-11-08 13:16 UTC (permalink / raw)
To: Jerzy Kasenberg; +Cc: linux-bluetooth
In-Reply-To: <1383914910-2304-1-git-send-email-jerzy.kasenberg@tieto.com>
Hi Jerzy,
On Fri, Nov 08, 2013, Jerzy Kasenberg wrote:
> This patchset works towards improving user interface.
> - Command line parsing (--help, --version, --no-init)
> - All interfaces are now initialized at start by default
> - --no-init allows to disable this initialization
> - pin_request_cb will now present prompt and send reply
> - ssp_request_cb will now present prompt and sent reply
>
> As part of adding those features terminal.c was restructured.
> Big switch inside terminal_process_char was distributed between
> number of small functions. This work was necessary due to input
> handling of prompted data.
>
> Version print may need to be changed according to bluez culture.
>
> Jerzy Kasenberg (8):
> android/client: Export get_interface_method
> android/client: Add NELEM macro for count elements
> android/client: Initialize all interfaces at start
> android/client: Add command line arguments
> android/client: Split terminal_process_char
> android/client: Add prompting for answer
> android/client: Add pin handling for bind
> android/client: Add ssp key confirmation helper
>
> android/client/haltest.c | 102 ++++++-
> android/client/if-bt.c | 46 +++
> android/client/if-main.h | 4 +
> android/client/tabcompletion.c | 2 +-
> android/client/terminal.c | 605 +++++++++++++++++++++++++++-------------
> android/client/terminal.h | 5 +-
> 6 files changed, 567 insertions(+), 197 deletions(-)
All eight patches have been applied. Thanks.
Johan
^ permalink raw reply
* [PATCHv5 3/3] android/hal-sock: Add UUID debug print in socket HAL
From: Andrei Emeltchenko @ 2013-11-08 13:16 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1383916561-9719-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Socket HAL uses uint8_t * strings which are of size bt_uuid_t.
---
android/hal-sock.c | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/android/hal-sock.c b/android/hal-sock.c
index 32c7939..d24276e 100644
--- a/android/hal-sock.c
+++ b/android/hal-sock.c
@@ -25,6 +25,8 @@
#include "hal-msg.h"
#include "hal.h"
+#include "hal-utils.h"
+
static bt_status_t sock_listen_rfcomm(const char *service_name,
const uint8_t *uuid, int chan,
int *sock, int flags)
@@ -49,13 +51,13 @@ static bt_status_t sock_listen(btsock_type_t type, const char *service_name,
int *sock, int flags)
{
if ((!uuid && chan <= 0) || !sock) {
- error("%s: invalid params: uuid %p, chan %d, sock %p",
- __func__, uuid, chan, sock);
+ error("Invalid params: uuid %s, chan %d, sock %p",
+ btuuid2str(uuid), chan, sock);
return BT_STATUS_PARM_INVALID;
}
- DBG("uuid %p chan %d sock %p type %d service_name %s",
- uuid, chan, sock, type, service_name);
+ DBG("uuid %s chan %d sock %p type %d service_name %s",
+ btuuid2str(uuid), chan, sock, type, service_name);
switch (type) {
case BTSOCK_RFCOMM:
@@ -76,12 +78,13 @@ static bt_status_t sock_connect(const bt_bdaddr_t *bdaddr, btsock_type_t type,
struct hal_cmd_sock_connect cmd;
if ((!uuid && chan <= 0) || !bdaddr || !sock) {
- error("invalid params: bd_addr %p, uuid %p, chan %d, sock %p",
- bdaddr, uuid, chan, sock);
+ error("Invalid params: bd_addr %p, uuid %s, chan %d, sock %p",
+ bdaddr, btuuid2str(uuid), chan, sock);
return BT_STATUS_PARM_INVALID;
}
- DBG("uuid %p chan %d sock %p type %d", uuid, chan, sock, type);
+ DBG("uuid %s chan %d sock %p type %d", btuuid2str(uuid), chan, sock,
+ type);
if (type != BTSOCK_RFCOMM) {
error("Socket type %u not supported", type);
--
1.7.10.4
^ permalink raw reply related
* [PATCHv5 2/3] android/debug: Convert uuid helper to use uint8_t buffer
From: Andrei Emeltchenko @ 2013-11-08 13:16 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1383916561-9719-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
At this moment Android uses uint8_t * and bt_uuid_t for representing
UUID for different HALs. Convert debug helper to use uint8_t * string.
---
android/client/textconv.c | 7 +++++--
android/hal-utils.c | 15 +++++++--------
android/hal-utils.h | 7 ++++---
3 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/android/client/textconv.c b/android/client/textconv.c
index 469b2c3..ebf6316 100644
--- a/android/client/textconv.c
+++ b/android/client/textconv.c
@@ -272,7 +272,9 @@ char *btproperty2str(const bt_property_t *property)
strcat(p, "{");
while (count--) {
- strcat(p, btuuid2str((bt_uuid_t *) ptr));
+ bt_uuid_t *uuid = (bt_uuid_t *) ptr;
+
+ strcat(p, btuuid2str(uuid->uu));
if (count)
strcat(p, ", ");
ptr += sizeof(bt_uuid_t);
@@ -286,8 +288,9 @@ char *btproperty2str(const bt_property_t *property)
case BT_PROPERTY_SERVICE_RECORD:
{
bt_service_record_t *rec = property->val;
+ bt_uuid_t *uuid = &rec->uuid;
- sprintf(p, "{%s, %d, %s}", btuuid2str(&rec->uuid),
+ sprintf(p, "{%s, %d, %s}", btuuid2str(uuid->uu),
rec->channel, rec->name);
}
break;
diff --git a/android/hal-utils.c b/android/hal-utils.c
index 84cfad1..96dc234 100644
--- a/android/hal-utils.c
+++ b/android/hal-utils.c
@@ -17,8 +17,7 @@
#include <stdio.h>
#include <string.h>
-
-#include <hardware/bluetooth.h>
+#include <stdint.h>
#include "hal-utils.h"
@@ -28,15 +27,15 @@
*
* returns string representation of uuid
*/
-char *bt_uuid_t2str(const bt_uuid_t *uuid, char *buf)
+char *bt_uuid_t2str(const uint8_t *uuid, char *buf)
{
int shift = 0;
- int i;
+ unsigned int i;
int is_bt;
- is_bt = !memcmp(&uuid->uu[4], &BT_BASE_UUID[4], sizeof(bt_uuid_t) - 4);
+ is_bt = !memcmp(&uuid[4], &BT_BASE_UUID[4], HAL_UUID_LEN - 4);
- for (i = 0; i < (int) sizeof(bt_uuid_t); i++) {
+ for (i = 0; i < HAL_UUID_LEN; i++) {
if (i == 4 && is_bt)
break;
@@ -44,13 +43,13 @@ char *bt_uuid_t2str(const bt_uuid_t *uuid, char *buf)
buf[i * 2 + shift] = '-';
shift++;
}
- sprintf(buf + i * 2 + shift, "%02x", uuid->uu[i]);
+ sprintf(buf + i * 2 + shift, "%02x", uuid[i]);
}
return buf;
}
-char *btuuid2str(const bt_uuid_t *uuid)
+char *btuuid2str(const uint8_t *uuid)
{
static char buf[MAX_UUID_STR_LEN];
diff --git a/android/hal-utils.h b/android/hal-utils.h
index d40b430..5287180 100644
--- a/android/hal-utils.h
+++ b/android/hal-utils.h
@@ -15,12 +15,13 @@
*
*/
-#define MAX_UUID_STR_LEN 37
+#define MAX_UUID_STR_LEN 37
+#define HAL_UUID_LEN 16
static const char BT_BASE_UUID[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb
};
-char *btuuid2str(const bt_uuid_t *uuid);
-char *bt_uuid_t2str(const bt_uuid_t *uuid, char *buf);
+char *bt_uuid_t2str(const uint8_t *uuid, char *buf);
+char *btuuid2str(const uint8_t *uuid);
--
1.7.10.4
^ permalink raw reply related
* [PATCHv5 1/3] android: Create debug hal-utils helpers
From: Andrei Emeltchenko @ 2013-11-08 13:15 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Create hal-utils helpers which helps to decode packets Android
sends through HAL interface.
---
android/Android.mk | 2 ++
android/Makefile.am | 3 ++-
android/client/if-gatt.c | 1 +
android/client/textconv.c | 42 ++------------------------------
android/client/textconv.h | 2 --
android/hal-utils.c | 58 +++++++++++++++++++++++++++++++++++++++++++++
android/hal-utils.h | 26 ++++++++++++++++++++
7 files changed, 91 insertions(+), 43 deletions(-)
create mode 100644 android/hal-utils.c
create mode 100644 android/hal-utils.h
diff --git a/android/Android.mk b/android/Android.mk
index 51037a7..0bc0e82 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -88,6 +88,7 @@ LOCAL_SRC_FILES := \
hal-pan.c \
hal-a2dp.c \
client/textconv.c \
+ hal-utils.c \
LOCAL_C_INCLUDES += \
$(call include-path-for, system-core) \
@@ -125,6 +126,7 @@ LOCAL_SRC_FILES := \
client/if-hh.c \
client/if-pan.c \
client/if-sock.c \
+ hal-utils.c \
ANDROID_4_3_OR_ABOVE := $(shell echo 0 | awk -v v=$(PLATFORM_SDK_VERSION) 'END {print (v > 17) ? 1 : 0}')
diff --git a/android/Makefile.am b/android/Makefile.am
index 073edc8..debe7c1 100644
--- a/android/Makefile.am
+++ b/android/Makefile.am
@@ -68,7 +68,8 @@ android_haltest_SOURCES = android/client/haltest.c \
android/client/if-hh.c \
android/client/if-pan.c \
android/client/if-sock.c \
- android/client/hwmodule.c
+ android/client/hwmodule.c \
+ android/hal-utils.h android/hal-utils.c
android_haltest_LDADD = android/libhal-internal.la
diff --git a/android/client/if-gatt.c b/android/client/if-gatt.c
index b2b20cb..bb53952 100644
--- a/android/client/if-gatt.c
+++ b/android/client/if-gatt.c
@@ -17,6 +17,7 @@
#include <hardware/bluetooth.h>
+#include "../hal-utils.h"
#include "if-main.h"
const btgatt_interface_t *if_gatt = NULL;
diff --git a/android/client/textconv.c b/android/client/textconv.c
index 4def3da..469b2c3 100644
--- a/android/client/textconv.c
+++ b/android/client/textconv.c
@@ -19,6 +19,8 @@
#include <stdio.h>
#include <hardware/bluetooth.h>
+#include "../hal-utils.h"
+
#include "textconv.h"
/*
@@ -154,39 +156,6 @@ void str2bt_bdaddr_t(const char *str, bt_bdaddr_t *bd_addr)
&p[0], &p[1], &p[2], &p[3], &p[4], &p[5]);
}
-static const char BT_BASE_UUID[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
- 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb
-};
-
-/*
- * converts uuid to string
- * buf should be at least 39 bytes
- *
- * returns string representation of uuid
- */
-char *bt_uuid_t2str(const bt_uuid_t *uuid, char *buf)
-{
- int shift = 0;
- int i;
- int is_bt;
-
- is_bt = !memcmp(&uuid->uu[4], &BT_BASE_UUID[4], sizeof(bt_uuid_t) - 4);
-
- for (i = 0; i < (int) sizeof(bt_uuid_t); i++) {
- if (i == 4 && is_bt)
- break;
-
- if (i == 4 || i == 6 || i == 8 || i == 10) {
- buf[i * 2 + shift] = '-';
- shift++;
- }
- sprintf(buf + i * 2 + shift, "%02x", uuid->uu[i]);
- }
-
- return buf;
-}
-
/* converts string to uuid */
void str2bt_uuid_t(const char *str, bt_uuid_t *uuid)
{
@@ -234,13 +203,6 @@ char *bdaddr2str(const bt_bdaddr_t *bd_addr)
return bt_bdaddr_t2str(bd_addr, buf);
}
-static char *btuuid2str(const bt_uuid_t *uuid)
-{
- static char buf[MAX_UUID_STR_LEN];
-
- return bt_uuid_t2str(uuid, buf);
-}
-
char *btproperty2str(const bt_property_t *property)
{
static char buf[4096];
diff --git a/android/client/textconv.h b/android/client/textconv.h
index 1c848ef..837eb4e 100644
--- a/android/client/textconv.h
+++ b/android/client/textconv.h
@@ -103,8 +103,6 @@ static struct int2str __##type##2str[] = {
char *bt_bdaddr_t2str(const bt_bdaddr_t *bd_addr, char *buf);
void str2bt_bdaddr_t(const char *str, bt_bdaddr_t *bd_addr);
-#define MAX_UUID_STR_LEN 37
-char *bt_uuid_t2str(const bt_uuid_t *uuid, char *buf);
void str2bt_uuid_t(const char *str, bt_uuid_t *uuid);
char *btproperty2str(const bt_property_t *property);
diff --git a/android/hal-utils.c b/android/hal-utils.c
new file mode 100644
index 0000000..84cfad1
--- /dev/null
+++ b/android/hal-utils.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2013 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <hardware/bluetooth.h>
+
+#include "hal-utils.h"
+
+/*
+ * converts uuid to string
+ * buf should be at least 39 bytes
+ *
+ * returns string representation of uuid
+ */
+char *bt_uuid_t2str(const bt_uuid_t *uuid, char *buf)
+{
+ int shift = 0;
+ int i;
+ int is_bt;
+
+ is_bt = !memcmp(&uuid->uu[4], &BT_BASE_UUID[4], sizeof(bt_uuid_t) - 4);
+
+ for (i = 0; i < (int) sizeof(bt_uuid_t); i++) {
+ if (i == 4 && is_bt)
+ break;
+
+ if (i == 4 || i == 6 || i == 8 || i == 10) {
+ buf[i * 2 + shift] = '-';
+ shift++;
+ }
+ sprintf(buf + i * 2 + shift, "%02x", uuid->uu[i]);
+ }
+
+ return buf;
+}
+
+char *btuuid2str(const bt_uuid_t *uuid)
+{
+ static char buf[MAX_UUID_STR_LEN];
+
+ return bt_uuid_t2str(uuid, buf);
+}
diff --git a/android/hal-utils.h b/android/hal-utils.h
new file mode 100644
index 0000000..d40b430
--- /dev/null
+++ b/android/hal-utils.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2013 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#define MAX_UUID_STR_LEN 37
+
+static const char BT_BASE_UUID[] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb
+};
+
+char *btuuid2str(const bt_uuid_t *uuid);
+char *bt_uuid_t2str(const bt_uuid_t *uuid, char *buf);
--
1.7.10.4
^ permalink raw reply related
* [PATCH 8/8] android/client: Add ssp key confirmation helper
From: Jerzy Kasenberg @ 2013-11-08 12:48 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jerzy Kasenberg
In-Reply-To: <1383914910-2304-1-git-send-email-jerzy.kasenberg@tieto.com>
This patch adds handling of ssp_request_cb that prints prompt
asking user if pass key matches. User does not need to type:
bluetooth ssp_reply address BT_SSP_VARIANT_PASSKEY_CONFIRMATION 1 key
---
android/client/if-bt.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/android/client/if-bt.c b/android/client/if-bt.c
index 0a580e1..10ae125 100644
--- a/android/client/if-bt.c
+++ b/android/client/if-bt.c
@@ -239,10 +239,26 @@ static void pin_request_cb(bt_bdaddr_t *remote_bd_addr, bt_bdname_t *bd_name,
terminal_prompt_for("Enter pin: ", pin_request_answer);
}
+/* Variables to store information from ssp_request_cb used for ssp_reply */
+static bt_bdaddr_t ssp_request_addr;
+static bt_ssp_variant_t ssp_request_variant;
+static uint32_t ssp_request_pask_key;
+
+/* Called when user hit enter on prompt for confirmation */
+static void ssp_request_yes_no_answer(char *reply)
+{
+ int accept = *reply == 0 || *reply == 'y' || *reply == 'Y';
+
+ if_bluetooth->ssp_reply(&ssp_request_addr, ssp_request_variant, accept,
+ ssp_request_pask_key);
+}
+
static void ssp_request_cb(bt_bdaddr_t *remote_bd_addr, bt_bdname_t *bd_name,
uint32_t cod, bt_ssp_variant_t pairing_variant,
uint32_t pass_key)
{
+ static char prompt[50];
+
/* Store for command completion */
bt_bdaddr_t2str(remote_bd_addr, last_remote_addr);
last_ssp_variant = pairing_variant;
@@ -250,6 +266,16 @@ static void ssp_request_cb(bt_bdaddr_t *remote_bd_addr, bt_bdname_t *bd_name,
haltest_info("%s: remote_bd_addr=%s bd_name=%s cod=%06x pairing_variant=%s pass_key=%d\n",
__func__, last_remote_addr, bd_name->name, cod,
bt_ssp_variant_t2str(pairing_variant), pass_key);
+
+ if (pairing_variant == BT_SSP_VARIANT_PASSKEY_CONFIRMATION) {
+ sprintf(prompt, "Does other device show %d [Y/n] ?", pass_key);
+
+ ssp_request_addr = *remote_bd_addr;
+ ssp_request_variant = pairing_variant;
+ ssp_request_pask_key = pass_key;
+
+ terminal_prompt_for(prompt, ssp_request_yes_no_answer);
+ }
}
static void bond_state_changed_cb(bt_status_t status,
--
1.7.9.5
^ permalink raw reply related
* [PATCH 7/8] android/client: Add pin handling for bind
From: Jerzy Kasenberg @ 2013-11-08 12:48 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jerzy Kasenberg
In-Reply-To: <1383914910-2304-1-git-send-email-jerzy.kasenberg@tieto.com>
This patch ask user for ping in pin_request_cb, which does
what otherwise would be required to manually type
bluetooth pin_reply address pin.
---
android/client/if-bt.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/android/client/if-bt.c b/android/client/if-bt.c
index 4c501a5..0a580e1 100644
--- a/android/client/if-bt.c
+++ b/android/client/if-bt.c
@@ -16,6 +16,7 @@
*/
#include "if-main.h"
+#include "terminal.h"
const bt_interface_t *if_bluetooth;
@@ -209,14 +210,33 @@ static void discovery_state_changed_cb(bt_discovery_state_t state)
static char last_remote_addr[MAX_ADDR_STR_LEN];
static bt_ssp_variant_t last_ssp_variant = (bt_ssp_variant_t) -1;
+static bt_bdaddr_t pin_request_addr;
+static void pin_request_answer(char *reply)
+{
+ bt_pin_code_t pin;
+ int accept = 0;
+ int pin_len = strlen(reply);
+
+ if (pin_len > 0) {
+ accept = 1;
+ if (pin_len > 16)
+ pin_len = 16;
+ memcpy(&pin.pin, reply, pin_len);
+ }
+
+ EXEC(if_bluetooth->pin_reply, &pin_request_addr, accept, pin_len, &pin);
+}
+
static void pin_request_cb(bt_bdaddr_t *remote_bd_addr, bt_bdname_t *bd_name,
uint32_t cod)
{
/* Store for command completion */
bt_bdaddr_t2str(remote_bd_addr, last_remote_addr);
+ pin_request_addr = *remote_bd_addr;
haltest_info("%s: remote_bd_addr=%s bd_name=%s cod=%06x\n", __func__,
last_remote_addr, bd_name->name, cod);
+ terminal_prompt_for("Enter pin: ", pin_request_answer);
}
static void ssp_request_cb(bt_bdaddr_t *remote_bd_addr, bt_bdname_t *bd_name,
--
1.7.9.5
^ permalink raw reply related
* [PATCH 6/8] android/client: Add prompting for answer
From: Jerzy Kasenberg @ 2013-11-08 12:48 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jerzy Kasenberg
In-Reply-To: <1383914910-2304-1-git-send-email-jerzy.kasenberg@tieto.com>
This patch allows to switch to prompt mode where user will be asked
to supply some information.
---
android/client/terminal.c | 67 +++++++++++++++++++++++++++++++++++++++++++++
android/client/terminal.h | 1 +
2 files changed, 68 insertions(+)
diff --git a/android/client/terminal.c b/android/client/terminal.c
index 3674f89..f7b56de 100644
--- a/android/client/terminal.c
+++ b/android/client/terminal.c
@@ -684,6 +684,9 @@ TERMINAL_ACTION(terminal_action_default)
terminal_insert_into_command_line(str);
}
+/* Callback to call when user hit enter during prompt for */
+static line_callback prompt_callback;
+
static KeyAction normal_actions[] = {
{ 0, terminal_action_default },
{ KEY_LEFT, terminal_action_left },
@@ -709,6 +712,59 @@ static KeyAction normal_actions[] = {
{ 0, NULL },
};
+TERMINAL_ACTION(terminal_action_answer)
+{
+ putchar(c);
+
+ terminal_set_actions(normal_actions);
+ /* Restore default prompt */
+ current_prompt = prompt_buf;
+
+ /* No prompt for prints */
+ prompt = noprompt;
+ line_buf_ix = 0;
+ line_len = 0;
+ /* Call user function with what was typed */
+ prompt_callback(line_buf);
+
+ line_buf[0] = 0;
+ /* promot_callback could change current_prompt */
+ prompt = current_prompt;
+
+ printf("%s", prompt);
+}
+
+TERMINAL_ACTION(terminal_action_prompt_ctrl_c)
+{
+ printf("^C\n");
+ line_buf_ix = 0;
+ line_len = 0;
+ line_buf[0] = 0;
+
+ current_prompt = prompt_buf;
+ prompt = current_prompt;
+ terminal_set_actions(normal_actions);
+
+ printf("%s", prompt);
+}
+
+static KeyAction prompt_actions[] = {
+ { 0, terminal_action_default },
+ { KEY_LEFT, terminal_action_left },
+ { KEY_RIGHT, terminal_action_right },
+ { KEY_HOME, terminal_action_home },
+ { KEY_END, terminal_action_end },
+ { KEY_DELETE, terminal_action_del },
+ { KEY_CLEFT, terminal_action_word_left },
+ { KEY_CRIGHT, terminal_action_word_right },
+ { KEY_BACKSPACE, terminal_action_backspace },
+ { KEY_C_C, terminal_action_prompt_ctrl_c },
+ { KEY_C_D, terminal_action_ctrl_d },
+ { '\r', terminal_action_answer },
+ { '\n', terminal_action_answer },
+ { 0, NULL },
+};
+
void terminal_process_char(int c, line_callback process_line)
{
KeyAction *a;
@@ -726,6 +782,17 @@ void terminal_process_char(int c, line_callback process_line)
fflush(stdout);
}
+void terminal_prompt_for(const char *s, line_callback process_line)
+{
+ current_prompt = s;
+ if (prompt != noprompt) {
+ prompt = s;
+ terminal_clear_line();
+ }
+ prompt_callback = process_line;
+ terminal_set_actions(prompt_actions);
+}
+
static struct termios origianl_tios;
static void terminal_cleanup(void)
diff --git a/android/client/terminal.h b/android/client/terminal.h
index b5e402d..0e63936 100644
--- a/android/client/terminal.h
+++ b/android/client/terminal.h
@@ -57,5 +57,6 @@ int terminal_vprint(const char *format, va_list args);
void terminal_process_char(int c, line_callback process_line);
void terminal_insert_into_command_line(const char *p);
void terminal_draw_command_line(void);
+void terminal_prompt_for(const char *s, line_callback process_line);
void process_tab(const char *line, int len);
--
1.7.9.5
^ permalink raw reply related
* [PATCH 5/8] android/client: Split terminal_process_char
From: Jerzy Kasenberg @ 2013-11-08 12:48 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jerzy Kasenberg
In-Reply-To: <1383914910-2304-1-git-send-email-jerzy.kasenberg@tieto.com>
This patch changes the way input characters are handled in function
terminal_process_char from big switch statement to smaller functions.
No functionality is changed in this patch.
Splitting to smaller functions will make easier to change behaviour
of terminal for prompt handling when user will be asked for something
and history substitution or auto completion will not be used.
---
android/client/terminal.c | 538 +++++++++++++++++++++++++++++----------------
android/client/terminal.h | 4 +-
2 files changed, 347 insertions(+), 195 deletions(-)
diff --git a/android/client/terminal.c b/android/client/terminal.c
index b152bf3..3674f89 100644
--- a/android/client/terminal.c
+++ b/android/client/terminal.c
@@ -118,6 +118,8 @@ static int line_len = 0;
static int line_index = 0;
static char prompt_buf[10] = "> ";
+static const char *const noprompt = "";
+static const char *current_prompt = prompt_buf;
static const char *prompt = prompt_buf;
/*
* Moves cursor to right or left
@@ -232,6 +234,7 @@ static void terminal_line_replaced(void)
/* set up indexes to new line */
line_len = strlen(line_buf);
line_buf_ix = line_len;
+ fflush(stdout);
}
static void terminal_clear_line(void)
@@ -365,217 +368,361 @@ static int terminal_convert_sequence(int c)
return c;
}
-void terminal_process_char(int c, void (*process_line)(char *line))
+typedef void (*terminal_action)(int c, line_callback process_line);
+
+#define TERMINAL_ACTION(n) \
+ static void n(int c, void (*process_line)(char *line))
+
+TERMINAL_ACTION(terminal_action_null)
{
- int refresh_from = -1;
- int old_pos;
+}
- c = terminal_convert_sequence(c);
+/* Mapping between keys and function */
+typedef struct {
+ int key;
+ terminal_action func;
+} KeyAction;
+
+int action_keys[] = {
+ KEY_SEQUNCE_NOT_FINISHED,
+ KEY_LEFT,
+ KEY_RIGHT,
+ KEY_HOME,
+ KEY_END,
+ KEY_DELETE,
+ KEY_CLEFT,
+ KEY_CRIGHT,
+ KEY_SUP,
+ KEY_SDOWN,
+ KEY_UP,
+ KEY_DOWN,
+ KEY_BACKSPACE,
+ KEY_INSERT,
+ KEY_PGUP,
+ KEY_PGDOWN,
+ KEY_CUP,
+ KEY_CDOWN,
+ KEY_SLEFT,
+ KEY_SRIGHT,
+ KEY_MLEFT,
+ KEY_MRIGHT,
+ KEY_MUP,
+ KEY_MDOWN,
+ KEY_STAB,
+ KEY_M_n,
+ KEY_M_p,
+ KEY_C_C,
+ KEY_C_D,
+ KEY_C_L,
+ '\t',
+ '\r',
+ '\n',
+};
- switch (c) {
- case KEY_SEQUNCE_NOT_FINISHED:
- break;
- case KEY_LEFT:
- /* if not at the beginning move to previous character */
- if (line_buf_ix <= 0)
- break;
- line_buf_ix--;
- terminal_move_cursor(-1);
- break;
- case KEY_RIGHT:
- /*
- * If not at the end, just print current character
- * and modify position
- */
- if (line_buf_ix < line_len)
- putchar(line_buf[line_buf_ix++]);
- break;
- case KEY_HOME:
- /* move to beginning of line and update position */
- printf("\r%s", prompt);
- line_buf_ix = 0;
- break;
- case KEY_END:
- /* if not at the end of line */
- if (line_buf_ix < line_len) {
- /* print everything from cursor */
- printf("%s", line_buf + line_buf_ix);
- /* just modify current position */
- line_buf_ix = line_len;
- }
- break;
- case KEY_DELETE:
- terminal_delete_char();
- break;
- case KEY_CLEFT:
+#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
+
+/*
+ * current_actions holds all recognizable kes and actions for them
+ * additional element (index 0) is used for default action
+ */
+static KeyAction current_actions[NELEM(action_keys) + 1];
+
+/* KeyAction comparator by key, for qsort and bsearch */
+static int KeyActionKeyCompare(const void *a, const void *b)
+{
+ return ((const KeyAction *) a)->key - ((const KeyAction *) b)->key;
+}
+
+/* Find action by key, NULL if no action for this key */
+static KeyAction *terminal_get_action(int key)
+{
+ KeyAction a = { .key = key };
+
+ return bsearch(&a, current_actions + 1, NELEM(action_keys), sizeof(a),
+ KeyActionKeyCompare);
+}
+
+/* Sets new set of actions to use */
+static void terminal_set_actions(const KeyAction *actions)
+{
+ int i;
+
+ /* Make map with empty function for every key */
+ for (i = 0; i < NELEM(action_keys); ++i) {
/*
- * Move by word left
- *
- * Are we at the beginning of line?
+ * + 1 due to 0 index reserved for default action that is
+ * called for non mapped key
*/
- if (line_buf_ix <= 0)
- break;
+ current_actions[i + 1].key = action_keys[i];
+ current_actions[i + 1].func = terminal_action_null;
+ }
+
+ /* Sort action from 1 (index 0 - default action) */
+ qsort(current_actions + 1, NELEM(action_keys), sizeof(KeyAction),
+ KeyActionKeyCompare);
+ /* Set default action (first in array) */
+ current_actions[0] = *actions++;
+
+ /* Copy rest of actions into their places */
+ for (; actions->key; ++actions) {
+ KeyAction *place = terminal_get_action(actions->key);
+
+ if (place)
+ place->func = actions->func;
+ }
+}
+
+TERMINAL_ACTION(terminal_action_left)
+{
+ /* if not at the beginning move to previous character */
+ if (line_buf_ix <= 0)
+ return;
+ line_buf_ix--;
+ terminal_move_cursor(-1);
+}
+
+TERMINAL_ACTION(terminal_action_right)
+{
+ /*
+ * If not at the end, just print current character
+ * and modify position
+ */
+ if (line_buf_ix < line_len)
+ putchar(line_buf[line_buf_ix++]);
+}
+
+TERMINAL_ACTION(terminal_action_home)
+{
+ /* move to beginning of line and update position */
+ printf("\r%s", prompt);
+ line_buf_ix = 0;
+}
+
+TERMINAL_ACTION(terminal_action_end)
+{
+ /* if not at the end of line */
+ if (line_buf_ix < line_len) {
+ /* print everything from cursor */
+ printf("%s", line_buf + line_buf_ix);
+ /* just modify current position */
+ line_buf_ix = line_len;
+ }
+}
+
+TERMINAL_ACTION(terminal_action_del)
+{
+ terminal_delete_char();
+}
+
+TERMINAL_ACTION(terminal_action_word_left)
+{
+ int old_pos;
+ /*
+ * Move by word left
+ *
+ * Are we at the beginning of line?
+ */
+ if (line_buf_ix <= 0)
+ return;
- old_pos = line_buf_ix;
+ old_pos = line_buf_ix;
+ line_buf_ix--;
+ /* skip spaces left */
+ while (line_buf_ix && isspace(line_buf[line_buf_ix]))
line_buf_ix--;
- /* skip spaces left */
- while (line_buf_ix && isspace(line_buf[line_buf_ix]))
- line_buf_ix--;
- /* skip all non spaces to the left */
- while (line_buf_ix > 0 &&
+
+ /* skip all non spaces to the left */
+ while (line_buf_ix > 0 &&
!isspace(line_buf[line_buf_ix - 1]))
- line_buf_ix--;
- /* move cursor to new position */
- terminal_move_cursor(line_buf_ix - old_pos);
- break;
- case KEY_CRIGHT:
- /*
- * Move by word right
- *
- * are we at the end of line?
- */
- if (line_buf_ix >= line_len)
- break;
+ line_buf_ix--;
- old_pos = line_buf_ix;
- /* skip all spaces */
- while (line_buf_ix < line_len &&
- isspace(line_buf[line_buf_ix]))
- line_buf_ix++;
- /* skip all non spaces */
- while (line_buf_ix < line_len &&
- !isspace(line_buf[line_buf_ix]))
- line_buf_ix++;
- /*
- * Move cursor to right by printing text
- * between old cursor and new
- */
- if (line_buf_ix > old_pos)
- printf("%.*s", (int) (line_buf_ix - old_pos),
+ /* move cursor to new position */
+ terminal_move_cursor(line_buf_ix - old_pos);
+}
+
+TERMINAL_ACTION(terminal_action_word_right)
+{
+ int old_pos;
+ /*
+ * Move by word right
+ *
+ * are we at the end of line?
+ */
+ if (line_buf_ix >= line_len)
+ return;
+
+ old_pos = line_buf_ix;
+ /* skip all spaces */
+ while (line_buf_ix < line_len && isspace(line_buf[line_buf_ix]))
+ line_buf_ix++;
+
+ /* skip all non spaces */
+ while (line_buf_ix < line_len && !isspace(line_buf[line_buf_ix]))
+ line_buf_ix++;
+ /*
+ * Move cursor to right by printing text
+ * between old cursor and new
+ */
+ if (line_buf_ix > old_pos)
+ printf("%.*s", (int) (line_buf_ix - old_pos),
line_buf + old_pos);
- break;
- case KEY_SUP:
- terminal_get_line_from_history(-1);
- break;
- case KEY_SDOWN:
- if (line_index > 0)
- terminal_get_line_from_history(0);
- break;
- case KEY_UP:
- terminal_get_line_from_history(line_index + 1);
- break;
- case KEY_DOWN:
- if (line_index > 0)
- terminal_get_line_from_history(line_index - 1);
- break;
- case '\n':
- case '\r':
- /*
- * On new line add line to history
- * forget history position
- */
- history_add_line(line_buf);
- line_len = 0;
- line_buf_ix = 0;
- line_index = -1;
- /* print new line */
- putchar(c);
- prompt = "";
- process_line(line_buf);
- /* clear current line */
- line_buf[0] = '\0';
- prompt = prompt_buf;
- printf("%s", prompt);
- break;
- case '\t':
- /* tab processing */
- process_tab(line_buf, line_buf_ix);
- break;
- case KEY_BACKSPACE:
- if (line_buf_ix <= 0)
- break;
+}
- if (line_buf_ix == line_len) {
- printf("\b \b");
- line_len = --line_buf_ix;
- line_buf[line_len] = 0;
- } else {
- putchar('\b');
- refresh_from = --line_buf_ix;
- line_len--;
- memmove(line_buf + line_buf_ix,
+TERMINAL_ACTION(terminal_action_history_begin)
+{
+ terminal_get_line_from_history(-1);
+}
+
+TERMINAL_ACTION(terminal_action_history_end)
+{
+ if (line_index > 0)
+ terminal_get_line_from_history(0);
+}
+
+TERMINAL_ACTION(terminal_action_history_up)
+{
+ terminal_get_line_from_history(line_index + 1);
+}
+
+TERMINAL_ACTION(terminal_action_history_down)
+{
+ if (line_index > 0)
+ terminal_get_line_from_history(line_index - 1);
+}
+
+TERMINAL_ACTION(terminal_action_tab)
+{
+ /* tab processing */
+ process_tab(line_buf, line_buf_ix);
+}
+
+
+TERMINAL_ACTION(terminal_action_backspace)
+{
+ if (line_buf_ix <= 0)
+ return;
+
+ if (line_buf_ix == line_len) {
+ printf("\b \b");
+ line_len = --line_buf_ix;
+ line_buf[line_len] = 0;
+ } else {
+ putchar('\b');
+ line_buf_ix--;
+ line_len--;
+ memmove(line_buf + line_buf_ix,
line_buf + line_buf_ix + 1,
line_len - line_buf_ix + 1);
- }
- break;
- case KEY_INSERT:
- case KEY_PGUP:
- case KEY_PGDOWN:
- case KEY_CUP:
- case KEY_CDOWN:
- case KEY_SLEFT:
- case KEY_SRIGHT:
- case KEY_MLEFT:
- case KEY_MRIGHT:
- case KEY_MUP:
- case KEY_MDOWN:
- case KEY_STAB:
- case KEY_M_n:
- /* Search history forward */
- terminal_match_hitory(false);
- break;
- case KEY_M_p:
- /* Search history backward */
- terminal_match_hitory(true);
- break;
- case KEY_C_C:
- terminal_clear_line();
- break;
- case KEY_C_D:
- if (line_len > 0) {
- terminal_delete_char();
- } else {
- puts("");
- exit(0);
- }
- break;
- case KEY_C_L:
- terminal_clear_screen();
- break;
- default:
- if (!isprint(c)) {
- /*
- * TODO: remove this print once all meaningful sequences
- * are identified
- */
- printf("char-0x%02x\n", c);
- break;
- }
-
- if (line_buf_ix < LINE_BUF_MAX - 1) {
- if (line_len == line_buf_ix) {
- putchar(c);
- line_buf[line_buf_ix++] = (char) c;
- line_len++;
- line_buf[line_len] = '\0';
- } else {
- memmove(line_buf + line_buf_ix + 1,
- line_buf + line_buf_ix,
- line_len - line_buf_ix + 1);
- line_buf[line_buf_ix] = c;
- refresh_from = line_buf_ix++;
- line_len++;
- }
- }
- break;
+ printf("%s \b", line_buf + line_buf_ix);
+ terminal_move_cursor(line_buf_ix - line_len);
}
+}
- if (refresh_from >= 0) {
- printf("%s \b", line_buf + refresh_from);
- terminal_move_cursor(line_buf_ix - line_len);
+TERMINAL_ACTION(terminal_action_find_history_forward)
+{
+ /* Search history forward */
+ terminal_match_hitory(false);
+}
+
+TERMINAL_ACTION(terminal_action_find_history_backward)
+{
+ /* Search history forward */
+ terminal_match_hitory(true);
+}
+
+TERMINAL_ACTION(terminal_action_ctrl_c)
+{
+ terminal_clear_line();
+}
+
+TERMINAL_ACTION(terminal_action_ctrl_d)
+{
+ if (line_len > 0) {
+ terminal_delete_char();
+ } else {
+ puts("");
+ exit(0);
}
+}
+
+TERMINAL_ACTION(terminal_action_clear_screen)
+{
+ terminal_clear_screen();
+}
+
+TERMINAL_ACTION(terminal_action_enter)
+{
+ /*
+ * On new line add line to history
+ * forget history position
+ */
+ history_add_line(line_buf);
+ line_len = 0;
+ line_buf_ix = 0;
+ line_index = -1;
+ /* print new line */
+ putchar(c);
+ prompt = noprompt;
+ process_line(line_buf);
+ /* clear current line */
+ line_buf[0] = '\0';
+ prompt = current_prompt;
+ printf("%s", prompt);
+}
+
+TERMINAL_ACTION(terminal_action_default)
+{
+ char str[2] = { c, 0 };
+
+ if (!isprint(c))
+ /*
+ * TODO: remove this print once all meaningful sequences
+ * are identified
+ */
+ printf("char-0x%02x\n", c);
+ else if (line_buf_ix < LINE_BUF_MAX - 1)
+ terminal_insert_into_command_line(str);
+}
- /* Flush output after all user input */
+static KeyAction normal_actions[] = {
+ { 0, terminal_action_default },
+ { KEY_LEFT, terminal_action_left },
+ { KEY_RIGHT, terminal_action_right },
+ { KEY_HOME, terminal_action_home },
+ { KEY_END, terminal_action_end },
+ { KEY_DELETE, terminal_action_del },
+ { KEY_CLEFT, terminal_action_word_left },
+ { KEY_CRIGHT, terminal_action_word_right },
+ { KEY_SUP, terminal_action_history_begin },
+ { KEY_SDOWN, terminal_action_history_end },
+ { KEY_UP, terminal_action_history_up },
+ { KEY_DOWN, terminal_action_history_down },
+ { '\t', terminal_action_tab },
+ { KEY_BACKSPACE, terminal_action_backspace },
+ { KEY_M_n, terminal_action_find_history_forward },
+ { KEY_M_p, terminal_action_find_history_backward },
+ { KEY_C_C, terminal_action_ctrl_c },
+ { KEY_C_D, terminal_action_ctrl_d },
+ { KEY_C_L, terminal_action_clear_screen },
+ { '\r', terminal_action_enter },
+ { '\n', terminal_action_enter },
+ { 0, NULL },
+};
+
+void terminal_process_char(int c, line_callback process_line)
+{
+ KeyAction *a;
+
+ c = terminal_convert_sequence(c);
+
+ /* Get action for this key */
+ a = terminal_get_action(c);
+
+ /* No action found, get default one */
+ if (a == NULL)
+ a = ¤t_actions[0];
+
+ a->func(c, process_line);
fflush(stdout);
}
@@ -589,6 +736,9 @@ static void terminal_cleanup(void)
void terminal_setup(void)
{
struct termios tios;
+
+ terminal_set_actions(normal_actions);
+
tcgetattr(0, &origianl_tios);
tios = origianl_tios;
diff --git a/android/client/terminal.h b/android/client/terminal.h
index e53750f..b5e402d 100644
--- a/android/client/terminal.h
+++ b/android/client/terminal.h
@@ -49,10 +49,12 @@ enum key_codes {
KEY_M_n
};
+typedef void (*line_callback)(char *);
+
void terminal_setup(void);
int terminal_print(const char *format, ...);
int terminal_vprint(const char *format, va_list args);
-void terminal_process_char(int c, void (*process_line)(char *line));
+void terminal_process_char(int c, line_callback process_line);
void terminal_insert_into_command_line(const char *p);
void terminal_draw_command_line(void);
--
1.7.9.5
^ permalink raw reply related
* [PATCH 4/8] android/client: Add command line arguments
From: Jerzy Kasenberg @ 2013-11-08 12:48 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jerzy Kasenberg
In-Reply-To: <1383914910-2304-1-git-send-email-jerzy.kasenberg@tieto.com>
This patch adds command line argument parsing.
Options added:
-h, --help
-n, --no-init - disable initialization of interfaces
--version
---
android/client/haltest.c | 68 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 66 insertions(+), 2 deletions(-)
diff --git a/android/client/haltest.c b/android/client/haltest.c
index 107dfec..7154d27 100644
--- a/android/client/haltest.c
+++ b/android/client/haltest.c
@@ -23,6 +23,7 @@
#include <unistd.h>
#include <poll.h>
#include <unistd.h>
+#include <getopt.h>
#include "if-main.h"
#include "terminal.h"
@@ -222,7 +223,7 @@ const char *interface_name(void *v, int i)
/* Function to enumerate command and interface names */
const char *command_name(void *v, int i)
{
- int cmd_cnt = (int) (sizeof(commands)/sizeof(commands[0]) - 1);
+ int cmd_cnt = NELEM(commands);
if (i >= cmd_cnt)
return interface_name(v, i - cmd_cnt);
@@ -318,6 +319,65 @@ static void stdin_handler(struct pollfd *pollfd)
}
}
+static void usage(void)
+{
+ printf("haltest Android Bluetooth HAL testing tool\n"
+ "Usage:\n");
+ printf("\thaltest [options]\n");
+ printf("options:\n"
+ "\t-n, --no-init Don't call init for interfaces\n"
+ "\t --version Print version\n"
+ "\t-h, --help Show help options\n");
+}
+
+enum {
+ PRINT_VERSION = 1000
+};
+
+int version = 1;
+int revision = 0;
+
+static void print_version(void)
+{
+ printf("haltest version %d.%d\n", version, revision);
+}
+
+static const struct option main_options[] = {
+ { "no-init", no_argument, NULL, 'n' },
+ { "help", no_argument, NULL, 'h' },
+ { "version", no_argument, NULL, PRINT_VERSION },
+ { NULL }
+};
+
+static bool no_init = false;
+
+static void parse_command_line(int argc, char *argv[])
+{
+ for (;;) {
+ int opt;
+
+ opt = getopt_long(argc, argv, "nh", main_options, NULL);
+ if (opt < 0)
+ break;
+
+ switch (opt) {
+ case 'n':
+ no_init = true;
+ break;
+ case 'h':
+ usage();
+ exit(0);
+ case PRINT_VERSION:
+ print_version();
+ exit(0);
+ default:
+ putchar('\n');
+ exit(-1);
+ break;
+ }
+ }
+}
+
static void init(void)
{
static const char * const inames[] = {
@@ -356,8 +416,12 @@ int main(int argc, char **argv)
{
struct stat rcstat;
+ parse_command_line(argc, argv);
+
terminal_setup();
- init();
+
+ if (!no_init)
+ init();
history_restore(".haltest_history");
--
1.7.9.5
^ permalink raw reply related
* [PATCH 3/8] android/client: Initialize all interfaces at start
From: Jerzy Kasenberg @ 2013-11-08 12:48 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jerzy Kasenberg
In-Reply-To: <1383914910-2304-1-git-send-email-jerzy.kasenberg@tieto.com>
Patch adds function that initializes all HAL interfaces.
---
android/client/haltest.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/android/client/haltest.c b/android/client/haltest.c
index f511025..107dfec 100644
--- a/android/client/haltest.c
+++ b/android/client/haltest.c
@@ -318,11 +318,47 @@ static void stdin_handler(struct pollfd *pollfd)
}
}
+static void init(void)
+{
+ static const char * const inames[] = {
+ BT_PROFILE_HANDSFREE_ID,
+ BT_PROFILE_ADVANCED_AUDIO_ID,
+ BT_PROFILE_HEALTH_ID,
+ BT_PROFILE_HIDHOST_ID,
+ BT_PROFILE_PAN_ID,
+#if PLATFORM_SDK_VERSION > 17
+ BT_PROFILE_GATT_ID,
+#endif
+ BT_PROFILE_SOCKETS_ID
+ };
+ const struct method *m;
+ const char *argv[4];
+ char init_line[] = "bluetooth init";
+ uint32_t i;
+
+ process_line(init_line);
+ m = get_interface_method("bluetooth", "get_profile_interface");
+
+ for (i = 0; i < NELEM(inames); ++i) {
+ argv[2] = inames[i];
+ m->func(3, argv);
+ }
+
+ /* Init what is available to init */
+ for (i = 1; i < NELEM(interfaces) - 1; ++i) {
+ m = get_interface_method(interfaces[i]->name, "init");
+ if (m != NULL)
+ m->func(2, argv);
+ }
+}
+
int main(int argc, char **argv)
{
struct stat rcstat;
terminal_setup();
+ init();
+
history_restore(".haltest_history");
fd_stack[fd_stack_pointer++] = 0;
--
1.7.9.5
^ permalink raw reply related
* [PATCH 2/8] android/client: Add NELEM macro for count elements
From: Jerzy Kasenberg @ 2013-11-08 12:48 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jerzy Kasenberg
In-Reply-To: <1383914910-2304-1-git-send-email-jerzy.kasenberg@tieto.com>
NELEM macro will be used in several places.
---
android/client/if-main.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/android/client/if-main.h b/android/client/if-main.h
index 647162c..dea7237 100644
--- a/android/client/if-main.h
+++ b/android/client/if-main.h
@@ -144,6 +144,8 @@ struct method *get_command(const char *name);
const struct method *get_interface_method(const char *iname,
const char *mname);
+#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
+
/* Helper macro for executing function on interface and printing BT_STATUS */
#define EXEC(f, ...) \
{ \
--
1.7.9.5
^ permalink raw reply related
* [PATCH 1/8] android/client: Export get_interface_method
From: Jerzy Kasenberg @ 2013-11-08 12:48 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jerzy Kasenberg
In-Reply-To: <1383914910-2304-1-git-send-email-jerzy.kasenberg@tieto.com>
This method will be used outside tab completion.c.
---
android/client/if-main.h | 2 ++
android/client/tabcompletion.c | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/android/client/if-main.h b/android/client/if-main.h
index f638b91..647162c 100644
--- a/android/client/if-main.h
+++ b/android/client/if-main.h
@@ -141,6 +141,8 @@ void add_remote_device(const bt_bdaddr_t *addr);
const struct interface *get_interface(const char *name);
struct method *get_method(struct method *methods, const char *name);
struct method *get_command(const char *name);
+const struct method *get_interface_method(const char *iname,
+ const char *mname);
/* Helper macro for executing function on interface and printing BT_STATUS */
#define EXEC(f, ...) \
diff --git a/android/client/tabcompletion.c b/android/client/tabcompletion.c
index 4a6329f..f965620 100644
--- a/android/client/tabcompletion.c
+++ b/android/client/tabcompletion.c
@@ -30,7 +30,7 @@ typedef struct split_arg {
} split_arg_t;
/* function returns method of given name or NULL if not found */
-static const struct method *get_interface_method(const char *iname,
+const struct method *get_interface_method(const char *iname,
const char *mname)
{
const struct interface *iface = get_interface(iname);
--
1.7.9.5
^ permalink raw reply related
* [PATCH 0/8] Improve user experience
From: Jerzy Kasenberg @ 2013-11-08 12:48 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Jerzy Kasenberg
This patchset works towards improving user interface.
- Command line parsing (--help, --version, --no-init)
- All interfaces are now initialized at start by default
- --no-init allows to disable this initialization
- pin_request_cb will now present prompt and send reply
- ssp_request_cb will now present prompt and sent reply
As part of adding those features terminal.c was restructured.
Big switch inside terminal_process_char was distributed between
number of small functions. This work was necessary due to input
handling of prompted data.
Version print may need to be changed according to bluez culture.
Jerzy Kasenberg (8):
android/client: Export get_interface_method
android/client: Add NELEM macro for count elements
android/client: Initialize all interfaces at start
android/client: Add command line arguments
android/client: Split terminal_process_char
android/client: Add prompting for answer
android/client: Add pin handling for bind
android/client: Add ssp key confirmation helper
android/client/haltest.c | 102 ++++++-
android/client/if-bt.c | 46 +++
android/client/if-main.h | 4 +
android/client/tabcompletion.c | 2 +-
android/client/terminal.c | 605 +++++++++++++++++++++++++++-------------
android/client/terminal.h | 5 +-
6 files changed, 567 insertions(+), 197 deletions(-)
--
1.7.9.5
^ permalink raw reply
* [PATCH_v5 3/5] android/hid: Fill send data command struct in hal-hidhost
From: Ravi kumar Veeramally @ 2013-11-08 12:32 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Ravi kumar Veeramally
---
android/hal-hidhost.c | 9 +++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/android/hal-hidhost.c b/android/hal-hidhost.c
index a0df7ce..e4a15c0 100644
--- a/android/hal-hidhost.c
+++ b/android/hal-hidhost.c
@@ -335,7 +335,8 @@ static bt_status_t set_report(bt_bdaddr_t *bd_addr,
static bt_status_t send_data(bt_bdaddr_t *bd_addr, char *data)
{
- struct hal_cmd_hidhost_send_data cmd;
+ uint8_t buf[BLUEZ_HAL_MTU];
+ struct hal_cmd_hidhost_send_data *cmd = (void *) buf;
DBG("");
@@ -345,10 +346,13 @@ static bt_status_t send_data(bt_bdaddr_t *bd_addr, char *data)
if (!bd_addr || !data)
return BT_STATUS_PARM_INVALID;
- memcpy(cmd.bdaddr, bd_addr, sizeof(cmd.bdaddr));
+ memcpy(cmd->bdaddr, bd_addr, sizeof(cmd->bdaddr));
+ cmd->len = strlen(data);
+ memcpy(cmd->data, data, cmd->len);
return hal_ipc_cmd(HAL_SERVICE_ID_HIDHOST, HAL_OP_HIDHOST_SEND_DATA,
- sizeof(cmd), &cmd, 0, NULL, NULL);
+ sizeof(*cmd) + cmd->len, buf, 0, NULL, NULL);
}
static bt_status_t init(bthh_callbacks_t *callbacks)
--
1.8.3.2
^ permalink raw reply related
* [PATCH_v5 1/5] android/hid: Fix set seport ipc cmd preparation
From: Ravi kumar Veeramally @ 2013-11-08 12:32 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Ravi kumar Veeramally
---
v5: Fix issues as per Johan's comemnts.
---
android/hal-hidhost.c | 18 +++++++++++--------
android/hal-msg.h | 2 +-
2 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/android/hal-hidhost.c b/android/hal-hidhost.c
index 94f7e01..a0df7ce 100644
--- a/android/hal-hidhost.c
+++ b/android/hal-hidhost.c
@@ -18,6 +18,7 @@
#include <stdbool.h>
#include <stddef.h>
#include <string.h>
+#include <stdlib.h>
#include "hal-log.h"
#include "hal.h"
@@ -298,7 +299,8 @@ static bt_status_t set_report(bt_bdaddr_t *bd_addr,
bthh_report_type_t report_type,
char *report)
{
- struct hal_cmd_hidhost_set_report cmd;
+ uint8_t buf[BLUEZ_HAL_MTU];
+ struct hal_cmd_hidhost_set_report *cmd = (void *) buf;
DBG("");
@@ -308,26 +310,27 @@ static bt_status_t set_report(bt_bdaddr_t *bd_addr,
if (!bd_addr || !report)
return BT_STATUS_PARM_INVALID;
- memcpy(cmd.bdaddr, bd_addr, sizeof(cmd.bdaddr));
- cmd.len = strlen(report);
- memcpy(cmd.data, report, cmd.len);
+ memcpy(cmd->bdaddr, bd_addr, sizeof(cmd->bdaddr));
+ cmd->len = strlen(report);
+ memcpy(cmd->data, report, cmd->len);
switch (report_type) {
case BTHH_INPUT_REPORT:
- cmd.type = HAL_HIDHOST_INPUT_REPORT;
+ cmd->type = HAL_HIDHOST_INPUT_REPORT;
break;
case BTHH_OUTPUT_REPORT:
- cmd.type = HAL_HIDHOST_OUTPUT_REPORT;
+ cmd->type = HAL_HIDHOST_OUTPUT_REPORT;
break;
case BTHH_FEATURE_REPORT:
- cmd.type = HAL_HIDHOST_FEATURE_REPORT;
+ cmd->type = HAL_HIDHOST_FEATURE_REPORT;
break;
default:
return BT_STATUS_PARM_INVALID;
}
return hal_ipc_cmd(HAL_SERVICE_ID_HIDHOST, HAL_OP_HIDHOST_SET_REPORT,
- sizeof(cmd), &cmd, 0, NULL, NULL);
+ sizeof(*cmd) + cmd->len, buf, 0, NULL, NULL);
}
static bt_status_t send_data(bt_bdaddr_t *bd_addr, char *data)
diff --git a/android/hal-msg.h b/android/hal-msg.h
index 4af86de..4c7d344 100644
--- a/android/hal-msg.h
+++ b/android/hal-msg.h
@@ -293,7 +293,7 @@ struct hal_cmd_hidhost_set_report {
uint8_t bdaddr[6];
uint8_t type;
uint16_t len;
- uint8_t data[670];
+ uint8_t data[0];
} __attribute__((packed));
#define HAL_OP_HIDHOST_SEND_DATA 0x09
--
1.8.3.2
^ permalink raw reply related
* Re: [PATCH_v4 1/5] android/hid: Fix set seport ipc cmd preparation
From: Ravi Kumar Veeramally @ 2013-11-08 12:27 UTC (permalink / raw)
To: linux-bluetooth, Johan Hedberg
In-Reply-To: <20131108121531.GA1371@x220.p-661hnu-f1>
Hi Johan,
On 11/08/2013 02:15 PM, Johan Hedberg wrote:
> Hi Ravi,
>
> On Fri, Nov 08, 2013, Ravi kumar Veeramally wrote:
>> - memcpy(cmd.data, report, cmd.len);
>> + memset(cmd, 0, sizeof(buf));
> How about memset(buf, 0, sizeof(buf)) to make this perfectly clear.
Ok.
> Btw,
> why is the memset needed? I don't think the original code had it. Seems
> like this is an independent bug fix?
Not in original, but in between versions (v1~v4) :(.
>
>> + cmd->len = strlen(report);
>> + memcpy(cmd->data, report, cmd->len);
>>
>> switch (report_type) {
>> case BTHH_INPUT_REPORT:
>> - cmd.type = HAL_HIDHOST_INPUT_REPORT;
>> + cmd->type = HAL_HIDHOST_INPUT_REPORT;
>> break;
>> case BTHH_OUTPUT_REPORT:
>> - cmd.type = HAL_HIDHOST_OUTPUT_REPORT;
>> + cmd->type = HAL_HIDHOST_OUTPUT_REPORT;
>> break;
>> case BTHH_FEATURE_REPORT:
>> - cmd.type = HAL_HIDHOST_FEATURE_REPORT;
>> + cmd->type = HAL_HIDHOST_FEATURE_REPORT;
>> break;
>> default:
>> return BT_STATUS_PARM_INVALID;
>> }
>>
>> return hal_ipc_cmd(HAL_SERVICE_ID_HIDHOST, HAL_OP_HIDHOST_SET_REPORT,
>> - sizeof(cmd), &cmd, 0, NULL, NULL);
>> + sizeof(buf), buf, 0, NULL, NULL);
> This last call looks broken to me. Shouldn't you instead of sizeof(buf)
> be sending sizeof(*cmd) + cmd->len?
yes, should be "sizeof(*cmd) + cmd->len".
>
> Johan
>
Thanks,
Ravi.
^ permalink raw reply
* [PATCH 4/4] android: Register DeviceID record when adapter is initialized
From: Szymon Janc @ 2013-11-08 12:21 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
In-Reply-To: <1383913284-4032-1-git-send-email-szymon.janc@tieto.com>
Register DeviceID SDP record and update local UUIDs after DeviceID
information is passed to kernel.
---
android/adapter.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/android/adapter.c b/android/adapter.c
index 8c4fe76..37ba988 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -47,6 +47,10 @@
#include "utils.h"
#include "adapter.h"
+#define DEVICE_ID_SOURCE 0x0002 /* USB */
+#define DEVICE_ID_VENDOR 0x1d6b /* Linux Foundation */
+#define DEVICE_ID_PRODUCT 0x0247 /* BlueZ for Android */
+
/* Default to DisplayYesNo */
#define DEFAULT_IO_CAPABILITY 0x01
/* Default discoverable timeout 120sec as in Android */
@@ -1184,20 +1188,28 @@ static void set_device_id(void)
{
struct mgmt_cp_set_device_id cp;
uint8_t major, minor;
+ uint16_t version;
if (sscanf(VERSION, "%hhu.%hhu", &major, &minor) != 2)
return;
+ version = major << 8 | minor;
+
memset(&cp, 0, sizeof(cp));
- cp.source = htobs(0x0002); /* USB */
- cp.vendor = htobs(0x1d6b); /* Linux Foundation */
- cp.product = htobs(0x0247); /* BlueZ for Android */
- cp.version = htobs(major << 8 | minor);
+ cp.source = htobs(DEVICE_ID_SOURCE);
+ cp.vendor = htobs(DEVICE_ID_VENDOR);
+ cp.product = htobs(DEVICE_ID_PRODUCT);
+ cp.version = htobs(version);
if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEVICE_ID,
adapter->index, sizeof(cp), &cp,
NULL, NULL, NULL) == 0)
error("Failed to set device id");
+
+ register_device_id(DEVICE_ID_SOURCE, DEVICE_ID_VENDOR,
+ DEVICE_ID_PRODUCT, version);
+
+ bt_adapter_add_record(PNPID_UUID, sdp_record_find(0x10000), 0x00);
}
static void set_adapter_name_complete(uint8_t status, uint16_t length,
--
1.8.4.2
^ permalink raw reply related
* [PATCH 3/4] android: Add support for getting UUIDs property
From: Szymon Janc @ 2013-11-08 12:21 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Marcin Kraglak
In-Reply-To: <1383913284-4032-1-git-send-email-szymon.janc@tieto.com>
From: Marcin Kraglak <marcin.kraglak@tieto.com>
This method will call adapter_properties_cb with uuids of
adapter. Method is called also when uuid is added or removed.
---
android/adapter.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 46 insertions(+), 9 deletions(-)
diff --git a/android/adapter.c b/android/adapter.c
index 8ea104b..8c4fe76 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -988,6 +988,44 @@ static void load_link_keys(GSList *keys)
}
}
+static bool get_uuids(void)
+{
+ struct hal_ev_adapter_props_changed *ev;
+ GSList *list = adapter->uuids;
+ unsigned int uuid_count = g_slist_length(list);
+ int len = uuid_count * sizeof(uint128_t);
+ uint8_t buf[BASELEN_PROP_CHANGED + len];
+ bt_uuid_t *uuid;
+ uint8_t *p;
+ int i;
+
+ memset(buf, 0, sizeof(buf));
+ ev = (void *) buf;
+
+ ev->num_props = 1;
+ ev->status = HAL_STATUS_SUCCESS;
+
+ ev->props[0].type = HAL_PROP_ADAPTER_UUIDS;
+ ev->props[0].len = len;
+ p = ev->props->val;
+
+ for (; list; list = g_slist_next(list)) {
+ uuid = list->data;
+
+ /* uuids on list are in mgmt interface format and need to
+ * be swapped before sending to HAL */
+ for (i = 0; i < 16; i++)
+ p[15 - i] = uuid->value.u128.data[i];
+
+ p += sizeof(uint128_t);
+ }
+
+ ipc_send(notification_sk, HAL_SERVICE_ID_BLUETOOTH,
+ HAL_EV_ADAPTER_PROPS_CHANGED, sizeof(buf), ev, -1);
+
+ return true;
+}
+
static void remove_uuid_complete(uint8_t status, uint16_t length,
const void *param, void *user_data)
{
@@ -998,6 +1036,10 @@ static void remove_uuid_complete(uint8_t status, uint16_t length,
}
mgmt_dev_class_changed_event(adapter->index, length, param, NULL);
+
+ /* send notification only if bluetooth service is registered */
+ if (notification_sk >= 0)
+ get_uuids();
}
static void remove_uuid(const uint8_t *uuid)
@@ -1006,7 +1048,6 @@ static void remove_uuid(const uint8_t *uuid)
memcpy(cp.uuid, uuid, sizeof(uint128_t));
-
mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID,
adapter->index, sizeof(cp), &cp,
remove_uuid_complete, NULL, NULL);
@@ -1022,6 +1063,10 @@ static void add_uuid_complete(uint8_t status, uint16_t length,
}
mgmt_dev_class_changed_event(adapter->index, length, param, NULL);
+
+ /* send notification only if bluetooth service is registered */
+ if (notification_sk >= 0)
+ get_uuids();
}
static void add_uuid(uint8_t svc_hint, const uint8_t *uuid)
@@ -1335,14 +1380,6 @@ static bool get_name(void)
return true;
}
-static bool get_uuids(void)
-{
- DBG("Not implemented");
-
- /* TODO: Add implementation */
-
- return false;
-}
static bool get_class(void)
{
--
1.8.4.2
^ permalink raw reply related
* [PATCH 2/4] android: Clear adapter uuids during initialization
From: Szymon Janc @ 2013-11-08 12:21 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Marcin Kraglak
In-Reply-To: <1383913284-4032-1-git-send-email-szymon.janc@tieto.com>
From: Marcin Kraglak <marcin.kraglak@tieto.com>
Clear adapter uuids during init. We have to do it before
other profiles will be able to register sdp records and add
their uuids.
---
android/adapter.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/android/adapter.c b/android/adapter.c
index 60b2635..8ea104b 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -1197,6 +1197,17 @@ static uint8_t set_discoverable_timeout(uint8_t *timeout)
return HAL_STATUS_SUCCESS;
}
+
+static void clear_uuids(void)
+{
+ struct mgmt_cp_remove_uuid cp;
+
+ memset(&cp, 0, sizeof(cp));
+
+ mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID, adapter->index,
+ sizeof(cp), &cp, NULL, NULL, NULL);
+}
+
static void read_info_complete(uint8_t status, uint16_t length, const void *param,
void *user_data)
{
@@ -1237,6 +1248,8 @@ static void read_info_complete(uint8_t status, uint16_t length, const void *para
/* TODO: Register all event notification handlers */
register_mgmt_handlers();
+ clear_uuids();
+
load_link_keys(NULL);
set_io_capability();
--
1.8.4.2
^ permalink raw reply related
* [PATCH 1/4] android: Add and remove sdp records and uuids
From: Szymon Janc @ 2013-11-08 12:21 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Marcin Kraglak
In-Reply-To: <1383913284-4032-1-git-send-email-szymon.janc@tieto.com>
From: Marcin Kraglak <marcin.kraglak@tieto.com>
This is api for adding and removing sdp records and uuids
via mgmt interface. Local profiles have to store handle to
own records to remove them in cleanup. Additionally list of
uuids is created in bt_adapter struct.
---
android/Android.mk | 1 +
android/adapter.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++
android/adapter.h | 4 +++
3 files changed, 106 insertions(+)
diff --git a/android/Android.mk b/android/Android.mk
index 51037a7..9f89dfd 100644
--- a/android/Android.mk
+++ b/android/Android.mk
@@ -39,6 +39,7 @@ LOCAL_SRC_FILES := \
../lib/sdp.c \
../lib/bluetooth.c \
../lib/hci.c \
+ ../lib/uuid.c \
../btio/btio.c \
../src/sdp-client.c \
diff --git a/android/adapter.c b/android/adapter.c
index 65b3170..60b2635 100644
--- a/android/adapter.c
+++ b/android/adapter.c
@@ -39,6 +39,7 @@
#include "lib/sdp.h"
#include "lib/sdp_lib.h"
#include "lib/uuid.h"
+#include "src/sdpd.h"
#include "src/sdp-client.h"
#include "log.h"
#include "hal-msg.h"
@@ -74,6 +75,7 @@ struct bt_adapter {
bool discovering;
uint32_t discoverable_timeout;
+ GSList *uuids;
};
struct browse_req {
@@ -986,6 +988,105 @@ static void load_link_keys(GSList *keys)
}
}
+static void remove_uuid_complete(uint8_t status, uint16_t length,
+ const void *param, void *user_data)
+{
+ if (status != MGMT_STATUS_SUCCESS) {
+ error("Failed to remove UUID: %s (0x%02x)",
+ mgmt_errstr(status), status);
+ return;
+ }
+
+ mgmt_dev_class_changed_event(adapter->index, length, param, NULL);
+}
+
+static void remove_uuid(const uint8_t *uuid)
+{
+ struct mgmt_cp_remove_uuid cp;
+
+ memcpy(cp.uuid, uuid, sizeof(uint128_t));
+
+
+ mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID,
+ adapter->index, sizeof(cp), &cp,
+ remove_uuid_complete, NULL, NULL);
+}
+
+static void add_uuid_complete(uint8_t status, uint16_t length,
+ const void *param, void *user_data)
+{
+ if (status != MGMT_STATUS_SUCCESS) {
+ error("Failed to add UUID: %s (0x%02x)",
+ mgmt_errstr(status), status);
+ return;
+ }
+
+ mgmt_dev_class_changed_event(adapter->index, length, param, NULL);
+}
+
+static void add_uuid(uint8_t svc_hint, const uint8_t *uuid)
+{
+ struct mgmt_cp_add_uuid cp;
+
+ memcpy(cp.uuid, uuid, sizeof(uint128_t));
+ cp.svc_hint = svc_hint;
+
+ mgmt_send(adapter->mgmt, MGMT_OP_ADD_UUID,
+ adapter->index, sizeof(cp), &cp,
+ add_uuid_complete, NULL, NULL);
+}
+
+static int uuid_cmp(gconstpointer a, gconstpointer b)
+{
+ const bt_uuid_t *uuid_a = a;
+ const bt_uuid_t *uuid_b = b;
+
+ return bt_uuid_cmp(uuid_a, uuid_b);
+}
+
+int bt_adapter_add_record(const char *uuid, sdp_record_t *rec,
+ uint8_t svc_hint)
+{
+ bt_uuid_t *new_uuid;
+
+ new_uuid = g_new0(bt_uuid_t, 1);
+ bt_string_to_uuid(new_uuid, uuid);
+ if (new_uuid->type != BT_UUID128) {
+ g_free(new_uuid);
+ return -1;
+ }
+
+ if (g_slist_find_custom(adapter->uuids, new_uuid, uuid_cmp)) {
+ DBG("UUID %s already added", uuid);
+ g_free(new_uuid);
+ return -1;
+ }
+
+ adapter->uuids = g_slist_prepend(adapter->uuids, new_uuid);
+ add_uuid(svc_hint, new_uuid->value.u128.data);
+
+ return add_record_to_server(&adapter->bdaddr, rec);
+}
+
+void bt_adapter_remove_record(const char *uuid, int handle)
+{
+ bt_uuid_t bt_uuid;
+ GSList *uuid_found;
+
+ bt_string_to_uuid(&bt_uuid, uuid);
+
+ uuid_found = g_slist_find_custom(adapter->uuids, &bt_uuid, uuid_cmp);
+
+ if (uuid_found) {
+ remove_uuid(bt_uuid.value.u128.data);
+ g_free(uuid_found->data);
+ adapter->uuids = g_slist_remove(adapter->uuids,
+ uuid_found->data);
+ }
+
+ remove_record_from_server(handle);
+}
+
static void set_mode_complete(uint8_t status, uint16_t length,
const void *param, void *user_data)
{
diff --git a/android/adapter.h b/android/adapter.h
index c62b859..0d93917 100644
--- a/android/adapter.h
+++ b/android/adapter.h
@@ -32,3 +32,7 @@ const bdaddr_t *bt_adapter_get_address(void);
bool bt_adapter_register(int sk);
void bt_adapter_unregister(void);
+
+int bt_adapter_add_record(const char *uuid, sdp_record_t *rec,
+ uint8_t svc_hint);
+void bt_adapter_remove_record(const char *uuid, int handle);
--
1.8.4.2
^ permalink raw reply related
* [PATCH 0/4] Add support for registering local SDP records
From: Szymon Janc @ 2013-11-08 12:21 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Szymon Janc
This adds support for manipulating local SDP database with
bt_adapter_add_record and bt_adapter_remove_record functions. Those should
be called when HAL service is registered or unregistered.
This also adds DeviceID record as at least 1 local UUID is needed by Android to
properly handle remote device profiles.
Last but not least: With this serie it is possible to connect HID device from
Android UI (Settings application). \O/
Comments are welcome.
BR
Szymon Janc
Marcin Kraglak (3):
android: Add and remove sdp records and uuids
android: Clear adapter uuids during initialization
android: Add support for getting UUIDs property
Szymon Janc (1):
android: Register DeviceID record when adapter is initialized
android/Android.mk | 1 +
android/adapter.c | 187 +++++++++++++++++++++++++++++++++++++++++++++++++----
android/adapter.h | 4 ++
3 files changed, 180 insertions(+), 12 deletions(-)
--
1.8.4.2
^ permalink raw reply
* Re: [PATCH_v4 1/5] android/hid: Fix set seport ipc cmd preparation
From: Johan Hedberg @ 2013-11-08 12:15 UTC (permalink / raw)
To: Ravi kumar Veeramally; +Cc: linux-bluetooth
In-Reply-To: <1383912531-1306-2-git-send-email-ravikumar.veeramally@linux.intel.com>
Hi Ravi,
On Fri, Nov 08, 2013, Ravi kumar Veeramally wrote:
> - memcpy(cmd.data, report, cmd.len);
> + memset(cmd, 0, sizeof(buf));
How about memset(buf, 0, sizeof(buf)) to make this perfectly clear. Btw,
why is the memset needed? I don't think the original code had it. Seems
like this is an independent bug fix?
> + cmd->len = strlen(report);
> + memcpy(cmd->data, report, cmd->len);
>
> switch (report_type) {
> case BTHH_INPUT_REPORT:
> - cmd.type = HAL_HIDHOST_INPUT_REPORT;
> + cmd->type = HAL_HIDHOST_INPUT_REPORT;
> break;
> case BTHH_OUTPUT_REPORT:
> - cmd.type = HAL_HIDHOST_OUTPUT_REPORT;
> + cmd->type = HAL_HIDHOST_OUTPUT_REPORT;
> break;
> case BTHH_FEATURE_REPORT:
> - cmd.type = HAL_HIDHOST_FEATURE_REPORT;
> + cmd->type = HAL_HIDHOST_FEATURE_REPORT;
> break;
> default:
> return BT_STATUS_PARM_INVALID;
> }
>
> return hal_ipc_cmd(HAL_SERVICE_ID_HIDHOST, HAL_OP_HIDHOST_SET_REPORT,
> - sizeof(cmd), &cmd, 0, NULL, NULL);
> + sizeof(buf), buf, 0, NULL, NULL);
This last call looks broken to me. Shouldn't you instead of sizeof(buf)
be sending sizeof(*cmd) + cmd->len?
Johan
^ permalink raw reply
* [PATCH_v4 5/5] android/hid: Add virtual unplug implemention in daemon
From: Ravi kumar Veeramally @ 2013-11-08 12:08 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Ravi kumar Veeramally
In-Reply-To: <1383912531-1306-1-git-send-email-ravikumar.veeramally@linux.intel.com>
Send virtual unplug command to hid device and disconnect and remove
hid device details.
---
android/hidhost.c | 46 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 44 insertions(+), 2 deletions(-)
diff --git a/android/hidhost.c b/android/hidhost.c
index 250288c..46f992e 100644
--- a/android/hidhost.c
+++ b/android/hidhost.c
@@ -55,6 +55,7 @@
#define UHID_DEVICE_FILE "/dev/uhid"
/* HID message types */
+#define HID_MSG_CONTROL 0x10
#define HID_MSG_GET_REPORT 0x40
#define HID_MSG_SET_REPORT 0x50
#define HID_MSG_GET_PROTOCOL 0x60
@@ -73,6 +74,9 @@
/* HID GET REPORT Size Field */
#define HID_GET_REPORT_SIZE_FIELD 0x08
+/* HID Virtual Cable Unplug */
+#define HID_VIRTUAL_CABLE_UNPLUG 0x05
+
static int notification_sk = -1;
static GIOChannel *ctrl_io = NULL;
static GIOChannel *intr_io = NULL;
@@ -744,9 +748,47 @@ static uint8_t bt_hid_disconnect(struct hal_cmd_hidhost_disconnect *cmd,
static uint8_t bt_hid_virtual_unplug(struct hal_cmd_hidhost_virtual_unplug *cmd,
uint16_t len)
{
- DBG("Not Implemented");
+ struct hid_device *dev;
+ GSList *l;
+ bdaddr_t dst;
+ uint8_t hdr;
+ int fd;
- return HAL_STATUS_FAILED;
+ DBG("");
+
+ if (len < sizeof(*cmd))
+ return HAL_STATUS_INVALID;
+
+ android2bdaddr(&cmd->bdaddr, &dst);
+
+ l = g_slist_find_custom(devices, &dst, device_cmp);
+ if (!l)
+ return HAL_STATUS_FAILED;
+
+ dev = l->data;
+
+ if (!(dev->ctrl_io))
+ return HAL_STATUS_FAILED;
+
+ hdr = HID_MSG_CONTROL | HID_VIRTUAL_CABLE_UNPLUG;
+
+ fd = g_io_channel_unix_get_fd(dev->ctrl_io);
+
+ if (write(fd, &hdr, sizeof(hdr)) < 0) {
+ error("error while virtual unplug command");
+ return HAL_STATUS_FAILED;
+ }
+
+ /* Wait either channels to HUP */
+ if (dev->intr_io)
+ g_io_channel_shutdown(dev->intr_io, TRUE, NULL);
+
+ if (dev->ctrl_io)
+ g_io_channel_shutdown(dev->ctrl_io, TRUE, NULL);
+
+ bt_hid_notify_state(dev, HAL_HIDHOST_STATE_DISCONNECTING);
+
+ return HAL_STATUS_SUCCESS;
}
static uint8_t bt_hid_info(struct hal_cmd_hidhost_set_info *cmd, uint16_t len)
--
1.8.3.2
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox