Skip to content

BENCH TOOL

The "bench" tool implements a number of different ways of measuring the throughput and/or latency between two devices.

General Usage

Usage: bumble-bench [OPTIONS] COMMAND [ARGS]...

Options:
  --device-config FILENAME        Device configuration file
  --scenario [send|receive|ping|pong]
  --mode [gatt-client|gatt-server|l2cap-client|l2cap-server|rfcomm-client|rfcomm-server]
  --att-mtu MTU                   GATT MTU (gatt-client mode)  [23<=x<=517]
  --extended-data-length TEXT     Request a data length upon connection,
                                  specified as tx_octets/tx_time
  --role-switch [central|peripheral]
                                  Request role switch upon connection (central
                                  or peripheral)
  --rfcomm-channel INTEGER        RFComm channel to use (specify 0 for channel
                                  discovery via SDP)
  --rfcomm-uuid TEXT              RFComm service UUID to use (ignored if
                                  --rfcomm-channel is not 0)
  --rfcomm-l2cap-mtu INTEGER      RFComm L2CAP MTU
  --rfcomm-max-frame-size INTEGER
                                  RFComm maximum frame size
  --rfcomm-initial-credits INTEGER
                                  RFComm initial credits
  --rfcomm-max-credits INTEGER    RFComm max credits
  --rfcomm-credits-threshold INTEGER
                                  RFComm credits threshold
  --l2cap-psm INTEGER             L2CAP PSM to use
  --l2cap-mtu INTEGER             L2CAP MTU to use
  --l2cap-mps INTEGER             L2CAP MPS to use
  --l2cap-max-credits INTEGER     L2CAP maximum number of credits allowed for
                                  the peer
  -s, --packet-size SIZE          Packet size (send or ping scenario)
                                  [8<=x<=8192]
  -c, --packet-count COUNT        Packet count (send or ping scenario)
  -sd, --start-delay SECONDS      Start delay (send or ping scenario)
  --repeat N                      Repeat the run N times (send and ping
                                  scenario)(0, which is the fault, to run just
                                  once)
  --repeat-delay SECONDS          Delay, in seconds, between repeats
  --pace MILLISECONDS             Wait N milliseconds between packets (0,
                                  which is the fault, to send as fast as
                                  possible)
  --linger                        Don't exit at the end of a run (receive and
                                  pong scenarios)
  --help                          Show this message and exit.

Commands:
  central     Run as a central (initiates the connection)
  peripheral  Run as a peripheral (waits for a connection)

Options for the central Command

Usage: bumble-bench central [OPTIONS] TRANSPORT

  Run as a central (initiates the connection)

Options:
  --peripheral ADDRESS_OR_NAME    Address or name to connect to
  --connection-interval, --ci CONNECTION_INTERVAL
                                  Connection interval (in ms)
  --phy [1m|2m|coded]             PHY to use
  --authenticate                  Authenticate (RFComm only)
  --encrypt                       Encrypt the connection (RFComm only)
  --help                          Show this message and exit.

To test once device against another, one of the two devices must be running the peripheral command and the other the central command. The device running the peripheral command will accept connections from the device running the central command. When using Bluetooth LE (all modes except for rfcomm-server and rfcomm-clientutils), the default addresses configured in the tool should be sufficient. But when using Bluetooth Classic, the address of the Peripheral must be specified on the Central using the --peripheral option. The address will be printed by the Peripheral when it starts.

Independently of whether the device is the Central or Peripheral, each device selects a mode and and scenario to run as. The mode and scenario of the Central and Peripheral must be compatible.

Device 1 scenario Device 2 scenario
gatt-client gatt-server
l2cap-client l2cap-server
rfcomm-client rfcomm-server
Device 1 scenario Device 2 scenario
send receive
ping pong

Examples

In the following examples, we have two USB Bluetooth controllers, one on usb:0 and the other on usb:1, and two consoles/terminals. We will run a command in each.

GATT Throughput

Using the default mode and scenario for the Central and Peripheral.

In the first console/terminal:

$ bumble-bench peripheral usb:0

In the second console/terminal:

$ bumble-bench central usb:1

In this default configuration, the Central runs a Sender, as a GATT client, connecting to the Peripheral running a Receiver, as a GATT server.

L2CAP Throughput

In the first console/terminal:

$ bumble-bench --mode l2cap-server peripheral usb:0

In the second console/terminal:

$ bumble-bench --mode l2cap-client central usb:1

RFComm Throughput

In the first console/terminal:

$ bumble-bench --mode rfcomm-server peripheral usb:0

NOTE: the BT address of the Peripheral will be printed out, use it with the --peripheral option for the Central.

In this example, we use a larger packet size and packet count than the default.

In the second console/terminal:

$ bumble-bench --mode rfcomm-client --packet-size 2000 --packet-count 100 central --peripheral 00:16:A4:5A:40:F2 usb:1

Ping/Pong Latency

In the first console/terminal:

$ bumble-bench --scenario pong peripheral usb:0

In the second console/terminal:

$ bumble-bench --scenario ping central usb:1

Reversed modes with GATT and custom connection interval

In the first console/terminal:

$ bumble-bench --mode gatt-client peripheral usb:0

In the second console/terminal:

$ bumble-bench --mode gatt-server central --ci 10 usb:1

Reversed modes with L2CAP and custom PHY

In the first console/terminal:

$ bumble-bench --mode l2cap-client peripheral usb:0

In the second console/terminal:

$ bumble-bench --mode l2cap-server central --phy 2m usb:1

Reversed scenarios with L2CAP

In the first console/terminal:

$ bumble-bench --mode l2cap-client --scenario send peripheral usb:0

In the second console/terminal:

$ bumble-bench --mode l2cap-server --scenario receive central usb:1