Skip to content

Commit dd1de01

Browse files
lylezhu2012fabiobaltieri
authored andcommitted
tests: bluetooth: tester: add RFCOMM service support
Add RFCOMM service implementation to the Bluetooth tester framework, enabling testing of RFCOMM protocol functionality over Bluetooth Classic connections. The implementation includes: - RFCOMM DLC (Data Link Connection) management with support for up to 10 concurrent channels and 5 server instances - BTP (Bluetooth Test Protocol) command handlers for connect, disconnect, send data, listen, send RPN, and get DLC info operations - Event notifications for connection state changes and data transfer - Integration with the existing BTP service infrastructure Enable RFCOMM support in the Bluetooth Classic test configuration. Co-Author: Jiawei Yang <jiawei.yang_1@nxp.com> Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
1 parent 9cae0c4 commit dd1de01

7 files changed

Lines changed: 609 additions & 1 deletion

File tree

tests/bluetooth/tester/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ if(CONFIG_BT_OTS)
3333
target_sources(app PRIVATE src/btp_ots.c)
3434
endif()
3535

36+
if(CONFIG_BT_RFCOMM)
37+
target_sources(app PRIVATE src/btp_rfcomm.c)
38+
endif()
39+
3640
zephyr_library_include_directories(src src/btp src/audio/btp)
3741
add_subdirectory_ifdef(CONFIG_BT_AUDIO src/audio)
3842

tests/bluetooth/tester/prj_br.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@ CONFIG_BT_L2CAP_STREAM=y
1313
CONFIG_BT_L2CAP_FCS=y
1414
CONFIG_BT_L2CAP_EXT_WIN_SIZE=y
1515
CONFIG_BT_L2CAP_MAX_WINDOW_SIZE=5
16+
17+
CONFIG_BT_RFCOMM=y

tests/bluetooth/tester/src/btp/btp.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "btp_ots.h"
4343
#include "btp_pbp.h"
4444
#include "btp_sdp.h"
45+
#include "btp_rfcomm.h"
4546

4647
#define BTP_MTU 1024
4748
#define BTP_DATA_MAX_SIZE (BTP_MTU - sizeof(struct btp_hdr))
@@ -83,8 +84,9 @@
8384
#define BTP_SERVICE_ID_OTS 0x1d
8485
#define BTP_SERVICE_ID_PBP 0x1e
8586
#define BTP_SERVICE_ID_SDP 0x1f
87+
#define BTP_SERVICE_ID_RFCOMM 0x20
8688

87-
#define BTP_SERVICE_ID_MAX BTP_SERVICE_ID_SDP
89+
#define BTP_SERVICE_ID_MAX BTP_SERVICE_ID_RFCOMM
8890

