Lines Matching refs:conn

75 static void conn_tx_destroy(struct bt_conn *conn, struct bt_conn_tx *tx)  in conn_tx_destroy()  argument
82 LOG_DBG("conn %p tx %p cb %p ud %p", conn, tx, cb, user_data); in conn_tx_destroy()
90 cb(conn, user_data, -ESHUTDOWN); in conn_tx_destroy()
108 static void notify_connected(struct bt_conn *conn);
217 struct k_sem *bt_conn_get_pkts(struct bt_conn *conn) in bt_conn_get_pkts() argument
220 if (conn->type == BT_CONN_TYPE_BR || !bt_dev.le.acl_mtu) { in bt_conn_get_pkts()
229 if (conn->type == BT_CONN_TYPE_ISO) { in bt_conn_get_pkts()
291 static void tx_notify_process(struct bt_conn *conn) in tx_notify_process() argument
296 LOG_DBG("conn %p", (void *)conn); in tx_notify_process()
305 if (!sys_slist_is_empty(&conn->tx_complete)) { in tx_notify_process()
306 const sys_snode_t *node = sys_slist_get_not_empty(&conn->tx_complete); in tx_notify_process()
330 cb(conn, user_data, 0); in tx_notify_process()
339 void bt_conn_tx_notify(struct bt_conn *conn, bool wait_for_completion) in bt_conn_tx_notify() argument
344 tx_notify_process(conn); in bt_conn_tx_notify()
349 err = k_work_submit_to_queue(tx_notify_workqueue_get(), &conn->tx_complete_work); in bt_conn_tx_notify()
353 (void)k_work_flush(&conn->tx_complete_work, &sync); in bt_conn_tx_notify()
357 ARG_UNUSED(conn); in bt_conn_tx_notify()
364 struct bt_conn *conn = NULL; in bt_conn_new() local
369 conn = &conns[i]; in bt_conn_new()
374 if (!conn) { in bt_conn_new()
378 (void)memset(conn, 0, offsetof(struct bt_conn, ref)); in bt_conn_new()
381 k_work_init_delayable(&conn->deferred_work, deferred_work); in bt_conn_new()
384 k_work_init(&conn->tx_complete_work, tx_complete_work); in bt_conn_new()
387 return conn; in bt_conn_new()
390 void bt_conn_reset_rx_state(struct bt_conn *conn) in bt_conn_reset_rx_state() argument
392 if (!conn->rx) { in bt_conn_reset_rx_state()
396 net_buf_unref(conn->rx); in bt_conn_reset_rx_state()
397 conn->rx = NULL; in bt_conn_reset_rx_state()
400 static void bt_acl_recv(struct bt_conn *conn, struct net_buf *buf, in bt_acl_recv() argument
408 if (conn->rx) { in bt_acl_recv()
410 bt_conn_reset_rx_state(conn); in bt_acl_recv()
416 conn->rx = buf; in bt_acl_recv()
419 if (!conn->rx) { in bt_acl_recv()
421 bt_conn_reset_rx_state(conn); in bt_acl_recv()
432 if (buf->len > net_buf_tailroom(conn->rx)) { in bt_acl_recv()
439 bt_l2cap_recv(conn, conn->rx, false); in bt_acl_recv()
440 conn->rx = NULL; in bt_acl_recv()
445 net_buf_add_mem(conn->rx, buf->data, buf->len); in bt_acl_recv()
454 bt_conn_reset_rx_state(conn); in bt_acl_recv()
459 if (conn->rx->len < sizeof(uint16_t)) { in bt_acl_recv()
466 acl_total_len = sys_get_le16(conn->rx->data) + sizeof(struct bt_l2cap_hdr); in bt_acl_recv()
468 if (conn->rx->len < acl_total_len) { in bt_acl_recv()
473 if ((conn->type != BT_CONN_TYPE_BR) && (conn->rx->len > acl_total_len)) { in bt_acl_recv()
474 LOG_ERR("ACL len mismatch (%u > %u)", conn->rx->len, acl_total_len); in bt_acl_recv()
475 bt_conn_reset_rx_state(conn); in bt_acl_recv()
480 buf = conn->rx; in bt_acl_recv()
481 conn->rx = NULL; in bt_acl_recv()
484 if (IS_ENABLED(CONFIG_BT_CLASSIC) && (conn->type == BT_CONN_TYPE_BR)) { in bt_acl_recv()
485 bt_br_acl_recv(conn, buf, true); in bt_acl_recv()
487 bt_l2cap_recv(conn, buf, true); in bt_acl_recv()
491 void bt_conn_recv(struct bt_conn *conn, struct net_buf *buf, uint8_t flags) in bt_conn_recv() argument
499 bt_conn_tx_notify(conn, true); in bt_conn_recv()
501 LOG_DBG("handle %u len %u flags %02x", conn->handle, buf->len, flags); in bt_conn_recv()
503 if (IS_ENABLED(CONFIG_BT_ISO_RX) && conn->type == BT_CONN_TYPE_ISO) { in bt_conn_recv()
504 bt_iso_recv(conn, buf, flags); in bt_conn_recv()
507 bt_acl_recv(conn, buf, flags); in bt_conn_recv()
509 __ASSERT(false, "Invalid connection type %u", conn->type); in bt_conn_recv()
513 static bool dont_have_tx_context(struct bt_conn *conn) in dont_have_tx_context() argument
534 static int send_acl(struct bt_conn *conn, struct net_buf *buf, uint8_t flags) in send_acl() argument
552 hdr->handle = sys_cpu_to_le16(bt_acl_handle_pack(conn->handle, flags)); in send_acl()
574 static int send_iso(struct bt_conn *conn, struct net_buf *buf, uint8_t flags) in send_iso() argument
610 hdr->handle = sys_cpu_to_le16(bt_iso_handle_pack(conn->handle, flags, ts)); in send_iso()
618 static inline uint16_t conn_mtu(struct bt_conn *conn) in conn_mtu() argument
621 if (conn->type == BT_CONN_TYPE_BR || in conn_mtu()
622 (conn->type != BT_CONN_TYPE_ISO && !bt_dev.le.acl_mtu)) { in conn_mtu()
627 if (conn->type == BT_CONN_TYPE_ISO) { in conn_mtu()
638 static bool is_classic_conn(struct bt_conn *conn) in is_classic_conn() argument
641 conn->type == BT_CONN_TYPE_BR); in is_classic_conn()
644 static bool is_iso_tx_conn(struct bt_conn *conn) in is_iso_tx_conn() argument
647 conn->type == BT_CONN_TYPE_ISO; in is_iso_tx_conn()
650 static bool is_le_conn(struct bt_conn *conn) in is_le_conn() argument
652 return IS_ENABLED(CONFIG_BT_CONN) && conn->type == BT_CONN_TYPE_LE; in is_le_conn()
655 static bool is_acl_conn(struct bt_conn *conn) in is_acl_conn() argument
657 return is_le_conn(conn) || is_classic_conn(conn); in is_acl_conn()
660 static int send_buf(struct bt_conn *conn, struct net_buf *buf, in send_buf() argument
683 conn, buf, len, buf->len, cb, ud); in send_buf()
686 if (k_sem_take(bt_conn_get_pkts(conn), K_NO_WAIT)) { in send_buf()
704 k_sem_give(bt_conn_get_pkts(conn)); in send_buf()
712 uint16_t frag_len = MIN(conn_mtu(conn), len); in send_buf()
730 if (len > conn_mtu(conn)) { in send_buf()
731 flags = conn->next_is_frag ? FRAG_CONT : FRAG_START; in send_buf()
732 conn->next_is_frag = true; in send_buf()
734 flags = conn->next_is_frag ? FRAG_END : FRAG_SINGLE; in send_buf()
735 conn->next_is_frag = false; in send_buf()
744 conn, frag, frag->len, flags); in send_buf()
754 atomic_inc(&conn->in_ll); in send_buf()
755 sys_slist_append(&conn->tx_pending, &tx->node); in send_buf()
757 if (is_iso_tx_conn(conn)) { in send_buf()
758 err = send_iso(conn, frag, flags); in send_buf()
759 } else if (is_acl_conn(conn)) { in send_buf()
760 err = send_acl(conn, frag, flags); in send_buf()
763 __ASSERT(false, "Invalid connection type %u", conn->type); in send_buf()
771 atomic_dec(&conn->in_ll); in send_buf()
772 (void)sys_slist_find_and_remove(&conn->tx_pending, &tx->node); in send_buf()
786 conn_tx_destroy(conn, tx); in send_buf()
787 k_sem_give(bt_conn_get_pkts(conn)); in send_buf()
798 cb(conn, ud, err); in send_buf()
806 static void conn_destroy(struct bt_conn *conn, void *data) in conn_destroy() argument
808 if (conn->state == BT_CONN_CONNECTED || in conn_destroy()
809 conn->state == BT_CONN_DISCONNECTING) { in conn_destroy()
810 bt_conn_set_state(conn, BT_CONN_DISCONNECT_COMPLETE); in conn_destroy()
813 if (conn->state != BT_CONN_DISCONNECTED) { in conn_destroy()
814 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in conn_destroy()
825 static bool acl_has_data(struct bt_conn *conn) in acl_has_data() argument
827 return sys_slist_peek_head(&conn->l2cap_data_ready) != NULL; in acl_has_data()
840 static bool should_stop_tx(struct bt_conn *conn) in should_stop_tx() argument
842 LOG_DBG("%p", conn); in should_stop_tx()
844 if (conn->state != BT_CONN_CONNECTED) { in should_stop_tx()
851 if (!conn->has_data(conn)) { in should_stop_tx()
852 LOG_DBG("No more data for %p", conn); in should_stop_tx()
857 if (atomic_get(&conn->in_ll) < 3) { in should_stop_tx()
873 void bt_conn_data_ready(struct bt_conn *conn) in bt_conn_data_ready() argument
879 bt_conn_ref(conn); in bt_conn_data_ready()
887 if (!sys_slist_find(&bt_dev.le.conn_ready, &conn->_conn_ready, NULL)) { in bt_conn_data_ready()
888 sys_slist_append(&bt_dev.le.conn_ready, &conn->_conn_ready); in bt_conn_data_ready()
898 bt_conn_unref(conn); in bt_conn_data_ready()
901 LOG_DBG("Connection %p %s conn_ready list", conn, added ? "added to" : "already in"); in bt_conn_data_ready()
907 static bool cannot_send_to_controller(struct bt_conn *conn) in cannot_send_to_controller() argument
909 return k_sem_count_get(bt_conn_get_pkts(conn)) == 0; in cannot_send_to_controller()
931 __maybe_unused static bool dont_have_methods(struct bt_conn *conn) in dont_have_methods() argument
933 return (conn->tx_data_pull == NULL) || in dont_have_methods()
934 (conn->get_and_clear_cb == NULL) || in dont_have_methods()
935 (conn->has_data == NULL); in dont_have_methods()
940 struct bt_conn *conn, *tmp; in get_conn_ready() local
951 SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&bt_dev.le.conn_ready, conn, tmp, _conn_ready) { in get_conn_ready()
952 __ASSERT_NO_MSG(tmp != conn); in get_conn_ready()
958 if (cannot_send_to_controller(conn)) { in get_conn_ready()
960 LOG_DBG("no LL bufs for %p", conn); in get_conn_ready()
961 prev = &conn->_conn_ready; in get_conn_ready()
965 if (dont_have_tx_context(conn)) { in get_conn_ready()
967 LOG_DBG("no TX contexts for %p", conn); in get_conn_ready()
968 prev = &conn->_conn_ready; in get_conn_ready()
972 CHECKIF(dont_have_methods(conn)) { in get_conn_ready()
974 LOG_DBG("conn %p (type %d) is missing mandatory methods", conn, conn->type); in get_conn_ready()
975 prev = &conn->_conn_ready; in get_conn_ready()
979 if (should_stop_tx(conn)) { in get_conn_ready()
981 __ASSERT_NO_MSG(prev != &conn->_conn_ready); in get_conn_ready()
982 sys_slist_remove(&bt_dev.le.conn_ready, prev, &conn->_conn_ready); in get_conn_ready()
985 if (conn->has_data(conn) && (conn->state == BT_CONN_CONNECTED)) { in get_conn_ready()
986 LOG_DBG("appending %p to back of TX queue", conn); in get_conn_ready()
987 bt_conn_data_ready(conn); in get_conn_ready()
990 return conn; in get_conn_ready()
993 return bt_conn_ref(conn); in get_conn_ready()
1002 static void acl_get_and_clear_cb(struct bt_conn *conn, struct net_buf *buf, in acl_get_and_clear_cb() argument
1005 __ASSERT_NO_MSG(is_acl_conn(conn)); in acl_get_and_clear_cb()
1029 struct bt_conn *conn; in bt_conn_tx_processor() local
1044 conn = get_conn_ready(); in bt_conn_tx_processor()
1046 if (!conn) { in bt_conn_tx_processor()
1051 LOG_DBG("processing conn %p", conn); in bt_conn_tx_processor()
1053 if (conn->state != BT_CONN_CONNECTED) { in bt_conn_tx_processor()
1054 LOG_WRN("conn %p: not connected", conn); in bt_conn_tx_processor()
1061 buf = conn->tx_data_pull(conn, conn_mtu(conn), &buf_len); in bt_conn_tx_processor()
1073 bool last_buf = conn_mtu(conn) >= buf_len; in bt_conn_tx_processor()
1079 conn->get_and_clear_cb(conn, buf, &cb, &ud); in bt_conn_tx_processor()
1084 conn, buf, last_buf ? "last" : "frag"); in bt_conn_tx_processor()
1086 int err = send_buf(conn, buf, buf_len, cb, ud); in bt_conn_tx_processor()
1089 LOG_ERR("Fatal error (%d). Disconnecting %p", err, conn); in bt_conn_tx_processor()
1090 bt_conn_disconnect(conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN); in bt_conn_tx_processor()
1102 bt_conn_unref(conn); in bt_conn_tx_processor()
1105 static void process_unack_tx(struct bt_conn *conn) in process_unack_tx() argument
1107 LOG_DBG("%p", conn); in process_unack_tx()
1114 node = sys_slist_get(&conn->tx_pending); in process_unack_tx()
1123 conn_tx_destroy(conn, tx); in process_unack_tx()
1124 k_sem_give(bt_conn_get_pkts(conn)); in process_unack_tx()
1134 struct bt_conn *conn = bt_conn_ref(&conns[i]); in conn_lookup_handle() local
1136 if (!conn) { in conn_lookup_handle()
1141 if (!bt_conn_is_handle_valid(conn)) { in conn_lookup_handle()
1142 bt_conn_unref(conn); in conn_lookup_handle()
1146 if (conn->handle != handle) { in conn_lookup_handle()
1147 bt_conn_unref(conn); in conn_lookup_handle()
1151 return conn; in conn_lookup_handle()
1157 void bt_conn_set_state(struct bt_conn *conn, bt_conn_state_t state) in bt_conn_set_state() argument
1161 LOG_DBG("%s -> %s", state2str(conn->state), state2str(state)); in bt_conn_set_state()
1163 if (conn->state == state) { in bt_conn_set_state()
1168 old_state = conn->state; in bt_conn_set_state()
1169 conn->state = state; in bt_conn_set_state()
1178 if (conn->type != BT_CONN_TYPE_ISO) { in bt_conn_set_state()
1179 bt_conn_ref(conn); in bt_conn_set_state()
1184 conn->type == BT_CONN_TYPE_LE) { in bt_conn_set_state()
1185 k_work_cancel_delayable(&conn->deferred_work); in bt_conn_set_state()
1193 switch (conn->state) { in bt_conn_set_state()
1195 if (conn->type == BT_CONN_TYPE_SCO) { in bt_conn_set_state()
1197 bt_sco_connected(conn); in bt_conn_set_state()
1204 conn->type == BT_CONN_TYPE_ISO) { in bt_conn_set_state()
1205 bt_iso_connected(conn); in bt_conn_set_state()
1210 sys_slist_init(&conn->channels); in bt_conn_set_state()
1213 conn->role == BT_CONN_ROLE_PERIPHERAL) { in bt_conn_set_state()
1216 if (conn->type == BT_CONN_TYPE_LE) { in bt_conn_set_state()
1217 conn->le.conn_param_retry_countdown = in bt_conn_set_state()
1222 k_work_schedule(&conn->deferred_work, in bt_conn_set_state()
1230 if (conn->type == BT_CONN_TYPE_SCO) { in bt_conn_set_state()
1232 bt_sco_disconnected(conn); in bt_conn_set_state()
1234 bt_conn_unref(conn); in bt_conn_set_state()
1247 k_work_cancel_delayable(&conn->deferred_work); in bt_conn_set_state()
1249 bt_conn_tx_notify(conn, true); in bt_conn_set_state()
1251 bt_conn_reset_rx_state(conn); in bt_conn_set_state()
1254 k_work_reschedule(&conn->deferred_work, K_NO_WAIT); in bt_conn_set_state()
1263 if (conn->err) { in bt_conn_set_state()
1264 notify_connected(conn); in bt_conn_set_state()
1267 bt_conn_unref(conn); in bt_conn_set_state()
1283 if (conn->err) { in bt_conn_set_state()
1284 notify_connected(conn); in bt_conn_set_state()
1287 bt_conn_unref(conn); in bt_conn_set_state()
1291 if (conn->err) { in bt_conn_set_state()
1292 notify_connected(conn); in bt_conn_set_state()
1295 bt_conn_unref(conn); in bt_conn_set_state()
1302 bt_conn_unref(conn); in bt_conn_set_state()
1308 bt_conn_unref(conn); in bt_conn_set_state()
1327 if (conn->type == BT_CONN_TYPE_SCO) { in bt_conn_set_state()
1335 conn->type == BT_CONN_TYPE_LE && in bt_conn_set_state()
1337 k_work_schedule(&conn->deferred_work, in bt_conn_set_state()
1346 if (conn->err == BT_HCI_ERR_CONN_FAIL_TO_ESTAB) { in bt_conn_set_state()
1353 LOG_WRN("conn %p failed to establish. RF noise?", conn); in bt_conn_set_state()
1356 process_unack_tx(conn); in bt_conn_set_state()
1367 struct bt_conn *conn; in bt_conn_lookup_handle() local
1370 conn = conn_lookup_handle(acl_conns, ARRAY_SIZE(acl_conns), handle); in bt_conn_lookup_handle()
1371 if (conn) { in bt_conn_lookup_handle()
1377 conn = conn_lookup_handle(iso_conns, ARRAY_SIZE(iso_conns), handle); in bt_conn_lookup_handle()
1378 if (conn) { in bt_conn_lookup_handle()
1384 conn = conn_lookup_handle(sco_conns, ARRAY_SIZE(sco_conns), handle); in bt_conn_lookup_handle()
1385 if (conn) { in bt_conn_lookup_handle()
1391 if (conn) { in bt_conn_lookup_handle()
1392 if (type & conn->type) { in bt_conn_lookup_handle()
1393 return conn; in bt_conn_lookup_handle()
1396 bt_conn_unref(conn); in bt_conn_lookup_handle()
1407 void (*func)(struct bt_conn *conn, void *data), in bt_conn_foreach() argument
1414 struct bt_conn *conn = bt_conn_ref(&acl_conns[i]); in bt_conn_foreach() local
1416 if (!conn) { in bt_conn_foreach()
1420 if (!(conn->type & type)) { in bt_conn_foreach()
1421 bt_conn_unref(conn); in bt_conn_foreach()
1425 func(conn, data); in bt_conn_foreach()
1426 bt_conn_unref(conn); in bt_conn_foreach()
1431 struct bt_conn *conn = bt_conn_ref(&sco_conns[i]); in bt_conn_foreach() local
1433 if (!conn) { in bt_conn_foreach()
1437 func(conn, data); in bt_conn_foreach()
1438 bt_conn_unref(conn); in bt_conn_foreach()
1447 struct bt_conn *conn = bt_conn_ref(&iso_conns[i]); in bt_conn_foreach() local
1449 if (!conn) { in bt_conn_foreach()
1453 func(conn, data); in bt_conn_foreach()
1454 bt_conn_unref(conn); in bt_conn_foreach()
1460 struct bt_conn *bt_conn_ref(struct bt_conn *conn) in bt_conn_ref() argument
1464 __ASSERT_NO_MSG(conn); in bt_conn_ref()
1472 old = atomic_get(&conn->ref); in bt_conn_ref()
1477 } while (!atomic_cas(&conn->ref, old, old + 1)); in bt_conn_ref()
1479 LOG_DBG("handle %u ref %ld -> %ld", conn->handle, old, old + 1); in bt_conn_ref()
1481 return conn; in bt_conn_ref()
1496 void bt_conn_unref(struct bt_conn *conn) in bt_conn_unref() argument
1504 __ASSERT(conn, "Invalid connection reference"); in bt_conn_unref()
1509 conn_type = conn->type; in bt_conn_unref()
1510 conn_role = conn->role; in bt_conn_unref()
1511 conn_handle = conn->handle; in bt_conn_unref()
1513 old = atomic_dec(&conn->ref); in bt_conn_unref()
1517 (__ASSERT(!(deallocated && k_work_is_pending(&conn->tx_complete_work)), in bt_conn_unref()
1519 conn = NULL; in bt_conn_unref()
1539 uint8_t bt_conn_index(const struct bt_conn *conn) in bt_conn_index() argument
1543 switch (conn->type) { in bt_conn_index()
1546 index = conn - iso_conns; in bt_conn_index()
1553 index = conn - sco_conns; in bt_conn_index()
1560 index = conn - acl_conns; in bt_conn_index()
1564 __ASSERT(false, "Invalid connection type %u", conn->type); in bt_conn_index()
1643 struct bt_conn *conn = CONTAINER_OF(work, struct bt_conn, tx_complete_work); in tx_complete_work() local
1645 tx_notify_process(conn); in tx_complete_work()
1667 int bt_conn_disconnect(struct bt_conn *conn, uint8_t reason) in bt_conn_disconnect() argument
1669 ARG_UNUSED(conn); in bt_conn_disconnect()
1687 static bool uses_symmetric_2mbit_phy(struct bt_conn *conn) in uses_symmetric_2mbit_phy() argument
1691 if (conn->le.phy.tx_phy == BT_HCI_LE_PHY_2M && in uses_symmetric_2mbit_phy()
1692 conn->le.phy.rx_phy == BT_HCI_LE_PHY_2M) { in uses_symmetric_2mbit_phy()
1697 ARG_UNUSED(conn); in uses_symmetric_2mbit_phy()
1703 static bool can_initiate_feature_exchange(struct bt_conn *conn) in can_initiate_feature_exchange() argument
1713 if (IS_ENABLED(CONFIG_BT_CENTRAL) && (conn->role == BT_HCI_ROLE_CENTRAL)) { in can_initiate_feature_exchange()
1724 static void perform_auto_initiated_procedures(struct bt_conn *conn, void *unused) in perform_auto_initiated_procedures() argument
1730 LOG_DBG("[%p] Running auto-initiated procedures", conn); in perform_auto_initiated_procedures()
1732 if (conn->state != BT_CONN_CONNECTED) { in perform_auto_initiated_procedures()
1740 if (atomic_test_and_set_bit(conn->flags, BT_CONN_AUTO_INIT_PROCEDURES_DONE)) { in perform_auto_initiated_procedures()
1745 if (!atomic_test_bit(conn->flags, BT_CONN_LE_FEATURES_EXCHANGED) && in perform_auto_initiated_procedures()
1746 can_initiate_feature_exchange(conn)) { in perform_auto_initiated_procedures()
1747 err = bt_hci_le_read_remote_features(conn); in perform_auto_initiated_procedures()
1751 if (conn->state != BT_CONN_CONNECTED) { in perform_auto_initiated_procedures()
1757 !atomic_test_bit(conn->flags, BT_CONN_AUTO_VERSION_INFO)) { in perform_auto_initiated_procedures()
1758 err = bt_hci_read_remote_version(conn); in perform_auto_initiated_procedures()
1762 if (conn->state != BT_CONN_CONNECTED) { in perform_auto_initiated_procedures()
1768 !uses_symmetric_2mbit_phy(conn)) { in perform_auto_initiated_procedures()
1769 err = bt_le_set_phy(conn, 0U, BT_HCI_LE_PHY_PREFER_2M, BT_HCI_LE_PHY_PREFER_2M, in perform_auto_initiated_procedures()
1774 if (conn->state != BT_CONN_CONNECTED) { in perform_auto_initiated_procedures()
1788 err = bt_le_set_data_len(conn, tx_octets, tx_time); in perform_auto_initiated_procedures()
1795 LOG_DBG("[%p] Successfully ran auto-initiated procedures", conn); in perform_auto_initiated_procedures()
1813 static void schedule_auto_initiated_procedures(struct bt_conn *conn) in schedule_auto_initiated_procedures() argument
1815 LOG_DBG("[%p] Scheduling auto-init procedures", conn); in schedule_auto_initiated_procedures()
1819 void bt_conn_connected(struct bt_conn *conn) in bt_conn_connected() argument
1821 schedule_auto_initiated_procedures(conn); in bt_conn_connected()
1822 bt_l2cap_connected(conn); in bt_conn_connected()
1823 notify_connected(conn); in bt_conn_connected()
1827 void bt_conn_role_changed(struct bt_conn *conn, uint8_t status) in bt_conn_role_changed() argument
1831 callback->role_changed(conn, status); in bt_conn_role_changed()
1837 cb->role_changed(conn, status); in bt_conn_role_changed()
1843 static int conn_disconnect(struct bt_conn *conn, uint8_t reason) in conn_disconnect() argument
1847 err = bt_hci_disconnect(conn->handle, reason); in conn_disconnect()
1852 if (conn->state == BT_CONN_CONNECTED) { in conn_disconnect()
1853 bt_conn_set_state(conn, BT_CONN_DISCONNECTING); in conn_disconnect()
1859 int bt_conn_disconnect(struct bt_conn *conn, uint8_t reason) in bt_conn_disconnect() argument
1861 switch (conn->state) { in bt_conn_disconnect()
1863 conn->err = reason; in bt_conn_disconnect()
1864 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_conn_disconnect()
1870 if (conn->type == BT_CONN_TYPE_LE) { in bt_conn_disconnect()
1872 k_work_cancel_delayable(&conn->deferred_work); in bt_conn_disconnect()
1877 else if (conn->type == BT_CONN_TYPE_ISO) { in bt_conn_disconnect()
1878 return conn_disconnect(conn, reason); in bt_conn_disconnect()
1882 else if (conn->type == BT_CONN_TYPE_BR) { in bt_conn_disconnect()
1883 return bt_hci_connect_br_cancel(conn); in bt_conn_disconnect()
1884 } else if (conn->type == BT_CONN_TYPE_SCO) { in bt_conn_disconnect()
1890 __ASSERT(false, "Invalid conn type %u", conn->type); in bt_conn_disconnect()
1895 return conn_disconnect(conn, reason); in bt_conn_disconnect()
1904 static void notify_connected(struct bt_conn *conn) in notify_connected() argument
1908 callback->connected(conn, conn->err); in notify_connected()
1914 cb->connected(conn, conn->err); in notify_connected()
1919 static void notify_disconnected(struct bt_conn *conn) in notify_disconnected() argument
1923 callback->disconnected(conn, conn->err); in notify_disconnected()
1929 cb->disconnected(conn, conn->err); in notify_disconnected()
1935 void notify_remote_info(struct bt_conn *conn) in notify_remote_info() argument
1940 err = bt_conn_get_remote_info(conn, &remote_info); in notify_remote_info()
1948 callback->remote_info_available(conn, &remote_info); in notify_remote_info()
1954 cb->remote_info_available(conn, &remote_info); in notify_remote_info()
1960 void notify_le_param_updated(struct bt_conn *conn) in notify_le_param_updated() argument
1965 if (atomic_test_bit(conn->flags, BT_CONN_PERIPHERAL_PARAM_SET) && in notify_le_param_updated()
1966 conn->le.interval >= conn->le.interval_min && in notify_le_param_updated()
1967 conn->le.interval <= conn->le.interval_max && in notify_le_param_updated()
1968 conn->le.latency == conn->le.pending_latency && in notify_le_param_updated()
1969 conn->le.timeout == conn->le.pending_timeout) { in notify_le_param_updated()
1970 atomic_clear_bit(conn->flags, BT_CONN_PERIPHERAL_PARAM_SET); in notify_le_param_updated()
1976 callback->le_param_updated(conn, conn->le.interval, in notify_le_param_updated()
1977 conn->le.latency, conn->le.timeout); in notify_le_param_updated()
1983 cb->le_param_updated(conn, conn->le.interval, in notify_le_param_updated()
1984 conn->le.latency, in notify_le_param_updated()
1985 conn->le.timeout); in notify_le_param_updated()
1991 void notify_le_data_len_updated(struct bt_conn *conn) in notify_le_data_len_updated() argument
1995 callback->le_data_len_updated(conn, &conn->le.data_len); in notify_le_data_len_updated()
2001 cb->le_data_len_updated(conn, &conn->le.data_len); in notify_le_data_len_updated()
2008 void notify_le_phy_updated(struct bt_conn *conn) in notify_le_phy_updated() argument
2012 callback->le_phy_updated(conn, &conn->le.phy); in notify_le_phy_updated()
2018 cb->le_phy_updated(conn, &conn->le.phy); in notify_le_phy_updated()
2024 bool le_param_req(struct bt_conn *conn, struct bt_le_conn_param *param) in le_param_req() argument
2035 if (!callback->le_param_req(conn, param)) { in le_param_req()
2052 if (!cb->le_param_req(conn, param)) { in le_param_req()
2068 static int send_conn_le_param_update(struct bt_conn *conn, in send_conn_le_param_update() argument
2071 LOG_DBG("conn %p features 0x%02x params (%d-%d %d %d)", conn, conn->le.features[0], in send_conn_le_param_update()
2083 BT_FEAT_LE_CONN_PARAM_REQ_PROC(conn->le.features) && in send_conn_le_param_update()
2084 !atomic_test_bit(conn->flags, BT_CONN_PERIPHERAL_PARAM_L2CAP)) || in send_conn_le_param_update()
2085 (conn->role == BT_HCI_ROLE_CENTRAL)) { in send_conn_le_param_update()
2088 rc = bt_conn_le_conn_update(conn, param); in send_conn_le_param_update()
2092 conn->le.interval_min = param->interval_min; in send_conn_le_param_update()
2093 conn->le.interval_max = param->interval_max; in send_conn_le_param_update()
2094 conn->le.pending_latency = param->latency; in send_conn_le_param_update()
2095 conn->le.pending_timeout = param->timeout; in send_conn_le_param_update()
2104 return bt_l2cap_update_conn_param(conn, param); in send_conn_le_param_update()
2108 static struct bt_conn *conn_lookup_iso(struct bt_conn *conn) in conn_lookup_iso() argument
2119 if (iso->iso.acl == conn) { in conn_lookup_iso()
2131 static struct bt_conn *conn_lookup_sco(struct bt_conn *conn) in conn_lookup_sco() argument
2142 if (sco->sco.acl == conn) { in conn_lookup_sco()
2156 struct bt_conn *conn = CONTAINER_OF(dwork, struct bt_conn, deferred_work); in deferred_work() local
2159 LOG_DBG("conn %p", conn); in deferred_work()
2161 if (conn->state == BT_CONN_DISCONNECTED) { in deferred_work()
2165 if (conn->type == BT_CONN_TYPE_ISO) { in deferred_work()
2170 bt_iso_disconnected(conn); in deferred_work()
2178 iso = conn_lookup_iso(conn); in deferred_work()
2190 iso = conn_lookup_iso(conn); in deferred_work()
2200 sco = conn_lookup_sco(conn); in deferred_work()
2212 sco = conn_lookup_sco(conn); in deferred_work()
2215 bt_l2cap_disconnected(conn); in deferred_work()
2216 notify_disconnected(conn); in deferred_work()
2221 bt_conn_unref(conn); in deferred_work()
2225 if (conn->type != BT_CONN_TYPE_LE) { in deferred_work()
2230 conn->role == BT_CONN_ROLE_CENTRAL) { in deferred_work()
2240 if (atomic_test_and_clear_bit(conn->flags, in deferred_work()
2244 param = BT_LE_CONN_PARAM(conn->le.interval_min, in deferred_work()
2245 conn->le.interval_max, in deferred_work()
2246 conn->le.pending_latency, in deferred_work()
2247 conn->le.pending_timeout); in deferred_work()
2249 err = send_conn_le_param_update(conn, param); in deferred_work()
2251 atomic_clear_bit(conn->flags, in deferred_work()
2266 err = send_conn_le_param_update(conn, param); in deferred_work()
2268 atomic_set_bit(conn->flags, in deferred_work()
2277 atomic_set_bit(conn->flags, BT_CONN_PERIPHERAL_PARAM_UPDATE); in deferred_work()
2296 struct bt_conn *conn = bt_conn_ref(&sco_conns[i]); in bt_conn_lookup_addr_sco() local
2298 if (!conn) { in bt_conn_lookup_addr_sco()
2302 if (conn->type != BT_CONN_TYPE_SCO) { in bt_conn_lookup_addr_sco()
2303 bt_conn_unref(conn); in bt_conn_lookup_addr_sco()
2307 if (!bt_addr_eq(peer, &conn->sco.acl->br.dst)) { in bt_conn_lookup_addr_sco()
2308 bt_conn_unref(conn); in bt_conn_lookup_addr_sco()
2312 return conn; in bt_conn_lookup_addr_sco()
2328 struct bt_conn *conn = bt_conn_ref(&acl_conns[i]); in bt_conn_lookup_addr_br() local
2330 if (!conn) { in bt_conn_lookup_addr_br()
2334 if (conn->type != BT_CONN_TYPE_BR) { in bt_conn_lookup_addr_br()
2335 bt_conn_unref(conn); in bt_conn_lookup_addr_br()
2339 if (!bt_addr_eq(peer, &conn->br.dst)) { in bt_conn_lookup_addr_br()
2340 bt_conn_unref(conn); in bt_conn_lookup_addr_br()
2344 return conn; in bt_conn_lookup_addr_br()
2384 struct bt_conn *conn = acl_conn_new(); in bt_conn_add_br() local
2386 if (!conn) { in bt_conn_add_br()
2390 bt_addr_copy(&conn->br.dst, peer); in bt_conn_add_br()
2391 conn->type = BT_CONN_TYPE_BR; in bt_conn_add_br()
2392 conn->tx_data_pull = l2cap_br_data_pull; in bt_conn_add_br()
2393 conn->get_and_clear_cb = acl_get_and_clear_cb; in bt_conn_add_br()
2394 conn->has_data = acl_has_data; in bt_conn_add_br()
2396 return conn; in bt_conn_add_br()
2401 bool bt_conn_ltk_present(const struct bt_conn *conn) in bt_conn_ltk_present() argument
2403 const struct bt_keys *keys = conn->le.keys; in bt_conn_ltk_present()
2406 keys = bt_keys_find_addr(conn->id, &conn->le.dst); in bt_conn_ltk_present()
2410 if (conn->role == BT_HCI_ROLE_CENTRAL) { in bt_conn_ltk_present()
2420 void bt_conn_identity_resolved(struct bt_conn *conn) in bt_conn_identity_resolved() argument
2424 if (conn->role == BT_HCI_ROLE_CENTRAL) { in bt_conn_identity_resolved()
2425 rpa = &conn->le.resp_addr; in bt_conn_identity_resolved()
2427 rpa = &conn->le.init_addr; in bt_conn_identity_resolved()
2432 callback->identity_resolved(conn, rpa, &conn->le.dst); in bt_conn_identity_resolved()
2438 cb->identity_resolved(conn, rpa, &conn->le.dst); in bt_conn_identity_resolved()
2443 int bt_conn_le_start_encryption(struct bt_conn *conn, uint8_t rand[8], in bt_conn_le_start_encryption() argument
2459 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_le_start_encryption()
2473 uint8_t bt_conn_enc_key_size(const struct bt_conn *conn) in bt_conn_enc_key_size() argument
2475 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE | BT_CONN_TYPE_BR)) { in bt_conn_enc_key_size()
2476 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_enc_key_size()
2480 if (!conn->encrypt) { in bt_conn_enc_key_size()
2485 conn->type == BT_CONN_TYPE_BR) { in bt_conn_enc_key_size()
2498 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_enc_key_size()
2515 return conn->le.keys ? conn->le.keys->enc_size : 0; in bt_conn_enc_key_size()
2521 static void reset_pairing(struct bt_conn *conn) in reset_pairing() argument
2524 if (conn->type == BT_CONN_TYPE_BR) { in reset_pairing()
2525 atomic_clear_bit(conn->flags, BT_CONN_BR_PAIRING); in reset_pairing()
2526 atomic_clear_bit(conn->flags, BT_CONN_BR_PAIRED); in reset_pairing()
2527 atomic_clear_bit(conn->flags, BT_CONN_BR_PAIRING_INITIATOR); in reset_pairing()
2528 atomic_clear_bit(conn->flags, BT_CONN_BR_LEGACY_SECURE); in reset_pairing()
2529 atomic_clear_bit(conn->flags, BT_CONN_BR_GENERAL_BONDING); in reset_pairing()
2534 conn->required_sec_level = conn->sec_level; in reset_pairing()
2537 void bt_conn_security_changed(struct bt_conn *conn, uint8_t hci_err, in bt_conn_security_changed() argument
2540 reset_pairing(conn); in bt_conn_security_changed()
2541 bt_l2cap_security_changed(conn, hci_err); in bt_conn_security_changed()
2543 bt_iso_security_changed(conn, hci_err); in bt_conn_security_changed()
2548 callback->security_changed(conn, conn->sec_level, err); in bt_conn_security_changed()
2554 cb->security_changed(conn, conn->sec_level, err); in bt_conn_security_changed()
2559 if (!err && conn->sec_level >= BT_SECURITY_L2) { in bt_conn_security_changed()
2560 if (conn->type == BT_CONN_TYPE_LE) { in bt_conn_security_changed()
2561 bt_keys_update_usage(conn->id, bt_conn_get_dst(conn)); in bt_conn_security_changed()
2565 if (conn->type == BT_CONN_TYPE_BR) { in bt_conn_security_changed()
2566 bt_keys_link_key_update_usage(&conn->br.dst); in bt_conn_security_changed()
2574 static int start_security(struct bt_conn *conn) in start_security() argument
2576 if (IS_ENABLED(CONFIG_BT_CLASSIC) && conn->type == BT_CONN_TYPE_BR) { in start_security()
2577 return bt_ssp_start_security(conn); in start_security()
2581 return bt_smp_start_security(conn); in start_security()
2587 int bt_conn_set_security(struct bt_conn *conn, bt_security_t sec) in bt_conn_set_security() argument
2592 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE | BT_CONN_TYPE_BR)) { in bt_conn_set_security()
2593 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_set_security()
2597 if (conn->state != BT_CONN_CONNECTED) { in bt_conn_set_security()
2613 if (!force_pair && (conn->sec_level >= sec || conn->required_sec_level >= sec)) { in bt_conn_set_security()
2617 atomic_set_bit_to(conn->flags, BT_CONN_FORCE_PAIR, force_pair); in bt_conn_set_security()
2618 conn->required_sec_level = sec; in bt_conn_set_security()
2620 err = start_security(conn); in bt_conn_set_security()
2624 conn->required_sec_level = conn->sec_level; in bt_conn_set_security()
2630 bt_security_t bt_conn_get_security(const struct bt_conn *conn) in bt_conn_get_security() argument
2632 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE | BT_CONN_TYPE_BR)) { in bt_conn_get_security()
2633 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_get_security()
2637 return conn->sec_level; in bt_conn_get_security()
2640 bt_security_t bt_conn_get_security(const struct bt_conn *conn) in bt_conn_get_security() argument
2676 struct bt_conn *conn = bt_conn_lookup_addr_le(id, peer); in bt_conn_exists_le() local
2678 if (conn) { in bt_conn_exists_le()
2686 LOG_WRN("Found valid connection (%p) with address %s in %s state ", conn, in bt_conn_exists_le()
2687 bt_addr_le_str(peer), state2str(conn->state)); in bt_conn_exists_le()
2688 bt_conn_unref(conn); in bt_conn_exists_le()
2697 struct bt_conn *conn = acl_conn_new(); in bt_conn_add_le() local
2699 if (!conn) { in bt_conn_add_le()
2703 conn->id = id; in bt_conn_add_le()
2704 bt_addr_le_copy(&conn->le.dst, peer); in bt_conn_add_le()
2706 conn->sec_level = BT_SECURITY_L1; in bt_conn_add_le()
2707 conn->required_sec_level = BT_SECURITY_L1; in bt_conn_add_le()
2709 conn->type = BT_CONN_TYPE_LE; in bt_conn_add_le()
2710 conn->tx_data_pull = l2cap_data_pull; in bt_conn_add_le()
2711 conn->get_and_clear_cb = acl_get_and_clear_cb; in bt_conn_add_le()
2712 conn->has_data = acl_has_data; in bt_conn_add_le()
2713 conn->le.interval_min = BT_GAP_INIT_CONN_INT_MIN; in bt_conn_add_le()
2714 conn->le.interval_max = BT_GAP_INIT_CONN_INT_MAX; in bt_conn_add_le()
2716 return conn; in bt_conn_add_le()
2719 bool bt_conn_is_peer_addr_le(const struct bt_conn *conn, uint8_t id, in bt_conn_is_peer_addr_le() argument
2722 if (id != conn->id) { in bt_conn_is_peer_addr_le()
2727 if (bt_addr_le_eq(peer, &conn->le.dst)) { in bt_conn_is_peer_addr_le()
2732 if (conn->role == BT_HCI_ROLE_CENTRAL) { in bt_conn_is_peer_addr_le()
2733 return bt_addr_le_eq(peer, &conn->le.resp_addr); in bt_conn_is_peer_addr_le()
2736 return bt_addr_le_eq(peer, &conn->le.init_addr); in bt_conn_is_peer_addr_le()
2744 struct bt_conn *conn = bt_conn_ref(&acl_conns[i]); in bt_conn_lookup_addr_le() local
2746 if (!conn) { in bt_conn_lookup_addr_le()
2750 if (conn->type != BT_CONN_TYPE_LE) { in bt_conn_lookup_addr_le()
2751 bt_conn_unref(conn); in bt_conn_lookup_addr_le()
2755 if (!bt_conn_is_peer_addr_le(conn, id, peer)) { in bt_conn_lookup_addr_le()
2756 bt_conn_unref(conn); in bt_conn_lookup_addr_le()
2760 return conn; in bt_conn_lookup_addr_le()
2772 struct bt_conn *conn = bt_conn_ref(&acl_conns[i]); in bt_conn_lookup_state_le() local
2774 if (!conn) { in bt_conn_lookup_state_le()
2778 if (conn->type != BT_CONN_TYPE_LE) { in bt_conn_lookup_state_le()
2779 bt_conn_unref(conn); in bt_conn_lookup_state_le()
2783 if (peer && !bt_conn_is_peer_addr_le(conn, id, peer)) { in bt_conn_lookup_state_le()
2784 bt_conn_unref(conn); in bt_conn_lookup_state_le()
2788 if (!(conn->state == state && conn->id == id)) { in bt_conn_lookup_state_le()
2789 bt_conn_unref(conn); in bt_conn_lookup_state_le()
2793 return conn; in bt_conn_lookup_state_le()
2799 const bt_addr_le_t *bt_conn_get_dst(const struct bt_conn *conn) in bt_conn_get_dst() argument
2801 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_get_dst()
2802 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_get_dst()
2806 return &conn->le.dst; in bt_conn_get_dst()
2831 int bt_conn_get_info(const struct bt_conn *conn, struct bt_conn_info *info) in bt_conn_get_info() argument
2833 info->type = conn->type; in bt_conn_get_info()
2834 info->role = conn->role; in bt_conn_get_info()
2835 info->id = conn->id; in bt_conn_get_info()
2836 info->state = conn_internal_to_public_state(conn->state); in bt_conn_get_info()
2838 info->security.level = bt_conn_get_security(conn); in bt_conn_get_info()
2840 info->security.enc_key_size = bt_conn_enc_key_size(conn); in bt_conn_get_info()
2845 switch (conn->type) { in bt_conn_get_info()
2847 info->le.dst = &conn->le.dst; in bt_conn_get_info()
2848 info->le.src = &bt_dev.id_addr[conn->id]; in bt_conn_get_info()
2849 if (conn->role == BT_HCI_ROLE_CENTRAL) { in bt_conn_get_info()
2850 info->le.local = &conn->le.init_addr; in bt_conn_get_info()
2851 info->le.remote = &conn->le.resp_addr; in bt_conn_get_info()
2853 info->le.local = &conn->le.resp_addr; in bt_conn_get_info()
2854 info->le.remote = &conn->le.init_addr; in bt_conn_get_info()
2856 info->le.interval = conn->le.interval; in bt_conn_get_info()
2857 info->le.latency = conn->le.latency; in bt_conn_get_info()
2858 info->le.timeout = conn->le.timeout; in bt_conn_get_info()
2860 info->le.phy = &conn->le.phy; in bt_conn_get_info()
2863 info->le.data_len = &conn->le.data_len; in bt_conn_get_info()
2866 info->le.subrate = &conn->le.subrate; in bt_conn_get_info()
2868 if (conn->le.keys && (conn->le.keys->flags & BT_KEYS_SC)) { in bt_conn_get_info()
2871 if (conn->le.keys && (conn->le.keys->flags & BT_KEYS_OOB)) { in bt_conn_get_info()
2877 info->br.dst = &conn->br.dst; in bt_conn_get_info()
2883 (conn->iso.info.type == BT_ISO_CHAN_TYPE_CENTRAL || in bt_conn_get_info()
2884 conn->iso.info.type == BT_ISO_CHAN_TYPE_PERIPHERAL) && in bt_conn_get_info()
2885 conn->iso.acl != NULL) { in bt_conn_get_info()
2886 info->le.dst = &conn->iso.acl->le.dst; in bt_conn_get_info()
2887 info->le.src = &bt_dev.id_addr[conn->iso.acl->id]; in bt_conn_get_info()
2901 bool bt_conn_is_type(const struct bt_conn *conn, enum bt_conn_type type) in bt_conn_is_type() argument
2903 if (conn == NULL) { in bt_conn_is_type()
2907 return (conn->type & type) != 0; in bt_conn_is_type()
2910 int bt_conn_get_remote_info(const struct bt_conn *conn, struct bt_conn_remote_info *remote_info) in bt_conn_get_remote_info() argument
2912 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE | BT_CONN_TYPE_BR)) { in bt_conn_get_remote_info()
2913 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_get_remote_info()
2917 if (!atomic_test_bit(conn->flags, BT_CONN_LE_FEATURES_EXCHANGED) || in bt_conn_get_remote_info()
2919 !atomic_test_bit(conn->flags, BT_CONN_AUTO_VERSION_INFO))) { in bt_conn_get_remote_info()
2923 remote_info->type = conn->type; in bt_conn_get_remote_info()
2926 remote_info->version = conn->rv.version; in bt_conn_get_remote_info()
2927 remote_info->manufacturer = conn->rv.manufacturer; in bt_conn_get_remote_info()
2928 remote_info->subversion = conn->rv.subversion; in bt_conn_get_remote_info()
2935 switch (conn->type) { in bt_conn_get_remote_info()
2937 remote_info->le.features = conn->le.features; in bt_conn_get_remote_info()
2951 static int bt_conn_get_tx_power_level(struct bt_conn *conn, uint8_t type, in bt_conn_get_tx_power_level() argument
2967 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_get_tx_power_level()
2982 void notify_tx_power_report(struct bt_conn *conn, in notify_tx_power_report() argument
2987 callback->tx_power_report(conn, &report); in notify_tx_power_report()
2994 cb->tx_power_report(conn, &report); in notify_tx_power_report()
2999 int bt_conn_le_enhanced_get_tx_power_level(struct bt_conn *conn, in bt_conn_le_enhanced_get_tx_power_level() argument
3008 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_le_enhanced_get_tx_power_level()
3009 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_le_enhanced_get_tx_power_level()
3023 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_le_enhanced_get_tx_power_level()
3040 int bt_conn_le_get_remote_tx_power_level(struct bt_conn *conn, in bt_conn_le_get_remote_tx_power_level() argument
3046 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_le_get_remote_tx_power_level()
3047 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_le_get_remote_tx_power_level()
3061 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_le_get_remote_tx_power_level()
3067 int bt_conn_le_set_tx_power_report_enable(struct bt_conn *conn, in bt_conn_le_set_tx_power_report_enable() argument
3074 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_le_set_tx_power_report_enable()
3075 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_le_set_tx_power_report_enable()
3085 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_le_set_tx_power_report_enable()
3095 int bt_conn_le_get_tx_power_level(struct bt_conn *conn, in bt_conn_le_get_tx_power_level() argument
3100 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_le_get_tx_power_level()
3101 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_le_get_tx_power_level()
3107 return bt_conn_le_enhanced_get_tx_power_level(conn, tx_power_level); in bt_conn_le_get_tx_power_level()
3113 err = bt_conn_get_tx_power_level(conn, BT_TX_POWER_LEVEL_CURRENT, in bt_conn_le_get_tx_power_level()
3119 err = bt_conn_get_tx_power_level(conn, BT_TX_POWER_LEVEL_MAX, in bt_conn_le_get_tx_power_level()
3125 void notify_path_loss_threshold_report(struct bt_conn *conn, in notify_path_loss_threshold_report() argument
3130 callback->path_loss_threshold_report(conn, &report); in notify_path_loss_threshold_report()
3137 cb->path_loss_threshold_report(conn, &report); in notify_path_loss_threshold_report()
3142 int bt_conn_le_set_path_loss_mon_param(struct bt_conn *conn, in bt_conn_le_set_path_loss_mon_param() argument
3148 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_le_set_path_loss_mon_param()
3149 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_le_set_path_loss_mon_param()
3159 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_le_set_path_loss_mon_param()
3169 int bt_conn_le_set_path_loss_mon_enable(struct bt_conn *conn, bool reporting_enable) in bt_conn_le_set_path_loss_mon_enable() argument
3174 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_le_set_path_loss_mon_enable()
3175 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_le_set_path_loss_mon_enable()
3185 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_le_set_path_loss_mon_enable()
3194 void notify_subrate_change(struct bt_conn *conn, in notify_subrate_change() argument
3199 callback->subrate_changed(conn, &params); in notify_subrate_change()
3206 cb->subrate_changed(conn, &params); in notify_subrate_change()
3267 int bt_conn_le_subrate_request(struct bt_conn *conn, in bt_conn_le_subrate_request() argument
3273 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_le_subrate_request()
3274 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_le_subrate_request()
3288 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_le_subrate_request()
3300 void notify_read_all_remote_feat_complete(struct bt_conn *conn, in notify_read_all_remote_feat_complete() argument
3305 callback->read_all_remote_feat_complete(conn, params); in notify_read_all_remote_feat_complete()
3312 cb->read_all_remote_feat_complete(conn, params); in notify_read_all_remote_feat_complete()
3317 int bt_conn_le_read_all_remote_features(struct bt_conn *conn, uint8_t pages_requested) in bt_conn_le_read_all_remote_features() argument
3322 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_le_read_all_remote_features()
3323 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_le_read_all_remote_features()
3337 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_le_read_all_remote_features()
3345 void notify_frame_space_update_complete(struct bt_conn *conn, in notify_frame_space_update_complete() argument
3353 callback->frame_space_updated(conn, params); in notify_frame_space_update_complete()
3361 cb->frame_space_updated(conn, params); in notify_frame_space_update_complete()
3385 int bt_conn_le_frame_space_update(struct bt_conn *conn, in bt_conn_le_frame_space_update() argument
3391 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_le_frame_space_update()
3392 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_le_frame_space_update()
3406 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_le_frame_space_update()
3417 void notify_remote_cs_capabilities(struct bt_conn *conn, uint8_t status, in notify_remote_cs_capabilities() argument
3422 callback->le_cs_read_remote_capabilities_complete(conn, status, in notify_remote_cs_capabilities()
3429 cb->le_cs_read_remote_capabilities_complete(conn, status, params); in notify_remote_cs_capabilities()
3434 void notify_remote_cs_fae_table(struct bt_conn *conn, uint8_t status, in notify_remote_cs_fae_table() argument
3439 callback->le_cs_read_remote_fae_table_complete(conn, status, in notify_remote_cs_fae_table()
3446 cb->le_cs_read_remote_fae_table_complete(conn, status, params); in notify_remote_cs_fae_table()
3451 void notify_cs_config_created(struct bt_conn *conn, uint8_t status, in notify_cs_config_created() argument
3456 callback->le_cs_config_complete(conn, status, params); in notify_cs_config_created()
3462 cb->le_cs_config_complete(conn, status, params); in notify_cs_config_created()
3467 void notify_cs_config_removed(struct bt_conn *conn, uint8_t config_id) in notify_cs_config_removed() argument
3471 callback->le_cs_config_removed(conn, config_id); in notify_cs_config_removed()
3477 cb->le_cs_config_removed(conn, config_id); in notify_cs_config_removed()
3482 void notify_cs_security_enable_available(struct bt_conn *conn, uint8_t status) in notify_cs_security_enable_available() argument
3486 callback->le_cs_security_enable_complete(conn, status); in notify_cs_security_enable_available()
3492 cb->le_cs_security_enable_complete(conn, status); in notify_cs_security_enable_available()
3497 void notify_cs_procedure_enable_available(struct bt_conn *conn, uint8_t status, in notify_cs_procedure_enable_available() argument
3502 callback->le_cs_procedure_enable_complete(conn, status, params); in notify_cs_procedure_enable_available()
3508 cb->le_cs_procedure_enable_complete(conn, status, params); in notify_cs_procedure_enable_available()
3513 void notify_cs_subevent_result(struct bt_conn *conn, struct bt_conn_le_cs_subevent_result *result) in notify_cs_subevent_result() argument
3517 callback->le_cs_subevent_data_available(conn, result); in notify_cs_subevent_result()
3523 cb->le_cs_subevent_data_available(conn, result); in notify_cs_subevent_result()
3529 int bt_conn_le_param_update(struct bt_conn *conn, in bt_conn_le_param_update() argument
3532 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_le_param_update()
3533 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_le_param_update()
3537 LOG_DBG("conn %p features 0x%02x params (%d-%d %d %d)", conn, conn->le.features[0], in bt_conn_le_param_update()
3541 conn->role == BT_CONN_ROLE_CENTRAL) { in bt_conn_le_param_update()
3542 return send_conn_le_param_update(conn, param); in bt_conn_le_param_update()
3547 if (atomic_test_bit(conn->flags, BT_CONN_PERIPHERAL_PARAM_UPDATE)) { in bt_conn_le_param_update()
3548 return send_conn_le_param_update(conn, param); in bt_conn_le_param_update()
3552 conn->le.interval_min = param->interval_min; in bt_conn_le_param_update()
3553 conn->le.interval_max = param->interval_max; in bt_conn_le_param_update()
3554 conn->le.pending_latency = param->latency; in bt_conn_le_param_update()
3555 conn->le.pending_timeout = param->timeout; in bt_conn_le_param_update()
3556 atomic_set_bit(conn->flags, BT_CONN_PERIPHERAL_PARAM_SET); in bt_conn_le_param_update()
3563 int bt_conn_le_data_len_update(struct bt_conn *conn, in bt_conn_le_data_len_update() argument
3566 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_le_data_len_update()
3567 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_le_data_len_update()
3571 if (conn->le.data_len.tx_max_len == param->tx_max_len && in bt_conn_le_data_len_update()
3572 conn->le.data_len.tx_max_time == param->tx_max_time) { in bt_conn_le_data_len_update()
3576 return bt_le_set_data_len(conn, param->tx_max_len, param->tx_max_time); in bt_conn_le_data_len_update()
3581 int bt_conn_le_phy_update(struct bt_conn *conn, in bt_conn_le_phy_update() argument
3586 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_le_phy_update()
3587 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_le_phy_update()
3611 return bt_le_set_phy(conn, all_phys, param->pref_tx_phy, in bt_conn_le_phy_update()
3632 static void bt_conn_set_param_le(struct bt_conn *conn, in bt_conn_set_param_le() argument
3635 conn->le.interval_min = param->interval_min; in bt_conn_set_param_le()
3636 conn->le.interval_max = param->interval_max; in bt_conn_set_param_le()
3637 conn->le.latency = param->latency; in bt_conn_set_param_le()
3638 conn->le.timeout = param->timeout; in bt_conn_set_param_le()
3665 struct bt_conn *conn; in bt_conn_le_create_auto() local
3676 conn = bt_conn_lookup_state_le(BT_ID_DEFAULT, BT_ADDR_LE_NONE, in bt_conn_le_create_auto()
3678 if (conn) { in bt_conn_le_create_auto()
3679 bt_conn_unref(conn); in bt_conn_le_create_auto()
3699 conn = bt_conn_add_le(BT_ID_DEFAULT, BT_ADDR_LE_NONE); in bt_conn_le_create_auto()
3700 if (!conn) { in bt_conn_le_create_auto()
3704 bt_conn_set_param_le(conn, param); in bt_conn_le_create_auto()
3707 atomic_set_bit(conn->flags, BT_CONN_AUTO_CONNECT); in bt_conn_le_create_auto()
3708 bt_conn_set_state(conn, BT_CONN_INITIATING_FILTER_LIST); in bt_conn_le_create_auto()
3710 err = bt_le_create_conn(conn); in bt_conn_le_create_auto()
3713 conn->err = 0; in bt_conn_le_create_auto()
3714 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_conn_le_create_auto()
3715 bt_conn_unref(conn); in bt_conn_le_create_auto()
3722 bt_conn_unref(conn); in bt_conn_le_create_auto()
3728 struct bt_conn *conn; in bt_conn_create_auto_stop() local
3735 conn = bt_conn_lookup_state_le(BT_ID_DEFAULT, BT_ADDR_LE_NONE, in bt_conn_create_auto_stop()
3737 if (!conn) { in bt_conn_create_auto_stop()
3745 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_conn_create_auto_stop()
3746 bt_conn_unref(conn); in bt_conn_create_auto_stop()
3799 struct bt_conn *conn; in conn_le_create_helper() local
3808 conn = bt_conn_add_le(BT_ID_DEFAULT, &dst); in conn_le_create_helper()
3809 if (!conn) { in conn_le_create_helper()
3813 bt_conn_set_param_le(conn, conn_param); in conn_le_create_helper()
3815 return conn; in conn_le_create_helper()
3821 struct bt_conn *conn; in bt_conn_le_create() local
3846 conn = conn_le_create_helper(peer, conn_param); in bt_conn_le_create()
3847 if (!conn) { in bt_conn_le_create()
3862 bt_conn_set_state(conn, BT_CONN_SCAN_BEFORE_INITIATING); in bt_conn_le_create()
3867 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_conn_le_create()
3868 bt_conn_unref(conn); in bt_conn_le_create()
3873 *ret_conn = conn; in bt_conn_le_create()
3878 bt_conn_set_state(conn, BT_CONN_INITIATING); in bt_conn_le_create()
3880 err = bt_le_create_conn(conn); in bt_conn_le_create()
3882 conn->err = 0; in bt_conn_le_create()
3883 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_conn_le_create()
3884 bt_conn_unref(conn); in bt_conn_le_create()
3895 *ret_conn = conn; in bt_conn_le_create()
3903 struct bt_conn *conn; in bt_conn_le_create_synced() local
3940 conn = conn_le_create_helper(synced_param->peer, conn_param); in bt_conn_le_create_synced()
3941 if (!conn) { in bt_conn_le_create_synced()
3951 bt_conn_set_state(conn, BT_CONN_INITIATING); in bt_conn_le_create_synced()
3953 err = bt_le_create_conn_synced(conn, adv, synced_param->subevent); in bt_conn_le_create_synced()
3955 conn->err = 0; in bt_conn_le_create_synced()
3956 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_conn_le_create_synced()
3957 bt_conn_unref(conn); in bt_conn_le_create_synced()
3962 *ret_conn = conn; in bt_conn_le_create_synced()
3970 struct bt_conn *conn; in bt_le_set_auto_conn() local
3985 conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr); in bt_le_set_auto_conn()
3986 if (!conn) { in bt_le_set_auto_conn()
3987 conn = bt_conn_add_le(BT_ID_DEFAULT, addr); in bt_le_set_auto_conn()
3988 if (!conn) { in bt_le_set_auto_conn()
3994 bt_conn_set_param_le(conn, param); in bt_le_set_auto_conn()
3996 if (!atomic_test_and_set_bit(conn->flags, in bt_le_set_auto_conn()
3998 bt_conn_ref(conn); in bt_le_set_auto_conn()
4001 if (atomic_test_and_clear_bit(conn->flags, in bt_le_set_auto_conn()
4003 bt_conn_unref(conn); in bt_le_set_auto_conn()
4004 if (conn->state == BT_CONN_SCAN_BEFORE_INITIATING) { in bt_le_set_auto_conn()
4005 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_le_set_auto_conn()
4011 if (conn->state == BT_CONN_DISCONNECTED && in bt_le_set_auto_conn()
4014 bt_conn_set_state(conn, BT_CONN_SCAN_BEFORE_INITIATING); in bt_le_set_auto_conn()
4019 bt_conn_unref(conn); in bt_le_set_auto_conn()
4026 int bt_conn_le_conn_update(struct bt_conn *conn, in bt_conn_le_conn_update() argument
4039 conn_update->handle = sys_cpu_to_le16(conn->handle); in bt_conn_le_conn_update()
4077 int bt_conn_auth_cb_overlay(struct bt_conn *conn, const struct bt_conn_auth_cb *cb) in bt_conn_auth_cb_overlay() argument
4079 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE | BT_CONN_TYPE_BR)) { in bt_conn_auth_cb_overlay()
4080 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_auth_cb_overlay()
4093 if (conn->type == BT_CONN_TYPE_LE) { in bt_conn_auth_cb_overlay()
4094 return bt_smp_auth_cb_overlay(conn, cb); in bt_conn_auth_cb_overlay()
4129 int bt_conn_auth_passkey_entry(struct bt_conn *conn, unsigned int passkey) in bt_conn_auth_passkey_entry() argument
4131 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE | BT_CONN_TYPE_BR)) { in bt_conn_auth_passkey_entry()
4132 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_auth_passkey_entry()
4136 if (IS_ENABLED(CONFIG_BT_SMP) && conn->type == BT_CONN_TYPE_LE) { in bt_conn_auth_passkey_entry()
4137 return bt_smp_auth_passkey_entry(conn, passkey); in bt_conn_auth_passkey_entry()
4140 if (IS_ENABLED(CONFIG_BT_CLASSIC) && conn->type == BT_CONN_TYPE_BR) { in bt_conn_auth_passkey_entry()
4145 return bt_ssp_auth_passkey_entry(conn, passkey); in bt_conn_auth_passkey_entry()
4152 int bt_conn_auth_keypress_notify(struct bt_conn *conn, in bt_conn_auth_keypress_notify() argument
4155 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) { in bt_conn_auth_keypress_notify()
4156 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_auth_keypress_notify()
4161 return bt_smp_auth_keypress_notify(conn, type); in bt_conn_auth_keypress_notify()
4164 LOG_ERR("Not implemented for conn type %d", conn->type); in bt_conn_auth_keypress_notify()
4169 int bt_conn_auth_passkey_confirm(struct bt_conn *conn) in bt_conn_auth_passkey_confirm() argument
4171 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE | BT_CONN_TYPE_BR)) { in bt_conn_auth_passkey_confirm()
4172 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_auth_passkey_confirm()
4176 if (IS_ENABLED(CONFIG_BT_SMP) && conn->type == BT_CONN_TYPE_LE) { in bt_conn_auth_passkey_confirm()
4177 return bt_smp_auth_passkey_confirm(conn); in bt_conn_auth_passkey_confirm()
4180 if (IS_ENABLED(CONFIG_BT_CLASSIC) && conn->type == BT_CONN_TYPE_BR) { in bt_conn_auth_passkey_confirm()
4185 return bt_ssp_auth_passkey_confirm(conn); in bt_conn_auth_passkey_confirm()
4191 int bt_conn_auth_cancel(struct bt_conn *conn) in bt_conn_auth_cancel() argument
4193 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE | BT_CONN_TYPE_BR)) { in bt_conn_auth_cancel()
4194 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_auth_cancel()
4198 if (IS_ENABLED(CONFIG_BT_SMP) && conn->type == BT_CONN_TYPE_LE) { in bt_conn_auth_cancel()
4199 return bt_smp_auth_cancel(conn); in bt_conn_auth_cancel()
4202 if (IS_ENABLED(CONFIG_BT_CLASSIC) && conn->type == BT_CONN_TYPE_BR) { in bt_conn_auth_cancel()
4207 return bt_ssp_auth_cancel(conn); in bt_conn_auth_cancel()
4213 int bt_conn_auth_pairing_confirm(struct bt_conn *conn) in bt_conn_auth_pairing_confirm() argument
4215 if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE | BT_CONN_TYPE_BR)) { in bt_conn_auth_pairing_confirm()
4216 LOG_DBG("Invalid connection type: %u for %p", conn->type, conn); in bt_conn_auth_pairing_confirm()
4220 if (IS_ENABLED(CONFIG_BT_SMP) && conn->type == BT_CONN_TYPE_LE) { in bt_conn_auth_pairing_confirm()
4221 return bt_smp_auth_pairing_confirm(conn); in bt_conn_auth_pairing_confirm()
4224 if (IS_ENABLED(CONFIG_BT_CLASSIC) && conn->type == BT_CONN_TYPE_BR) { in bt_conn_auth_pairing_confirm()
4229 return bt_ssp_auth_pairing_confirm(conn); in bt_conn_auth_pairing_confirm()
4266 struct bt_conn *conn = bt_conn_ref(&acl_conns[i]); in bt_conn_init() local
4268 if (!conn) { in bt_conn_init()
4273 if (atomic_test_bit(conn->flags, in bt_conn_init()
4276 conn->id = BT_ID_DEFAULT; in bt_conn_init()
4277 bt_conn_set_state(conn, in bt_conn_init()
4282 bt_conn_unref(conn); in bt_conn_init()
4293 struct bt_conn *conn; in bt_hci_le_df_connection_iq_report_common() local
4297 err = hci_df_prepare_connection_iq_report(buf, &iq_report, &conn); in bt_hci_le_df_connection_iq_report_common()
4304 err = hci_df_vs_prepare_connection_iq_report(buf, &iq_report, &conn); in bt_hci_le_df_connection_iq_report_common()
4316 callback->cte_report_cb(conn, &iq_report); in bt_hci_le_df_connection_iq_report_common()
4323 cb->cte_report_cb(conn, &iq_report); in bt_hci_le_df_connection_iq_report_common()
4327 bt_conn_unref(conn); in bt_hci_le_df_connection_iq_report_common()
4347 struct bt_conn *conn; in bt_hci_le_df_cte_req_failed() local
4350 err = hci_df_prepare_conn_cte_req_failed(buf, &iq_report, &conn); in bt_hci_le_df_cte_req_failed()
4358 callback->cte_report_cb(conn, &iq_report); in bt_hci_le_df_cte_req_failed()
4365 cb->cte_report_cb(conn, &iq_report); in bt_hci_le_df_cte_req_failed()
4369 bt_conn_unref(conn); in bt_hci_le_df_cte_req_failed()