From cf61573ce95a1e2d0962ac66ec3dc4ded38fb918 Mon Sep 17 00:00:00 2001 From: Cheng Kai Date: Thu, 3 Jul 2025 14:26:00 +0800 Subject: [PATCH] Bluetooth: L2CAP: add br l2cap unregister interface It needs to do l2cap unregister operation from app Signed-off-by: Cheng Kai --- include/zephyr/bluetooth/l2cap.h | 10 ++++++++++ subsys/bluetooth/host/classic/l2cap_br.c | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/include/zephyr/bluetooth/l2cap.h b/include/zephyr/bluetooth/l2cap.h index f8781d791f0..fc543a3464d 100644 --- a/include/zephyr/bluetooth/l2cap.h +++ b/include/zephyr/bluetooth/l2cap.h @@ -769,6 +769,16 @@ int bt_l2cap_server_register(struct bt_l2cap_server *server); */ int bt_l2cap_br_server_register(struct bt_l2cap_server *server); +/** @brief Unregister L2CAP server on BR/EDR oriented connection. + * + * Unregister L2CAP server for a PSM. + * + * @param server Server structure. + * + * @return 0 in case of success or negative value in case of error. + */ +int bt_l2cap_br_server_unregister(struct bt_l2cap_server *server); + /** @brief Connect Enhanced Credit Based L2CAP channels * * Connect up to 5 L2CAP channels by PSM, once the connection is completed diff --git a/subsys/bluetooth/host/classic/l2cap_br.c b/subsys/bluetooth/host/classic/l2cap_br.c index f7d3d1a0e43..9d208f47b8e 100644 --- a/subsys/bluetooth/host/classic/l2cap_br.c +++ b/subsys/bluetooth/host/classic/l2cap_br.c @@ -3711,6 +3711,14 @@ int bt_l2cap_br_server_register(struct bt_l2cap_server *server) { int err; + CHECKIF(server == NULL) { + return -EINVAL; + } + + if (sys_slist_find(&br_servers, &server->node, NULL)) { + return -EEXIST; + } + if (!server->accept) { return -EINVAL; } @@ -3747,6 +3755,21 @@ int bt_l2cap_br_server_register(struct bt_l2cap_server *server) return 0; } +int bt_l2cap_br_server_unregister(struct bt_l2cap_server *server) +{ + CHECKIF(server == NULL) { + return -EINVAL; + } + + if (!sys_slist_find_and_remove(&br_servers, &server->node)) { + return -ENOENT; + } + + LOG_DBG("PSM 0x%04x unregistered", server->psm); + + return 0; +} + static void l2cap_br_send_reject(struct bt_conn *conn, uint8_t ident, uint16_t reason, void *data, uint8_t data_len) {