Nano BLE 33 Sense: DLE not utilized in Coded PHY mode

Hello,

I am developing an application that sends data from an Arduino Nano 33 BLE Sense to a custom Android app (Motorola Edge running Android 10 with Bluetooth 5.1). The Arduino board is based on the nRF52840 SoC as I have understood it. I have noticed that the data length extension is enabled when using 1M PHY. However, when using Coded PHY the link layer PDU size is always selected as 27. I am using the new "Arduino Mbed OS Board" board firmware for the Nano board (Mbed OS 6.2 with Cordio LL).

Is this normal behavior? Would it be possible to enable DLE with a PDU size up to 251 bytes when using Coded PHY? Do I need to update the Bluetooth softdevice or something?

I have examined the on-air traffic using the Sniffle tool (https://github.com/nccgroup/Sniffle). The nRF Sniffer does currently not work in Coded PHY mode.

By first considering the 1M PHY case I get the following (I have stripped all messages not related to PDU data length negotiation):

Timestamp: 4.019493 Length: 11 RSSI: -40 Channel: 28 PHY: Coded
LLID: LL CONTROL
Dir: S->M NESN: 1 SN: 0 MD: 1 Data Length: 9
Opcode: LL_LENGTH_REQ
17 09 14 FB 00 50 08 FB 00 48 08

Timestamp: 4.023704 Length: 11 RSSI: -52 Channel: 28 PHY: Coded
LLID: LL CONTROL
Dir: M->S NESN: 0 SN: 0 MD: 0 Data Length: 9
Opcode: LL_LENGTH_RSP
03 09 15 FB 00 90 42 1B 00 90 0A

Timestamp: 4.580553 Length: 11 RSSI: -52 Channel: 24 PHY: Coded
LLID: LL CONTROL
Dir: M->S NESN: 0 SN: 0 MD: 1 Data Length: 9
Opcode: LL_LENGTH_REQ
13 09 14 FB 00 7A 37 1B 00 90 0A

Timestamp: 4.584315 Length: 11 RSSI: -40 Channel: 24 PHY: Coded
LLID: LL CONTROL
Dir: S->M NESN: 0 SN: 1 MD: 0 Data Length: 9
Opcode: LL_LENGTH_RSP
0B 09 15 FB 00 90 42 FB 00 90 0A

Timestamp: 4.888056 Length: 11 RSSI: -53 Channel: 3 PHY: 1M
LLID: LL CONTROL
Dir: M->S NESN: 0 SN: 0 MD: 0 Data Length: 9
Opcode: LL_LENGTH_REQ
03 09 14 FB 00 48 08 1B 00 48 01

Timestamp: 4.895850 Length: 11 RSSI: -41 Channel: 26 PHY: 1M
LLID: LL CONTROL
Dir: S->M NESN: 0 SN: 1 MD: 0 Data Length: 9
Opcode: LL_LENGTH_RSP
0B 09 15 FB 00 90 42 FB 00 48 08

Timestamp: 4.963287 Length: 214 RSSI: -42 Channel: 4 PHY: 1M
LLID: LL DATA
Dir: S->M NESN: 0 SN: 1 MD: 0 Data Length: 212
0A D4 D0 00 04 00 1B 03 00 CC 0A 31 08 BC C4 15 15 00 00 0A 3D 1D 00 00 42
BC 25 00 B8 7B 3F 2D 00 00 7A 3E 35 00 00 7A 3F 3D 00 40 1C BF 45 00 00 00
00 4D 00 00 00 00 55 00 00 00 00 0A 31 08 CD C4 15 15 00 00 0A 3D 1D 00 00
5A BC 25 00 60 7B 3F 2D 00 40 9C 3E 35 00 00 7A 3F 3D 00 40 1C BF 45 00 00
00 00 4D 00 00 00 00 55 00 00 00 00 0A 31 08 DE C4 15 15 00 80 0C 3D 1D 00
00 5A BC 25 00 30 7B 3F 2D 00 C0 DA 3E 35 00 D0 84 3F 3D 00 40 1C BF 45 00
00 00 00 4D 00 00 00 00 55 00 00 00 00 0A 31 08 EF C4 15 15 00 00 0C 3D 1D
00 00 50 BC 25 00 40 7B 3F 2D 00 80 BB 3E 35 00 00 7A 3F 3D 00 80 3B BF 45
00 00 00 00 4D 00 00 00 00 55 00 00 00 00

Here we see that the master (the Android phone) and the slave (the Arduino application) negotiates the PDU length using LL_LENGTH_REQ and LL_LENGTH_RSP, and agree on 0xFB = 251 bytes as max PDU size. The slave then sends data to the master in chunks of 212 bytes (see the last LL_DATA frame) which is normal for my application.

When using Coded PHY I instead get the following behavior:

Timestamp: 4.810122 Length: 11 RSSI: -44 Channel: 24 PHY: Coded
LLID: LL CONTROL
Dir: S->M NESN: 1 SN: 0 MD: 0 Data Length: 9
Opcode: LL_LENGTH_REQ
07 09 14 FB 00 50 08 FB 00 48 08

Timestamp: 4.853677 Length: 11 RSSI: -35 Channel: 20 PHY: Coded
LLID: LL CONTROL
Dir: M->S NESN: 1 SN: 1 MD: 0 Data Length: 9
Opcode: LL_LENGTH_RSP
0F 09 15 FB 00 90 42 1B 00 90 0A

Timestamp: 5.446184 Length: 11 RSSI: -35 Channel: 24 PHY: Coded
LLID: LL CONTROL
Dir: M->S NESN: 0 SN: 0 MD: 0 Data Length: 9
Opcode: LL_LENGTH_REQ
03 09 14 FB 00 6A 10 1B 00 90 0A

Timestamp: 5.454554 Length: 11 RSSI: -46 Channel: 2 PHY: Coded
LLID: LL CONTROL
Dir: S->M NESN: 0 SN: 1 MD: 0 Data Length: 9
Opcode: LL_LENGTH_RSP
0B 09 15 FB 00 90 42 FB 00 90 0A

Timestamp: 5.618686 Length: 11 RSSI: -36 Channel: 16 PHY: Coded
LLID: LL CONTROL
Dir: M->S NESN: 0 SN: 0 MD: 0 Data Length: 9
Opcode: LL_LENGTH_REQ
03 09 14 FB 00 90 42 FB 00 90 42

Timestamp: 5.664557 Length: 11 RSSI: -46 Channel: 4 PHY: Coded
LLID: LL CONTROL
Dir: S->M NESN: 0 SN: 1 MD: 0 Data Length: 9
Opcode: LL_LENGTH_RSP
0B 09 15 FB 00 90 42 FB 00 90 0A

Timestamp: 5.889559 Length: 29 RSSI: -44 Channel: 30 PHY: Coded
LLID: LL DATA
Dir: S->M NESN: 1 SN: 0 MD: 1 Data Length: 27
16 1B D4 00 04 00 1B 03 00 D0 0A 32 08 8D D7 F3 02 15 00 00 88 3C 1D 00 00
40 3B 25 00

Here the PDU size is always selected as 27 bytes as seen by the first LL_DATA frame in the end of the log. I would be very grateful for any help.