Commit 31fba83f authored by Mark Wang's avatar Mark Wang Committed by Alberto Escolar
Browse files

bluetooth: classic: add role changed callback



add `role_changed` to `struct bt_conn_cb` to notify the HCI_Role_Change
event to application.

Signed-off-by: default avatarMark Wang <yichang.wang@nxp.com>
parent 897590fd
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -1989,6 +1989,17 @@ struct bt_conn_cb {

#endif

#if defined(CONFIG_BT_CLASSIC)
	/** @brief The role of the connection has changed.
	 *
	 *  This callback notifies the application that the role switch procedure has completed.
	 *
	 *  @param conn Connection object.
	 *  @param status HCI status of role change event.
	 */
	void (*role_changed)(struct bt_conn *conn, uint8_t status);
#endif

	/** @internal Internally used field for list handling */
	sys_snode_t _node;
};
+8 −8
Original line number Diff line number Diff line
@@ -681,21 +681,21 @@ void bt_hci_role_change(struct net_buf *buf)

	LOG_DBG("status 0x%02x role %u addr %s", evt->status, evt->role, bt_addr_str(&evt->bdaddr));

	if (evt->status) {
		return;
	}

	conn = bt_conn_lookup_addr_br(&evt->bdaddr);
	if (!conn) {
		LOG_ERR("Can't find conn for %s", bt_addr_str(&evt->bdaddr));
		return;
	}

	if (evt->role) {
	if (evt->status == 0) {
		if (evt->role == BT_HCI_ROLE_PERIPHERAL) {
			conn->role = BT_CONN_ROLE_PERIPHERAL;
		} else {
			conn->role = BT_CONN_ROLE_CENTRAL;
		}
	}

	bt_conn_role_changed(conn, evt->status);

	bt_conn_unref(conn);
}
+19 −0
Original line number Diff line number Diff line
@@ -1811,6 +1811,25 @@ void bt_conn_connected(struct bt_conn *conn)
	notify_connected(conn);
}

#if defined(CONFIG_BT_CLASSIC)
void bt_conn_role_changed(struct bt_conn *conn, uint8_t status)
{
	struct bt_conn_cb *callback;

	SYS_SLIST_FOR_EACH_CONTAINER(&conn_cbs, callback, _node) {
		if (callback->role_changed) {
			callback->role_changed(conn, status);
		}
	}

	STRUCT_SECTION_FOREACH(bt_conn_cb, cb) {
		if (cb->role_changed) {
			cb->role_changed(conn, status);
		}
	}
}
#endif

static int conn_disconnect(struct bt_conn *conn, uint8_t reason)
{
	int err;
+2 −0
Original line number Diff line number Diff line
@@ -490,6 +490,8 @@ void bt_conn_set_state(struct bt_conn *conn, bt_conn_state_t state);

void bt_conn_connected(struct bt_conn *conn);

void bt_conn_role_changed(struct bt_conn *conn, uint8_t status);

int bt_conn_le_conn_update(struct bt_conn *conn,
			   const struct bt_le_conn_param *param);