This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

SDK 15.3 SD 6.1.1 MTU negotiation fails

I setup gatt like the following:

static void gatt_init(void)
{
ret_code_t err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
APP_ERROR_CHECK(err_code);

err_code = nrf_ble_gatt_att_mtu_central_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
APP_ERROR_CHECK(err_code);

err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
APP_ERROR_CHECK(err_code);

err_code = nrf_ble_gatt_data_length_set(&m_gatt, BLE_CONN_HANDLE_INVALID, NRF_SDH_BLE_GAP_DATA_LENGTH);
APP_ERROR_CHECK(err_code);
}

where NRF_SDH_BLE_GATT_MAX_MTU_SIZE is 247

When I connect to a macOS 10.13 computer, it seems the MTU negotiation fails and it uses the default minimum of 23.  With other devices I am not seeing this problem.  I attached the capture from the sniffer.  It looks like nRF requests 247, master requests 104, master responds 104, nRF responds 247.  Shouldn't nRF respond 104?  Am I missing some call in the code to make it respond 104?

<html> <head> <title>FTS Generated HTML</title>
<style type="text/css">@import "style.css";</style>
<style type="text/css" media="print">@import "print.css";</style>
</head>
<body><div id="ftsdiv" align=center> <p class="title">ATT Summary Pane</p>
<table><thead><tr><td>Bookmark</td>
<td>Frame#</td>
<td>Role</td>
<td>Opcode</td>
<td>Handle</td>
<td>UUID</td>
<td>Database</td>
<td>Direction</td>
<td>Error code</td>
<td>Frame Size</td>
<td>Delta</td>
<td>Timestamp</td>
</tr>
</thead>
<tfoot><tr><td colspan="12">ATT Summary Pane</td>
</tr>
</tfoot>
<tr bgcolor=#ffffff><td></td>
<td>9,489</td>
<td>Slave</td>
<td>Exchange MTU Request</td>
<td></td>
<td></td>
<td>506563a9(M)</td>
<td>M<<S</td>
<td></td>
<td>25</td>
<td></td>
<td>8/12/2020 5:23:21.998675 PM</td>
</tr>
<tr bgcolor=#ffffff><td></td>
<td>9,501</td>
<td>Slave</td>
<td>Exchange MTU Request</td>
<td></td>
<td></td>
<td>506563a9(M)</td>
<td>M<<S</td>
<td></td>
<td>25</td>
<td> 00:00:00.015000</td>
<td>8/12/2020 5:23:22.013675 PM</td>
</tr>
<tr bgcolor=#ffffff><td></td>
<td>9,525</td>
<td>Master</td>
<td>Exchange MTU Request</td>
<td></td>
<td></td>
<td>506563a9(S)</td>
<td>M>>S</td>
<td></td>
<td>25</td>
<td> 00:00:00.029771</td>
<td>8/12/2020 5:23:22.043446 PM</td>
</tr>
<tr bgcolor=#ffffff><td></td>
<td>9,527</td>
<td>Master</td>
<td>Exchange MTU Response</td>
<td></td>
<td></td>
<td>506563a9(M)</td>
<td>M>>S</td>
<td></td>
<td>25</td>
<td> 00:00:00.000516</td>
<td>8/12/2020 5:23:22.043962 PM</td>
</tr>
<tr bgcolor=#ffffff><td></td>
<td>9,528</td>
<td>Slave</td>
<td>Exchange MTU Response</td>
<td></td>
<td></td>
<td>506563a9(S)</td>
<td>M<<S</td>
<td></td>
<td>25</td>
<td> 00:00:00.000286</td>
<td>8/12/2020 5:23:22.044248 PM</td>
</tr>
<tr bgcolor=#ffffff><td></td>
<td>9,529</td>
<td>Master</td>
<td>Read by Group Type Request</td>
<td>1</td>
<td>Primary Service</td>
<td>506563a9(S)</td>
<td>M>>S</td>
<td></td>
<td>29</td>
<td> 00:00:00.014198</td>
<td>8/12/2020 5:23:22.058446 PM</td>
</tr>
</table>
</div>
<html> <head> <title>FTS Generated HTML</title>
<style type="text/css">@import "style.css";</style>
<style type="text/css" media="print">@import "print.css";</style>
</head>
<body><div id="ftsdiv" align=center> <p class="title">ATT Summary Pane</p>
<table><thead><tr><td>Bookmark</td>
<td>Frame#</td>
<td>Role</td>
<td>Opcode</td>
<td>Handle</td>
<td>UUID</td>
<td>Database</td>
<td>Direction</td>
<td>Error code</td>
<td>Frame Size</td>
<td>Delta</td>
<td>Timestamp</td>
</tr>
</thead>
<tfoot><tr><td colspan="12">ATT Summary Pane</td>
</tr>
</tfoot>
<ul class="ftstree" id="frame9,489">Frame 9,489:  Len=25<li class="liOpen" style="color:#7d005f">LE BB<ul><li class="liBullet">Header Length: 13</li>
<li class="liBullet">Header Version: 3</li>
<li class="liBullet">CP #: 1</li>
<li class="liBullet">RF Channel:  9 - 2420 MHz</li>
<li class="liBullet">Channel Index:  8</li>
<li class="liBullet">Meets Predefined Filter Criteria for BT low energy devices: No</li>
<li class="liBullet">Receive Status: Received without errors</li>
<li class="liBullet">Decryption Initiated: No</li>
<li class="liBullet">Signal Strength: 12 (strong)</li>
<li class="liBullet">Access Address: 0x506563a9</li>
<li class="liOpen">Packet Length: 17  bytes<ul><li class="liBullet">Preamble Length: 1 byte</li>
<li class="liBullet">Access Address Length: 4 bytes</li>
<li class="liBullet">PDU Length: 9 bytes</li>
<li class="liBullet">CRC Length: 3 bytes</li>
</ul>
</li>
</ul>
</li>
<li class="liOpen" style="color:#357d00">LE PKT<ul><li class="liBullet">Preamble: 0x55</li>
<li class="liBullet">Access Address: 0x506563a9</li>
<li class="liBullet">CRC: 0x38263d</li>
</ul>
</li>
<li class="liOpen" style="color:#aa5e5e">LE DATA<ul><li class="liBullet">LLID: Start</li>
<li class="liBullet">NESN: 1</li>
<li class="liBullet">SN: 0</li>
<li class="liBullet">SN+NESN: 2</li>
<li class="liBullet">MD: 0</li>
<li class="liBullet">CP: No CTEInfo</li>
<li class="liBullet">Payload Length: 7</li>
</ul>
</li>
<li class="liOpen" style="color:#67aa5e">L2CAP<ul><li class="liBullet">PDU Length: 3</li>
<li class="liBullet">Channel ID: 0x0004  (Attribute Protocol)</li>
</ul>
</li>
<li class="liOpen" style="color:#aa8d5e">ATT<ul><li class="liBullet">Role: Slave</li>
<li class="liBullet">Signature Present: No</li>
<li class="liBullet">PDU Type is Command: No</li>
<li class="liBullet">Opcode: Exchange MTU Request</li>
<li class="liBullet">*Database: 506563a9(M)</li>
<li class="liBullet">Client Rx MTU: 247</li>
</ul>
</li>
</ul>
<ul class="ftstree" id="frame9,501">Frame 9,501:  Len=25<li class="liOpen" style="color:#7d005f">LE BB<ul><li class="liBullet">Header Length: 13</li>
<li class="liBullet">Header Version: 3</li>
<li class="liBullet">CP #: 1</li>
<li class="liBullet">RF Channel: 18 - 2438 MHz</li>
<li class="liBullet">Channel Index: 16</li>
<li class="liBullet">Meets Predefined Filter Criteria for BT low energy devices: No</li>
<li class="liBullet">Receive Status: Received without errors</li>
<li class="liBullet">Decryption Initiated: No</li>
<li class="liBullet">Signal Strength: 12 (strong)</li>
<li class="liBullet">Access Address: 0x506563a9</li>
<li class="liOpen">Packet Length: 17  bytes<ul><li class="liBullet">Preamble Length: 1 byte</li>
<li class="liBullet">Access Address Length: 4 bytes</li>
<li class="liBullet">PDU Length: 9 bytes</li>
<li class="liBullet">CRC Length: 3 bytes</li>
</ul>
</li>
</ul>
</li>
<li class="liOpen" style="color:#357d00">LE PKT<ul><li class="liBullet">Preamble: 0x55</li>
<li class="liBullet">Access Address: 0x506563a9</li>
<li class="liBullet">CRC: 0x3fd04f</li>
</ul>
</li>
<li class="liOpen" style="color:#aa5e5e">LE DATA<ul><li class="liBullet">LLID: Start</li>
<li class="liBullet">NESN: 0</li>
<li class="liBullet">SN: 0</li>
<li class="liBullet">SN+NESN: 0</li>
<li class="liBullet">MD: 0</li>
<li class="liBullet">CP: No CTEInfo</li>
<li class="liBullet">Payload Length: 7</li>
</ul>
</li>
<li class="liOpen" style="color:#67aa5e">L2CAP<ul><li class="liBullet">PDU Length: 3</li>
<li class="liBullet">Channel ID: 0x0004  (Attribute Protocol)</li>
</ul>
</li>
<li class="liOpen" style="color:#aa8d5e">ATT<ul><li class="liBullet">Role: Slave</li>
<li class="liBullet">Signature Present: No</li>
<li class="liBullet">PDU Type is Command: No</li>
<li class="liBullet">Opcode: Exchange MTU Request</li>
<li class="liBullet">*Database: 506563a9(M)</li>
<li class="liBullet">Client Rx MTU: 247</li>
</ul>
</li>
</ul>
<ul class="ftstree" id="frame9,525">Frame 9,525:  Len=25<li class="liOpen" style="color:#7d005f">LE BB<ul><li class="liBullet">Header Length: 13</li>
<li class="liBullet">Header Version: 3</li>
<li class="liBullet">CP #: 1</li>
<li class="liBullet">RF Channel: 34 - 2470 MHz</li>
<li class="liBullet">Channel Index: 32</li>
<li class="liBullet">Meets Predefined Filter Criteria for BT low energy devices: No</li>
<li class="liBullet">Receive Status: Received without errors</li>
<li class="liBullet">Decryption Initiated: No</li>
<li class="liBullet">Signal Strength: 9 (medium)</li>
<li class="liBullet">Access Address: 0x506563a9</li>
<li class="liOpen">Packet Length: 17  bytes<ul><li class="liBullet">Preamble Length: 1 byte</li>
<li class="liBullet">Access Address Length: 4 bytes</li>
<li class="liBullet">PDU Length: 9 bytes</li>
<li class="liBullet">CRC Length: 3 bytes</li>
</ul>
</li>
</ul>
</li>
<li class="liOpen" style="color:#357d00">LE PKT<ul><li class="liBullet">Preamble: 0x55</li>
<li class="liBullet">Access Address: 0x506563a9</li>
<li class="liBullet">CRC: 0x9cca71</li>
</ul>
</li>
<li class="liOpen" style="color:#aa5e5e">LE DATA<ul><li class="liBullet">LLID: Start</li>
<li class="liBullet">NESN: 0</li>
<li class="liBullet">SN: 1</li>
<li class="liBullet">SN+NESN: 1</li>
<li class="liBullet">MD: 1</li>
<li class="liBullet">CP: No CTEInfo</li>
<li class="liBullet">Payload Length: 7</li>
</ul>
</li>
<li class="liOpen" style="color:#67aa5e">L2CAP<ul><li class="liBullet">PDU Length: 3</li>
<li class="liBullet">Channel ID: 0x0004  (Attribute Protocol)</li>
</ul>
</li>
<li class="liOpen" style="color:#aa8d5e">ATT<ul><li class="liBullet">Role: Master</li>
<li class="liBullet">Signature Present: No</li>
<li class="liBullet">PDU Type is Command: No</li>
<li class="liBullet">Opcode: Exchange MTU Request</li>
<li class="liBullet">*Database: 506563a9(S)</li>
<li class="liBullet">Client Rx MTU: 104</li>
</ul>
</li>
</ul>
<ul class="ftstree" id="frame9,527">Frame 9,527:  Len=25<li class="liOpen" style="color:#7d005f">LE BB<ul><li class="liBullet">Header Length: 13</li>
<li class="liBullet">Header Version: 3</li>
<li class="liBullet">CP #: 1</li>
<li class="liBullet">RF Channel: 34 - 2470 MHz</li>
<li class="liBullet">Channel Index: 32</li>
<li class="liBullet">Meets Predefined Filter Criteria for BT low energy devices: No</li>
<li class="liBullet">Receive Status: Received without errors</li>
<li class="liBullet">Decryption Initiated: No</li>
<li class="liBullet">Signal Strength: 9 (medium)</li>
<li class="liBullet">Access Address: 0x506563a9</li>
<li class="liOpen">Packet Length: 17  bytes<ul><li class="liBullet">Preamble Length: 1 byte</li>
<li class="liBullet">Access Address Length: 4 bytes</li>
<li class="liBullet">PDU Length: 9 bytes</li>
<li class="liBullet">CRC Length: 3 bytes</li>
</ul>
</li>
</ul>
</li>
<li class="liOpen" style="color:#357d00">LE PKT<ul><li class="liBullet">Preamble: 0x55</li>
<li class="liBullet">Access Address: 0x506563a9</li>
<li class="liBullet">CRC: 0x933204</li>
</ul>
</li>
<li class="liOpen" style="color:#aa5e5e">LE DATA<ul><li class="liBullet">LLID: Start</li>
<li class="liBullet">NESN: 1</li>
<li class="liBullet">SN: 0</li>
<li class="liBullet">SN+NESN: 2</li>
<li class="liBullet">MD: 0</li>
<li class="liBullet">CP: No CTEInfo</li>
<li class="liBullet">Payload Length: 7</li>
</ul>
</li>
<li class="liOpen" style="color:#67aa5e">L2CAP<ul><li class="liBullet">PDU Length: 3</li>
<li class="liBullet">Channel ID: 0x0004  (Attribute Protocol)</li>
</ul>
</li>
<li class="liOpen" style="color:#aa8d5e">ATT<ul><li class="liBullet">Role: Master</li>
<li class="liBullet">Signature Present: No</li>
<li class="liBullet">PDU Type is Command: No</li>
<li class="liBullet">Opcode: Exchange MTU Response</li>
<li class="liBullet">*Database: 506563a9(M)</li>
<li class="liBullet">Server Rx MTU: 104</li>
</ul>
</li>
</ul>
<ul class="ftstree" id="frame9,528">Frame 9,528:  Len=25<li class="liOpen" style="color:#7d005f">LE BB<ul><li class="liBullet">Header Length: 13</li>
<li class="liBullet">Header Version: 3</li>
<li class="liBullet">CP #: 1</li>
<li class="liBullet">RF Channel: 34 - 2470 MHz</li>
<li class="liBullet">Channel Index: 32</li>
<li class="liBullet">Meets Predefined Filter Criteria for BT low energy devices: No</li>
<li class="liBullet">Receive Status: Received without errors</li>
<li class="liBullet">Decryption Initiated: No</li>
<li class="liBullet">Signal Strength: 12 (strong)</li>
<li class="liBullet">Access Address: 0x506563a9</li>
<li class="liOpen">Packet Length: 17  bytes<ul><li class="liBullet">Preamble Length: 1 byte</li>
<li class="liBullet">Access Address Length: 4 bytes</li>
<li class="liBullet">PDU Length: 9 bytes</li>
<li class="liBullet">CRC Length: 3 bytes</li>
</ul>
</li>
</ul>
</li>
<li class="liOpen" style="color:#357d00">LE PKT<ul><li class="liBullet">Preamble: 0x55</li>
<li class="liBullet">Access Address: 0x506563a9</li>
<li class="liBullet">CRC: 0xb1d68b</li>
</ul>
</li>
<li class="liOpen" style="color:#aa5e5e">LE DATA<ul><li class="liBullet">LLID: Start</li>
<li class="liBullet">NESN: 1</li>
<li class="liBullet">SN: 1</li>
<li class="liBullet">SN+NESN: 3</li>
<li class="liBullet">MD: 0</li>
<li class="liBullet">CP: No CTEInfo</li>
<li class="liBullet">Payload Length: 7</li>
</ul>
</li>
<li class="liOpen" style="color:#67aa5e">L2CAP<ul><li class="liBullet">PDU Length: 3</li>
<li class="liBullet">Channel ID: 0x0004  (Attribute Protocol)</li>
</ul>
</li>
<li class="liOpen" style="color:#aa8d5e">ATT<ul><li class="liBullet">Role: Slave</li>
<li class="liBullet">Signature Present: No</li>
<li class="liBullet">PDU Type is Command: No</li>
<li class="liBullet">Opcode: Exchange MTU Response</li>
<li class="liBullet">*Database: 506563a9(S)</li>
<li class="liBullet">Server Rx MTU: 247</li>
</ul>
</li>
</ul>
<ul class="ftstree" id="frame9,529">Frame 9,529:  Len=29<li class="liOpen" style="color:#7d005f">LE BB<ul><li class="liBullet">Header Length: 13</li>
<li class="liBullet">Header Version: 3</li>
<li class="liBullet">CP #: 1</li>
<li class="liBullet">RF Channel:  4 - 2410 MHz</li>
<li class="liBullet">Channel Index:  3</li>
<li class="liBullet">Meets Predefined Filter Criteria for BT low energy devices: No</li>
<li class="liBullet">Receive Status: Received without errors</li>
<li class="liBullet">Decryption Initiated: No</li>
<li class="liBullet">Signal Strength: 9 (medium)</li>
<li class="liBullet">Access Address: 0x506563a9</li>
<li class="liOpen">Packet Length: 21  bytes<ul><li class="liBullet">Preamble Length: 1 byte</li>
<li class="liBullet">Access Address Length: 4 bytes</li>
<li class="liBullet">PDU Length: 13 bytes</li>
<li class="liBullet">CRC Length: 3 bytes</li>
</ul>
</li>
</ul>
</li>
<li class="liOpen" style="color:#357d00">LE PKT<ul><li class="liBullet">Preamble: 0x55</li>
<li class="liBullet">Access Address: 0x506563a9</li>
<li class="liBullet">CRC: 0xb2007b</li>
</ul>
</li>
<li class="liOpen" style="color:#aa5e5e">LE DATA<ul><li class="liBullet">LLID: Start</li>
<li class="liBullet">NESN: 0</li>
<li class="liBullet">SN: 1</li>
<li class="liBullet">SN+NESN: 1</li>
<li class="liBullet">MD: 0</li>
<li class="liBullet">CP: No CTEInfo</li>
<li class="liBullet">Payload Length: 11</li>
</ul>
</li>
<li class="liOpen" style="color:#67aa5e">L2CAP<ul><li class="liBullet">PDU Length: 7</li>
<li class="liBullet">Channel ID: 0x0004  (Attribute Protocol)</li>
</ul>
</li>
<li class="liOpen" style="color:#aa8d5e">ATT<ul><li class="liBullet">Role: Master</li>
<li class="liBullet">Signature Present: No</li>
<li class="liBullet">PDU Type is Command: No</li>
<li class="liBullet">Opcode: Read by Group Type Request</li>
<li class="liBullet">*Database: 506563a9(S)</li>
<li class="liBullet">Starting Attribute Handle: 1</li>
<li class="liBullet">Ending Attribute Handle: 65535</li>
<li class="liBullet">Attribute Group Type: Primary Service</li>
</ul>
</li>
</ul>
</body>
</html>

