summaryrefslogtreecommitdiff
path: root/src/advertising.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2017-11-02 15:46:43 +0200
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2017-11-02 15:46:43 +0200
commit5b9596dac4d0e25c5179be8643726a02c058b00a (patch)
tree2f0776677dd44fcc9b90bdb9f00167deeb3009aa /src/advertising.c
parent5b0ab3065d77ef8b0bb34085bd310a9e530c3763 (diff)
downloadbluez-5b9596dac4d0e25c5179be8643726a02c058b00a.tar.gz
advertising: Add implementation of Duration and Timeout
This adds implementation of Duration and Timeout property and properly set them in Add Advertising: @ MGMT Command: Add Advertising (0x003e) plen 11 Instance: 1 Flags: 0x00000003 Switch into Connectable mode Advertise as Discoverable Duration: 4 Timeout: 0 Advertising data length: 0 Scan response length: 0
Diffstat (limited to 'src/advertising.c')
-rw-r--r--src/advertising.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/advertising.c b/src/advertising.c
index d4d95c1c3..31a5fff5c 100644
--- a/src/advertising.c
+++ b/src/advertising.c
@@ -64,6 +64,9 @@ struct btd_adv_client {
char *path;
char *name;
uint16_t appearance;
+ uint16_t duration;
+ uint16_t timeout;
+ unsigned int to_id;
GDBusClient *client;
GDBusProxy *proxy;
DBusMessage *reg;
@@ -97,6 +100,9 @@ static void client_free(void *data)
{
struct btd_adv_client *client = data;
+ if (client->to_id > 0)
+ g_source_remove(client->to_id);
+
if (client->client) {
g_dbus_client_set_disconnect_watch(client->client, NULL, NULL);
g_dbus_client_unref(client->client);
@@ -491,6 +497,48 @@ static bool parse_appearance(DBusMessageIter *iter,
return true;
}
+static bool parse_duration(DBusMessageIter *iter,
+ struct btd_adv_client *client)
+{
+ if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_UINT16)
+ return false;
+
+ dbus_message_iter_get_basic(iter, &client->duration);
+
+ return true;
+}
+
+static gboolean client_timeout(void *user_data)
+{
+ struct btd_adv_client *client = user_data;
+
+ DBG("");
+
+ client->to_id = 0;
+
+ client_release(client);
+ client_remove(client);
+
+ return FALSE;
+}
+
+static bool parse_timeout(DBusMessageIter *iter,
+ struct btd_adv_client *client)
+{
+ if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_UINT16)
+ return false;
+
+ dbus_message_iter_get_basic(iter, &client->timeout);
+
+ if (client->to_id)
+ g_source_remove(client->to_id);
+
+ client->to_id = g_timeout_add_seconds(client->timeout, client_timeout,
+ client);
+
+ return true;
+}
+
static struct adv_parser {
const char *name;
bool (*func)(DBusMessageIter *iter, struct btd_adv_client *client);
@@ -503,6 +551,8 @@ static struct adv_parser {
{ "Includes", parse_includes },
{ "LocalName", parse_local_name },
{ "Appearance", parse_appearance },
+ { "Duration", parse_duration },
+ { "Timeout", parse_timeout },
{ },
};
@@ -611,6 +661,7 @@ static int refresh_adv(struct btd_adv_client *client, mgmt_request_func_t func)
cp->flags = htobl(flags);
cp->instance = client->instance;
+ cp->duration = client->duration;
cp->adv_data_len = adv_data_len;
cp->scan_rsp_len = scan_rsp_len;
memcpy(cp->data, adv_data, adv_data_len);