Lines Matching refs:conn

118 static void lp_comm_ntf(struct ll_conn *conn, struct proc_ctx *ctx);
119 static void lp_comm_terminate_invalid_pdu(struct ll_conn *conn, struct proc_ctx *ctx);
155 static void lp_comm_tx(struct ll_conn *conn, struct proc_ctx *ctx) in lp_comm_tx() argument
161 tx = llcp_tx_alloc(conn, ctx); in lp_comm_tx()
175 llcp_pdu_encode_feature_req(conn, pdu); in lp_comm_tx()
203 llcp_pdu_encode_length_req(conn, pdu); in lp_comm_tx()
227 llcp_tx_enqueue(conn, tx); in lp_comm_tx()
232 llcp_lr_prt_restart(conn); in lp_comm_tx()
238 const uint32_t conn_interval_us = conn->lll.interval * CONN_INT_UNIT_US; in lp_comm_tx()
240 (conn->supervision_timeout * 10U * 1000U), in lp_comm_tx()
242 llcp_lr_prt_restart_with_value(conn, sto_reload); in lp_comm_tx()
246 static void lp_comm_ntf_feature_exchange(struct ll_conn *conn, struct proc_ctx *ctx, in lp_comm_ntf_feature_exchange() argument
251 llcp_ntf_encode_feature_rsp(conn, pdu); in lp_comm_ntf_feature_exchange()
262 static void lp_comm_ntf_version_ind(struct ll_conn *conn, struct proc_ctx *ctx, in lp_comm_ntf_version_ind() argument
267 llcp_ntf_encode_version_ind(conn, pdu); in lp_comm_ntf_version_ind()
276 static void lp_comm_ntf_length_change(struct ll_conn *conn, struct proc_ctx *ctx, in lp_comm_ntf_length_change() argument
279 llcp_ntf_encode_length_change(conn, pdu); in lp_comm_ntf_length_change()
285 static void lp_comm_complete_cte_req_finalize(struct ll_conn *conn) in lp_comm_complete_cte_req_finalize() argument
287 llcp_rr_set_paused_cmd(conn, PROC_NONE); in lp_comm_complete_cte_req_finalize()
288 llcp_lr_complete(conn); in lp_comm_complete_cte_req_finalize()
291 static void lp_comm_ntf_cte_req(struct ll_conn *conn, struct proc_ctx *ctx, struct pdu_data *pdu) in lp_comm_ntf_cte_req() argument
312 static void lp_comm_ntf_cte_req_tx(struct ll_conn *conn, struct proc_ctx *ctx) in lp_comm_ntf_cte_req_tx() argument
314 lp_comm_ntf(conn, ctx); in lp_comm_ntf_cte_req_tx()
315 ull_cp_cte_req_set_disable(conn); in lp_comm_ntf_cte_req_tx()
319 static void lp_comm_complete_cte_req(struct ll_conn *conn, struct proc_ctx *ctx) in lp_comm_complete_cte_req() argument
321 if (conn->llcp.cte_req.is_enabled) { in lp_comm_complete_cte_req()
324 if (conn->llcp.cte_req.req_interval != 0U) { in lp_comm_complete_cte_req()
325 conn->llcp.cte_req.req_expire = in lp_comm_complete_cte_req()
326 conn->llcp.cte_req.req_interval; in lp_comm_complete_cte_req()
331 conn->llcp.cte_req.is_enabled = 0U; in lp_comm_complete_cte_req()
335 lp_comm_ntf_cte_req_tx(conn, ctx); in lp_comm_complete_cte_req()
339 lp_comm_ntf_cte_req_tx(conn, ctx); in lp_comm_complete_cte_req()
345 feature_unmask_features(conn, LL_FEAT_BIT_CONNECTION_CTE_REQ); in lp_comm_complete_cte_req()
346 lp_comm_ntf_cte_req_tx(conn, ctx); in lp_comm_complete_cte_req()
353 ull_cp_cte_req_set_disable(conn); in lp_comm_complete_cte_req()
359 lp_comm_terminate_invalid_pdu(conn, ctx); in lp_comm_complete_cte_req()
369 lp_comm_complete_cte_req_finalize(conn); in lp_comm_complete_cte_req()
385 static void lp_comm_ntf(struct ll_conn *conn, struct proc_ctx *ctx) in lp_comm_ntf() argument
401 ntf->hdr.handle = conn->lll.handle; in lp_comm_ntf()
406 lp_comm_ntf_feature_exchange(conn, ctx, pdu); in lp_comm_ntf()
409 lp_comm_ntf_version_ind(conn, ctx, pdu); in lp_comm_ntf()
413 lp_comm_ntf_length_change(conn, ctx, pdu); in lp_comm_ntf()
418 lp_comm_ntf_cte_req(conn, ctx, pdu); in lp_comm_ntf()
441 static void lp_comm_terminate_invalid_pdu(struct ll_conn *conn, struct proc_ctx *ctx) in lp_comm_terminate_invalid_pdu() argument
445 conn->llcp_terminate.reason_final = BT_HCI_ERR_LMP_PDU_NOT_ALLOWED; in lp_comm_terminate_invalid_pdu()
446 llcp_lr_complete(conn); in lp_comm_terminate_invalid_pdu()
450 static void lp_comm_complete(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, void *param) in lp_comm_complete() argument
457 llcp_lr_complete(conn); in lp_comm_complete()
461 lp_comm_terminate_invalid_pdu(conn, ctx); in lp_comm_complete()
469 lp_comm_ntf(conn, ctx); in lp_comm_complete()
471 llcp_lr_complete(conn); in lp_comm_complete()
475 lp_comm_terminate_invalid_pdu(conn, ctx); in lp_comm_complete()
480 llcp_lr_complete(conn); in lp_comm_complete()
488 lp_comm_ntf(conn, ctx); in lp_comm_complete()
489 llcp_lr_complete(conn); in lp_comm_complete()
497 llcp_lr_prt_restart(conn); in lp_comm_complete()
502 lp_comm_terminate_invalid_pdu(conn, ctx); in lp_comm_complete()
507 llcp_lr_complete(conn); in lp_comm_complete()
511 conn->llcp_terminate.reason_final = BT_HCI_ERR_LOCALHOST_TERM_CONN; in lp_comm_complete()
516 llcp_lr_complete(conn); in lp_comm_complete()
524 uint8_t dle_changed = ull_dle_update_eff(conn); in lp_comm_complete()
527 lp_comm_ntf(conn, ctx); in lp_comm_complete()
529 llcp_lr_complete(conn); in lp_comm_complete()
533 feature_unmask_features(conn, LL_FEAT_BIT_DLE); in lp_comm_complete()
535 llcp_lr_complete(conn); in lp_comm_complete()
539 lp_comm_terminate_invalid_pdu(conn, ctx); in lp_comm_complete()
543 if (!ull_cp_remote_dle_pending(conn)) { in lp_comm_complete()
547 llcp_tx_resume_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_DATA_LENGTH); in lp_comm_complete()
553 lp_comm_complete_cte_req(conn, ctx); in lp_comm_complete()
561 feature_unmask_features(conn, LL_FEAT_BIT_SCA_UPDATE); in lp_comm_complete()
566 if (conn->lll.role == BT_HCI_ROLE_PERIPHERAL && in lp_comm_complete()
568 conn->periph.sca != ctx->data.sca_update.sca) { in lp_comm_complete()
569 conn->periph.sca = ctx->data.sca_update.sca; in lp_comm_complete()
570 ull_conn_update_peer_sca(conn); in lp_comm_complete()
572 ull_peripheral_iso_update_peer_sca(conn); in lp_comm_complete()
576 lp_comm_ntf(conn, ctx); in lp_comm_complete()
577 llcp_lr_complete(conn); in lp_comm_complete()
582 lp_comm_terminate_invalid_pdu(conn, ctx); in lp_comm_complete()
593 static bool lp_cis_terminated(struct ll_conn *conn) in lp_cis_terminated() argument
595 return conn->llcp.cis.terminate_ack; in lp_cis_terminated()
599 static bool lp_comm_tx_proxy(struct ll_conn *conn, struct proc_ctx *ctx, const bool extra_cond) in lp_comm_tx_proxy() argument
601 if (extra_cond || llcp_lr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) { in lp_comm_tx_proxy()
604 lp_comm_tx(conn, ctx); in lp_comm_tx_proxy()
614 static void lp_comm_send_req(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, void *param) argument
619 lp_comm_tx_proxy(conn, ctx, false);
623 lp_comm_tx_proxy(conn, ctx, false);
627 lp_comm_tx_proxy(conn, ctx, false);
634 if (!conn->llcp.vex.sent) {
635 if (lp_comm_tx_proxy(conn, ctx, false)) {
636 conn->llcp.vex.sent = 1;
642 lp_comm_complete(conn, ctx, evt, param);
646 if (!llcp_tx_alloc_peek(conn, ctx)) {
649 lp_comm_tx(conn, ctx);
656 lp_comm_tx_proxy(conn, ctx, !lp_cis_terminated(conn));
661 if (feature_dle(conn) && !ull_cp_remote_dle_pending(conn)) {
662 if (llcp_lr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
669 llcp_tx_pause_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_DATA_LENGTH);
670 lp_comm_tx(conn, ctx);
682 llcp_lr_complete(conn);
689 if (conn->llcp.cte_req.is_enabled &&
691 conn->lll.phy_rx != PHY_CODED) {
695 lp_comm_tx_proxy(conn, ctx,
696 llcp_rr_get_paused_cmd(conn) == PROC_CTE_REQ);
708 llcp_lr_complete(conn);
714 lp_comm_tx_proxy(conn, ctx, false);
723 static void lp_comm_st_idle(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, void *param) argument
733 conn->llcp.cis.terminate_ack = 0U;
738 lp_comm_send_req(conn, ctx, evt, param);
746 static void lp_comm_st_wait_tx(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, argument
751 lp_comm_send_req(conn, ctx, evt, param);
759 static void lp_comm_st_wait_tx_ack(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, argument
767 lp_comm_complete(conn, ctx, evt, param);
771 lp_comm_complete(conn, ctx, evt, param);
775 lp_comm_complete(conn, ctx, evt, param);
789 static void lp_comm_rx_decode(struct ll_conn *conn, struct proc_ctx *ctx, struct pdu_data *pdu) argument
800 llcp_pdu_decode_feature_rsp(conn, pdu);
803 if (feature_phy_coded(conn)) {
804 ull_dle_max_time_get(conn, &conn->lll.dle.local.max_rx_time,
805 &conn->lll.dle.local.max_tx_time);
815 llcp_pdu_decode_version_ind(conn, pdu);
826 llcp_pdu_decode_length_rsp(conn, pdu);
851 static void lp_comm_st_wait_rx(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, argument
856 lp_comm_rx_decode(conn, ctx, (struct pdu_data *)param);
857 lp_comm_complete(conn, ctx, evt, param);
865 static void lp_comm_st_wait_ntf_avail(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, argument
882 lp_comm_ntf(conn, ctx);
883 llcp_lr_complete(conn);
901 static void lp_comm_execute_fsm(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, argument
906 lp_comm_st_idle(conn, ctx, evt, param);
909 lp_comm_st_wait_tx(conn, ctx, evt, param);
912 lp_comm_st_wait_tx_ack(conn, ctx, evt, param);
915 lp_comm_st_wait_rx(conn, ctx, evt, param);
918 lp_comm_st_wait_ntf_avail(conn, ctx, evt, param);
926 void llcp_lp_comm_tx_ack(struct ll_conn *conn, struct proc_ctx *ctx, struct node_tx *tx) argument
928 lp_comm_execute_fsm(conn, ctx, LP_COMMON_EVT_ACK, tx->pdu);
931 void llcp_lp_comm_rx(struct ll_conn *conn, struct proc_ctx *ctx, struct node_rx_pdu *rx) argument
933 lp_comm_execute_fsm(conn, ctx, LP_COMMON_EVT_RESPONSE, rx->pdu);
936 void llcp_lp_comm_run(struct ll_conn *conn, struct proc_ctx *ctx, void *param) argument
938 lp_comm_execute_fsm(conn, ctx, LP_COMMON_EVT_RUN, param);
942 static void rp_comm_terminate(struct ll_conn *conn, struct proc_ctx *ctx) argument
944 llcp_rr_complete(conn);
948 conn->llcp_terminate.reason_final = ctx->data.term.error_code;
962 static void rp_comm_rx_decode(struct ll_conn *conn, struct proc_ctx *ctx, struct pdu_data *pdu) argument
980 llcp_pdu_decode_feature_req(conn, pdu);
983 if (feature_phy_coded(conn)) {
984 ull_dle_max_time_get(conn, &conn->lll.dle.local.max_rx_time,
985 &conn->lll.dle.local.max_tx_time);
992 llcp_pdu_decode_min_used_chans_ind(conn, pdu);
996 llcp_pdu_decode_version_ind(conn, pdu);
1001 llcp_tx_pause_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_TERMINATE);
1012 llcp_pdu_decode_length_req(conn, pdu);
1018 llcp_tx_pause_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_DATA_LENGTH);
1019 ctx->data.dle.ntf_dle = ull_dle_update_eff_rx(conn);
1041 static void rp_comm_tx(struct ll_conn *conn, struct proc_ctx *ctx) argument
1047 tx = llcp_tx_alloc(conn, ctx);
1061 llcp_pdu_encode_feature_rsp(conn, pdu);
1070 llcp_pdu_encode_length_rsp(conn, pdu);
1079 if (conn->llcp.cte_rsp.is_enabled == 0) {
1087 if (conn->lll.phy_tx == PHY_CODED) {
1091 if (!(conn->llcp.cte_rsp.cte_types & BIT(ctx->data.cte_remote_req.cte_type)) ||
1092 conn->llcp.cte_rsp.max_cte_len < ctx->data.cte_remote_req.min_cte_len) {
1124 llcp_tx_enqueue(conn, tx);
1127 llcp_rr_prt_restart(conn);
1130 static void rp_comm_st_idle(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, void *param) argument
1142 static void rp_comm_ntf(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t generate_ntf) argument
1160 ntf->hdr.handle = conn->lll.handle;
1163 llcp_ntf_encode_length_change(conn, pdu);
1171 static bool rp_comm_tx_proxy(struct ll_conn *conn, struct proc_ctx *ctx, const bool complete) argument
1173 if (llcp_rr_ispaused(conn) || !llcp_tx_alloc_peek(conn, ctx)) {
1178 rp_comm_tx(conn, ctx);
1181 llcp_rr_complete(conn);
1188 static void rp_comm_send_rsp(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, void *param) argument
1194 rp_comm_tx_proxy(conn, ctx, true);
1199 rp_comm_tx_proxy(conn, ctx, true);
1208 if (!conn->llcp.vex.sent) {
1209 if (rp_comm_tx_proxy(conn, ctx, true)) {
1210 conn->llcp.vex.sent = 1;
1217 llcp_rr_complete(conn);
1241 llcp_rr_complete(conn);
1247 if (conn->lll.role == BT_HCI_ROLE_CENTRAL) {
1257 rp_comm_terminate(conn, ctx);
1263 llcp_rr_complete(conn);
1270 rp_comm_tx_proxy(conn, ctx, false);
1275 if (llcp_rr_ispaused(conn) ||
1276 !llcp_tx_alloc_peek(conn, ctx) ||
1277 (llcp_rr_get_paused_cmd(conn) == PROC_CTE_REQ)) {
1280 llcp_rr_set_paused_cmd(conn, PROC_PHY_UPDATE);
1281 rp_comm_tx(conn, ctx);
1289 rp_comm_tx_proxy(conn, ctx, false);
1298 static void rp_comm_st_wait_rx(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, void *param) argument
1302 rp_comm_rx_decode(conn, ctx, (struct pdu_data *)param);
1303 rp_comm_send_rsp(conn, ctx, evt, param);
1311 static void rp_comm_st_postpone_terminate(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, argument
1322 rp_comm_terminate(conn, ctx);
1331 static void rp_comm_st_wait_tx(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, void *param) argument
1335 rp_comm_send_rsp(conn, ctx, evt, param);
1343 static void rp_comm_st_wait_tx_ack(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, argument
1352 uint8_t dle_changed = ull_dle_update_eff_tx(conn);
1355 llcp_tx_resume_data(conn, LLCP_TX_QUEUE_PAUSE_DATA_DATA_LENGTH);
1357 rp_comm_ntf(conn, ctx, dle_changed);
1358 llcp_rr_complete(conn);
1366 llcp_rr_set_paused_cmd(conn, PROC_NONE);
1367 llcp_rr_complete(conn);
1374 if (conn->lll.role == BT_HCI_ROLE_PERIPHERAL) {
1375 conn->periph.sca = ctx->data.sca_update.sca;
1376 ull_conn_update_peer_sca(conn);
1378 ull_peripheral_iso_update_peer_sca(conn);
1382 llcp_rr_complete(conn);
1397 static void rp_comm_execute_fsm(struct ll_conn *conn, struct proc_ctx *ctx, uint8_t evt, argument
1402 rp_comm_st_idle(conn, ctx, evt, param);
1405 rp_comm_st_wait_rx(conn, ctx, evt, param);
1408 rp_comm_st_postpone_terminate(conn, ctx, evt, param);
1411 rp_comm_st_wait_tx(conn, ctx, evt, param);
1414 rp_comm_st_wait_tx_ack(conn, ctx, evt, param);
1422 void llcp_rp_comm_rx(struct ll_conn *conn, struct proc_ctx *ctx, struct node_rx_pdu *rx) argument
1424 rp_comm_execute_fsm(conn, ctx, RP_COMMON_EVT_REQUEST, rx->pdu);
1427 void llcp_rp_comm_tx_ack(struct ll_conn *conn, struct proc_ctx *ctx, struct node_tx *tx) argument
1429 rp_comm_execute_fsm(conn, ctx, RP_COMMON_EVT_ACK, tx->pdu);
1432 void llcp_rp_comm_run(struct ll_conn *conn, struct proc_ctx *ctx, void *param) argument
1434 rp_comm_execute_fsm(conn, ctx, RP_COMMON_EVT_RUN, param);