Parents
  • Hi

    I know that iOS has an "issue" with achieving 247 MTU, and this seems very similar to that, so my guess is that the macOS doesn't accept 247 as the MTU size either. This issue (with iOS) is explained in length in this case, and a few workarounds are suggested. You can also check out this blog post by my colleague Jimmy where he explains how to maximize the BLE throughput in communication between nRF52 and iOS devices.

    One of the workarounds suggested is that you can delay the MTU request/negotiation to occur at a later point, as iOS devices do not seem to like MTU requests upon connection. The attached project is a modified version of the ble_app_uart example where the MTU requests are delayed and should allow iOS devices to achieve a 247 byte MTU. Please note that this example project has not been through thorough testing, so there might be some hitches to it.

    ble_app_uart.zip

    Best regards,

    Simon

Reply
  • Hi

    I know that iOS has an "issue" with achieving 247 MTU, and this seems very similar to that, so my guess is that the macOS doesn't accept 247 as the MTU size either. This issue (with iOS) is explained in length in this case, and a few workarounds are suggested. You can also check out this blog post by my colleague Jimmy where he explains how to maximize the BLE throughput in communication between nRF52 and iOS devices.

    One of the workarounds suggested is that you can delay the MTU request/negotiation to occur at a later point, as iOS devices do not seem to like MTU requests upon connection. The attached project is a modified version of the ble_app_uart example where the MTU requests are delayed and should allow iOS devices to achieve a 247 byte MTU. Please note that this example project has not been through thorough testing, so there might be some hitches to it.

    ble_app_uart.zip

    Best regards,

    Simon

Children
No Data
Related