Lines Matching refs:session

156 		dlcs->session->dlcs = dlcs->_next;  in rfcomm_dlcs_remove_dlci()
190 struct bt_rfcomm_session *session = &bt_rfcomm_pool[i]; in rfcomm_sessions_lookup_bt_conn() local
192 if (session->br_chan.chan.conn == conn) { in rfcomm_sessions_lookup_bt_conn()
193 return session; in rfcomm_sessions_lookup_bt_conn()
256 dlc->session = NULL; in rfcomm_dlc_destroy()
286 k_sem_give(&dlc->session->fc); in rfcomm_dlc_disconnect()
294 static void rfcomm_session_disconnected(struct bt_rfcomm_session *session) in rfcomm_session_disconnected() argument
298 LOG_DBG("Session %p", session); in rfcomm_session_disconnected()
300 if (session->state == BT_RFCOMM_STATE_DISCONNECTED) { in rfcomm_session_disconnected()
304 for (dlc = session->dlcs; dlc;) { in rfcomm_session_disconnected()
316 session->state = BT_RFCOMM_STATE_DISCONNECTED; in rfcomm_session_disconnected()
317 session->dlcs = NULL; in rfcomm_session_disconnected()
330 static int rfcomm_send_cb(struct bt_rfcomm_session *session, struct net_buf *buf, in rfcomm_send_cb() argument
335 err = bt_l2cap_br_chan_send_cb(&session->br_chan.chan, buf, cb, user_data); in rfcomm_send_cb()
343 static int rfcomm_send(struct bt_rfcomm_session *session, struct net_buf *buf) in rfcomm_send() argument
345 return rfcomm_send_cb(session, buf, NULL, NULL); in rfcomm_send()
348 static int rfcomm_send_sabm(struct bt_rfcomm_session *session, uint8_t dlci) in rfcomm_send_sabm() argument
357 cr = BT_RFCOMM_CMD_CR(session->role); in rfcomm_send_sabm()
365 return rfcomm_send(session, buf); in rfcomm_send_sabm()
368 static int rfcomm_send_disc(struct bt_rfcomm_session *session, uint8_t dlci) in rfcomm_send_disc() argument
379 cr = BT_RFCOMM_RESP_CR(session->role); in rfcomm_send_disc()
386 return rfcomm_send(session, buf); in rfcomm_send_disc()
389 static void rfcomm_session_disconnect(struct bt_rfcomm_session *session) in rfcomm_session_disconnect() argument
391 if (session->dlcs) { in rfcomm_session_disconnect()
395 session->state = BT_RFCOMM_STATE_DISCONNECTING; in rfcomm_session_disconnect()
396 rfcomm_send_disc(session, 0); in rfcomm_session_disconnect()
397 k_work_reschedule(&session->rtx_work, RFCOMM_DISC_TIMEOUT); in rfcomm_session_disconnect()
400 static struct net_buf *rfcomm_make_uih_msg(struct bt_rfcomm_session *session, in rfcomm_make_uih_msg() argument
412 hdr_cr = BT_RFCOMM_UIH_CR(session->role); in rfcomm_make_uih_msg()
426 struct bt_rfcomm_session *session = RFCOMM_SESSION(chan); in rfcomm_connected() local
428 LOG_DBG("Session %p", session); in rfcomm_connected()
431 session->mtu = MIN(session->br_chan.rx.mtu, in rfcomm_connected()
432 session->br_chan.tx.mtu) - in rfcomm_connected()
435 if (session->state == BT_RFCOMM_STATE_CONNECTING) { in rfcomm_connected()
436 rfcomm_send_sabm(session, 0); in rfcomm_connected()
442 struct bt_rfcomm_session *session = RFCOMM_SESSION(chan); in rfcomm_disconnected() local
444 LOG_DBG("Session %p", session); in rfcomm_disconnected()
446 k_work_cancel_delayable(&session->rtx_work); in rfcomm_disconnected()
447 rfcomm_session_disconnected(session); in rfcomm_disconnected()
448 session->state = BT_RFCOMM_STATE_IDLE; in rfcomm_disconnected()
454 struct bt_rfcomm_session *session = dlc->session; in rfcomm_dlc_rtx_timeout() local
458 rfcomm_dlcs_remove_dlci(session->dlcs, dlc->dlci); in rfcomm_dlc_rtx_timeout()
460 rfcomm_session_disconnect(session); in rfcomm_dlc_rtx_timeout()
464 struct bt_rfcomm_session *session, in rfcomm_dlc_init() argument
471 dlc->session = session; in rfcomm_dlc_init()
480 dlc->_next = session->dlcs; in rfcomm_dlc_init()
481 session->dlcs = dlc; in rfcomm_dlc_init()
484 static struct bt_rfcomm_dlc *rfcomm_dlc_accept(struct bt_rfcomm_session *session, in rfcomm_dlc_accept() argument
498 if (server->accept(session->br_chan.chan.conn, server, &dlc) < 0) { in rfcomm_dlc_accept()
508 rfcomm_dlc_init(dlc, session, dlci, BT_RFCOMM_ROLE_ACCEPTOR); in rfcomm_dlc_accept()
509 dlc->mtu = MIN(dlc->mtu, session->mtu); in rfcomm_dlc_accept()
514 static int rfcomm_send_dm(struct bt_rfcomm_session *session, uint8_t dlci) in rfcomm_send_dm() argument
525 cr = BT_RFCOMM_RESP_CR(session->role); in rfcomm_send_dm()
533 return rfcomm_send(session, buf); in rfcomm_send_dm()
544 if (dlc->session->cfc == BT_RFCOMM_CFC_SUPPORTED) { in rfcomm_check_fc()
548 k_sem_take(&dlc->session->fc, K_FOREVER); in rfcomm_check_fc()
555 k_sem_give(&dlc->session->fc); in rfcomm_check_fc()
621 if (rfcomm_send_cb(dlc->session, buf, rfcomm_sent, dlc) < 0) { in rfcomm_dlc_tx_thread()
646 rfcomm_send_disc(dlc->session, dlc->dlci); in rfcomm_dlc_tx_thread()
655 static int rfcomm_send_ua(struct bt_rfcomm_session *session, uint8_t dlci) in rfcomm_send_ua() argument
664 cr = BT_RFCOMM_RESP_CR(session->role); in rfcomm_send_ua()
672 return rfcomm_send(session, buf); in rfcomm_send_ua()
682 buf = rfcomm_make_uih_msg(dlc->session, cr, BT_RFCOMM_MSC, in rfcomm_send_msc()
693 return rfcomm_send(dlc->session, buf); in rfcomm_send_msc()
703 buf = rfcomm_make_uih_msg(dlc->session, cr, BT_RFCOMM_RLS, in rfcomm_send_rls()
714 return rfcomm_send(dlc->session, buf); in rfcomm_send_rls()
717 static int rfcomm_send_rpn(struct bt_rfcomm_session *session, uint8_t cr, in rfcomm_send_rpn() argument
723 buf = rfcomm_make_uih_msg(session, cr, BT_RFCOMM_RPN, sizeof(*rpn)); in rfcomm_send_rpn()
730 return rfcomm_send(session, buf); in rfcomm_send_rpn()
733 static int rfcomm_send_test(struct bt_rfcomm_session *session, uint8_t cr, in rfcomm_send_test() argument
739 buf = rfcomm_make_uih_msg(session, cr, BT_RFCOMM_TEST, len); in rfcomm_send_test()
746 return rfcomm_send(session, buf); in rfcomm_send_test()
749 static int rfcomm_send_nsc(struct bt_rfcomm_session *session, uint8_t cmd_type) in rfcomm_send_nsc() argument
754 buf = rfcomm_make_uih_msg(session, BT_RFCOMM_MSG_RESP_CR, in rfcomm_send_nsc()
762 return rfcomm_send(session, buf); in rfcomm_send_nsc()
765 static int rfcomm_send_fcon(struct bt_rfcomm_session *session, uint8_t cr) in rfcomm_send_fcon() argument
770 buf = rfcomm_make_uih_msg(session, cr, BT_RFCOMM_FCON, 0); in rfcomm_send_fcon()
775 return rfcomm_send(session, buf); in rfcomm_send_fcon()
778 static int rfcomm_send_fcoff(struct bt_rfcomm_session *session, uint8_t cr) in rfcomm_send_fcoff() argument
783 buf = rfcomm_make_uih_msg(session, cr, BT_RFCOMM_FCOFF, 0); in rfcomm_send_fcoff()
788 return rfcomm_send(session, buf); in rfcomm_send_fcoff()
797 if (dlc->session->cfc == BT_RFCOMM_CFC_UNKNOWN) { in rfcomm_dlc_connected()
801 dlc->session->cfc = BT_RFCOMM_CFC_NOT_SUPPORTED; in rfcomm_dlc_connected()
804 if (dlc->session->cfc == BT_RFCOMM_CFC_NOT_SUPPORTED) { in rfcomm_dlc_connected()
806 rfcomm_send_fcon(dlc->session, BT_RFCOMM_MSG_CMD_CR); in rfcomm_dlc_connected()
834 struct bt_conn *conn = dlc->session->br_chan.chan.conn; in rfcomm_dlc_security()
867 rfcomm_dlcs_remove_dlci(dlc->session->dlcs, dlc->dlci); in rfcomm_dlc_drop()
878 rfcomm_send_dm(dlc->session, dlc->dlci); in rfcomm_dlc_close()
887 rfcomm_send_disc(dlc->session, dlc->dlci); in rfcomm_dlc_close()
915 static void rfcomm_handle_sabm(struct bt_rfcomm_session *session, uint8_t dlci) in rfcomm_handle_sabm() argument
918 if (rfcomm_send_ua(session, dlci) < 0) { in rfcomm_handle_sabm()
922 session->state = BT_RFCOMM_STATE_CONNECTED; in rfcomm_handle_sabm()
927 dlc = rfcomm_dlcs_lookup_dlci(session->dlcs, dlci); in rfcomm_handle_sabm()
929 dlc = rfcomm_dlc_accept(session, dlci); in rfcomm_handle_sabm()
931 rfcomm_send_dm(session, dlci); in rfcomm_handle_sabm()
945 rfcomm_send_dm(session, dlci); in rfcomm_handle_sabm()
950 if (rfcomm_send_ua(session, dlci) < 0) { in rfcomm_handle_sabm()
955 k_work_cancel_delayable(&session->rtx_work); in rfcomm_handle_sabm()
967 buf = rfcomm_make_uih_msg(dlc->session, cr, BT_RFCOMM_PN, sizeof(*pn)); in rfcomm_send_pn()
975 (dlc->session->cfc == BT_RFCOMM_CFC_UNKNOWN || in rfcomm_send_pn()
976 dlc->session->cfc == BT_RFCOMM_CFC_SUPPORTED)) { in rfcomm_send_pn()
997 return rfcomm_send(dlc->session, buf); in rfcomm_send_pn()
1011 cr = BT_RFCOMM_UIH_CR(dlc->session->role); in rfcomm_send_credit()
1020 return rfcomm_send(dlc->session, buf); in rfcomm_send_credit()
1032 dlc->mtu = MIN(dlc->mtu, dlc->session->mtu); in rfcomm_dlc_start()
1047 static void rfcomm_handle_ua(struct bt_rfcomm_session *session, uint8_t dlci) in rfcomm_handle_ua() argument
1053 switch (session->state) { in rfcomm_handle_ua()
1055 session->state = BT_RFCOMM_STATE_CONNECTED; in rfcomm_handle_ua()
1056 for (dlc = session->dlcs; dlc; dlc = next) { in rfcomm_handle_ua()
1066 rfcomm_session_disconnect(session); in rfcomm_handle_ua()
1069 session->state = BT_RFCOMM_STATE_DISCONNECTED; in rfcomm_handle_ua()
1071 k_work_cancel_delayable(&session->rtx_work); in rfcomm_handle_ua()
1072 err = bt_l2cap_chan_disconnect(&session->br_chan.chan); in rfcomm_handle_ua()
1074 session->state = BT_RFCOMM_STATE_IDLE; in rfcomm_handle_ua()
1081 dlc = rfcomm_dlcs_lookup_dlci(session->dlcs, dlci); in rfcomm_handle_ua()
1092 rfcomm_session_disconnect(session); in rfcomm_handle_ua()
1100 static void rfcomm_handle_dm(struct bt_rfcomm_session *session, uint8_t dlci) in rfcomm_handle_dm() argument
1106 dlc = rfcomm_dlcs_remove_dlci(session->dlcs, dlci); in rfcomm_handle_dm()
1112 rfcomm_session_disconnect(session); in rfcomm_handle_dm()
1115 static void rfcomm_handle_msc(struct bt_rfcomm_session *session, in rfcomm_handle_msc() argument
1124 dlc = rfcomm_dlcs_lookup_dlci(session->dlcs, dlci); in rfcomm_handle_msc()
1133 if (dlc->session->cfc == BT_RFCOMM_CFC_NOT_SUPPORTED) { in rfcomm_handle_msc()
1155 static void rfcomm_handle_rls(struct bt_rfcomm_session *session, in rfcomm_handle_rls() argument
1169 dlc = rfcomm_dlcs_lookup_dlci(session->dlcs, dlci); in rfcomm_handle_rls()
1178 static void rfcomm_handle_rpn(struct bt_rfcomm_session *session, in rfcomm_handle_rpn() argument
1197 rfcomm_send_rpn(session, BT_RFCOMM_MSG_RESP_CR, rpn); in rfcomm_handle_rpn()
1221 rfcomm_send_rpn(session, BT_RFCOMM_MSG_RESP_CR, &default_rpn); in rfcomm_handle_rpn()
1224 static void rfcomm_handle_pn(struct bt_rfcomm_session *session, in rfcomm_handle_pn() argument
1230 dlc = rfcomm_dlcs_lookup_dlci(session->dlcs, pn->dlci); in rfcomm_handle_pn()
1239 rfcomm_send_dm(session, pn->dlci); in rfcomm_handle_pn()
1243 dlc = rfcomm_dlc_accept(session, pn->dlci); in rfcomm_handle_pn()
1245 rfcomm_send_dm(session, pn->dlci); in rfcomm_handle_pn()
1254 if (session->cfc == BT_RFCOMM_CFC_UNKNOWN) { in rfcomm_handle_pn()
1255 session->cfc = BT_RFCOMM_CFC_SUPPORTED; in rfcomm_handle_pn()
1260 session->cfc = BT_RFCOMM_CFC_NOT_SUPPORTED; in rfcomm_handle_pn()
1266 k_work_cancel_delayable(&session->rtx_work); in rfcomm_handle_pn()
1284 if (session->cfc == BT_RFCOMM_CFC_UNKNOWN) { in rfcomm_handle_pn()
1285 session->cfc = BT_RFCOMM_CFC_SUPPORTED; in rfcomm_handle_pn()
1290 session->cfc = BT_RFCOMM_CFC_NOT_SUPPORTED; in rfcomm_handle_pn()
1294 rfcomm_send_sabm(session, dlc->dlci); in rfcomm_handle_pn()
1299 static void rfcomm_handle_disc(struct bt_rfcomm_session *session, uint8_t dlci) in rfcomm_handle_disc() argument
1306 dlc = rfcomm_dlcs_remove_dlci(session->dlcs, dlci); in rfcomm_handle_disc()
1308 rfcomm_send_dm(session, dlci); in rfcomm_handle_disc()
1312 rfcomm_send_ua(session, dlci); in rfcomm_handle_disc()
1315 if (!session->dlcs) { in rfcomm_handle_disc()
1317 k_work_reschedule(&dlc->session->rtx_work, in rfcomm_handle_disc()
1322 k_work_cancel_delayable(&session->rtx_work); in rfcomm_handle_disc()
1323 rfcomm_send_ua(session, 0); in rfcomm_handle_disc()
1324 rfcomm_session_disconnected(session); in rfcomm_handle_disc()
1328 static void rfcomm_handle_msg(struct bt_rfcomm_session *session, in rfcomm_handle_msg() argument
1348 rfcomm_handle_pn(session, buf, cr); in rfcomm_handle_msg()
1351 rfcomm_handle_msc(session, buf, cr); in rfcomm_handle_msg()
1354 rfcomm_handle_rls(session, buf, cr); in rfcomm_handle_msg()
1357 rfcomm_handle_rpn(session, buf, cr); in rfcomm_handle_msg()
1363 rfcomm_send_test(session, BT_RFCOMM_MSG_RESP_CR, buf->data, in rfcomm_handle_msg()
1367 if (session->cfc == BT_RFCOMM_CFC_SUPPORTED) { in rfcomm_handle_msg()
1379 k_sem_give(&session->fc); in rfcomm_handle_msg()
1380 rfcomm_send_fcon(session, BT_RFCOMM_MSG_RESP_CR); in rfcomm_handle_msg()
1383 if (session->cfc == BT_RFCOMM_CFC_SUPPORTED) { in rfcomm_handle_msg()
1398 k_sem_take(&session->fc, K_NO_WAIT); in rfcomm_handle_msg()
1399 rfcomm_send_fcoff(session, BT_RFCOMM_MSG_RESP_CR); in rfcomm_handle_msg()
1403 rfcomm_send_nsc(session, hdr->type); in rfcomm_handle_msg()
1412 if (dlc->session->cfc == BT_RFCOMM_CFC_NOT_SUPPORTED) { in rfcomm_dlc_update_credits()
1430 static void rfcomm_handle_data(struct bt_rfcomm_session *session, in rfcomm_handle_data() argument
1438 dlc = rfcomm_dlcs_lookup_dlci(session->dlcs, dlci); in rfcomm_handle_data()
1441 rfcomm_send_dm(session, dlci); in rfcomm_handle_data()
1460 if (dlc->session->cfc == BT_RFCOMM_CFC_SUPPORTED && in rfcomm_handle_data()
1508 cr = BT_RFCOMM_UIH_CR(dlc->session->role); in bt_rfcomm_dlc_send()
1521 struct bt_rfcomm_session *session = RFCOMM_SESSION(chan); in rfcomm_recv() local
1537 LOG_DBG("session %p dlci %x type %x", session, dlci, frame_type); in rfcomm_recv()
1564 rfcomm_handle_sabm(session, dlci); in rfcomm_recv()
1568 rfcomm_handle_msg(session, buf); in rfcomm_recv()
1570 rfcomm_handle_data(session, buf, dlci, BT_RFCOMM_GET_PF(hdr->control)); in rfcomm_recv()
1574 rfcomm_handle_disc(session, dlci); in rfcomm_recv()
1577 rfcomm_handle_ua(session, dlci); in rfcomm_recv()
1580 rfcomm_handle_dm(session, dlci); in rfcomm_recv()
1593 struct bt_rfcomm_session *session = RFCOMM_SESSION(chan); in rfcomm_encrypt_change() local
1597 LOG_DBG("session %p status 0x%02x encr 0x%02x", session, hci_status, conn->encrypt); in rfcomm_encrypt_change()
1599 for (dlc = session->dlcs; dlc; dlc = next) { in rfcomm_encrypt_change()
1613 rfcomm_send_ua(session, dlc->dlci); in rfcomm_encrypt_change()
1616 dlc->mtu = MIN(dlc->mtu, session->mtu); in rfcomm_encrypt_change()
1625 struct bt_rfcomm_session *session = SESSION_RTX(work); in rfcomm_session_rtx_timeout() local
1627 LOG_WRN("session %p state %d timeout", session, session->state); in rfcomm_session_rtx_timeout()
1629 switch (session->state) { in rfcomm_session_rtx_timeout()
1631 rfcomm_session_disconnect(session); in rfcomm_session_rtx_timeout()
1634 session->state = BT_RFCOMM_STATE_DISCONNECTED; in rfcomm_session_rtx_timeout()
1635 if (bt_l2cap_chan_disconnect(&session->br_chan.chan) < 0) { in rfcomm_session_rtx_timeout()
1636 session->state = BT_RFCOMM_STATE_IDLE; in rfcomm_session_rtx_timeout()
1653 struct bt_rfcomm_session *session = &bt_rfcomm_pool[i]; in rfcomm_session_new() local
1655 if (session->br_chan.chan.conn) { in rfcomm_session_new()
1659 LOG_DBG("session %p initialized", session); in rfcomm_session_new()
1661 session->br_chan.chan.ops = &ops; in rfcomm_session_new()
1662 session->br_chan.rx.mtu = CONFIG_BT_RFCOMM_L2CAP_MTU; in rfcomm_session_new()
1663 session->state = BT_RFCOMM_STATE_INIT; in rfcomm_session_new()
1664 session->role = role; in rfcomm_session_new()
1665 session->cfc = BT_RFCOMM_CFC_UNKNOWN; in rfcomm_session_new()
1666 k_work_init_delayable(&session->rtx_work, in rfcomm_session_new()
1668 k_sem_init(&session->fc, 0, 1); in rfcomm_session_new()
1670 return session; in rfcomm_session_new()
1679 struct bt_rfcomm_session *session; in bt_rfcomm_dlc_connect() local
1702 session = rfcomm_sessions_lookup_bt_conn(conn); in bt_rfcomm_dlc_connect()
1703 if (!session) { in bt_rfcomm_dlc_connect()
1704 session = rfcomm_session_new(BT_RFCOMM_ROLE_INITIATOR); in bt_rfcomm_dlc_connect()
1705 if (!session) { in bt_rfcomm_dlc_connect()
1710 dlci = BT_RFCOMM_DLCI(session->role, channel); in bt_rfcomm_dlc_connect()
1712 if (rfcomm_dlcs_lookup_dlci(session->dlcs, dlci)) { in bt_rfcomm_dlc_connect()
1716 rfcomm_dlc_init(dlc, session, dlci, BT_RFCOMM_ROLE_INITIATOR); in bt_rfcomm_dlc_connect()
1718 switch (session->state) { in bt_rfcomm_dlc_connect()
1720 if (session->role == BT_RFCOMM_ROLE_ACCEPTOR) { in bt_rfcomm_dlc_connect()
1724 chan = &session->br_chan.chan; in bt_rfcomm_dlc_connect()
1728 session->state = BT_RFCOMM_STATE_IDLE; in bt_rfcomm_dlc_connect()
1731 session->state = BT_RFCOMM_STATE_CONNECTING; in bt_rfcomm_dlc_connect()
1741 k_work_cancel_delayable(&session->rtx_work); in bt_rfcomm_dlc_connect()
1744 LOG_ERR("Invalid session state %d", session->state); in bt_rfcomm_dlc_connect()
1752 rfcomm_dlcs_remove_dlci(session->dlcs, dlc->dlci); in bt_rfcomm_dlc_connect()
1754 dlc->session = NULL; in bt_rfcomm_dlc_connect()
1787 struct bt_rfcomm_session *session; in rfcomm_accept() local
1791 session = rfcomm_session_new(BT_RFCOMM_ROLE_ACCEPTOR); in rfcomm_accept()
1792 if (session) { in rfcomm_accept()
1793 *chan = &session->br_chan.chan; in rfcomm_accept()