Update rpa on VSC advertising 86/185986/1
authorinjun.yang <injun.yang@samsung.com>
Mon, 21 May 2018 08:36:44 +0000 (17:36 +0900)
committerDoHyun Pyun <dh79.pyun@samsung.com>
Mon, 6 Aug 2018 06:17:29 +0000 (15:17 +0900)
[Model] All
[BinType] AP
[Customer] OPEN

[Issue#] N/A
[Request] Internal
[Occurrence Version] N/A

[Problem] The updated rpa is not applied on VSC advertising
[Cause & Measure] When rpa changed, report it to bluetoothd.
 If device doing multiple adv, bluetoothd will update rpa.
[Checking Method] When rpa updated, check the address of advertiser

[Team] Basic Connection
[Developer] Injun Yang
[Solution company] Samsung
[Change Type] Specification change

Change-Id: I967e8eca52d9de1a0e140ee70abcd18392a1ea1b
Signed-off-by: injun.yang <injun.yang@samsung.com>
Signed-off-by: DoHyun Pyun <dh79.pyun@samsung.com>
lib/mgmt.h
src/adapter.c
src/adapter_le_vsc_features.c
src/adapter_le_vsc_features.h

index 9553bb2..a8b3a93 100644 (file)
@@ -1214,6 +1214,11 @@ struct mgmt_ev_le_data_length_changed {
        int16_t max_rx_time;
 } __packed;
 
+#define MGMT_EV_RPA_CHANGED                    (TIZEN_EV_BASE + 0x0f)
+struct mgmt_ev_rpa_changed {
+       bdaddr_t bdaddr;
+} __packed;
+
 static const char *mgmt_tizen_op[] = {
        "<0x0000>",
        "Set Advertising Parameters",
index a7aec92..4ff2711 100644 (file)
@@ -229,6 +229,7 @@ struct btd_adapter {
        bdaddr_t bdaddr;                /* controller Bluetooth address */
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
        bdaddr_t le_static_addr;
+       bdaddr_t rpa;
 #endif
        uint8_t bdaddr_type;            /* address type */
        uint32_t dev_class;             /* controller class of device */
@@ -731,29 +732,30 @@ static struct adv_info *find_advertiser(struct btd_adapter *adapter,
        return NULL;
 }
 
-static void create_advertiser(struct btd_adapter *adapter,
+static struct adv_info *create_advertiser(struct btd_adapter *adapter,
                                        int slot_id)
 {
        struct adv_info *adv;
 
        if (!adapter)
-               return;
+               return NULL;
 
-       if (find_advertiser(adapter, slot_id) != NULL) {
-               error("Aleady existed [%d]", slot_id);
-               return;
+       adv = find_advertiser(adapter, slot_id);
+       if (adv != NULL) {
+               DBG("Aleady existed. solt_id [%d]", slot_id);
+               return adv;
        }
 
        DBG("Create adv slot id : %d", slot_id);
 
        adv = g_new0(struct adv_info, 1);
        if (adv == NULL)
-               return;
+               return NULL;
 
        adv->slot_id = slot_id;
 
        adapter->adv_list = g_slist_append(adapter->adv_list, adv);
-       return;
+       return adv;
 }
 
 
@@ -801,6 +803,38 @@ static void advertiser_cleanup(struct btd_adapter *adapter)
        g_slist_free(adapter->adv_list);
        adapter->adv_list = NULL;
 }
+
+static void update_advertiser_address(gpointer data, gpointer user_data)
+{
+       struct adv_info *adv = data;
+       struct btd_adapter *adapter = user_data;
+
+       if (adv->slot_id > 0 && adv->status == 1)
+               adapter_le_set_random_address(adapter, &adapter->rpa, adv->slot_id);
+}
+
+static void rpa_changed_callback(uint16_t index, uint16_t length,
+                                       const void *param, void *user_data)
+{
+       const struct mgmt_ev_rpa_changed *ev = param;
+       struct btd_adapter *adapter = user_data;
+       char addr[18];
+
+       if (length < sizeof(*ev)) {
+               error("Too small rpa changed event");
+               return;
+       }
+
+       ba2str(&ev->bdaddr, addr);
+       DBG("RPA changed %s", addr);
+       bacpy(&adapter->rpa, &ev->bdaddr);
+
+       if (!adapter->adv_list)
+               return;
+
+       g_slist_foreach(adapter->adv_list, update_advertiser_address, adapter);
+}
+
 #endif
 
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
@@ -4369,10 +4403,8 @@ static DBusMessage *adapter_set_advertising_params(DBusConnection *conn,
                adapter_le_adv_inst_info_t *p_inst;
                adapter_le_adv_param_t *p_params;
 
-               p_inst = malloc(sizeof(adapter_le_adv_inst_info_t));
-               p_params = malloc(sizeof(adapter_le_adv_param_t));
-               memset(p_inst, 0, sizeof(adapter_le_adv_inst_info_t));
-               memset(p_params, 0, sizeof(adapter_le_adv_param_t));
+               p_inst = g_malloc0(sizeof(adapter_le_adv_inst_info_t));
+               p_params = g_malloc0(sizeof(adapter_le_adv_param_t));
                p_inst->inst_id = slot_id;
                p_params->adv_int_min = interval_min;
                p_params->adv_int_max = interval_max;
@@ -4380,7 +4412,11 @@ static DBusMessage *adapter_set_advertising_params(DBusConnection *conn,
                p_params->channel_map = 0x07;   /* fixed channel :: will be used all */
                p_params->adv_filter_policy = filter_policy;
                p_params->tx_power = BLE_ADV_TX_POWER_MID;      /* TODO:need to optimize */
-               if (adapter->le_static_addr.b[5] != 0) {
+
+               if (adapter->current_settings & MGMT_SETTING_PRIVACY) {
+                       p_inst->bdaddr_type = 0x01;
+                       bacpy(&p_inst->bdaddr, &adapter->rpa);
+               } else if (adapter->le_static_addr.b[5] != 0) {
                        p_inst->bdaddr_type = 0x01;
                        bacpy(&p_inst->bdaddr, &adapter->le_static_addr);
                } else {
@@ -4390,8 +4426,8 @@ static DBusMessage *adapter_set_advertising_params(DBusConnection *conn,
 
                ret = adapter_le_set_multi_adv_params(p_inst, p_params);
 
-               free(p_inst);
-               free(p_params);
+               g_free(p_inst);
+               g_free(p_params);
 
                if (ret)
                        return dbus_message_new_method_return(msg);
@@ -9965,7 +10001,9 @@ const bdaddr_t *btd_adapter_get_address(struct btd_adapter *adapter)
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
 const bdaddr_t *btd_adapter_get_le_address(struct btd_adapter *adapter)
 {
-       if (adapter->le_static_addr.b[5] != 0)
+       if (adapter->current_settings & MGMT_SETTING_PRIVACY)
+               return &adapter->rpa;
+       else if (adapter->le_static_addr.b[5] != 0)
                return &adapter->le_static_addr;
        else
                return &adapter->bdaddr;
@@ -9973,10 +10011,11 @@ const bdaddr_t *btd_adapter_get_le_address(struct btd_adapter *adapter)
 
 uint8_t btd_adapter_get_le_address_type(struct btd_adapter * adapter)
 {
-       if (adapter->le_static_addr.b[5] != 0)
-               return BDADDR_LE_RANDOM;
-       else
-               return BDADDR_LE_PUBLIC;
+       if (adapter->current_settings & MGMT_SETTING_PRIVACY ||
+                               adapter->le_static_addr.b[5] != 0)
+                       return BDADDR_LE_RANDOM;
+               else
+                       return BDADDR_LE_PUBLIC;
 }
 #endif
 
@@ -13962,6 +14001,11 @@ static void read_info_complete(uint8_t status, uint16_t length,
                                        adapter->dev_id,
                                        le_conn_update_completed_callback,
                                        adapter, NULL);
+
+       mgmt_register(adapter->mgmt, MGMT_EV_RPA_CHANGED,
+                                       adapter->dev_id,
+                                       rpa_changed_callback,
+                                       adapter, NULL);
 #endif
 
        set_dev_class(adapter);
index 6c586eb..fed654a 100755 (executable)
@@ -225,6 +225,34 @@ gboolean adapter_le_set_multi_adv_data(uint8_t inst_id, gboolean is_scan_rsp,
        return TRUE;
 }
 
+gboolean adapter_le_set_random_address (struct btd_adapter *adapter,
+                                       const bdaddr_t *addr, uint8_t inst_id)
+{
+       int ret;
+       adapter_le_vsc_cp_set_random_address cp;
+       apater_le_vsc_rp_set_random_address rp;
+
+       DBG("");
+
+       memset(&cp, 0, sizeof(cp));
+       cp.subcode = SUB_CMD_LE_MULTI_ADV_SET_RANDOM_ADDR;
+       cp.inst_id = inst_id;
+       bacpy(&cp.bdaddr, addr);
+
+       ret = send_vsc_command(OCF_BCM_LE_MULTI_ADV, (uint8_t *) &cp, sizeof(cp),
+                                       (uint8_t *) &rp, sizeof(rp));
+
+       if (ret < 0)
+               return FALSE;
+
+       if (HCI_SUCCESS != rp.status) {
+               DBG("Fail to send VSC :: sub[%x] - status [0x%02x]", rp.subcode, rp.status);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
 gboolean adapter_le_enable_multi_adv (struct btd_adapter *adapter,
                                        gboolean enable, uint8_t inst_id)
 {
@@ -234,7 +262,7 @@ gboolean adapter_le_enable_multi_adv (struct btd_adapter *adapter,
        uint8_t bdaddr_type;
        const bdaddr_t *bdaddr;
 
-       DBG("");
+       DBG("%s slot_id %d", enable ? "Enable" : "Disable", inst_id);
        if (enable) {
                bdaddr_type = btd_adapter_get_le_address_type(adapter);
                if (bdaddr_type == BDADDR_LE_RANDOM) {
index 44a4bcc..ea4d91d 100755 (executable)
@@ -270,6 +270,33 @@ typedef struct {
 
 /**
 *
+* CP for SUB_CMD_LE_MULTI_ADV_SET_RANDOM_ADDR
+*
+* (6 octet) b     :  Random address
+* (1 octet) inst_id     : Specifies the applicability of the above parameters
+*                         to an instance. Instance 0 has special meaning this
+*                         refers to std HCI instance.
+*/
+typedef struct {
+       uint8_t subcode;
+       bdaddr_t bdaddr;
+       uint8_t inst_id;
+} __attribute__ ((packed)) adapter_le_vsc_cp_set_random_address;
+
+/**
+*
+* RP
+*
+* (1 octet) status      : Command complete status
+* (1 octet) subcode     : subcode of SUB_CMD_LE_MULTI_ADV_SET_RANDOM_ADDR
+*/
+typedef struct {
+       uint8_t status;
+       uint8_t subcode;
+} __attribute__ ((packed)) apater_le_vsc_rp_set_random_address;
+
+/**
+*
 * CP for SUB_CMD_LE_MULTI_ADV_ENB
 *
 * (1 octet) subcode     : SUB_CMD_LE_MULTI_ADV_ENB
@@ -476,6 +503,9 @@ gboolean adapter_le_set_multi_adv_params (adapter_le_adv_inst_info_t *p_inst,
 gboolean adapter_le_set_multi_adv_data(uint8_t inst_id, gboolean is_scan_rsp,
                                        uint8_t data_len, uint8_t *p_data);
 
+gboolean adapter_le_set_random_address (struct btd_adapter *adapter,
+                                       const bdaddr_t *addr, uint8_t inst_id);
+
 gboolean adapter_le_enable_multi_adv (struct btd_adapter *adapter,
                                        gboolean enable, uint8_t inst_id);