]> granicus.if.org Git - esp-idf/commitdiff
Component/bt: send data length request by host after read feature complete
authorzhiweijian <zhiweijian@espressif.com>
Tue, 16 Jan 2018 04:14:11 +0000 (12:14 +0800)
committerzhiweijian <zhiweijian@espressif.com>
Wed, 17 Jan 2018 11:40:22 +0000 (19:40 +0800)
components/bt/bluedroid/device/controller.c
components/bt/bluedroid/device/include/controller.h
components/bt/bluedroid/hci/hci_packet_parser.c
components/bt/bluedroid/hci/include/hci_packet_parser.h
components/bt/bluedroid/stack/btm/btm_acl.c
components/bt/bluedroid/stack/btm/btm_ble.c
components/bt/bluedroid/stack/btm/btm_ble_gap.c
components/bt/bluedroid/stack/gatt/gatt_cl.c
components/bt/bluedroid/stack/gatt/gatt_sr.c
components/bt/lib

index 08564052d85b0da41138bca9677bfd825522d24e..176eb8f29b299d452776cfe18af0ee366bec4906 100644 (file)
@@ -66,6 +66,7 @@ static uint8_t ble_resolving_list_max_size;
 static uint8_t ble_supported_states[BLE_SUPPORTED_STATES_SIZE];
 static bt_device_features_t features_ble;
 static uint16_t ble_suggested_default_data_length;
+static uint16_t ble_suggested_default_data_txtime;
 
 static bool readable;
 static bool ble_supported;
@@ -228,7 +229,8 @@ static void start_up(void)
             response = AWAIT_COMMAND(packet_factory->make_ble_read_suggested_default_data_length());
             packet_parser->parse_ble_read_suggested_default_data_length_response(
                 response,
-                &ble_suggested_default_data_length);
+                &ble_suggested_default_data_length,
+                &ble_suggested_default_data_txtime);
         }
 
         // Set the ble event mask next
@@ -404,6 +406,13 @@ static uint16_t get_ble_suggested_default_data_length(void)
     return ble_suggested_default_data_length;
 }
 
+static uint16_t get_ble_suggested_default_data_txtime(void)
+{
+    assert(readable);
+    assert(ble_supported);
+    return ble_suggested_default_data_txtime;
+}
+
 static uint16_t get_acl_buffer_count_classic(void)
 {
     assert(readable);
@@ -472,6 +481,7 @@ static const controller_t interface = {
     get_acl_packet_size_classic,
     get_acl_packet_size_ble,
     get_ble_suggested_default_data_length,
+    get_ble_suggested_default_data_txtime,
 
     get_acl_buffer_count_classic,
     get_acl_buffer_count_ble,
index 6d6e5a8ca34781c32ec40e38dabe7d5764c53d2a..bffa714f4330897fa252c48cadd1d7a8d6a97a35 100644 (file)
@@ -69,6 +69,7 @@ typedef struct controller_t {
     uint16_t (*get_acl_packet_size_ble)(void);
 
     uint16_t (*get_ble_default_data_packet_length)(void);
+    uint16_t (*get_ble_default_data_packet_txtime)(void);
 
     // Get the number of acl packets the controller can buffer.
     uint16_t (*get_acl_buffer_count_classic)(void);
index b0e5e4b43456a8d535fb26687852d4024a8e5581..613113d6908bc2937a65a330ad75b80982eae7cf 100644 (file)
@@ -183,11 +183,13 @@ static void parse_ble_read_resolving_list_size_response(
 
 static void parse_ble_read_suggested_default_data_length_response(
     BT_HDR *response,
-    uint16_t *ble_default_packet_length_ptr)
+    uint16_t *ble_default_packet_length_ptr,
+    uint16_t *ble_default_packet_txtime_ptr)
 {
 
     uint8_t *stream = read_command_complete_header(response, HCI_BLE_READ_DEFAULT_DATA_LENGTH, 2 /* bytes after */);
-    STREAM_TO_UINT8(*ble_default_packet_length_ptr, stream);
+    STREAM_TO_UINT16(*ble_default_packet_length_ptr, stream);
+    STREAM_TO_UINT16(*ble_default_packet_txtime_ptr, stream);
 
     buffer_allocator->free(response);
 }
index 916ea313f6741dc3d879b004fa77879dab5cf9d2..7090708f0d0a2b7e6b1d3b489e794e8c46a7c37d 100644 (file)
@@ -90,7 +90,8 @@ typedef struct {
 
     void (*parse_ble_read_suggested_default_data_length_response)(
         BT_HDR *response,
-        uint16_t *ble_default_packet_length_ptr
+        uint16_t *ble_default_packet_length_ptr,
+        uint16_t *ble_default_packet_txtime_ptr
     );
 } hci_packet_parser_t;
 
index 239d6d6507bdf0b87e78db02e31dfe6fdfe7f46b..08ed2fcdd25a78de48b98a4edd326b06f1002a7e 100644 (file)
@@ -907,6 +907,11 @@ void btm_read_remote_version_complete (UINT8 *p)
             }
 #if BLE_INCLUDED == TRUE
             if (p_acl_cb->transport == BT_TRANSPORT_LE) {
+                if (HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl_cb->peer_le_features)) {
+                    uint16_t data_length = controller_get_interface()->get_ble_default_data_packet_length();
+                    uint16_t data_txtime = controller_get_interface()->get_ble_default_data_packet_txtime();
+                    btsnd_hcic_ble_set_data_length(p_acl_cb->hci_handle, data_length, data_txtime);
+                }
                 l2cble_notify_le_connection (p_acl_cb->remote_addr);
             }
 #endif
index 95f15e3a65c7a234bff880b87d71fb2ecf8aa4f9..7c9e4380843f447be6aae734919ae1af56df02f4 100644 (file)
@@ -812,7 +812,7 @@ tBTM_STATUS BTM_SetBleDataLength(BD_ADDR bd_addr, UINT16 tx_pdu_length)
     }
 
     if (!HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl->peer_le_features)) {
-        BTM_TRACE_DEBUG("%s failed, peer does not support request", __FUNCTION__);
+        BTM_TRACE_ERROR("%s failed, peer does not support request", __FUNCTION__);
         return BTM_PEER_LE_DATA_LEN_UNSUPPORTED;
     }
 
