Lines Matching refs:conn

98 void bt_conn_del(struct bt_conn *conn);
100 struct k_sem *bt_conn_get_pkts(struct bt_conn *conn) in bt_conn_get_pkts() argument
103 if (conn->type == BT_CONN_TYPE_BR || !bt_dev.le.mtu) { in bt_conn_get_pkts()
135 static void notify_connected(struct bt_conn *conn) in notify_connected() argument
141 cb->connected(conn, conn->err); in notify_connected()
145 if (!conn->err) { in notify_connected()
146 bt_gatt_connected(conn); in notify_connected()
150 static void notify_disconnected(struct bt_conn *conn) in notify_disconnected() argument
156 cb->disconnected(conn, conn->err); in notify_disconnected()
162 void notify_remote_info(struct bt_conn *conn) in notify_remote_info() argument
168 err = bt_conn_get_remote_info(conn, &remote_info); in notify_remote_info()
176 cb->remote_info_available(conn, &remote_info); in notify_remote_info()
182 void notify_le_param_updated(struct bt_conn *conn) in notify_le_param_updated() argument
189 if (atomic_test_bit(conn->flags, BT_CONN_SLAVE_PARAM_SET) && in notify_le_param_updated()
190 conn->le.interval >= conn->le.interval_min && in notify_le_param_updated()
191 conn->le.interval <= conn->le.interval_max && in notify_le_param_updated()
192 conn->le.latency == conn->le.pending_latency && in notify_le_param_updated()
193 conn->le.timeout == conn->le.pending_timeout) { in notify_le_param_updated()
194 atomic_clear_bit(conn->flags, BT_CONN_SLAVE_PARAM_SET); in notify_le_param_updated()
199 cb->le_param_updated(conn, conn->le.interval, in notify_le_param_updated()
200 conn->le.latency, in notify_le_param_updated()
201 conn->le.timeout); in notify_le_param_updated()
207 void notify_le_data_len_updated(struct bt_conn *conn) in notify_le_data_len_updated() argument
213 cb->le_data_len_updated(conn, &conn->le.data_len); in notify_le_data_len_updated()
220 void notify_le_phy_updated(struct bt_conn *conn) in notify_le_phy_updated() argument
226 cb->le_phy_updated(conn, &conn->le.phy); in notify_le_phy_updated()
232 bool le_param_req(struct bt_conn *conn, struct bt_le_conn_param *param) in le_param_req() argument
245 if (!cb->le_param_req(conn, param)) { in le_param_req()
261 static int send_conn_le_param_update(struct bt_conn *conn, in send_conn_le_param_update() argument
264 BT_DBG("conn %p features 0x%02x params (%d-%d %d %d)", conn, in send_conn_le_param_update()
265 conn->le.features[0], param->interval_min, in send_conn_le_param_update()
277 BT_FEAT_LE_CONN_PARAM_REQ_PROC(conn->le.features) && in send_conn_le_param_update()
278 !atomic_test_bit(conn->flags, BT_CONN_SLAVE_PARAM_L2CAP)) || in send_conn_le_param_update()
279 (conn->role == BT_HCI_ROLE_MASTER)) { in send_conn_le_param_update()
282 rc = bt_conn_le_conn_update(conn, param); in send_conn_le_param_update()
286 conn->le.pending_latency = param->latency; in send_conn_le_param_update()
287 conn->le.pending_timeout = param->timeout; in send_conn_le_param_update()
296 return bt_l2cap_update_conn_param(conn, param); in send_conn_le_param_update()
307 static void tx_notify(struct bt_conn *conn) in tx_notify() argument
309 BT_DBG("conn %p", conn); in tx_notify()
318 if (sys_slist_is_empty(&conn->tx_complete)) { in tx_notify()
323 tx = (void *)sys_slist_get_not_empty(&conn->tx_complete); in tx_notify()
339 cb(conn, user_data); in tx_notify()
345 struct bt_conn *conn = CONTAINER_OF(work, struct bt_conn, in tx_complete_work() local
348 BT_DBG("conn %p", conn); in tx_complete_work()
350 tx_notify(conn); in tx_complete_work()
355 struct bt_conn *conn = CONTAINER_OF(work, struct bt_conn, update_work); in conn_update_timeout() local
358 BT_DBG("conn %p", conn); in conn_update_timeout()
360 if (conn->state == BT_CONN_DISCONNECTED) { in conn_update_timeout()
361 bt_l2cap_disconnected(conn); in conn_update_timeout()
367 bt_conn_unref(conn); in conn_update_timeout()
379 if (conn->type != BT_CONN_TYPE_LE) { in conn_update_timeout()
384 conn->role == BT_CONN_ROLE_MASTER) { in conn_update_timeout()
397 if (atomic_test_and_clear_bit(conn->flags, in conn_update_timeout()
399 param = BT_LE_CONN_PARAM(conn->le.interval_min, in conn_update_timeout()
400 conn->le.interval_max, in conn_update_timeout()
401 conn->le.pending_latency, in conn_update_timeout()
402 conn->le.pending_timeout); in conn_update_timeout()
403 send_conn_le_param_update(conn, param); in conn_update_timeout()
411 send_conn_le_param_update(conn, param); in conn_update_timeout()
416 atomic_set_bit(conn->flags, BT_CONN_SLAVE_PARAM_UPDATE); in conn_update_timeout()
421 struct bt_conn *conn = NULL; in conn_new() local
426 conn = &conns[i]; in conn_new()
427 (void)memset(conn, 0, sizeof(*conn)); in conn_new()
428 conn->handle = i; in conn_new()
433 if (!conn) { in conn_new()
437 k_delayed_work_init(&conn->update_work, conn_update_timeout); in conn_new()
439 k_work_init(&conn->tx_complete_work, tx_complete_work); in conn_new()
441 atomic_set(&conn->ref, 1); in conn_new()
443 return conn; in conn_new()
481 struct bt_conn *conn; in bt_conn_create_br() local
484 conn = bt_conn_lookup_addr_br(peer); in bt_conn_create_br()
485 if (conn) { in bt_conn_create_br()
486 switch (conn->state) { in bt_conn_create_br()
489 return conn; in bt_conn_create_br()
491 bt_conn_unref(conn); in bt_conn_create_br()
496 conn = bt_conn_add_br(peer); in bt_conn_create_br()
497 if (!conn) { in bt_conn_create_br()
503 bt_conn_unref(conn); in bt_conn_create_br()
518 bt_conn_unref(conn); in bt_conn_create_br()
522 bt_conn_set_state(conn, BT_CONN_CONNECT); in bt_conn_create_br()
523 conn->role = BT_CONN_ROLE_MASTER; in bt_conn_create_br()
525 return conn; in bt_conn_create_br()
660 struct bt_conn *conn = conn_new(); in bt_conn_add_br() local
662 if (!conn) { in bt_conn_add_br()
666 bt_addr_copy(&conn->br.dst, peer); in bt_conn_add_br()
667 conn->type = BT_CONN_TYPE_BR; in bt_conn_add_br()
669 return conn; in bt_conn_add_br()
690 static int pin_code_reply(struct bt_conn *conn, const char *pin, u8_t len) in pin_code_reply() argument
704 bt_addr_copy(&cp->bdaddr, &conn->br.dst); in pin_code_reply()
711 int bt_conn_auth_pincode_entry(struct bt_conn *conn, const char *pin) in bt_conn_auth_pincode_entry() argument
719 if (conn->type != BT_CONN_TYPE_BR) { in bt_conn_auth_pincode_entry()
728 if (conn->required_sec_level == BT_SECURITY_L3 && len < 16) { in bt_conn_auth_pincode_entry()
730 bt_addr_str(&conn->br.dst)); in bt_conn_auth_pincode_entry()
735 if (!atomic_test_and_clear_bit(conn->flags, BT_CONN_USER)) { in bt_conn_auth_pincode_entry()
740 atomic_set_bit(conn->flags, BT_CONN_BR_LEGACY_SECURE); in bt_conn_auth_pincode_entry()
743 return pin_code_reply(conn, pin, len); in bt_conn_auth_pincode_entry()
746 void bt_conn_pin_code_req(struct bt_conn *conn) in bt_conn_pin_code_req() argument
751 if (conn->required_sec_level == BT_SECURITY_L3) { in bt_conn_pin_code_req()
755 atomic_set_bit(conn->flags, BT_CONN_USER); in bt_conn_pin_code_req()
756 atomic_set_bit(conn->flags, BT_CONN_BR_PAIRING); in bt_conn_pin_code_req()
757 bt_auth->pincode_entry(conn, secure); in bt_conn_pin_code_req()
759 pin_code_neg_reply(&conn->br.dst); in bt_conn_pin_code_req()
784 static u8_t ssp_pair_method(const struct bt_conn *conn) in ssp_pair_method() argument
786 return ssp_method[conn->br.remote_io_capa][bt_conn_get_io_capa()]; in ssp_pair_method()
789 u8_t bt_conn_ssp_get_auth(const struct bt_conn *conn) in bt_conn_ssp_get_auth() argument
792 if ((conn->br.remote_auth == BT_HCI_NO_BONDING) || in bt_conn_ssp_get_auth()
793 ((conn->br.remote_auth == BT_HCI_NO_BONDING_MITM) && in bt_conn_ssp_get_auth()
794 (ssp_pair_method(conn) > JUST_WORKS))) { in bt_conn_ssp_get_auth()
795 return conn->br.remote_auth; in bt_conn_ssp_get_auth()
799 if (ssp_pair_method(conn) > JUST_WORKS) { in bt_conn_ssp_get_auth()
800 return conn->br.remote_auth | BT_MITM; in bt_conn_ssp_get_auth()
804 return (conn->br.remote_auth & ~BT_MITM); in bt_conn_ssp_get_auth()
807 static int ssp_confirm_reply(struct bt_conn *conn) in ssp_confirm_reply() argument
820 bt_addr_copy(&cp->bdaddr, &conn->br.dst); in ssp_confirm_reply()
825 static int ssp_confirm_neg_reply(struct bt_conn *conn) in ssp_confirm_neg_reply() argument
838 bt_addr_copy(&cp->bdaddr, &conn->br.dst); in ssp_confirm_neg_reply()
844 void bt_conn_ssp_auth_complete(struct bt_conn *conn, u8_t status) in bt_conn_ssp_auth_complete() argument
847 bool bond = !atomic_test_bit(conn->flags, BT_CONN_BR_NOBOND); in bt_conn_ssp_auth_complete()
850 bt_auth->pairing_complete(conn, bond); in bt_conn_ssp_auth_complete()
854 bt_auth->pairing_failed(conn, status); in bt_conn_ssp_auth_complete()
859 void bt_conn_ssp_auth(struct bt_conn *conn, bt_u32_t passkey) in bt_conn_ssp_auth() argument
861 conn->br.pairing_method = ssp_pair_method(conn); in bt_conn_ssp_auth()
867 if (conn->required_sec_level > BT_SECURITY_L2 && in bt_conn_ssp_auth()
868 conn->br.pairing_method == JUST_WORKS) { in bt_conn_ssp_auth()
870 ssp_confirm_neg_reply(conn); in bt_conn_ssp_auth()
874 switch (conn->br.pairing_method) { in bt_conn_ssp_auth()
876 atomic_set_bit(conn->flags, BT_CONN_USER); in bt_conn_ssp_auth()
877 bt_auth->passkey_confirm(conn, passkey); in bt_conn_ssp_auth()
880 atomic_set_bit(conn->flags, BT_CONN_USER); in bt_conn_ssp_auth()
881 bt_auth->passkey_display(conn, passkey); in bt_conn_ssp_auth()
884 atomic_set_bit(conn->flags, BT_CONN_USER); in bt_conn_ssp_auth()
885 bt_auth->passkey_entry(conn); in bt_conn_ssp_auth()
894 !atomic_test_bit(conn->flags, in bt_conn_ssp_auth()
896 atomic_set_bit(conn->flags, BT_CONN_USER); in bt_conn_ssp_auth()
897 bt_auth->pairing_confirm(conn); in bt_conn_ssp_auth()
900 ssp_confirm_reply(conn); in bt_conn_ssp_auth()
907 static int ssp_passkey_reply(struct bt_conn *conn, unsigned int passkey) in ssp_passkey_reply() argument
920 bt_addr_copy(&cp->bdaddr, &conn->br.dst); in ssp_passkey_reply()
926 static int ssp_passkey_neg_reply(struct bt_conn *conn) in ssp_passkey_neg_reply() argument
939 bt_addr_copy(&cp->bdaddr, &conn->br.dst); in ssp_passkey_neg_reply()
945 static int bt_hci_connect_br_cancel(struct bt_conn *conn) in bt_hci_connect_br_cancel() argument
958 memcpy(&cp->bdaddr, &conn->br.dst, sizeof(cp->bdaddr)); in bt_hci_connect_br_cancel()
974 static int conn_auth(struct bt_conn *conn) in conn_auth() argument
987 auth->handle = sys_cpu_to_le16(conn->handle); in conn_auth()
989 atomic_set_bit(conn->flags, BT_CONN_BR_PAIRING_INITIATOR); in conn_auth()
996 void bt_conn_identity_resolved(struct bt_conn *conn) in bt_conn_identity_resolved() argument
1001 if (conn->role == BT_HCI_ROLE_MASTER) { in bt_conn_identity_resolved()
1002 rpa = &conn->le.resp_addr; in bt_conn_identity_resolved()
1004 rpa = &conn->le.init_addr; in bt_conn_identity_resolved()
1009 cb->identity_resolved(conn, rpa, &conn->le.dst); in bt_conn_identity_resolved()
1014 int bt_conn_le_start_encryption(struct bt_conn *conn, u8_t rand[8], in bt_conn_le_start_encryption() argument
1027 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_le_start_encryption()
1046 return hci_api_le_start_encrypt(conn->handle, rand, ediv, ltk_buf); in bt_conn_le_start_encryption()
1052 u8_t bt_conn_enc_key_size(struct bt_conn *conn) in bt_conn_enc_key_size() argument
1054 if (!conn->encrypt) { in bt_conn_enc_key_size()
1059 conn->type == BT_CONN_TYPE_BR) { in bt_conn_enc_key_size()
1073 cp->handle = sys_cpu_to_le16(conn->handle); in bt_conn_enc_key_size()
1090 return conn->le.keys ? conn->le.keys->enc_size : 0; in bt_conn_enc_key_size()
1096 void bt_conn_security_changed(struct bt_conn *conn, enum bt_security_err err) in bt_conn_security_changed() argument
1102 cb->security_changed(conn, conn->sec_level, err); in bt_conn_security_changed()
1106 if (!err && conn->sec_level >= BT_SECURITY_L2) { in bt_conn_security_changed()
1107 bt_keys_update_usage(conn->id, bt_conn_get_dst(conn)); in bt_conn_security_changed()
1112 static int start_security(struct bt_conn *conn) in start_security() argument
1115 if (conn->type == BT_CONN_TYPE_BR) { in start_security()
1116 if (atomic_test_bit(conn->flags, BT_CONN_BR_PAIRING)) { in start_security()
1120 if (conn->required_sec_level > BT_SECURITY_L3) { in start_security()
1125 conn->required_sec_level > BT_SECURITY_L2) { in start_security()
1129 return conn_auth(conn); in start_security()
1134 return bt_smp_start_security(conn); in start_security()
1140 int bt_conn_set_security(struct bt_conn *conn, bt_security_t sec) in bt_conn_set_security() argument
1144 if (conn->state != BT_CONN_CONNECTED) { in bt_conn_set_security()
1159 if (conn->sec_level >= sec || conn->required_sec_level >= sec) { in bt_conn_set_security()
1163 atomic_set_bit_to(conn->flags, BT_CONN_FORCE_PAIR, in bt_conn_set_security()
1165 conn->required_sec_level = sec & ~BT_SECURITY_FORCE_PAIR; in bt_conn_set_security()
1167 err = start_security(conn); in bt_conn_set_security()
1171 conn->required_sec_level = conn->sec_level; in bt_conn_set_security()
1177 bt_security_t bt_conn_get_security(struct bt_conn *conn) in bt_conn_get_security() argument
1179 return conn->sec_level; in bt_conn_get_security()
1182 bt_security_t bt_conn_get_security(struct bt_conn *conn) in bt_conn_get_security() argument
1194 static void bt_conn_reset_rx_state(struct bt_conn *conn) in bt_conn_reset_rx_state() argument
1196 if (!conn->rx_len) { in bt_conn_reset_rx_state()
1200 net_buf_unref(conn->rx); in bt_conn_reset_rx_state()
1201 conn->rx = NULL; in bt_conn_reset_rx_state()
1202 conn->rx_len = 0U; in bt_conn_reset_rx_state()
1205 void bt_conn_recv(struct bt_conn *conn, struct net_buf *buf, u8_t flags) in bt_conn_recv() argument
1213 tx_notify(conn); in bt_conn_recv()
1215 BT_DBG("handle %u len %u flags %02x", conn->handle, buf->len, flags); in bt_conn_recv()
1225 if (conn->rx_len) { in bt_conn_recv()
1227 bt_conn_reset_rx_state(conn); in bt_conn_recv()
1230 conn->rx_len = (sizeof(*hdr) + len) - buf->len; in bt_conn_recv()
1231 BT_DBG("rx_len %u", conn->rx_len); in bt_conn_recv()
1232 if (conn->rx_len) { in bt_conn_recv()
1233 conn->rx = buf; in bt_conn_recv()
1239 if (!conn->rx_len) { in bt_conn_recv()
1241 bt_conn_reset_rx_state(conn); in bt_conn_recv()
1246 if (buf->len > conn->rx_len) { in bt_conn_recv()
1248 bt_conn_reset_rx_state(conn); in bt_conn_recv()
1253 BT_DBG("Cont, len %u rx_len %u", buf->len, conn->rx_len); in bt_conn_recv()
1255 if (buf->len > net_buf_tailroom(conn->rx)) { in bt_conn_recv()
1257 bt_conn_reset_rx_state(conn); in bt_conn_recv()
1262 net_buf_add_mem(conn->rx, buf->data, buf->len); in bt_conn_recv()
1263 conn->rx_len -= buf->len; in bt_conn_recv()
1266 if (conn->rx_len) { in bt_conn_recv()
1270 buf = conn->rx; in bt_conn_recv()
1271 conn->rx = NULL; in bt_conn_recv()
1272 conn->rx_len = 0U; in bt_conn_recv()
1281 bt_conn_reset_rx_state(conn); in bt_conn_recv()
1297 bt_l2cap_recv(conn, buf); in bt_conn_recv()
1324 int bt_conn_send_cb(struct bt_conn *conn, struct net_buf *buf, in bt_conn_send_cb() argument
1329 BT_DBG("conn handle %u buf len %u cb %p user_data %p", conn->handle, in bt_conn_send_cb()
1332 if (conn->state != BT_CONN_CONNECTED) { in bt_conn_send_cb()
1347 if (conn->state != BT_CONN_CONNECTED) { in bt_conn_send_cb()
1363 net_buf_put(&conn->tx_queue, buf); in bt_conn_send_cb()
1368 static bool send_frag(struct bt_conn *conn, struct net_buf *buf, u8_t flags, in send_frag() argument
1377 BT_DBG("conn %p buf %p len %u flags 0x%02x", conn, buf, buf->len, in send_frag()
1381 k_sem_take(bt_conn_get_pkts(conn), K_FOREVER); in send_frag()
1384 if (conn->state != BT_CONN_CONNECTED) { in send_frag()
1389 hdr->handle = sys_cpu_to_le16(bt_acl_handle_pack(conn->handle, flags)); in send_frag()
1395 sys_slist_append(&conn->tx_pending, &tx->node); in send_frag()
1399 tail_tx = (void *)sys_slist_peek_tail(&conn->tx_pending); in send_frag()
1403 pending_no_cb = &conn->pending_no_cb; in send_frag()
1418 sys_slist_find_and_remove(&conn->tx_pending, &tx->node); in send_frag()
1430 k_sem_give(bt_conn_get_pkts(conn)); in send_frag()
1441 static inline u16_t conn_mtu(struct bt_conn *conn) in conn_mtu() argument
1444 if (conn->type == BT_CONN_TYPE_BR || !bt_dev.le.mtu) { in conn_mtu()
1452 static struct net_buf *create_frag(struct bt_conn *conn, struct net_buf *buf) in create_frag() argument
1459 if (conn->state != BT_CONN_CONNECTED) { in create_frag()
1467 frag_len = MIN(conn_mtu(conn), net_buf_tailroom(frag)); in create_frag()
1475 static bool send_buf(struct bt_conn *conn, struct net_buf *buf) in send_buf() argument
1479 BT_DBG("conn %p buf %p len %u", conn, buf, buf->len); in send_buf()
1482 if (buf->len <= conn_mtu(conn)) { in send_buf()
1483 return send_frag(conn, buf, BT_ACL_START_NO_FLUSH, false); in send_buf()
1487 frag = create_frag(conn, buf); in send_buf()
1492 if (!send_frag(conn, frag, BT_ACL_START_NO_FLUSH, true)) { in send_buf()
1500 while (buf->len > conn_mtu(conn)) { in send_buf()
1501 frag = create_frag(conn, buf); in send_buf()
1506 if (!send_frag(conn, frag, BT_ACL_CONT, true)) { in send_buf()
1511 return send_frag(conn, buf, BT_ACL_CONT, false); in send_buf()
1517 static void conn_cleanup(struct bt_conn *conn) in conn_cleanup() argument
1522 while ((buf = net_buf_get(&conn->tx_queue, K_NO_WAIT))) { in conn_cleanup()
1530 __ASSERT(sys_slist_is_empty(&conn->tx_pending), "Pending TX packets"); in conn_cleanup()
1531 __ASSERT_NO_MSG(conn->pending_no_cb == 0); in conn_cleanup()
1533 bt_conn_reset_rx_state(conn); in conn_cleanup()
1535 k_delayed_work_submit(&conn->update_work, K_NO_WAIT); in conn_cleanup()
1549 struct bt_conn *conn = &conns[i]; in bt_conn_prepare_events() local
1551 if (!atomic_get(&conn->ref)) { in bt_conn_prepare_events()
1555 if (conn->state == BT_CONN_DISCONNECTED && in bt_conn_prepare_events()
1556 atomic_test_and_clear_bit(conn->flags, BT_CONN_CLEANUP)) { in bt_conn_prepare_events()
1557 conn_cleanup(conn); in bt_conn_prepare_events()
1561 if (conn->state != BT_CONN_CONNECTED) { in bt_conn_prepare_events()
1565 BT_DBG("Adding conn %p to poll list", conn); in bt_conn_prepare_events()
1570 &conn->tx_queue); in bt_conn_prepare_events()
1577 void bt_conn_process_tx(struct bt_conn *conn) in bt_conn_process_tx() argument
1581 BT_DBG("conn %p", conn); in bt_conn_process_tx()
1583 if (conn->state == BT_CONN_DISCONNECTED && in bt_conn_process_tx()
1584 atomic_test_and_clear_bit(conn->flags, BT_CONN_CLEANUP)) { in bt_conn_process_tx()
1585 BT_DBG("handle %u disconnected - cleaning up", conn->handle); in bt_conn_process_tx()
1586 conn_cleanup(conn); in bt_conn_process_tx()
1591 buf = net_buf_get(&conn->tx_queue, K_NO_WAIT); in bt_conn_process_tx()
1593 if (!send_buf(conn, buf)) { in bt_conn_process_tx()
1600 struct bt_conn *conn = bt_conn_lookup_addr_le(id, peer); in bt_conn_exists_le() local
1602 if (conn) { in bt_conn_exists_le()
1611 state2str(conn->state)); in bt_conn_exists_le()
1612 bt_conn_unref(conn); in bt_conn_exists_le()
1621 struct bt_conn *conn = conn_new(); in bt_conn_add_le() local
1623 if (!conn) { in bt_conn_add_le()
1627 conn->id = id; in bt_conn_add_le()
1628 bt_addr_le_copy(&conn->le.dst, peer); in bt_conn_add_le()
1630 conn->sec_level = BT_SECURITY_L1; in bt_conn_add_le()
1631 conn->required_sec_level = BT_SECURITY_L1; in bt_conn_add_le()
1633 conn->type = BT_CONN_TYPE_LE; in bt_conn_add_le()
1634 conn->le.interval_min = BT_GAP_INIT_CONN_INT_MIN; in bt_conn_add_le()
1635 conn->le.interval_max = BT_GAP_INIT_CONN_INT_MAX; in bt_conn_add_le()
1637 return conn; in bt_conn_add_le()
1640 static void process_unack_tx(struct bt_conn *conn) in process_unack_tx() argument
1650 if (conn->pending_no_cb) { in process_unack_tx()
1651 conn->pending_no_cb--; in process_unack_tx()
1653 k_sem_give(bt_conn_get_pkts(conn)); in process_unack_tx()
1657 node = sys_slist_get(&conn->tx_pending); in process_unack_tx()
1667 conn->pending_no_cb = tx->pending_no_cb; in process_unack_tx()
1673 k_sem_give(bt_conn_get_pkts(conn)); in process_unack_tx()
1677 void bt_conn_set_state(struct bt_conn *conn, bt_conn_state_t state) in bt_conn_set_state() argument
1681 BT_DBG("%s -> %s", state2str(conn->state), state2str(state)); in bt_conn_set_state()
1683 if (conn->state == state) { in bt_conn_set_state()
1688 old_state = conn->state; in bt_conn_set_state()
1689 conn->state = state; in bt_conn_set_state()
1698 bt_conn_ref(conn); in bt_conn_set_state()
1702 conn->type == BT_CONN_TYPE_LE) { in bt_conn_set_state()
1704 k_delayed_work_cancel(&conn->update_work); in bt_conn_set_state()
1712 switch (conn->state) { in bt_conn_set_state()
1714 if (conn->type == BT_CONN_TYPE_SCO) { in bt_conn_set_state()
1720 k_fifo_init(&conn->tx_queue); in bt_conn_set_state()
1723 sys_slist_init(&conn->channels); in bt_conn_set_state()
1725 bt_l2cap_connected(conn); in bt_conn_set_state()
1726 notify_connected(conn); in bt_conn_set_state()
1729 if (conn->type == BT_CONN_TYPE_SCO) { in bt_conn_set_state()
1731 bt_conn_unref(conn); in bt_conn_set_state()
1742 process_unack_tx(conn); in bt_conn_set_state()
1743 tx_notify(conn); in bt_conn_set_state()
1744 bt_conn_del(conn); in bt_conn_set_state()
1745 bt_l2cap_disconnected(conn); in bt_conn_set_state()
1746 notify_disconnected(conn); in bt_conn_set_state()
1749 if (conn->type == BT_CONN_TYPE_LE) { in bt_conn_set_state()
1751 k_delayed_work_cancel(&conn->update_work); in bt_conn_set_state()
1754 atomic_set_bit(conn->flags, BT_CONN_CLEANUP); in bt_conn_set_state()
1764 if (conn->err) { in bt_conn_set_state()
1765 notify_connected(conn); in bt_conn_set_state()
1768 bt_conn_unref(conn); in bt_conn_set_state()
1776 if (conn->err) { in bt_conn_set_state()
1777 notify_connected(conn); in bt_conn_set_state()
1780 bt_conn_unref(conn); in bt_conn_set_state()
1784 if (conn->err) { in bt_conn_set_state()
1785 notify_connected(conn); in bt_conn_set_state()
1788 bt_conn_unref(conn); in bt_conn_set_state()
1795 bt_conn_unref(conn); in bt_conn_set_state()
1801 bt_conn_unref(conn); in bt_conn_set_state()
1817 if (conn->type == BT_CONN_TYPE_SCO) { in bt_conn_set_state()
1825 conn->type == BT_CONN_TYPE_LE) { in bt_conn_set_state()
1826 k_delayed_work_submit(&conn->update_work, in bt_conn_set_state()
1881 bool bt_conn_is_peer_addr_le(const struct bt_conn *conn, u8_t id, in bt_conn_is_peer_addr_le() argument
1884 if (id != conn->id) { in bt_conn_is_peer_addr_le()
1889 if (!bt_addr_le_cmp(peer, &conn->le.dst)) { in bt_conn_is_peer_addr_le()
1894 if (conn->role == BT_HCI_ROLE_MASTER) { in bt_conn_is_peer_addr_le()
1895 return bt_addr_le_cmp(peer, &conn->le.resp_addr) == 0; in bt_conn_is_peer_addr_le()
1898 return bt_addr_le_cmp(peer, &conn->le.init_addr) == 0; in bt_conn_is_peer_addr_le()
1948 void bt_conn_foreach(int type, void (*func)(struct bt_conn *conn, void *data), in bt_conn_foreach() argument
1977 struct bt_conn *bt_conn_ref(struct bt_conn *conn) in bt_conn_ref() argument
1979 atomic_val_t old = atomic_inc(&conn->ref); in bt_conn_ref()
1981 BT_DBG("%s: handle %u ref %u -> %u", __func__, conn->handle, old, in bt_conn_ref()
1982 atomic_get(&conn->ref)); in bt_conn_ref()
1985 return conn; in bt_conn_ref()
1988 void bt_conn_unref(struct bt_conn *conn) in bt_conn_unref() argument
1990 if (atomic_get(&conn->ref) == 0) in bt_conn_unref()
1993 atomic_val_t old = atomic_dec(&conn->ref); in bt_conn_unref()
1996 BT_DBG("%s: handle %u ref %u -> %u", __func__, conn->handle, old, in bt_conn_unref()
1997 atomic_get(&conn->ref)); in bt_conn_unref()
2000 void bt_conn_del(struct bt_conn *conn) in bt_conn_del() argument
2002 atomic_val_t old = atomic_set(&conn->ref, 0); in bt_conn_del()
2005 BT_DBG("%s: handle %u ref %u -> %u", __func__, conn->handle, old, in bt_conn_del()
2006 atomic_get(&conn->ref)); in bt_conn_del()
2009 const bt_addr_le_t *bt_conn_get_dst(const struct bt_conn *conn) in bt_conn_get_dst() argument
2011 return &conn->le.dst; in bt_conn_get_dst()
2014 int bt_conn_get_info(const struct bt_conn *conn, struct bt_conn_info *info) in bt_conn_get_info() argument
2016 info->type = conn->type; in bt_conn_get_info()
2017 info->role = conn->role; in bt_conn_get_info()
2018 info->id = conn->id; in bt_conn_get_info()
2020 switch (conn->type) { in bt_conn_get_info()
2022 info->le.dst = &conn->le.dst; in bt_conn_get_info()
2023 info->le.src = &bt_dev.id_addr[conn->id]; in bt_conn_get_info()
2024 if (conn->role == BT_HCI_ROLE_MASTER) { in bt_conn_get_info()
2025 info->le.local = &conn->le.init_addr; in bt_conn_get_info()
2026 info->le.remote = &conn->le.resp_addr; in bt_conn_get_info()
2028 info->le.local = &conn->le.resp_addr; in bt_conn_get_info()
2029 info->le.remote = &conn->le.init_addr; in bt_conn_get_info()
2031 info->le.interval = conn->le.interval; in bt_conn_get_info()
2032 info->le.latency = conn->le.latency; in bt_conn_get_info()
2033 info->le.timeout = conn->le.timeout; in bt_conn_get_info()
2035 info->le.phy = &conn->le.phy; in bt_conn_get_info()
2038 info->le.data_len = &conn->le.data_len; in bt_conn_get_info()
2043 info->br.dst = &conn->br.dst; in bt_conn_get_info()
2051 int bt_conn_get_remote_info(struct bt_conn *conn, in bt_conn_get_remote_info() argument
2054 if (!atomic_test_bit(conn->flags, BT_CONN_AUTO_FEATURE_EXCH) || in bt_conn_get_remote_info()
2056 !atomic_test_bit(conn->flags, BT_CONN_AUTO_VERSION_INFO))) { in bt_conn_get_remote_info()
2060 remote_info->type = conn->type; in bt_conn_get_remote_info()
2063 remote_info->version = conn->rv.version; in bt_conn_get_remote_info()
2064 remote_info->manufacturer = conn->rv.manufacturer; in bt_conn_get_remote_info()
2065 remote_info->subversion = conn->rv.subversion; in bt_conn_get_remote_info()
2072 switch (conn->type) { in bt_conn_get_remote_info()
2074 remote_info->le.features = conn->le.features; in bt_conn_get_remote_info()
2087 static int conn_disconnect(struct bt_conn *conn, u8_t reason) in conn_disconnect() argument
2091 err = bt_hci_disconnect(conn->handle, reason); in conn_disconnect()
2096 bt_conn_set_state(conn, BT_CONN_DISCONNECT); in conn_disconnect()
2101 int bt_conn_le_param_update(struct bt_conn *conn, in bt_conn_le_param_update() argument
2104 BT_DBG("conn %p features 0x%02x params (%d-%d %d %d)", conn, in bt_conn_le_param_update()
2105 conn->le.features[0], param->interval_min, in bt_conn_le_param_update()
2109 if (conn->le.interval >= param->interval_min && in bt_conn_le_param_update()
2110 conn->le.interval <= param->interval_max && in bt_conn_le_param_update()
2111 conn->le.latency == param->latency && in bt_conn_le_param_update()
2112 conn->le.timeout == param->timeout) { in bt_conn_le_param_update()
2113 atomic_clear_bit(conn->flags, BT_CONN_SLAVE_PARAM_SET); in bt_conn_le_param_update()
2118 conn->role == BT_CONN_ROLE_MASTER) { in bt_conn_le_param_update()
2119 return send_conn_le_param_update(conn, param); in bt_conn_le_param_update()
2124 if (atomic_test_bit(conn->flags, BT_CONN_SLAVE_PARAM_UPDATE)) { in bt_conn_le_param_update()
2125 return send_conn_le_param_update(conn, param); in bt_conn_le_param_update()
2129 conn->le.interval_min = param->interval_min; in bt_conn_le_param_update()
2130 conn->le.interval_max = param->interval_max; in bt_conn_le_param_update()
2131 conn->le.pending_latency = param->latency; in bt_conn_le_param_update()
2132 conn->le.pending_timeout = param->timeout; in bt_conn_le_param_update()
2133 atomic_set_bit(conn->flags, BT_CONN_SLAVE_PARAM_SET); in bt_conn_le_param_update()
2140 int bt_conn_le_data_len_update(struct bt_conn *conn, in bt_conn_le_data_len_update() argument
2143 if (conn->le.data_len.tx_max_len == param->tx_max_len && in bt_conn_le_data_len_update()
2144 conn->le.data_len.tx_max_time == param->tx_max_time) { in bt_conn_le_data_len_update()
2149 !atomic_test_bit(conn->flags, BT_CONN_AUTO_DATA_LEN_COMPLETE)) { in bt_conn_le_data_len_update()
2153 return bt_le_set_data_len(conn, param->tx_max_len, param->tx_max_time); in bt_conn_le_data_len_update()
2158 int bt_conn_le_phy_update(struct bt_conn *conn, in bt_conn_le_phy_update() argument
2161 if (conn->le.phy.tx_phy == param->pref_tx_phy && in bt_conn_le_phy_update()
2162 conn->le.phy.rx_phy == param->pref_rx_phy) { in bt_conn_le_phy_update()
2167 !atomic_test_bit(conn->flags, BT_CONN_AUTO_PHY_COMPLETE)) { in bt_conn_le_phy_update()
2171 return bt_le_set_phy(conn, param->pref_tx_phy, param->pref_rx_phy); in bt_conn_le_phy_update()
2175 int bt_conn_disconnect(struct bt_conn *conn, u8_t reason) in bt_conn_disconnect() argument
2184 conn->type == BT_CONN_TYPE_LE) { in bt_conn_disconnect()
2185 bt_le_set_auto_conn(&conn->le.dst, NULL); in bt_conn_disconnect()
2189 switch (conn->state) { in bt_conn_disconnect()
2191 conn->err = reason; in bt_conn_disconnect()
2192 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_conn_disconnect()
2199 conn->err = reason; in bt_conn_disconnect()
2200 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_conn_disconnect()
2210 if (conn->type == BT_CONN_TYPE_BR) { in bt_conn_disconnect()
2211 return bt_hci_connect_br_cancel(conn); in bt_conn_disconnect()
2216 k_delayed_work_cancel(&conn->update_work); in bt_conn_disconnect()
2222 return conn_disconnect(conn, reason); in bt_conn_disconnect()
2232 static void bt_conn_set_param_le(struct bt_conn *conn, in bt_conn_set_param_le() argument
2235 conn->le.interval_min = param->interval_min; in bt_conn_set_param_le()
2236 conn->le.interval_max = param->interval_max; in bt_conn_set_param_le()
2237 conn->le.latency = param->latency; in bt_conn_set_param_le()
2238 conn->le.timeout = param->timeout; in bt_conn_set_param_le()
2279 struct bt_conn *conn; in bt_conn_le_create_auto() local
2290 conn = bt_conn_lookup_state_le(BT_ID_DEFAULT, BT_ADDR_LE_NONE, in bt_conn_le_create_auto()
2292 if (conn) { in bt_conn_le_create_auto()
2293 bt_conn_unref(conn); in bt_conn_le_create_auto()
2312 conn = bt_conn_add_le(BT_ID_DEFAULT, BT_ADDR_LE_NONE); in bt_conn_le_create_auto()
2313 if (!conn) { in bt_conn_le_create_auto()
2317 bt_conn_set_param_le(conn, param); in bt_conn_le_create_auto()
2320 atomic_set_bit(conn->flags, BT_CONN_AUTO_CONNECT); in bt_conn_le_create_auto()
2321 bt_conn_set_state(conn, BT_CONN_CONNECT_AUTO); in bt_conn_le_create_auto()
2323 err = bt_le_create_conn(conn); in bt_conn_le_create_auto()
2326 conn->err = 0; in bt_conn_le_create_auto()
2327 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_conn_le_create_auto()
2328 bt_conn_unref(conn); in bt_conn_le_create_auto()
2335 bt_conn_unref(conn); in bt_conn_le_create_auto()
2341 struct bt_conn *conn; in bt_conn_create_auto_stop() local
2348 conn = bt_conn_lookup_state_le(BT_ID_DEFAULT, BT_ADDR_LE_NONE, in bt_conn_create_auto_stop()
2350 if (!conn) { in bt_conn_create_auto_stop()
2358 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_conn_create_auto_stop()
2359 bt_conn_unref(conn); in bt_conn_create_auto_stop()
2376 struct bt_conn *conn; in bt_conn_le_create() local
2417 conn = bt_conn_add_le(BT_ID_DEFAULT, &dst); in bt_conn_le_create()
2418 if (!conn) { in bt_conn_le_create()
2422 bt_conn_set_param_le(conn, conn_param); in bt_conn_le_create()
2427 bt_conn_set_state(conn, BT_CONN_CONNECT_SCAN); in bt_conn_le_create()
2431 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_conn_le_create()
2432 bt_conn_unref(conn); in bt_conn_le_create()
2437 *ret_conn = conn; in bt_conn_le_create()
2442 bt_conn_set_state(conn, BT_CONN_CONNECT); in bt_conn_le_create()
2444 err = bt_le_create_conn(conn); in bt_conn_le_create()
2446 conn->err = 0; in bt_conn_le_create()
2447 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_conn_le_create()
2448 bt_conn_unref(conn); in bt_conn_le_create()
2454 *ret_conn = conn; in bt_conn_le_create()
2462 struct bt_conn *conn; in bt_le_set_auto_conn() local
2477 conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr); in bt_le_set_auto_conn()
2478 if (!conn) { in bt_le_set_auto_conn()
2479 conn = bt_conn_add_le(BT_ID_DEFAULT, addr); in bt_le_set_auto_conn()
2480 if (!conn) { in bt_le_set_auto_conn()
2486 bt_conn_set_param_le(conn, param); in bt_le_set_auto_conn()
2488 if (!atomic_test_and_set_bit(conn->flags, in bt_le_set_auto_conn()
2490 bt_conn_ref(conn); in bt_le_set_auto_conn()
2493 if (atomic_test_and_clear_bit(conn->flags, in bt_le_set_auto_conn()
2495 bt_conn_unref(conn); in bt_le_set_auto_conn()
2496 if (conn->state == BT_CONN_CONNECT_SCAN) { in bt_le_set_auto_conn()
2497 bt_conn_set_state(conn, BT_CONN_DISCONNECTED); in bt_le_set_auto_conn()
2502 if (conn->state == BT_CONN_DISCONNECTED && in bt_le_set_auto_conn()
2505 bt_conn_set_state(conn, BT_CONN_CONNECT_SCAN); in bt_le_set_auto_conn()
2510 bt_conn_unref(conn); in bt_le_set_auto_conn()
2517 int bt_conn_le_conn_update(struct bt_conn *conn, in bt_conn_le_conn_update() argument
2532 conn_update->handle = sys_cpu_to_le16(conn->handle); in bt_conn_le_conn_update()
2540 return hci_api_le_conn_updata(conn->handle, in bt_conn_le_conn_update()
2655 int bt_conn_auth_passkey_entry(struct bt_conn *conn, unsigned int passkey) in bt_conn_auth_passkey_entry() argument
2661 if (IS_ENABLED(CONFIG_BT_SMP) && conn->type == BT_CONN_TYPE_LE) { in bt_conn_auth_passkey_entry()
2662 bt_smp_auth_passkey_entry(conn, passkey); in bt_conn_auth_passkey_entry()
2667 if (conn->type == BT_CONN_TYPE_BR) { in bt_conn_auth_passkey_entry()
2669 if (!atomic_test_and_clear_bit(conn->flags, BT_CONN_USER)) { in bt_conn_auth_passkey_entry()
2673 if (conn->br.pairing_method == PASSKEY_INPUT) { in bt_conn_auth_passkey_entry()
2674 return ssp_passkey_reply(conn, passkey); in bt_conn_auth_passkey_entry()
2682 int bt_conn_auth_passkey_confirm(struct bt_conn *conn) in bt_conn_auth_passkey_confirm() argument
2689 conn->type == BT_CONN_TYPE_LE) { in bt_conn_auth_passkey_confirm()
2690 return bt_smp_auth_passkey_confirm(conn); in bt_conn_auth_passkey_confirm()
2694 if (conn->type == BT_CONN_TYPE_BR) { in bt_conn_auth_passkey_confirm()
2696 if (!atomic_test_and_clear_bit(conn->flags, BT_CONN_USER)) { in bt_conn_auth_passkey_confirm()
2700 return ssp_confirm_reply(conn); in bt_conn_auth_passkey_confirm()
2707 int bt_conn_auth_cancel(struct bt_conn *conn) in bt_conn_auth_cancel() argument
2713 if (IS_ENABLED(CONFIG_BT_SMP) && conn->type == BT_CONN_TYPE_LE) { in bt_conn_auth_cancel()
2714 return bt_smp_auth_cancel(conn); in bt_conn_auth_cancel()
2718 if (conn->type == BT_CONN_TYPE_BR) { in bt_conn_auth_cancel()
2720 if (!atomic_test_and_clear_bit(conn->flags, BT_CONN_USER)) { in bt_conn_auth_cancel()
2724 switch (conn->br.pairing_method) { in bt_conn_auth_cancel()
2727 return ssp_confirm_neg_reply(conn); in bt_conn_auth_cancel()
2729 return ssp_passkey_neg_reply(conn); in bt_conn_auth_cancel()
2731 return bt_conn_disconnect(conn, in bt_conn_auth_cancel()
2734 return pin_code_neg_reply(&conn->br.dst); in bt_conn_auth_cancel()
2744 int bt_conn_auth_pairing_confirm(struct bt_conn *conn) in bt_conn_auth_pairing_confirm() argument
2750 switch (conn->type) { in bt_conn_auth_pairing_confirm()
2753 return bt_smp_auth_pairing_confirm(conn); in bt_conn_auth_pairing_confirm()
2757 return ssp_confirm_reply(conn); in bt_conn_auth_pairing_confirm()
2765 u8_t bt_conn_index(struct bt_conn *conn) in bt_conn_index() argument
2767 u8_t index = conn - conns; in bt_conn_index()
2775 struct bt_conn *conn; in bt_conn_lookup_index() local
2781 conn = &conns[index]; in bt_conn_lookup_index()
2783 if (!atomic_get(&conn->ref)) { in bt_conn_lookup_index()
2787 return bt_conn_ref(conn); in bt_conn_lookup_index()
2815 struct bt_conn *conn = &conns[i]; in bt_conn_init() local
2817 if (!atomic_get(&conn->ref)) { in bt_conn_init()
2822 if (atomic_test_bit(conn->flags, in bt_conn_init()
2825 conn->id = BT_ID_DEFAULT; in bt_conn_init()
2826 bt_conn_set_state(conn, BT_CONN_CONNECT_SCAN); in bt_conn_init()