adapter: Handle Device Found Event with Scan Response flag
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tue, 20 Jun 2023 20:37:53 +0000 (13:37 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 5 Jan 2024 13:34:03 +0000 (19:04 +0530)
This handles recently introduced Scan Response flag since that
shouldn't affect connectable flag the device would be considered
connectable but it shall not create a new device by itself.

lib/mgmt.h
src/adapter.c
src/adapter.h
src/adv_monitor.c

index 4c00995..bb7ab0b 100644 (file)
@@ -912,6 +912,7 @@ struct mgmt_ev_auth_failed {
 #define MGMT_DEV_FOUND_NOT_CONNECTABLE         BIT(2)
 #define MGMT_DEV_FOUND_INITIATED_CONN          BIT(3)
 #define MGMT_DEV_FOUND_NAME_REQUEST_FAILED     BIT(4)
+#define MGMT_DEV_FOUND_SCAN_RSP                        BIT(5)
 
 #define MGMT_EV_DEVICE_FOUND           0x0012
 struct mgmt_ev_device_found {
index 5b68ef8..35bb348 100644 (file)
@@ -12267,20 +12267,17 @@ static bool device_is_discoverable(struct btd_adapter *adapter,
 #endif
 
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
-void btd_adapter_update_found_device(struct btd_adapter *adapter,
+void btd_adapter_device_found(struct btd_adapter *adapter,
                                        const bdaddr_t *bdaddr,
                                        uint8_t bdaddr_type, int8_t rssi,
-                                       bool confirm, bool legacy, uint8_t adv_type,
-                                       bool name_resolve_failed,
+                                       uint8_t adv_type, uint32_t flags,
                                        const uint8_t *data, uint8_t data_len,
                                        bool monitoring)
 #else
-void btd_adapter_update_found_device(struct btd_adapter *adapter,
+void btd_adapter_device_found(struct btd_adapter *adapter,
                                        const bdaddr_t *bdaddr,
                                        uint8_t bdaddr_type, int8_t rssi,
-                                       bool confirm, bool legacy,
-                                       bool not_connectable,
-                                       bool name_resolve_failed,
+                                       uint8_t adv_type, uint32_t flags,
                                        const uint8_t *data, uint8_t data_len,
                                        bool monitoring)
 #endif
@@ -12292,6 +12289,7 @@ void btd_adapter_update_found_device(struct btd_adapter *adapter,
        struct eir_data eir_data;
 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
        bool name_known, discoverable;
+       bool not_connectable;
 #else
        bool name_known;
 #endif
@@ -12299,7 +12297,21 @@ void btd_adapter_update_found_device(struct btd_adapter *adapter,
        uint8_t allow_report;
 #endif
        char addr[18];
+       bool confirm;
+       bool legacy;
+//     bool not_connectable;
+       bool name_resolve_failed;
+       bool scan_rsp;
        bool duplicate = false;
+
+       confirm = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
+       legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
+#ifndef TIZEN_FEATURE_BLUEZ_MODIFY
+       not_connectable = (flags & MGMT_DEV_FOUND_NOT_CONNECTABLE);
+#endif
+       name_resolve_failed = (flags & MGMT_DEV_FOUND_NAME_REQUEST_FAILED);
+       scan_rsp = (flags & MGMT_DEV_FOUND_SCAN_RSP);
+
 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
        struct queue *matched_monitors = NULL;
 
@@ -12351,6 +12363,15 @@ void btd_adapter_update_found_device(struct btd_adapter *adapter,
                 * not marked as discoverable, then do not create new
                 * device objects.
                 */
+
+               /* In case of being just a scan response don't attempt to create
+                * the device.
+                */
+               if (scan_rsp) {
+                       eir_data_free(&eir_data);
+                       return;
+               }
+
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
                /*DBG("List BREDR:%p LE:%p Discoverable:%d", adapter->discovery_list,
                        adapter->le_discovery_list, discoverable);*/
@@ -12613,12 +12634,6 @@ static void device_found_callback(uint16_t index, uint16_t length,
        const uint8_t *eir;
        uint16_t eir_len;
        uint32_t flags;
-       bool confirm_name;
-       bool legacy;
-#ifndef TIZEN_FEATURE_BLUEZ_MODIFY
-       bool not_connectable;
-#endif
-       bool name_resolve_failed;
        char addr[18];
        if (length < sizeof(*ev)) {
                btd_error(adapter->dev_id,
@@ -12639,27 +12654,19 @@ static void device_found_callback(uint16_t index, uint16_t length,
        else
                eir = ev->eir;
 
-       flags = btohl(ev->flags);
+       flags = le32_to_cpu(ev->flags);
 
        ba2str(&ev->addr.bdaddr, addr);
        DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
                        index, addr, ev->rssi, flags, eir_len);
 
-       confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
-       legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
-#ifndef TIZEN_FEATURE_BLUEZ_MODIFY
-       not_connectable = (flags & MGMT_DEV_FOUND_NOT_CONNECTABLE);
-#endif
-       name_resolve_failed = (flags & MGMT_DEV_FOUND_NAME_REQUEST_FAILED);
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
-       btd_adapter_update_found_device(adapter, &ev->addr.bdaddr, ev->addr.type,
-                                       ev->rssi, confirm_name, legacy, 0,
-                                       name_resolve_failed,
+       btd_adapter_device_found(adapter, &ev->addr.bdaddr,
+                                       ev->addr.type, ev->rssi, 0, flags,
                                        eir, eir_len, false);
 #else
-       btd_adapter_update_found_device(adapter, &ev->addr.bdaddr, ev->addr.type,
-                                       ev->rssi, confirm_name, legacy,
-                                       not_connectable, name_resolve_failed,
+       btd_adapter_device_found(adapter, &ev->addr.bdaddr,
+                                       ev->addr.type, ev->rssi, 0, flags,
                                        eir, eir_len, false);
 #endif
 }
@@ -12673,10 +12680,7 @@ static void le_device_found_callback(uint16_t index, uint16_t length,
        const uint8_t *eir;
        uint16_t eir_len;
        uint32_t flags;
-       bool confirm_name;
-       bool legacy;
        char addr[18];
-       bool name_resolve_failed;
 
        if (length < sizeof(*ev)) {
                error("Too short device found event (%u bytes)", length);
@@ -12701,15 +12705,9 @@ static void le_device_found_callback(uint16_t index, uint16_t length,
        /*DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
                        index, addr, ev->rssi, flags, eir_len);*/
 
-       confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
-       legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
-
-       /*DBG("hci%u addr %s, addr_type %d rssi %d flags 0x%04x eir_len %u confirm_name %d legacy %d, adv_type %02x",
-                       index, addr, ev->addr.type, ev->rssi, flags, eir_len, confirm_name, legacy, ev->adv_type);*/
-       name_resolve_failed = (flags & MGMT_DEV_FOUND_NAME_REQUEST_FAILED);
-       btd_adapter_update_found_device(adapter, &ev->addr.bdaddr, ev->addr.type,
-                                       ev->rssi, confirm_name, legacy, ev->adv_type,
-                                       name_resolve_failed, eir, eir_len, false);
+       btd_adapter_device_found(adapter, &ev->addr.bdaddr, ev->addr.type,
+                                       ev->rssi, ev->adv_type, flags,
+                                       eir, eir_len, false);
 }
 #endif
 
index 57a66e3..f4aa717 100644 (file)
@@ -166,20 +166,17 @@ struct btd_device *btd_adapter_find_device_by_path(struct btd_adapter *adapter,
 struct btd_device *btd_adapter_find_device_by_fd(int fd);
 
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
-void btd_adapter_update_found_device(struct btd_adapter *adapter,
+void btd_adapter_device_found(struct btd_adapter *adapter,
                                        const bdaddr_t *bdaddr,
                                        uint8_t bdaddr_type, int8_t rssi,
-                                       bool confirm, bool legacy, uint8_t adv_type,
-                                       bool name_resolve_failed,
+                                       uint8_t adv_type, uint32_t flags,
                                        const uint8_t *data, uint8_t data_len,
                                        bool monitoring);
 #else
-void btd_adapter_update_found_device(struct btd_adapter *adapter,
+void btd_adapter_device_found(struct btd_adapter *adapter,
                                        const bdaddr_t *bdaddr,
                                        uint8_t bdaddr_type, int8_t rssi,
-                                       bool confirm, bool legacy,
-                                       bool not_connectable,
-                                       bool name_resolve_failed,
+                                       uint8_t adv_type, uint32_t flags,
                                        const uint8_t *data, uint8_t data_len,
                                        bool monitored);
 #endif
index 77f212f..395b854 100644 (file)
@@ -1582,10 +1582,6 @@ static void adv_monitor_device_found_callback(uint16_t index, uint16_t length,
        const uint8_t *ad_data = NULL;
        uint16_t ad_data_len;
        uint32_t flags;
-       bool confirm_name;
-       bool legacy;
-       bool not_connectable;
-       bool name_resolve_failed;
        char addr[18];
 
        if (length < sizeof(*ev)) {
@@ -1604,21 +1600,14 @@ static void adv_monitor_device_found_callback(uint16_t index, uint16_t length,
        if (ad_data_len > 0)
                ad_data = ev->ad_data;
 
-       flags = btohl(ev->flags);
+       flags = le32_to_cpu(ev->flags);
 
        ba2str(&ev->addr.bdaddr, addr);
        DBG("hci%u addr %s, rssi %d flags 0x%04x ad_data_len %u",
                        index, addr, ev->rssi, flags, ad_data_len);
 
-       confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
-       legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
-       not_connectable = (flags & MGMT_DEV_FOUND_NOT_CONNECTABLE);
-       name_resolve_failed = (flags & MGMT_DEV_FOUND_NAME_REQUEST_FAILED);
-
-       btd_adapter_update_found_device(adapter, &ev->addr.bdaddr,
-                                       ev->addr.type, ev->rssi, confirm_name,
-                                       legacy, not_connectable,
-                                       name_resolve_failed, ad_data,
+       btd_adapter_device_found(adapter, &ev->addr.bdaddr,
+                                       ev->addr.type, ev->rssi, 0, flags, ad_data,
                                        ad_data_len, true);
 
        if (handle) {