<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>What controls packets per connection event?</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/117363/what-controls-packets-per-connection-event</link><description>I am working on a project where we are sending data to a remote device as fast as possible. The sender will call bt_gatt_write() until it blocks the thread. So it is just keeping the queues loaded up with packets. Generally, what I see is that the BLE</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 02 Feb 2026 22:06:54 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/117363/what-controls-packets-per-connection-event" /><item><title>RE: What controls packets per connection event?</title><link>https://devzone.nordicsemi.com/thread/560169?ContentTypeID=1</link><pubDate>Mon, 02 Feb 2026 22:06:54 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:3ca461ff-b8d2-4ebf-b807-9f2f885e9a1b</guid><dc:creator>umr_engnr</dc:creator><description>&lt;p&gt;We have learned a lot about scheduling optimizations since this question was first posted.&amp;nbsp; The largest takeaway, as it applies to this post, is that data length extension only helps on the last connection made because the scheduler will stack connections right on top of each other.&amp;nbsp; For example, if you have two connections both with 100ms connection intervals and both with data event lengths of 7.5ms, your first connection will start at time 0 and due to data length extension can keep sending data for most of the 100ms; however, once connection #2 is made it is placed at 7.5ms right after the first connection.&amp;nbsp; So now connection #1 is only allowed 7.5ms per connection event to send data, while connection #2 is allowed 92.5ms per connection event to send data.&amp;nbsp; If yet another connection is made, then it is placed directly after connection #2, and now connection #1 and #2 only get 7.5ms, whereas connection #3 gets 85ms to send data.&amp;nbsp; There is a lot of other scheduling nuance, but this was the largest reason the performance was seemingly random, and would vary widely depending on what connections were being made.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: What controls packets per connection event?</title><link>https://devzone.nordicsemi.com/thread/559603?ContentTypeID=1</link><pubDate>Mon, 26 Jan 2026 20:53:17 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:2993854d-e2c6-403a-b4c4-92f37cda2ab8</guid><dc:creator>variant</dc:creator><description>&lt;p&gt;As Amanda pointed, read the SDC/Scheduling. You will see then that if you are advertising and/or scanning while you are performing throughput measurements on a connection, you will get different throughput results.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: What controls packets per connection event?</title><link>https://devzone.nordicsemi.com/thread/515824?ContentTypeID=1</link><pubDate>Thu, 19 Dec 2024 20:12:23 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:584e99e2-7bed-4d2d-be67-fae41923a081</guid><dc:creator>Amanda Hsieh</dc:creator><description>&lt;p&gt;Maybe you can analyze their &lt;a href="https://www.nordicsemi.com/Products/Development-tools/nRF-Sniffer-for-Bluetooth-LE"&gt;sniffer logs&lt;/a&gt; to find out something different.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: What controls packets per connection event?</title><link>https://devzone.nordicsemi.com/thread/515634?ContentTypeID=1</link><pubDate>Thu, 19 Dec 2024 05:20:53 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ddb02dee-eae7-4858-9f6e-c985f82df4e7</guid><dc:creator>umr_engnr</dc:creator><description>&lt;p&gt;Hi Amanda,&lt;/p&gt;
&lt;p&gt;Do you have any thoughts on why with the same exact connections and parameters the scheduler can produce such drastically different results?&lt;/p&gt;
&lt;p&gt;Is there any debug data we could compare between these two scenarios to try and better understand what is going on?&lt;/p&gt;
&lt;p&gt;In the &amp;quot;fast&amp;quot; case the performance is acceptable, we just want that behavior to happen reliably.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: What controls packets per connection event?</title><link>https://devzone.nordicsemi.com/thread/515610?ContentTypeID=1</link><pubDate>Wed, 18 Dec 2024 23:29:58 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a0f35c3d-d113-4310-88e7-99de89051c0a</guid><dc:creator>Amanda Hsieh</dc:creator><description>&lt;p&gt;Hi,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You are correct. See the explanation in the &lt;a href="https://docs.nordicsemi.com/bundle/ncs-latest/page/nrfxlib/softdevice_controller/doc/scheduling.html"&gt;SDC/Scheduling&lt;/a&gt;, and&amp;nbsp;&lt;a href="https://docs.nordicsemi.com/bundle/ncs-2.8.0/page/nrf/samples/bluetooth/throughput/README.html"&gt;Bluetooth: Throughput&lt;/a&gt;&amp;nbsp;for how to increase the throughput.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-Amanda H.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: What controls packets per connection event?</title><link>https://devzone.nordicsemi.com/thread/515340?ContentTypeID=1</link><pubDate>Tue, 17 Dec 2024 19:58:45 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:dd7ae5be-8e7e-4bb7-8878-3dc9b1e69e78</guid><dc:creator>umr_engnr</dc:creator><description>&lt;p&gt;We noticed that CONFIG_BT_CTLR_SDC_CONN_EVENT_EXTEND_DEFAULT=y&lt;/p&gt;
&lt;p&gt;Which based on the KCONFIG data seems to imply that&amp;nbsp;&lt;span&gt;BT_CTLR_SDC_MAX_CONN_EVENT_LEN_DEFAULT is not used for the connection event length determination.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;However, it does appear to be used to set &lt;span&gt;BT_CTLR_SDC_CENTRAL_ACL_EVENT_SPACING_DEFAULT&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;From nrf/subsys/bluetooth/controller/KCONFIG:&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;config BT_CTLR_SDC_CONN_EVENT_EXTEND_DEFAULT&lt;br /&gt; bool &amp;quot;Enable connection event extension by default&amp;quot;&lt;br /&gt; default y if !NRF_802154_RADIO_DRIVER&lt;br /&gt; help&lt;br /&gt; When Extended Connection Events are disabled, the maximum connection event length is&lt;br /&gt; configured with BT_CTLR_SDC_MAX_CONN_EVENT_LEN_DEFAULT.&lt;br /&gt; When Extended Connection Events are enabled, the controller&lt;br /&gt; will extend the connection event as much as possible, if&lt;br /&gt; - Either of the peers has more data to send.&lt;br /&gt; See also: Core v5.6, Vol 6, Part B, Section 4.5.6.&lt;br /&gt; - There are no conflicts with other roles of equal or higher priority.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;config BT_CTLR_SDC_CENTRAL_ACL_EVENT_SPACING_DEFAULT&lt;br /&gt; int &amp;quot;Default central ACL event spacing [us]&amp;quot;&lt;br /&gt; default 30000 if BT_ISO&lt;br /&gt; default BT_CTLR_SDC_MAX_CONN_EVENT_LEN_DEFAULT&lt;br /&gt; help&lt;br /&gt; On the central, sets the time ACL connections are spaced apart assuming that&lt;br /&gt; they are using the same connection interval.&lt;br /&gt; This configuration allows the application to set a different value for event spacing&lt;br /&gt; than BT_CTLR_SDC_MAX_CONN_EVENT_LEN_DEFAULT. This will result in holes in the scheduling&lt;br /&gt; timeline if the connection interval is longer than the ACL event spacing.&lt;br /&gt; This gap can be used for other scheduling activites like isochronous streams.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: What controls packets per connection event?</title><link>https://devzone.nordicsemi.com/thread/515337?ContentTypeID=1</link><pubDate>Tue, 17 Dec 2024 19:41:34 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:88a15672-e3a6-43d0-a27c-9e670cffd8b2</guid><dc:creator>umr_engnr</dc:creator><description>&lt;p&gt;In case it is helpful I went ahead and captured the CONFIG_BT_CTLR* settings from the net core .config file:&lt;br /&gt;&lt;br /&gt;CONFIG_BT_CTLR=y&lt;br /&gt;CONFIG_BT_CTLR_DATA_LENGTH_MAX=81&lt;br /&gt;CONFIG_BT_CTLR_SDC_PERIPHERAL_COUNT=2&lt;br /&gt;# CONFIG_BT_CTLR_SDC_QOS_CHANNEL_SURVEY is not set&lt;br /&gt;# CONFIG_BT_CTLR_SDC_MAX_CONN_EVENT_LEN_DEFAULT_OVERRIDE is not set&lt;br /&gt;CONFIG_BT_CTLR_SDC_MAX_CONN_EVENT_LEN_DEFAULT=4000&lt;br /&gt;CONFIG_BT_CTLR_SDC_CONN_EVENT_EXTEND_DEFAULT=y&lt;br /&gt;CONFIG_BT_CTLR_SDC_CENTRAL_ACL_EVENT_SPACING_DEFAULT=4000&lt;br /&gt;# CONFIG_BT_CTLR_SDC_PERIODIC_ADV_EVENT_LEN_DEFAULT_OVERRIDE is not set&lt;br /&gt;CONFIG_BT_CTLR_SDC_PERIODIC_ADV_EVENT_LEN_DEFAULT=7500&lt;br /&gt;CONFIG_BT_CTLR_SDC_TX_PACKET_COUNT=3&lt;br /&gt;CONFIG_BT_CTLR_SDC_RX_PACKET_COUNT=2&lt;br /&gt;CONFIG_BT_CTLR_SDC_SCAN_BUFFER_COUNT=3&lt;br /&gt;CONFIG_BT_CTLR_SDC_PERIODIC_SYNC_BUFFER_COUNT=3&lt;br /&gt;CONFIG_BT_CTLR_SDC_RX_PRIO=6&lt;br /&gt;# CONFIG_BT_CTLR_DF is not set&lt;br /&gt;CONFIG_BT_CTLR_FAL_SIZE=8&lt;br /&gt;CONFIG_BT_CTLR_ECDH_LIB_OBERON=y&lt;br /&gt;# CONFIG_BT_CTLR_ECDH_LIB_TINYCRYPT is not set&lt;br /&gt;CONFIG_BT_CTLR_ECDH_STACK_SIZE=900&lt;br /&gt;# CONFIG_BT_CTLR_ECDH_IN_MPSL_WORK is not set&lt;br /&gt;# CONFIG_BT_CTLR_SDC_EVENT_TRIGGER is not set&lt;br /&gt;CONFIG_BT_CTLR_SDC_BIG_RESERVED_TIME_US=1600&lt;br /&gt;CONFIG_BT_CTLR_SDC_CIG_RESERVED_TIME_US=1300&lt;br /&gt;CONFIG_BT_CTLR_SDC_CIS_SUBEVENT_LENGTH_US=0&lt;br /&gt;CONFIG_BT_CTLR_LE_ENC_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_EXT_REJ_IND_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_DATA_LEN_UPDATE_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_PRIVACY_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_EXT_SCAN_FP_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_PHY_UPDATE_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_PHY_2M_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_PHY_CODED_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_ADV_EXT_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_ADV_PERIODIC_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_ADV_PERIODIC_RSP_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_SYNC_PERIODIC_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_SYNC_PERIODIC_RSP_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_SYNC_TRANSFER_SENDER_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_SYNC_TRANSFER_RECEIVER_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_ADV_ISO_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_SYNC_ISO_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_CENTRAL_ISO_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_PERIPHERAL_ISO_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_CHAN_SEL_2_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_SCA_UPDATE_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_CONN_RSSI_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_ECDH_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_LE_POWER_CONTROL_SUPPORT=y&lt;br /&gt;CONFIG_BT_CTLR_CRYPTO=y&lt;br /&gt;CONFIG_BT_CTLR_HCI_VS_BUILD_INFO=&amp;quot;&amp;quot;&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_PLUS_3 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_PLUS_2 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_PLUS_1 is not set&lt;br /&gt;CONFIG_BT_CTLR_TX_PWR_0=y&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_MINUS_1 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_MINUS_2 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_MINUS_3 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_MINUS_4 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_MINUS_5 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_MINUS_6 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_MINUS_7 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_MINUS_8 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_MINUS_12 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_MINUS_16 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_MINUS_20 is not set&lt;br /&gt;# CONFIG_BT_CTLR_TX_PWR_MINUS_40 is not set&lt;br /&gt;CONFIG_BT_CTLR_TX_PWR_DBM=0&lt;br /&gt;CONFIG_BT_CTLR_TX_PWR_ANTENNA=0&lt;br /&gt;CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y&lt;br /&gt;CONFIG_BT_CTLR_LE_ENC=y&lt;br /&gt;CONFIG_BT_CTLR_ECDH=y&lt;br /&gt;CONFIG_BT_CTLR_EXT_REJ_IND=y&lt;br /&gt;CONFIG_BT_CTLR_LE_PING=y&lt;br /&gt;CONFIG_BT_CTLR_DATA_LENGTH=y&lt;br /&gt;CONFIG_BT_CTLR_PHY=y&lt;br /&gt;CONFIG_BT_CTLR_CONN_RSSI=y&lt;br /&gt;# CONFIG_BT_CTLR_LE_POWER_CONTROL is not set&lt;br /&gt;CONFIG_BT_CTLR_FILTER_ACCEPT_LIST=y&lt;br /&gt;CONFIG_BT_CTLR_PRIVACY=y&lt;br /&gt;CONFIG_BT_CTLR_RL_SIZE=8&lt;br /&gt;CONFIG_BT_CTLR_EXT_SCAN_FP=y&lt;br /&gt;CONFIG_BT_CTLR_PHY_2M=y&lt;br /&gt;CONFIG_BT_CTLR_PHY_CODED=y&lt;br /&gt;CONFIG_BT_CTLR_CHAN_SEL_2=y&lt;br /&gt;# CONFIG_BT_CTLR_ADV_EXT is not set&lt;br /&gt;# CONFIG_BT_CTLR_SET_HOST_FEATURE is not set&lt;br /&gt;# CONFIG_BT_CTLR_CENTRAL_ISO is not set&lt;br /&gt;# CONFIG_BT_CTLR_PERIPHERAL_ISO is not set&lt;br /&gt;# CONFIG_BT_CTLR_HCI_CODEC_AND_DELAY_INFO is not set&lt;br /&gt;CONFIG_BT_CTLR_ASSERT_HANDLER=y&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>