diff --git a/android/gatt.c b/android/gatt.c
index d5f3d7d..a36922c 100644
--- a/android/gatt.c
+++ b/android/gatt.c
return true;
}
+static bool update_mtu(struct gatt_device *device, uint16_t rmtu)
+{
+ uint16_t mtu, lmtu;
+
+ DBG("%u", rmtu);
+
+ if (rmtu < ATT_DEFAULT_LE_MTU) {
+ error("gatt: remote MTU invalid (%u bytes)", rmtu);
+ return false;
+ }
+
+ if (!get_local_mtu(device, &lmtu))
+ return false;
+
+ mtu = MIN(lmtu, rmtu);
+
+ if (mtu == ATT_DEFAULT_LE_MTU)
+ return true;
+
+ if (!g_attrib_set_mtu(device->attrib, mtu)) {
+ error("gatt: Failed to set MTU");
+ return false;
+ }
+
+ DBG("remote_mtu:%d local_mtu:%d", rmtu, lmtu);
+
+ return true;
+}
+
static void att_handler(const uint8_t *ipdu, uint16_t len, gpointer user_data);
static void exchange_mtu_cb(guint8 status, const guint8 *pdu, guint16 plen,
gpointer user_data)
{
struct gatt_device *device = user_data;
- uint16_t rmtu, lmtu, mtu;
+ uint16_t rmtu;
if (status) {
error("gatt: MTU exchange: %s", att_ecode2str(status));
goto failed;
}
- if (rmtu < ATT_DEFAULT_LE_MTU) {
- error("gatt: MTU exchange: remote MTU invalid (%u)", rmtu);
- goto failed;
- }
-
- if (!get_local_mtu(device, &lmtu))
- goto failed;
-
- mtu = MIN(lmtu, rmtu);
-
- if (mtu != ATT_DEFAULT_LE_MTU &&
- !g_attrib_set_mtu(device->attrib, mtu)) {
- error("gatt: MTU exchange failed");
- goto failed;
- }
-
- DBG("MTU exchange succeeded: remote mtu:%d local mtu:%d", rmtu, lmtu);
+ update_mtu(device, rmtu);
failed:
device_unref(device);
if (!len)
return ATT_ECODE_INVALID_PDU;
- if (rmtu < ATT_DEFAULT_LE_MTU)
- return ATT_ECODE_REQ_NOT_SUPP;
-
/* MTU exchange shall not be used on BR/EDR - Vol 3. Part G. 4.3.1 */
if (get_cid(dev) != ATT_CID)
return ATT_ECODE_UNLIKELY;
if (!len)
return ATT_ECODE_UNLIKELY;
- g_attrib_send(dev->attrib, 0, rsp, len, NULL, NULL, NULL);
+ if (!update_mtu(dev, rmtu))
+ return ATT_ECODE_UNLIKELY;
- /* Limit MTU to received value */
- mtu = MIN(mtu, rmtu);
- g_attrib_set_mtu(dev->attrib, mtu);
+ g_attrib_send(dev->attrib, 0, rsp, len, NULL, NULL, NULL);
return 0;
}