index a632972a6b1c107a9c2c893fb9395a55706e7ee1..d0eee7b87c327537621c1810bff88336d0f1591b 100644 (file)
@@ -3350,6 +3350,11 @@ void btm_ble_read_remote_features_complete(UINT8 *p)
 
                 else{
                     if (p_acl_cb->transport == BT_TRANSPORT_LE) {
+                        if (HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl_cb->peer_le_features)) {
+                            uint16_t data_length = controller_get_interface()->get_ble_default_data_packet_length();
+                            uint16_t data_txtime = controller_get_interface()->get_ble_default_data_packet_txtime();
+                            btsnd_hcic_ble_set_data_length(p_acl_cb->hci_handle, data_length, data_txtime);
+                        }
                         l2cble_notify_le_connection (p_acl_cb->remote_addr);
                     }
                 }
index cefa32f852bc73acbf59b01509d3bb7feea0f12f..9c0584313c07ad2e7a15b0124d418146a9286549 100644 (file)
@@ -989,8 +989,10 @@ void gatt_process_mtu_rsp(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb, UINT16 len, UINT
             p_tcb->payload_size = mtu;
         }
     }
-
-    l2cble_set_fixed_channel_tx_data_length(p_tcb->peer_bda, L2CAP_ATT_CID, p_tcb->payload_size);
+    /* host will set packet data length to 251 automatically if remote device support set packet data length,
+       so l2cble_set_fixed_channel_tx_data_length() is not necessary.
+       l2cble_set_fixed_channel_tx_data_length(p_tcb->peer_bda, L2CAP_ATT_CID, p_tcb->payload_size);
+    */
     gatt_end_operation(p_clcb, status, NULL);
 }
 /*******************************************************************************
index 3d8259840f9d05c35f246d2814b095f7335518f8..7a53afa851d76076c3548e85d53f81671067ff34 100644 (file)
@@ -929,9 +929,10 @@ static void gatts_process_mtu_req (tGATT_TCB *p_tcb, UINT16 len, UINT8 *p_data)
             p_tcb->payload_size = mtu;
         }
 
-        GATT_TRACE_ERROR("MTU request PDU with MTU size %d\n", p_tcb->payload_size);
-
-        l2cble_set_fixed_channel_tx_data_length(p_tcb->peer_bda, L2CAP_ATT_CID, p_tcb->payload_size);
+        /* host will set packet data length to 251 automatically if remote device support set packet data length,
+            so l2cble_set_fixed_channel_tx_data_length() is not necessary.
+            l2cble_set_fixed_channel_tx_data_length(p_tcb->peer_bda, L2CAP_ATT_CID, p_tcb->payload_size);
+        */
 
         if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_MTU, (tGATT_SR_MSG *) &p_tcb->payload_size)) != NULL) {
             attp_send_sr_msg (p_tcb, p_buf);
index 4c0d1e8941ebc2d43962d92509c17b664db2c7da..459d8f8e1921c9e82d8f0a9b1ecf44fc3699139d 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 4c0d1e8941ebc2d43962d92509c17b664db2c7da
+Subproject commit 459d8f8e1921c9e82d8f0a9b1ecf44fc3699139d