8991
#define BTP_STATUS_SUCCESS 0x00
9092
#define BTP_STATUS_FAILED 0x01
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/* btp_rfcomm.h - Bluetooth RFCOMM tester headers */
2+
3+
/*
4+
* Copyright 2025 NXP
5+
*
6+
* SPDX-License-Identifier: Apache-2.0
7+
*/
8+
9+
#include <stdint.h>
10+
11+
#include <zephyr/bluetooth/addr.h>
12+
13+
/* RFCOMM Service */
14+
/* commands */
15+
#define BTP_RFCOMM_READ_SUPPORTED_COMMANDS 0x01
16+
struct btp_rfcomm_read_supported_commands_rp {
17+
uint8_t data[0];
18+
} __packed;
19+
20+
#define BTP_RFCOMM_CONNECT 0x02
21+
struct btp_rfcomm_connect_cmd {
22+
bt_addr_le_t address;
23+
uint8_t channel;
24+
} __packed;
25+
26+
#define BTP_RFCOMM_DISCONNECT 0x03
27+
struct btp_rfcomm_disconnect_cmd {
28+
bt_addr_le_t address;
29+
uint8_t channel;
30+
} __packed;
31+
32+
#define BTP_RFCOMM_SEND_DATA 0x04
33+
struct btp_rfcomm_send_data_cmd {
34+
bt_addr_le_t address;
35+
uint8_t channel;
36+
uint16_t data_len;
37+
uint8_t data[];
38+
} __packed;
39+
40+
#define BTP_RFCOMM_LISTEN 0x05
41+
struct btp_rfcomm_listen_cmd {
42+
uint8_t channel;
43+
} __packed;
44+
45+
#define BTP_RFCOMM_SEND_RPN 0x06
46+
struct btp_rfcomm_send_rpn_cmd {
47+
bt_addr_le_t address;
48+
uint8_t channel;
49+
uint8_t baud_rate;
50+
uint8_t line_settings;
51+
uint8_t flow_control;
52+
uint8_t xon_char;
53+
uint8_t xoff_char;
54+
uint16_t param_mask;
55+
} __packed;
56+
57+
#define BTP_RFCOMM_GET_DLC_INFO 0x07
58+
struct btp_rfcomm_get_dlc_info_cmd {
59+
bt_addr_le_t address;
60+
uint8_t channel;
61+
} __packed;
62+
struct btp_rfcomm_get_dlc_info_rp {
63+
uint16_t mtu;
64+
uint8_t state;
65+
} __packed;
66+
67+
/* events */
68+
#define BTP_RFCOMM_EV_CONNECTED 0x80
69+
struct btp_rfcomm_connected_ev {
70+
bt_addr_le_t address;
71+
uint8_t channel;
72+
uint16_t mtu;
73+
} __packed;
74+
75+
#define BTP_RFCOMM_EV_DISCONNECTED 0x81
76+
struct btp_rfcomm_disconnected_ev {
77+
bt_addr_le_t address;
78+
uint8_t channel;
79+
} __packed;
80+
81+
#define BTP_RFCOMM_EV_DATA_RECEIVED 0x82
82+
struct btp_rfcomm_data_received_ev {
83+
bt_addr_le_t address;
84+
uint8_t channel;
85+
uint16_t data_length;
86+
uint8_t data[];
87+
} __packed;
88+
89+
#define BTP_RFCOMM_EV_DATA_SENT 0x83
90+
struct btp_rfcomm_data_sent_ev {
91+
bt_addr_le_t address;
92+
uint8_t channel;
93+
int8_t err;
94+
} __packed;

tests/bluetooth/tester/src/btp/bttester.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,6 @@ uint8_t tester_unregister_pbp(void);
148148

149149
uint8_t tester_init_sdp(void);
150150
uint8_t tester_unregister_sdp(void);
151+
152+
uint8_t tester_init_rfcomm(void);
153+
uint8_t tester_unregister_rfcomm(void);

tests/bluetooth/tester/src/btp_core.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,11 @@ static uint8_t register_service(const void *cmd, uint16_t cmd_len,
300300
status = tester_init_sdp();
301301
break;
302302
#endif /* CONFIG_BT_CLASSIC */
303+
#if defined(CONFIG_BT_RFCOMM)
304+
case BTP_SERVICE_ID_RFCOMM:
305+
status = tester_init_rfcomm();
306+
break;
307+
#endif /* CONFIG_BT_RFCOMM */
303308
default:
304309
LOG_WRN("unknown id: 0x%02x", cp->id);
305310
status = BTP_STATUS_FAILED;
@@ -460,6 +465,11 @@ static uint8_t unregister_service(const void *cmd, uint16_t cmd_len,
460465
status = tester_unregister_sdp();
461466
break;
462467
#endif /* CONFIG_BT_CLASSIC */
468+
#if defined(CONFIG_BT_RFCOMM)
469+
case BTP_SERVICE_ID_RFCOMM:
470+
status = tester_unregister_rfcomm();
471+
break;
472+
#endif /* CONFIG_BT_RFCOMM */
463473
default:
464474
LOG_WRN("unknown id: 0x%x", cp->id);
465475
status = BTP_STATUS_FAILED;

0 commit comments

Comments
 (0)