Return error response for 'LEReadMaximumDataLength' method 44/140044/1 accepted/tizen_3.0_common accepted/tizen_3.0_ivi accepted/tizen/3.0/common/20170803.140334 accepted/tizen/3.0/ivi/20170803.010922 accepted/tizen/3.0/mobile/20170803.010846 accepted/tizen/3.0/tv/20170803.010858 accepted/tizen/3.0/wearable/20170803.010911 submit/tizen_3.0/20170801.063915
authorSangki Park <sangki79.park@samsung.com>
Mon, 13 Mar 2017 09:29:55 +0000 (18:29 +0900)
committerNagaraj D R <nagaraj.dr@samsung.com>
Fri, 21 Jul 2017 12:22:17 +0000 (17:52 +0530)
When BT-FRWK calls this method and error happend
in bluez internally, bluez does not reply resulting
in BT-FRWK blocked till default dbus timeout

Change-Id: Ia1bb5596f3e176a90c3a809abb858fd593719141

src/adapter.c
src/adapter.h

index 5acea50..039db58 100644 (file)
@@ -5172,11 +5172,12 @@ static void le_read_maximum_data_length_return_param_complete(
        const struct mgmt_rp_le_read_maximum_data_length *rp = param;
        uint16_t max_tx_octects, max_tx_time;
        uint16_t max_rx_octects, max_rx_time;
+       int err = 0;
 
        if (!rp) {
                error("Error ocurred in Reading maximum data length, rp is NULL");
-               g_free(adapter->read_handler);
-               return;
+               err = -EIO;
+               goto done;
        }
 
        if (status != MGMT_STATUS_SUCCESS) {
@@ -5187,14 +5188,14 @@ static void le_read_maximum_data_length_return_param_complete(
                max_rx_octects = 0;
                max_rx_time = 0;
 
-               g_free(adapter->read_handler);
-               return;
+               err = -EIO;
+               goto done;
        }
 
        if (length < sizeof(*rp)) {
                error("Too small le read maximum data length response");
-               g_free(adapter->read_handler);
-               return;
+               err = -EIO;
+               goto done;
        } else {
                max_tx_octects = rp->max_tx_octets;
                max_tx_time =rp->max_tx_time;
@@ -5202,13 +5203,14 @@ static void le_read_maximum_data_length_return_param_complete(
                max_rx_time = rp->max_rx_time;
        }
 
+done:
        if (!adapter->read_handler ||
                !adapter->read_handler->read_callback) {
                g_free(adapter->read_handler);
                return;
        }
 
-       adapter->read_handler->read_callback(adapter,
+       adapter->read_handler->read_callback(adapter, err,
                        max_tx_octects, max_tx_time,
                        max_rx_octects, max_rx_time,
                        adapter->read_handler->user_data);
@@ -5253,6 +5255,7 @@ static struct le_data_length_read_request *find_read_le_data_length_request(
 
 static void le_read_data_length_complete(
                        struct btd_adapter *adapter,
+                       int err,
                        uint16_t max_tx_octects, uint16_t max_tx_time,
                        uint16_t max_rx_octects, uint16_t max_rx_time,
                        void *user_data)
@@ -5261,20 +5264,26 @@ static void le_read_data_length_complete(
        struct le_data_length_read_request *read_request;
 
        read_request = find_read_le_data_length_request(adapter);
+
        if (!read_request)
                return;
 
-       reply = g_dbus_create_reply(read_request->msg,
-                               DBUS_TYPE_UINT16, &max_tx_octects,
-                               DBUS_TYPE_UINT16, &max_tx_time,
-                               DBUS_TYPE_UINT16, &max_rx_octects,
-                               DBUS_TYPE_UINT16, &max_rx_time,
-                               DBUS_TYPE_INVALID);
-
-       if (!reply) {
-               btd_error_failed(read_request->msg,
-                                       "Failed to read max data length.");
-               return;
+       if (err) {
+               DBG("Failed to read max data length. errno[%d]", err);
+               reply = btd_error_failed(read_request->msg,
+                                       "Failed to read max data length");
+       } else {
+               reply = g_dbus_create_reply(read_request->msg,
+                                       DBUS_TYPE_UINT16, &max_tx_octects,
+                                       DBUS_TYPE_UINT16, &max_tx_time,
+                                       DBUS_TYPE_UINT16, &max_rx_octects,
+                                       DBUS_TYPE_UINT16, &max_rx_time,
+                                       DBUS_TYPE_INVALID);
+
+               if (!reply) {
+                       reply = btd_error_failed(read_request->msg,
+                                               "Failed to create reply.");
+               }
        }
 
        read_requests = g_slist_remove(read_requests, read_request);
index 4a0783a..7019393 100644 (file)
@@ -312,6 +312,7 @@ int btd_adapter_set_dev_rpa_res_support(struct btd_adapter *adapter,
                                                struct btd_device *device);
 
 typedef void (*read_max_data_length_cb_t) (struct btd_adapter *adapter,
+                                       int result,
                                        const uint16_t max_txOctects,
                                        const uint16_t max_txTime,
                                        const uint16_t max_rxOctects,