| /** @file |
| * @brief Internal APIs for Bluetooth SCO handling. |
| */ |
| /* |
| * Copyright 2024 NXP |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /** @brief Life-span states of SCO channel. Used only by internal APIs |
| * dealing with setting channel to proper state depending on operational |
| * context. |
| */ |
| enum bt_sco_state { |
| /** Channel disconnected */ |
| BT_SCO_STATE_DISCONNECTED, |
| /** Channel is pending ACL encryption before connecting */ |
| BT_SCO_STATE_ENCRYPT_PENDING, |
| /** Channel in connecting state */ |
| BT_SCO_STATE_CONNECTING, |
| /** Channel ready for upper layer traffic on it */ |
| BT_SCO_STATE_CONNECTED, |
| /** Channel in disconnecting state */ |
| BT_SCO_STATE_DISCONNECTING, |
| }; |
| |
| struct bt_sco_chan; |
| struct bt_sco_chan_ops { |
| /** @brief Channel connected callback |
| * |
| * If this callback is provided it will be called whenever the |
| * connection completes. |
| * |
| * @param chan The channel that has been connected |
| */ |
| void (*connected)(struct bt_sco_chan *chan); |
| |
| /** @brief Channel disconnected callback |
| * |
| * If this callback is provided it will be called whenever the |
| * channel is disconnected, including when a connection gets |
| * rejected or when setting security fails. |
| * |
| * @param chan The channel that has been Disconnected |
| * @param reason BT_HCI_ERR_* reason for the disconnection. |
| */ |
| void (*disconnected)(struct bt_sco_chan *chan, uint8_t reason); |
| }; |
| |
| struct bt_sco_chan { |
| struct bt_conn *sco; |
| /** Channel operations reference */ |
| struct bt_sco_chan_ops *ops; |
| |
| enum bt_sco_state state; |
| }; |
| |
| /** @brief Initiate an SCO connection to a remote device. |
| * |
| * Allows initiate new SCO link to remote peer using its address. |
| * |
| * The caller gets a new reference to the connection object which must be |
| * released with bt_conn_unref() once done using the object. |
| * |
| * @param peer Remote address. |
| * @param chan sco chan object. |
| * |
| * @return Valid connection object on success or NULL otherwise. |
| */ |
| struct bt_conn *bt_conn_create_sco(const bt_addr_t *peer, struct bt_sco_chan *chan); |
| |
| /** @brief SCO Accept Info Structure */ |
| struct bt_sco_accept_info { |
| /** The ACL connection that is requesting authorization */ |
| struct bt_conn *acl; |
| |
| /** class code of peer device */ |
| uint8_t dev_class[3]; |
| |
| /** link type */ |
| uint8_t link_type; |
| }; |
| |
| /** @brief SCO Server structure. */ |
| struct bt_sco_server { |
| /** Required minimum security level. |
| * Only available when @kconfig{CONFIG_BT_SMP} is enabled. |
| */ |
| bt_security_t sec_level; |
| /** @brief Server accept callback |
| * |
| * This callback is called whenever a new incoming connection requires |
| * authorization. |
| * |
| * @param info The SCO accept information structure |
| * @param chan Pointer to receive the allocated channel |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int (*accept)(const struct bt_sco_accept_info *info, |
| struct bt_sco_chan **chan); |
| }; |
| |
| /** @brief Register SCO server. |
| * |
| * Register SCO server, each new connection is authorized using the accept() |
| * callback which in case of success shall allocate the channel structure |
| * to be used by the new connection. |
| * |
| * @param server Server structure. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_sco_server_register(struct bt_sco_server *server); |
| |
| /** @brief Unregister SCO server. |
| * |
| * Unregister previously registered SCO server. |
| * |
| * @param server Server structure. |
| * |
| * @return 0 in case of success or negative value in case of error. |
| */ |
| int bt_sco_server_unregister(struct bt_sco_server *server); |
| |
| /** @brief sco channel connected. |
| * |
| * sco channel connected |
| * |
| * @param sco SCO connection object. |
| */ |
| void bt_sco_connected(struct bt_conn *sco); |
| |
| /** @brief sco channel disconnected. |
| * |
| * sco channel disconnected |
| * |
| * @param sco SCO connection object. |
| */ |
| void bt_sco_disconnected(struct bt_conn *sco); |
| |
| uint8_t bt_esco_conn_req(struct bt_hci_evt_conn_request *evt); |
| |
| #if defined(CONFIG_BT_CONN_LOG_LEVEL_DBG) |
| void bt_sco_chan_set_state_debug(struct bt_sco_chan *chan, |
| enum bt_sco_state state, |
| const char *func, int line); |
| #define bt_sco_chan_set_state(_chan, _state) \ |
| bt_sco_chan_set_state_debug(_chan, _state, __func__, __LINE__) |
| #else |
| void bt_sco_chan_set_state(struct bt_sco_chan *chan, enum bt_sco_state state); |
| #endif /* CONFIG_BT_CONN_LOG_LEVEL_DBG */ |