diff --git a/system/stack/eatt/eatt.h b/system/stack/eatt/eatt.h index 828d17ac0e3a0b655c8b8a5b28472cdbcc7c73a0..f6e735d554d6b091874d92c24fb9beb2baac2535 100644 --- a/system/stack/eatt/eatt.h +++ b/system/stack/eatt/eatt.h @@ -17,6 +17,7 @@ #pragma once +#include <algorithm> #include <queue> #include "stack/gatt/gatt_int.h" @@ -25,6 +26,7 @@ #define EATT_MIN_MTU_MPS (64) #define EATT_DEFAULT_MTU (256) #define EATT_ALL_CIDS (0xFFFF) +#define EATT_MAX_TX_MTU (1024) namespace bluetooth { namespace eatt { @@ -59,12 +61,13 @@ class EattChannel { EattChannel(RawAddress& bda, uint16_t cid, uint16_t tx_mtu, uint16_t rx_mtu) : bda_(bda), cid_(cid), - tx_mtu_(tx_mtu), rx_mtu_(rx_mtu), state_(EattChannelState::EATT_CHANNEL_PENDING), indicate_handle_(0), ind_ack_timer_(NULL), - ind_confirmation_timer_(NULL) {} + ind_confirmation_timer_(NULL) { + EattChannelSetTxMTU(tx_mtu); + } ~EattChannel() { if (ind_ack_timer_ != NULL) { @@ -93,7 +96,10 @@ class EattChannel { } state_ = state; } - void EattChannelSetTxMTU(uint16_t tx_mtu) { this->tx_mtu_ = tx_mtu; } + + void EattChannelSetTxMTU(uint16_t tx_mtu) { + this->tx_mtu_ = std::min<uint16_t>(tx_mtu, EATT_MAX_TX_MTU); + } }; /* Interface class */ diff --git a/system/stack/eatt/eatt_impl.h b/system/stack/eatt/eatt_impl.h index 0a2c2afd1d6e767e211812c3267d6fc55f099f17..a2e35d9aaeaf0fa0a1effed6d5dc2de96aad60a9 100644 --- a/system/stack/eatt/eatt_impl.h +++ b/system/stack/eatt/eatt_impl.h @@ -276,7 +276,7 @@ struct eatt_impl { if (is_local_cfg) channel->rx_mtu_ = p_cfg->mtu; else - channel->tx_mtu_ = p_cfg->mtu; + channel->EattChannelSetTxMTU(p_cfg->mtu); /* Go back to open state */ channel->EattChannelSetState(EattChannelState::EATT_CHANNEL_OPENED);