diff --git a/src/advertising.c b/src/advertising.c
index 6d54814..7e74584 100644
--- a/src/advertising.c
+++ b/src/advertising.c
#include "dbus-common.h"
#include "error.h"
#include "log.h"
+#include "eir.h"
#include "src/shared/ad.h"
#include "src/shared/mgmt.h"
#include "src/shared/queue.h"
struct mgmt *mgmt;
uint16_t mgmt_index;
uint8_t max_adv_len;
+ uint8_t max_scan_rsp_len;
uint8_t max_ads;
uint32_t supported_flags;
unsigned int instance_bitmap;
uint8_t type; /* Advertising type */
uint32_t flags;
struct bt_ad *data;
+ struct bt_ad *scan;
uint8_t instance;
};
client->instance);
bt_ad_unref(client->data);
+ bt_ad_unref(client->scan);
g_dbus_proxy_unref(client->proxy);
return max;
}
+static uint8_t *generate_scan_rsp(struct btd_adv_client *client,
+ uint32_t *flags, size_t *len)
+{
+ struct btd_adv_manager *manager = client->manager;
+ const char *name;
+
+ if (!(*flags & MGMT_ADV_FLAG_LOCAL_NAME)) {
+ *len = 0;
+ return NULL;
+ }
+
+ *flags &= ~MGMT_ADV_FLAG_LOCAL_NAME;
+
+ name = btd_adapter_get_name(manager->adapter);
+
+ bt_ad_add_name(client->scan, name);
+
+ return bt_ad_generate(client->scan, len);
+}
+
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;
+ uint8_t *scan_rsp;
+ size_t scan_rsp_len = -1;
uint32_t flags = 0;
DBG("Refreshing advertisement: %s", client->path);
"Advertising data too long.");
}
- param_len = sizeof(struct mgmt_cp_add_advertising) + adv_data_len;
+ scan_rsp = generate_scan_rsp(client, &flags, &scan_rsp_len);
+ if (!scan_rsp && scan_rsp_len) {
+ error("Scan data 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);
error("Couldn't allocate for MGMT!");
free(adv_data);
+ free(scan_rsp);
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, scan_rsp_len);
free(adv_data);
+ free(scan_rsp);
if (!mgmt_send(client->manager->mgmt, MGMT_OP_ADD_ADVERTISING,
client->manager->mgmt_index, param_len, cp,
if (!client->data)
goto fail;
+ client->scan = bt_ad_new();
+ if (!client->scan)
+ goto fail;
+
client->manager = manager;
return client;
}
manager->max_adv_len = feat->max_adv_data_len;
+ manager->max_scan_rsp_len = feat->max_scan_rsp_len;
manager->max_ads = feat->max_instances;
- manager->supported_flags = feat->supported_flags;
+ manager->supported_flags |= feat->supported_flags;
if (manager->max_ads == 0)
return;
}
manager->clients = queue_new();
+ manager->supported_flags = MGMT_ADV_FLAG_LOCAL_NAME;
return manager;
}