Lines Matching refs:dlc
226 static void rfcomm_dlc_tx_give_credits(struct bt_rfcomm_dlc *dlc, in rfcomm_dlc_tx_give_credits() argument
229 BT_DBG("dlc %p credits %u", dlc, credits); in rfcomm_dlc_tx_give_credits()
232 k_sem_give(&dlc->tx_credits); in rfcomm_dlc_tx_give_credits()
235 BT_DBG("dlc %p updated credits %u", dlc, in rfcomm_dlc_tx_give_credits()
236 k_sem_count_get(&dlc->tx_credits)); in rfcomm_dlc_tx_give_credits()
239 static void rfcomm_dlc_destroy(struct bt_rfcomm_dlc *dlc) in rfcomm_dlc_destroy() argument
241 BT_DBG("dlc %p", dlc); in rfcomm_dlc_destroy()
243 k_delayed_work_cancel(&dlc->rtx_work); in rfcomm_dlc_destroy()
244 dlc->state = BT_RFCOMM_STATE_IDLE; in rfcomm_dlc_destroy()
245 dlc->session = NULL; in rfcomm_dlc_destroy()
247 if (dlc->ops && dlc->ops->disconnected) { in rfcomm_dlc_destroy()
248 dlc->ops->disconnected(dlc); in rfcomm_dlc_destroy()
252 static void rfcomm_dlc_disconnect(struct bt_rfcomm_dlc *dlc) in rfcomm_dlc_disconnect() argument
254 u8_t old_state = dlc->state; in rfcomm_dlc_disconnect()
256 BT_DBG("dlc %p", dlc); in rfcomm_dlc_disconnect()
258 if (dlc->state == BT_RFCOMM_STATE_DISCONNECTED) { in rfcomm_dlc_disconnect()
262 dlc->state = BT_RFCOMM_STATE_DISCONNECTED; in rfcomm_dlc_disconnect()
269 net_buf_put(&dlc->tx_queue, in rfcomm_dlc_disconnect()
275 rfcomm_dlc_tx_give_credits(dlc, 1); in rfcomm_dlc_disconnect()
276 k_sem_give(&dlc->session->fc); in rfcomm_dlc_disconnect()
279 rfcomm_dlc_destroy(dlc); in rfcomm_dlc_disconnect()
286 struct bt_rfcomm_dlc *dlc; in rfcomm_session_disconnected() local
294 for (dlc = session->dlcs; dlc;) { in rfcomm_session_disconnected()
298 next = dlc->_next; in rfcomm_session_disconnected()
299 dlc->_next = NULL; in rfcomm_session_disconnected()
301 rfcomm_dlc_disconnect(dlc); in rfcomm_session_disconnected()
303 dlc = next; in rfcomm_session_disconnected()
425 struct bt_rfcomm_dlc *dlc = DLC_RTX(work); in rfcomm_dlc_rtx_timeout() local
426 struct bt_rfcomm_session *session = dlc->session; in rfcomm_dlc_rtx_timeout()
428 BT_WARN("dlc %p state %d timeout", dlc, dlc->state); in rfcomm_dlc_rtx_timeout()
430 rfcomm_dlcs_remove_dlci(session->dlcs, dlc->dlci); in rfcomm_dlc_rtx_timeout()
431 rfcomm_dlc_disconnect(dlc); in rfcomm_dlc_rtx_timeout()
435 static void rfcomm_dlc_init(struct bt_rfcomm_dlc *dlc, in rfcomm_dlc_init() argument
440 BT_DBG("dlc %p", dlc); in rfcomm_dlc_init()
442 dlc->dlci = dlci; in rfcomm_dlc_init()
443 dlc->session = session; in rfcomm_dlc_init()
444 dlc->rx_credit = RFCOMM_DEFAULT_CREDIT; in rfcomm_dlc_init()
445 dlc->state = BT_RFCOMM_STATE_INIT; in rfcomm_dlc_init()
446 dlc->role = role; in rfcomm_dlc_init()
447 k_delayed_work_init(&dlc->rtx_work, rfcomm_dlc_rtx_timeout); in rfcomm_dlc_init()
450 k_delayed_work_submit(&dlc->rtx_work, RFCOMM_CONN_TIMEOUT); in rfcomm_dlc_init()
452 dlc->_next = session->dlcs; in rfcomm_dlc_init()
453 session->dlcs = dlc; in rfcomm_dlc_init()
460 struct bt_rfcomm_dlc *dlc; in rfcomm_dlc_accept() local
470 if (server->accept(session->br_chan.chan.conn, &dlc) < 0) { in rfcomm_dlc_accept()
475 if (!BT_RFCOMM_CHECK_MTU(dlc->mtu)) { in rfcomm_dlc_accept()
476 rfcomm_dlc_destroy(dlc); in rfcomm_dlc_accept()
480 rfcomm_dlc_init(dlc, session, dlci, BT_RFCOMM_ROLE_ACCEPTOR); in rfcomm_dlc_accept()
481 dlc->mtu = MIN(dlc->mtu, session->mtu); in rfcomm_dlc_accept()
483 return dlc; in rfcomm_dlc_accept()
508 static void rfcomm_check_fc(struct bt_rfcomm_dlc *dlc) in rfcomm_check_fc() argument
510 BT_DBG("%p", dlc); in rfcomm_check_fc()
512 BT_DBG("Wait for credits or MSC FC %p", dlc); in rfcomm_check_fc()
514 k_sem_take(&dlc->tx_credits, K_FOREVER); in rfcomm_check_fc()
516 if (dlc->session->cfc == BT_RFCOMM_CFC_SUPPORTED) { in rfcomm_check_fc()
520 k_sem_take(&dlc->session->fc, K_FOREVER); in rfcomm_check_fc()
527 k_sem_give(&dlc->session->fc); in rfcomm_check_fc()
528 k_sem_give(&dlc->tx_credits); in rfcomm_check_fc()
533 struct bt_rfcomm_dlc *dlc = p1; in rfcomm_dlc_tx_thread() local
537 BT_DBG("Started for dlc %p", dlc); in rfcomm_dlc_tx_thread()
539 while (dlc->state == BT_RFCOMM_STATE_CONNECTED || in rfcomm_dlc_tx_thread()
540 dlc->state == BT_RFCOMM_STATE_USER_DISCONNECT) { in rfcomm_dlc_tx_thread()
542 BT_DBG("Wait for buf %p", dlc); in rfcomm_dlc_tx_thread()
543 buf = net_buf_get(&dlc->tx_queue, timeout); in rfcomm_dlc_tx_thread()
545 if ((dlc->state != BT_RFCOMM_STATE_CONNECTED && in rfcomm_dlc_tx_thread()
546 dlc->state != BT_RFCOMM_STATE_USER_DISCONNECT) || in rfcomm_dlc_tx_thread()
554 rfcomm_check_fc(dlc); in rfcomm_dlc_tx_thread()
555 if (dlc->state != BT_RFCOMM_STATE_CONNECTED && in rfcomm_dlc_tx_thread()
556 dlc->state != BT_RFCOMM_STATE_USER_DISCONNECT) { in rfcomm_dlc_tx_thread()
561 if (bt_l2cap_chan_send(&dlc->session->br_chan.chan, buf) < 0) { in rfcomm_dlc_tx_thread()
563 dlc->state = BT_RFCOMM_STATE_DISCONNECTED; in rfcomm_dlc_tx_thread()
568 if (dlc->state == BT_RFCOMM_STATE_USER_DISCONNECT) { in rfcomm_dlc_tx_thread()
573 BT_DBG("dlc %p disconnected - cleaning up", dlc); in rfcomm_dlc_tx_thread()
576 while ((buf = net_buf_get(&dlc->tx_queue, K_NO_WAIT))) { in rfcomm_dlc_tx_thread()
580 if (dlc->state == BT_RFCOMM_STATE_USER_DISCONNECT) { in rfcomm_dlc_tx_thread()
581 dlc->state = BT_RFCOMM_STATE_DISCONNECTING; in rfcomm_dlc_tx_thread()
584 if (dlc->state == BT_RFCOMM_STATE_DISCONNECTING) { in rfcomm_dlc_tx_thread()
585 rfcomm_send_disc(dlc->session, dlc->dlci); in rfcomm_dlc_tx_thread()
586 k_delayed_work_submit(&dlc->rtx_work, RFCOMM_DISC_TIMEOUT); in rfcomm_dlc_tx_thread()
588 rfcomm_dlc_destroy(dlc); in rfcomm_dlc_tx_thread()
591 BT_DBG("dlc %p exiting", dlc); in rfcomm_dlc_tx_thread()
614 static int rfcomm_send_msc(struct bt_rfcomm_dlc *dlc, u8_t cr, in rfcomm_send_msc() argument
621 buf = rfcomm_make_uih_msg(dlc->session, cr, BT_RFCOMM_MSC, in rfcomm_send_msc()
626 msc->dlci = BT_RFCOMM_SET_ADDR(dlc->dlci, 1); in rfcomm_send_msc()
632 return bt_l2cap_chan_send(&dlc->session->br_chan.chan, buf); in rfcomm_send_msc()
635 static int rfcomm_send_rls(struct bt_rfcomm_dlc *dlc, u8_t cr, in rfcomm_send_rls() argument
642 buf = rfcomm_make_uih_msg(dlc->session, cr, BT_RFCOMM_RLS, in rfcomm_send_rls()
647 rls->dlci = BT_RFCOMM_SET_ADDR(dlc->dlci, 1); in rfcomm_send_rls()
653 return bt_l2cap_chan_send(&dlc->session->br_chan.chan, buf); in rfcomm_send_rls()
730 static void rfcomm_dlc_connected(struct bt_rfcomm_dlc *dlc) in rfcomm_dlc_connected() argument
732 dlc->state = BT_RFCOMM_STATE_CONNECTED; in rfcomm_dlc_connected()
734 rfcomm_send_msc(dlc, BT_RFCOMM_MSG_CMD_CR, BT_RFCOMM_DEFAULT_V24_SIG); in rfcomm_dlc_connected()
736 if (dlc->session->cfc == BT_RFCOMM_CFC_UNKNOWN) { in rfcomm_dlc_connected()
740 dlc->session->cfc = BT_RFCOMM_CFC_NOT_SUPPORTED; in rfcomm_dlc_connected()
743 if (dlc->session->cfc == BT_RFCOMM_CFC_NOT_SUPPORTED) { in rfcomm_dlc_connected()
744 BT_DBG("CFC not supported %p", dlc); in rfcomm_dlc_connected()
745 rfcomm_send_fcon(dlc->session, BT_RFCOMM_MSG_CMD_CR); in rfcomm_dlc_connected()
747 k_sem_init(&dlc->tx_credits, 0, 1); in rfcomm_dlc_connected()
751 k_delayed_work_cancel(&dlc->rtx_work); in rfcomm_dlc_connected()
753 k_fifo_init(&dlc->tx_queue); in rfcomm_dlc_connected()
754 k_thread_create(&dlc->tx_thread, dlc->stack, in rfcomm_dlc_connected()
755 K_THREAD_STACK_SIZEOF(dlc->stack), in rfcomm_dlc_connected()
756 rfcomm_dlc_tx_thread, dlc, NULL, NULL, K_PRIO_COOP(7), in rfcomm_dlc_connected()
758 k_thread_name_set(&dlc->tx_thread, "BT DLC"); in rfcomm_dlc_connected()
760 if (dlc->ops && dlc->ops->connected) { in rfcomm_dlc_connected()
761 dlc->ops->connected(dlc); in rfcomm_dlc_connected()
771 static enum security_result rfcomm_dlc_security(struct bt_rfcomm_dlc *dlc) in rfcomm_dlc_security() argument
773 struct bt_conn *conn = dlc->session->br_chan.chan.conn; in rfcomm_dlc_security()
775 BT_DBG("dlc %p", dlc); in rfcomm_dlc_security()
782 if (conn->sec_level >= dlc->required_sec_level) { in rfcomm_dlc_security()
786 if (!bt_conn_set_security(conn, dlc->required_sec_level)) { in rfcomm_dlc_security()
795 static void rfcomm_dlc_drop(struct bt_rfcomm_dlc *dlc) in rfcomm_dlc_drop() argument
797 BT_DBG("dlc %p", dlc); in rfcomm_dlc_drop()
799 rfcomm_dlcs_remove_dlci(dlc->session->dlcs, dlc->dlci); in rfcomm_dlc_drop()
800 rfcomm_dlc_destroy(dlc); in rfcomm_dlc_drop()
803 static int rfcomm_dlc_close(struct bt_rfcomm_dlc *dlc) in rfcomm_dlc_close() argument
805 BT_DBG("dlc %p", dlc); in rfcomm_dlc_close()
807 switch (dlc->state) { in rfcomm_dlc_close()
809 if (dlc->role == BT_RFCOMM_ROLE_ACCEPTOR) { in rfcomm_dlc_close()
810 rfcomm_send_dm(dlc->session, dlc->dlci); in rfcomm_dlc_close()
814 rfcomm_dlc_drop(dlc); in rfcomm_dlc_close()
818 dlc->state = BT_RFCOMM_STATE_DISCONNECTING; in rfcomm_dlc_close()
819 rfcomm_send_disc(dlc->session, dlc->dlci); in rfcomm_dlc_close()
820 k_delayed_work_submit(&dlc->rtx_work, RFCOMM_DISC_TIMEOUT); in rfcomm_dlc_close()
823 dlc->state = BT_RFCOMM_STATE_DISCONNECTING; in rfcomm_dlc_close()
828 net_buf_put(&dlc->tx_queue, in rfcomm_dlc_close()
834 rfcomm_dlc_tx_give_credits(dlc, 1); in rfcomm_dlc_close()
856 struct bt_rfcomm_dlc *dlc; in rfcomm_handle_sabm() local
859 dlc = rfcomm_dlcs_lookup_dlci(session->dlcs, dlci); in rfcomm_handle_sabm()
860 if (!dlc) { in rfcomm_handle_sabm()
861 dlc = rfcomm_dlc_accept(session, dlci); in rfcomm_handle_sabm()
862 if (!dlc) { in rfcomm_handle_sabm()
868 result = rfcomm_dlc_security(dlc); in rfcomm_handle_sabm()
871 dlc->state = BT_RFCOMM_STATE_SECURITY_PENDING; in rfcomm_handle_sabm()
878 rfcomm_dlc_drop(dlc); in rfcomm_handle_sabm()
889 rfcomm_dlc_connected(dlc); in rfcomm_handle_sabm()
893 static int rfcomm_send_pn(struct bt_rfcomm_dlc *dlc, u8_t cr) in rfcomm_send_pn() argument
899 buf = rfcomm_make_uih_msg(dlc->session, cr, BT_RFCOMM_PN, sizeof(*pn)); in rfcomm_send_pn()
901 BT_DBG("mtu %x", dlc->mtu); in rfcomm_send_pn()
904 pn->dlci = dlc->dlci; in rfcomm_send_pn()
905 pn->mtu = sys_cpu_to_le16(dlc->mtu); in rfcomm_send_pn()
906 if (dlc->state == BT_RFCOMM_STATE_CONFIG && in rfcomm_send_pn()
907 (dlc->session->cfc == BT_RFCOMM_CFC_UNKNOWN || in rfcomm_send_pn()
908 dlc->session->cfc == BT_RFCOMM_CFC_SUPPORTED)) { in rfcomm_send_pn()
909 pn->credits = dlc->rx_credit; in rfcomm_send_pn()
929 return bt_l2cap_chan_send(&dlc->session->br_chan.chan, buf); in rfcomm_send_pn()
932 static int rfcomm_send_credit(struct bt_rfcomm_dlc *dlc, u8_t credits) in rfcomm_send_credit() argument
938 BT_DBG("Dlc %p credits %d", dlc, credits); in rfcomm_send_credit()
943 cr = BT_RFCOMM_UIH_CR(dlc->session->role); in rfcomm_send_credit()
944 hdr->address = BT_RFCOMM_SET_ADDR(dlc->dlci, cr); in rfcomm_send_credit()
952 return bt_l2cap_chan_send(&dlc->session->br_chan.chan, buf); in rfcomm_send_credit()
955 static int rfcomm_dlc_start(struct bt_rfcomm_dlc *dlc) in rfcomm_dlc_start() argument
959 BT_DBG("dlc %p", dlc); in rfcomm_dlc_start()
961 result = rfcomm_dlc_security(dlc); in rfcomm_dlc_start()
964 dlc->mtu = MIN(dlc->mtu, dlc->session->mtu); in rfcomm_dlc_start()
965 dlc->state = BT_RFCOMM_STATE_CONFIG; in rfcomm_dlc_start()
966 rfcomm_send_pn(dlc, BT_RFCOMM_MSG_CMD_CR); in rfcomm_dlc_start()
969 dlc->state = BT_RFCOMM_STATE_SECURITY_PENDING; in rfcomm_dlc_start()
981 struct bt_rfcomm_dlc *dlc, *next; in rfcomm_handle_ua() local
988 for (dlc = session->dlcs; dlc; dlc = next) { in rfcomm_handle_ua()
989 next = dlc->_next; in rfcomm_handle_ua()
990 if (dlc->role == BT_RFCOMM_ROLE_INITIATOR && in rfcomm_handle_ua()
991 dlc->state == BT_RFCOMM_STATE_INIT) { in rfcomm_handle_ua()
992 if (rfcomm_dlc_start(dlc) < 0) { in rfcomm_handle_ua()
993 rfcomm_dlc_drop(dlc); in rfcomm_handle_ua()
1013 dlc = rfcomm_dlcs_lookup_dlci(session->dlcs, dlci); in rfcomm_handle_ua()
1014 if (!dlc) { in rfcomm_handle_ua()
1018 switch (dlc->state) { in rfcomm_handle_ua()
1020 rfcomm_dlc_connected(dlc); in rfcomm_handle_ua()
1023 rfcomm_dlc_drop(dlc); in rfcomm_handle_ua()
1034 struct bt_rfcomm_dlc *dlc; in rfcomm_handle_dm() local
1038 dlc = rfcomm_dlcs_remove_dlci(session->dlcs, dlci); in rfcomm_handle_dm()
1039 if (!dlc) { in rfcomm_handle_dm()
1043 rfcomm_dlc_disconnect(dlc); in rfcomm_handle_dm()
1051 struct bt_rfcomm_dlc *dlc; in rfcomm_handle_msc() local
1056 dlc = rfcomm_dlcs_lookup_dlci(session->dlcs, dlci); in rfcomm_handle_msc()
1057 if (!dlc) { in rfcomm_handle_msc()
1065 if (dlc->session->cfc == BT_RFCOMM_CFC_NOT_SUPPORTED) { in rfcomm_handle_msc()
1075 k_sem_take(&dlc->tx_credits, K_NO_WAIT); in rfcomm_handle_msc()
1080 k_sem_give(&dlc->tx_credits); in rfcomm_handle_msc()
1084 rfcomm_send_msc(dlc, BT_RFCOMM_MSG_RESP_CR, msc->v24_signal); in rfcomm_handle_msc()
1092 struct bt_rfcomm_dlc *dlc; in rfcomm_handle_rls() local
1101 dlc = rfcomm_dlcs_lookup_dlci(session->dlcs, dlci); in rfcomm_handle_rls()
1102 if (!dlc) { in rfcomm_handle_rls()
1107 rfcomm_send_rls(dlc, BT_RFCOMM_MSG_RESP_CR, rls->line_status); in rfcomm_handle_rls()
1160 struct bt_rfcomm_dlc *dlc; in rfcomm_handle_pn() local
1162 dlc = rfcomm_dlcs_lookup_dlci(session->dlcs, pn->dlci); in rfcomm_handle_pn()
1163 if (!dlc) { in rfcomm_handle_pn()
1175 dlc = rfcomm_dlc_accept(session, pn->dlci); in rfcomm_handle_pn()
1176 if (!dlc) { in rfcomm_handle_pn()
1181 BT_DBG("Incoming connection accepted dlc %p", dlc); in rfcomm_handle_pn()
1183 dlc->mtu = MIN(dlc->mtu, sys_le16_to_cpu(pn->mtu)); in rfcomm_handle_pn()
1189 k_sem_init(&dlc->tx_credits, 0, UINT32_MAX); in rfcomm_handle_pn()
1190 rfcomm_dlc_tx_give_credits(dlc, pn->credits); in rfcomm_handle_pn()
1195 dlc->state = BT_RFCOMM_STATE_CONFIG; in rfcomm_handle_pn()
1196 rfcomm_send_pn(dlc, BT_RFCOMM_MSG_RESP_CR); in rfcomm_handle_pn()
1204 rfcomm_dlc_close(dlc); in rfcomm_handle_pn()
1207 dlc->mtu = MIN(dlc->mtu, sys_le16_to_cpu(pn->mtu)); in rfcomm_handle_pn()
1208 rfcomm_send_pn(dlc, BT_RFCOMM_MSG_RESP_CR); in rfcomm_handle_pn()
1210 if (dlc->state != BT_RFCOMM_STATE_CONFIG) { in rfcomm_handle_pn()
1214 dlc->mtu = MIN(dlc->mtu, sys_le16_to_cpu(pn->mtu)); in rfcomm_handle_pn()
1219 k_sem_init(&dlc->tx_credits, 0, UINT32_MAX); in rfcomm_handle_pn()
1220 rfcomm_dlc_tx_give_credits(dlc, pn->credits); in rfcomm_handle_pn()
1225 dlc->state = BT_RFCOMM_STATE_CONNECTING; in rfcomm_handle_pn()
1226 rfcomm_send_sabm(session, dlc->dlci); in rfcomm_handle_pn()
1233 struct bt_rfcomm_dlc *dlc; in rfcomm_handle_disc() local
1238 dlc = rfcomm_dlcs_remove_dlci(session->dlcs, dlci); in rfcomm_handle_disc()
1239 if (!dlc) { in rfcomm_handle_disc()
1245 rfcomm_dlc_disconnect(dlc); in rfcomm_handle_disc()
1249 k_delayed_work_submit(&dlc->session->rtx_work, in rfcomm_handle_disc()
1340 static void rfcomm_dlc_update_credits(struct bt_rfcomm_dlc *dlc) in rfcomm_dlc_update_credits() argument
1344 if (dlc->session->cfc == BT_RFCOMM_CFC_NOT_SUPPORTED) { in rfcomm_dlc_update_credits()
1348 BT_DBG("dlc %p credits %u", dlc, dlc->rx_credit); in rfcomm_dlc_update_credits()
1351 if (dlc->rx_credit > RFCOMM_CREDITS_THRESHOLD) { in rfcomm_dlc_update_credits()
1356 credits = RFCOMM_MAX_CREDITS - dlc->rx_credit; in rfcomm_dlc_update_credits()
1357 dlc->rx_credit += credits; in rfcomm_dlc_update_credits()
1359 rfcomm_send_credit(dlc, credits); in rfcomm_dlc_update_credits()
1366 struct bt_rfcomm_dlc *dlc; in rfcomm_handle_data() local
1370 dlc = rfcomm_dlcs_lookup_dlci(session->dlcs, dlci); in rfcomm_handle_data()
1371 if (!dlc) { in rfcomm_handle_data()
1377 BT_DBG("dlc %p rx credit %d", dlc, dlc->rx_credit); in rfcomm_handle_data()
1379 if (dlc->state != BT_RFCOMM_STATE_CONNECTED) { in rfcomm_handle_data()
1384 rfcomm_dlc_tx_give_credits(dlc, net_buf_pull_u8(buf)); in rfcomm_handle_data()
1388 if (dlc->session->cfc == BT_RFCOMM_CFC_SUPPORTED && in rfcomm_handle_data()
1389 !dlc->rx_credit) { in rfcomm_handle_data()
1391 rfcomm_dlc_close(dlc); in rfcomm_handle_data()
1397 if (dlc->ops && dlc->ops->recv) { in rfcomm_handle_data()
1398 dlc->ops->recv(dlc, buf); in rfcomm_handle_data()
1401 dlc->rx_credit--; in rfcomm_handle_data()
1402 rfcomm_dlc_update_credits(dlc); in rfcomm_handle_data()
1406 int bt_rfcomm_dlc_send(struct bt_rfcomm_dlc *dlc, struct net_buf *buf) in bt_rfcomm_dlc_send() argument
1415 BT_DBG("dlc %p tx credit %d", dlc, k_sem_count_get(&dlc->tx_credits)); in bt_rfcomm_dlc_send()
1417 if (dlc->state != BT_RFCOMM_STATE_CONNECTED) { in bt_rfcomm_dlc_send()
1421 if (buf->len > dlc->mtu) { in bt_rfcomm_dlc_send()
1438 cr = BT_RFCOMM_UIH_CR(dlc->session->role); in bt_rfcomm_dlc_send()
1439 hdr->address = BT_RFCOMM_SET_ADDR(dlc->dlci, cr); in bt_rfcomm_dlc_send()
1446 net_buf_put(&dlc->tx_queue, buf); in bt_rfcomm_dlc_send()
1517 struct bt_rfcomm_dlc *dlc, *next; in rfcomm_encrypt_change() local
1522 for (dlc = session->dlcs; dlc; dlc = next) { in rfcomm_encrypt_change()
1523 next = dlc->_next; in rfcomm_encrypt_change()
1525 if (dlc->state != BT_RFCOMM_STATE_SECURITY_PENDING) { in rfcomm_encrypt_change()
1530 conn->sec_level < dlc->required_sec_level) { in rfcomm_encrypt_change()
1531 rfcomm_dlc_close(dlc); in rfcomm_encrypt_change()
1535 if (dlc->role == BT_RFCOMM_ROLE_ACCEPTOR) { in rfcomm_encrypt_change()
1536 rfcomm_send_ua(session, dlc->dlci); in rfcomm_encrypt_change()
1537 rfcomm_dlc_connected(dlc); in rfcomm_encrypt_change()
1539 dlc->mtu = MIN(dlc->mtu, session->mtu); in rfcomm_encrypt_change()
1540 dlc->state = BT_RFCOMM_STATE_CONFIG; in rfcomm_encrypt_change()
1541 rfcomm_send_pn(dlc, BT_RFCOMM_MSG_CMD_CR); in rfcomm_encrypt_change()
1599 int bt_rfcomm_dlc_connect(struct bt_conn *conn, struct bt_rfcomm_dlc *dlc, in bt_rfcomm_dlc_connect() argument
1607 BT_DBG("conn %p dlc %p channel %d", conn, dlc, channel); in bt_rfcomm_dlc_connect()
1609 if (!dlc) { in bt_rfcomm_dlc_connect()
1621 if (!BT_RFCOMM_CHECK_MTU(dlc->mtu)) { in bt_rfcomm_dlc_connect()
1639 rfcomm_dlc_init(dlc, session, dlci, BT_RFCOMM_ROLE_INITIATOR); in bt_rfcomm_dlc_connect()
1648 chan->required_sec_level = dlc->required_sec_level; in bt_rfcomm_dlc_connect()
1659 ret = rfcomm_dlc_start(dlc); in bt_rfcomm_dlc_connect()
1675 rfcomm_dlcs_remove_dlci(session->dlcs, dlc->dlci); in bt_rfcomm_dlc_connect()
1676 dlc->state = BT_RFCOMM_STATE_IDLE; in bt_rfcomm_dlc_connect()
1677 dlc->session = NULL; in bt_rfcomm_dlc_connect()
1681 int bt_rfcomm_dlc_disconnect(struct bt_rfcomm_dlc *dlc) in bt_rfcomm_dlc_disconnect() argument
1683 BT_DBG("dlc %p", dlc); in bt_rfcomm_dlc_disconnect()
1685 if (!dlc) { in bt_rfcomm_dlc_disconnect()
1689 if (dlc->state == BT_RFCOMM_STATE_CONNECTED) { in bt_rfcomm_dlc_disconnect()
1695 dlc->state = BT_RFCOMM_STATE_USER_DISCONNECT; in bt_rfcomm_dlc_disconnect()
1696 net_buf_put(&dlc->tx_queue, in bt_rfcomm_dlc_disconnect()
1699 k_delayed_work_submit(&dlc->rtx_work, RFCOMM_DISC_TIMEOUT); in bt_rfcomm_dlc_disconnect()
1704 return rfcomm_dlc_close(dlc); in bt_rfcomm_dlc_disconnect()