Lines Matching refs:chan
59 static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size);
60 static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
62 static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
190 int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm) in l2cap_add_psm() argument
196 if (psm && __l2cap_global_chan_by_addr(psm, src, chan->src_type)) { in l2cap_add_psm()
202 chan->psm = psm; in l2cap_add_psm()
203 chan->sport = psm; in l2cap_add_psm()
208 if (chan->src_type == BDADDR_BREDR) { in l2cap_add_psm()
221 chan->src_type)) { in l2cap_add_psm()
222 chan->psm = cpu_to_le16(p); in l2cap_add_psm()
223 chan->sport = cpu_to_le16(p); in l2cap_add_psm()
235 int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid) in l2cap_add_scid() argument
240 chan->omtu = L2CAP_DEFAULT_MTU; in l2cap_add_scid()
241 chan->chan_type = L2CAP_CHAN_FIXED; in l2cap_add_scid()
243 chan->scid = scid; in l2cap_add_scid()
267 static void l2cap_state_change(struct l2cap_chan *chan, int state) in l2cap_state_change() argument
269 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state), in l2cap_state_change()
272 chan->state = state; in l2cap_state_change()
273 chan->ops->state_change(chan, state, 0); in l2cap_state_change()
276 static inline void l2cap_state_change_and_error(struct l2cap_chan *chan, in l2cap_state_change_and_error() argument
279 chan->state = state; in l2cap_state_change_and_error()
280 chan->ops->state_change(chan, chan->state, err); in l2cap_state_change_and_error()
283 static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err) in l2cap_chan_set_err() argument
285 chan->ops->state_change(chan, chan->state, err); in l2cap_chan_set_err()
288 static void __set_retrans_timer(struct l2cap_chan *chan) in __set_retrans_timer() argument
290 if (!delayed_work_pending(&chan->monitor_timer) && in __set_retrans_timer()
291 chan->retrans_timeout) { in __set_retrans_timer()
292 l2cap_set_timer(chan, &chan->retrans_timer, in __set_retrans_timer()
293 msecs_to_jiffies(chan->retrans_timeout)); in __set_retrans_timer()
297 static void __set_monitor_timer(struct l2cap_chan *chan) in __set_monitor_timer() argument
299 __clear_retrans_timer(chan); in __set_monitor_timer()
300 if (chan->monitor_timeout) { in __set_monitor_timer()
301 l2cap_set_timer(chan, &chan->monitor_timer, in __set_monitor_timer()
302 msecs_to_jiffies(chan->monitor_timeout)); in __set_monitor_timer()
415 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_chan_timeout() local
417 struct l2cap_conn *conn = chan->conn; in l2cap_chan_timeout()
420 BT_DBG("chan %p state %s", chan, state_to_string(chan->state)); in l2cap_chan_timeout()
426 l2cap_chan_lock(chan); in l2cap_chan_timeout()
428 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG) in l2cap_chan_timeout()
430 else if (chan->state == BT_CONNECT && in l2cap_chan_timeout()
431 chan->sec_level != BT_SECURITY_SDP) in l2cap_chan_timeout()
436 l2cap_chan_close(chan, reason); in l2cap_chan_timeout()
438 chan->ops->close(chan); in l2cap_chan_timeout()
440 l2cap_chan_unlock(chan); in l2cap_chan_timeout()
441 l2cap_chan_put(chan); in l2cap_chan_timeout()
448 struct l2cap_chan *chan; in l2cap_chan_create() local
450 chan = kzalloc(sizeof(*chan), GFP_ATOMIC); in l2cap_chan_create()
451 if (!chan) in l2cap_chan_create()
454 skb_queue_head_init(&chan->tx_q); in l2cap_chan_create()
455 skb_queue_head_init(&chan->srej_q); in l2cap_chan_create()
456 mutex_init(&chan->lock); in l2cap_chan_create()
459 atomic_set(&chan->nesting, L2CAP_NESTING_NORMAL); in l2cap_chan_create()
462 list_add(&chan->global_l, &chan_list); in l2cap_chan_create()
465 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout); in l2cap_chan_create()
467 chan->state = BT_OPEN; in l2cap_chan_create()
469 kref_init(&chan->kref); in l2cap_chan_create()
472 set_bit(CONF_NOT_COMPLETE, &chan->conf_state); in l2cap_chan_create()
474 BT_DBG("chan %p", chan); in l2cap_chan_create()
476 return chan; in l2cap_chan_create()
482 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref); in l2cap_chan_destroy() local
484 BT_DBG("chan %p", chan); in l2cap_chan_destroy()
487 list_del(&chan->global_l); in l2cap_chan_destroy()
490 kfree(chan); in l2cap_chan_destroy()
508 void l2cap_chan_set_defaults(struct l2cap_chan *chan) in l2cap_chan_set_defaults() argument
510 chan->fcs = L2CAP_FCS_CRC16; in l2cap_chan_set_defaults()
511 chan->max_tx = L2CAP_DEFAULT_MAX_TX; in l2cap_chan_set_defaults()
512 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW; in l2cap_chan_set_defaults()
513 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW; in l2cap_chan_set_defaults()
514 chan->remote_max_tx = chan->max_tx; in l2cap_chan_set_defaults()
515 chan->remote_tx_win = chan->tx_win; in l2cap_chan_set_defaults()
516 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW; in l2cap_chan_set_defaults()
517 chan->sec_level = BT_SECURITY_LOW; in l2cap_chan_set_defaults()
518 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO; in l2cap_chan_set_defaults()
519 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO; in l2cap_chan_set_defaults()
520 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO; in l2cap_chan_set_defaults()
522 chan->conf_state = 0; in l2cap_chan_set_defaults()
523 set_bit(CONF_NOT_COMPLETE, &chan->conf_state); in l2cap_chan_set_defaults()
525 set_bit(FLAG_FORCE_ACTIVE, &chan->flags); in l2cap_chan_set_defaults()
529 static void l2cap_le_flowctl_init(struct l2cap_chan *chan, u16 tx_credits) in l2cap_le_flowctl_init() argument
531 chan->sdu = NULL; in l2cap_le_flowctl_init()
532 chan->sdu_last_frag = NULL; in l2cap_le_flowctl_init()
533 chan->sdu_len = 0; in l2cap_le_flowctl_init()
534 chan->tx_credits = tx_credits; in l2cap_le_flowctl_init()
536 chan->mps = min_t(u16, chan->imtu, chan->conn->mtu - L2CAP_HDR_SIZE); in l2cap_le_flowctl_init()
538 chan->rx_credits = (chan->imtu / chan->mps) + 1; in l2cap_le_flowctl_init()
540 skb_queue_head_init(&chan->tx_q); in l2cap_le_flowctl_init()
543 static void l2cap_ecred_init(struct l2cap_chan *chan, u16 tx_credits) in l2cap_ecred_init() argument
545 l2cap_le_flowctl_init(chan, tx_credits); in l2cap_ecred_init()
548 if (chan->mps < L2CAP_ECRED_MIN_MPS) { in l2cap_ecred_init()
549 chan->mps = L2CAP_ECRED_MIN_MPS; in l2cap_ecred_init()
550 chan->rx_credits = (chan->imtu / chan->mps) + 1; in l2cap_ecred_init()
554 void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) in __l2cap_chan_add() argument
557 __le16_to_cpu(chan->psm), chan->dcid); in __l2cap_chan_add()
561 chan->conn = conn; in __l2cap_chan_add()
563 switch (chan->chan_type) { in __l2cap_chan_add()
566 chan->scid = l2cap_alloc_cid(conn); in __l2cap_chan_add()
568 chan->omtu = L2CAP_DEFAULT_MTU; in __l2cap_chan_add()
573 chan->scid = L2CAP_CID_CONN_LESS; in __l2cap_chan_add()
574 chan->dcid = L2CAP_CID_CONN_LESS; in __l2cap_chan_add()
575 chan->omtu = L2CAP_DEFAULT_MTU; in __l2cap_chan_add()
584 chan->scid = L2CAP_CID_SIGNALING; in __l2cap_chan_add()
585 chan->dcid = L2CAP_CID_SIGNALING; in __l2cap_chan_add()
586 chan->omtu = L2CAP_DEFAULT_MTU; in __l2cap_chan_add()
589 chan->local_id = L2CAP_BESTEFFORT_ID; in __l2cap_chan_add()
590 chan->local_stype = L2CAP_SERV_BESTEFFORT; in __l2cap_chan_add()
591 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE; in __l2cap_chan_add()
592 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME; in __l2cap_chan_add()
593 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT; in __l2cap_chan_add()
594 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO; in __l2cap_chan_add()
596 l2cap_chan_hold(chan); in __l2cap_chan_add()
599 if (chan->chan_type != L2CAP_CHAN_FIXED || in __l2cap_chan_add()
600 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags)) in __l2cap_chan_add()
603 list_add(&chan->list, &conn->chan_l); in __l2cap_chan_add()
606 void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) in l2cap_chan_add() argument
609 __l2cap_chan_add(conn, chan); in l2cap_chan_add()
613 void l2cap_chan_del(struct l2cap_chan *chan, int err) in l2cap_chan_del() argument
615 struct l2cap_conn *conn = chan->conn; in l2cap_chan_del()
617 __clear_chan_timer(chan); in l2cap_chan_del()
619 BT_DBG("chan %p, conn %p, err %d, state %s", chan, conn, err, in l2cap_chan_del()
620 state_to_string(chan->state)); in l2cap_chan_del()
622 chan->ops->teardown(chan, err); in l2cap_chan_del()
627 list_del(&chan->list); in l2cap_chan_del()
629 l2cap_chan_put(chan); in l2cap_chan_del()
631 chan->conn = NULL; in l2cap_chan_del()
637 if (chan->chan_type != L2CAP_CHAN_FIXED || in l2cap_chan_del()
638 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags)) in l2cap_chan_del()
641 if (mgr && mgr->bredr_chan == chan) in l2cap_chan_del()
645 if (chan->hs_hchan) { in l2cap_chan_del()
646 struct hci_chan *hs_hchan = chan->hs_hchan; in l2cap_chan_del()
648 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan); in l2cap_chan_del()
652 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state)) in l2cap_chan_del()
655 switch (chan->mode) { in l2cap_chan_del()
661 skb_queue_purge(&chan->tx_q); in l2cap_chan_del()
665 __clear_retrans_timer(chan); in l2cap_chan_del()
666 __clear_monitor_timer(chan); in l2cap_chan_del()
667 __clear_ack_timer(chan); in l2cap_chan_del()
669 skb_queue_purge(&chan->srej_q); in l2cap_chan_del()
671 l2cap_seq_list_free(&chan->srej_list); in l2cap_chan_del()
672 l2cap_seq_list_free(&chan->retrans_list); in l2cap_chan_del()
676 skb_queue_purge(&chan->tx_q); in l2cap_chan_del()
685 struct l2cap_chan *chan; in __l2cap_chan_list() local
687 list_for_each_entry(chan, &conn->chan_l, list) { in __l2cap_chan_list()
688 func(chan, data); in __l2cap_chan_list()
710 struct l2cap_chan *chan; in l2cap_conn_update_id_addr() local
714 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_update_id_addr()
715 l2cap_chan_lock(chan); in l2cap_conn_update_id_addr()
716 bacpy(&chan->dst, &hcon->dst); in l2cap_conn_update_id_addr()
717 chan->dst_type = bdaddr_dst_type(hcon); in l2cap_conn_update_id_addr()
718 l2cap_chan_unlock(chan); in l2cap_conn_update_id_addr()
724 static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan) in l2cap_chan_le_connect_reject() argument
726 struct l2cap_conn *conn = chan->conn; in l2cap_chan_le_connect_reject()
730 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_le_connect_reject()
735 l2cap_state_change(chan, BT_DISCONN); in l2cap_chan_le_connect_reject()
737 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_chan_le_connect_reject()
738 rsp.mtu = cpu_to_le16(chan->imtu); in l2cap_chan_le_connect_reject()
739 rsp.mps = cpu_to_le16(chan->mps); in l2cap_chan_le_connect_reject()
740 rsp.credits = cpu_to_le16(chan->rx_credits); in l2cap_chan_le_connect_reject()
743 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in l2cap_chan_le_connect_reject()
747 static void l2cap_chan_ecred_connect_reject(struct l2cap_chan *chan) in l2cap_chan_ecred_connect_reject() argument
749 struct l2cap_conn *conn = chan->conn; in l2cap_chan_ecred_connect_reject()
753 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_ecred_connect_reject()
758 l2cap_state_change(chan, BT_DISCONN); in l2cap_chan_ecred_connect_reject()
764 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in l2cap_chan_ecred_connect_reject()
768 static void l2cap_chan_connect_reject(struct l2cap_chan *chan) in l2cap_chan_connect_reject() argument
770 struct l2cap_conn *conn = chan->conn; in l2cap_chan_connect_reject()
774 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_connect_reject()
779 l2cap_state_change(chan, BT_DISCONN); in l2cap_chan_connect_reject()
781 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_chan_connect_reject()
782 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_chan_connect_reject()
786 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp); in l2cap_chan_connect_reject()
789 void l2cap_chan_close(struct l2cap_chan *chan, int reason) in l2cap_chan_close() argument
791 struct l2cap_conn *conn = chan->conn; in l2cap_chan_close()
793 BT_DBG("chan %p state %s", chan, state_to_string(chan->state)); in l2cap_chan_close()
795 switch (chan->state) { in l2cap_chan_close()
797 chan->ops->teardown(chan, 0); in l2cap_chan_close()
802 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) { in l2cap_chan_close()
803 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_chan_close()
804 l2cap_send_disconn_req(chan, reason); in l2cap_chan_close()
806 l2cap_chan_del(chan, reason); in l2cap_chan_close()
810 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) { in l2cap_chan_close()
812 l2cap_chan_connect_reject(chan); in l2cap_chan_close()
814 switch (chan->mode) { in l2cap_chan_close()
816 l2cap_chan_le_connect_reject(chan); in l2cap_chan_close()
819 l2cap_chan_ecred_connect_reject(chan); in l2cap_chan_close()
825 l2cap_chan_del(chan, reason); in l2cap_chan_close()
830 l2cap_chan_del(chan, reason); in l2cap_chan_close()
834 chan->ops->teardown(chan, 0); in l2cap_chan_close()
840 static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan) in l2cap_get_auth_type() argument
842 switch (chan->chan_type) { in l2cap_get_auth_type()
844 switch (chan->sec_level) { in l2cap_get_auth_type()
855 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) { in l2cap_get_auth_type()
856 if (chan->sec_level == BT_SECURITY_LOW) in l2cap_get_auth_type()
857 chan->sec_level = BT_SECURITY_SDP; in l2cap_get_auth_type()
859 if (chan->sec_level == BT_SECURITY_HIGH || in l2cap_get_auth_type()
860 chan->sec_level == BT_SECURITY_FIPS) in l2cap_get_auth_type()
866 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) { in l2cap_get_auth_type()
867 if (chan->sec_level == BT_SECURITY_LOW) in l2cap_get_auth_type()
868 chan->sec_level = BT_SECURITY_SDP; in l2cap_get_auth_type()
870 if (chan->sec_level == BT_SECURITY_HIGH || in l2cap_get_auth_type()
871 chan->sec_level == BT_SECURITY_FIPS) in l2cap_get_auth_type()
879 switch (chan->sec_level) { in l2cap_get_auth_type()
893 int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator) in l2cap_chan_check_security() argument
895 struct l2cap_conn *conn = chan->conn; in l2cap_chan_check_security()
899 return smp_conn_security(conn->hcon, chan->sec_level); in l2cap_chan_check_security()
901 auth_type = l2cap_get_auth_type(chan); in l2cap_chan_check_security()
903 return hci_conn_security(conn->hcon, chan->sec_level, auth_type, in l2cap_chan_check_security()
954 static bool __chan_is_moving(struct l2cap_chan *chan) in __chan_is_moving() argument
956 return chan->move_state != L2CAP_MOVE_STABLE && in __chan_is_moving()
957 chan->move_state != L2CAP_MOVE_WAIT_PREPARE; in __chan_is_moving()
960 static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_do_send() argument
962 struct hci_conn *hcon = chan->conn->hcon; in l2cap_do_send()
965 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len, in l2cap_do_send()
968 if (chan->hs_hcon && !__chan_is_moving(chan)) { in l2cap_do_send()
969 if (chan->hs_hchan) in l2cap_do_send()
970 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE); in l2cap_do_send()
982 (!test_bit(FLAG_FLUSHABLE, &chan->flags) && in l2cap_do_send()
988 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags); in l2cap_do_send()
989 hci_send_acl(chan->conn->hchan, skb, flags); in l2cap_do_send()
1040 static inline void __unpack_control(struct l2cap_chan *chan, in __unpack_control() argument
1043 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) { in __unpack_control()
1092 static inline void __pack_control(struct l2cap_chan *chan, in __pack_control() argument
1096 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) { in __pack_control()
1105 static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan) in __ertm_hdr_size() argument
1107 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in __ertm_hdr_size()
1113 static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan, in l2cap_create_sframe_pdu() argument
1118 int hlen = __ertm_hdr_size(chan); in l2cap_create_sframe_pdu()
1120 if (chan->fcs == L2CAP_FCS_CRC16) in l2cap_create_sframe_pdu()
1130 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_sframe_pdu()
1132 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_create_sframe_pdu()
1137 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_create_sframe_pdu()
1146 static void l2cap_send_sframe(struct l2cap_chan *chan, in l2cap_send_sframe() argument
1152 BT_DBG("chan %p, control %p", chan, control); in l2cap_send_sframe()
1157 if (__chan_is_moving(chan)) in l2cap_send_sframe()
1160 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) && in l2cap_send_sframe()
1165 clear_bit(CONN_RNR_SENT, &chan->conn_state); in l2cap_send_sframe()
1167 set_bit(CONN_RNR_SENT, &chan->conn_state); in l2cap_send_sframe()
1170 chan->last_acked_seq = control->reqseq; in l2cap_send_sframe()
1171 __clear_ack_timer(chan); in l2cap_send_sframe()
1177 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_send_sframe()
1182 skb = l2cap_create_sframe_pdu(chan, control_field); in l2cap_send_sframe()
1184 l2cap_do_send(chan, skb); in l2cap_send_sframe()
1187 static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll) in l2cap_send_rr_or_rnr() argument
1191 BT_DBG("chan %p, poll %d", chan, poll); in l2cap_send_rr_or_rnr()
1197 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) in l2cap_send_rr_or_rnr()
1202 control.reqseq = chan->buffer_seq; in l2cap_send_rr_or_rnr()
1203 l2cap_send_sframe(chan, &control); in l2cap_send_rr_or_rnr()
1206 static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan) in __l2cap_no_conn_pending() argument
1208 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) in __l2cap_no_conn_pending()
1211 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state); in __l2cap_no_conn_pending()
1214 static bool __amp_capable(struct l2cap_chan *chan) in __amp_capable() argument
1216 struct l2cap_conn *conn = chan->conn; in __amp_capable()
1236 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED) in __amp_capable()
1242 static bool l2cap_check_efs(struct l2cap_chan *chan) in l2cap_check_efs() argument
1248 void l2cap_send_conn_req(struct l2cap_chan *chan) in l2cap_send_conn_req() argument
1250 struct l2cap_conn *conn = chan->conn; in l2cap_send_conn_req()
1253 req.scid = cpu_to_le16(chan->scid); in l2cap_send_conn_req()
1254 req.psm = chan->psm; in l2cap_send_conn_req()
1256 chan->ident = l2cap_get_ident(conn); in l2cap_send_conn_req()
1258 set_bit(CONF_CONNECT_PEND, &chan->conf_state); in l2cap_send_conn_req()
1260 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req); in l2cap_send_conn_req()
1263 static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id) in l2cap_send_create_chan_req() argument
1266 req.scid = cpu_to_le16(chan->scid); in l2cap_send_create_chan_req()
1267 req.psm = chan->psm; in l2cap_send_create_chan_req()
1270 chan->ident = l2cap_get_ident(chan->conn); in l2cap_send_create_chan_req()
1272 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ, in l2cap_send_create_chan_req()
1276 static void l2cap_move_setup(struct l2cap_chan *chan) in l2cap_move_setup() argument
1280 BT_DBG("chan %p", chan); in l2cap_move_setup()
1282 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_move_setup()
1285 __clear_retrans_timer(chan); in l2cap_move_setup()
1286 __clear_monitor_timer(chan); in l2cap_move_setup()
1287 __clear_ack_timer(chan); in l2cap_move_setup()
1289 chan->retry_count = 0; in l2cap_move_setup()
1290 skb_queue_walk(&chan->tx_q, skb) { in l2cap_move_setup()
1297 chan->expected_tx_seq = chan->buffer_seq; in l2cap_move_setup()
1299 clear_bit(CONN_REJ_ACT, &chan->conn_state); in l2cap_move_setup()
1300 clear_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_move_setup()
1301 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_move_setup()
1302 l2cap_seq_list_clear(&chan->srej_list); in l2cap_move_setup()
1303 skb_queue_purge(&chan->srej_q); in l2cap_move_setup()
1305 chan->tx_state = L2CAP_TX_STATE_XMIT; in l2cap_move_setup()
1306 chan->rx_state = L2CAP_RX_STATE_MOVE; in l2cap_move_setup()
1308 set_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_move_setup()
1311 static void l2cap_move_done(struct l2cap_chan *chan) in l2cap_move_done() argument
1313 u8 move_role = chan->move_role; in l2cap_move_done()
1314 BT_DBG("chan %p", chan); in l2cap_move_done()
1316 chan->move_state = L2CAP_MOVE_STABLE; in l2cap_move_done()
1317 chan->move_role = L2CAP_MOVE_ROLE_NONE; in l2cap_move_done()
1319 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_move_done()
1324 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL); in l2cap_move_done()
1325 chan->rx_state = L2CAP_RX_STATE_WAIT_F; in l2cap_move_done()
1328 chan->rx_state = L2CAP_RX_STATE_WAIT_P; in l2cap_move_done()
1333 static void l2cap_chan_ready(struct l2cap_chan *chan) in l2cap_chan_ready() argument
1339 if (chan->state == BT_CONNECTED) in l2cap_chan_ready()
1343 chan->conf_state = 0; in l2cap_chan_ready()
1344 __clear_chan_timer(chan); in l2cap_chan_ready()
1346 switch (chan->mode) { in l2cap_chan_ready()
1349 if (!chan->tx_credits) in l2cap_chan_ready()
1350 chan->ops->suspend(chan); in l2cap_chan_ready()
1354 chan->state = BT_CONNECTED; in l2cap_chan_ready()
1356 chan->ops->ready(chan); in l2cap_chan_ready()
1359 static void l2cap_le_connect(struct l2cap_chan *chan) in l2cap_le_connect() argument
1361 struct l2cap_conn *conn = chan->conn; in l2cap_le_connect()
1364 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags)) in l2cap_le_connect()
1367 if (!chan->imtu) in l2cap_le_connect()
1368 chan->imtu = chan->conn->mtu; in l2cap_le_connect()
1370 l2cap_le_flowctl_init(chan, 0); in l2cap_le_connect()
1372 req.psm = chan->psm; in l2cap_le_connect()
1373 req.scid = cpu_to_le16(chan->scid); in l2cap_le_connect()
1374 req.mtu = cpu_to_le16(chan->imtu); in l2cap_le_connect()
1375 req.mps = cpu_to_le16(chan->mps); in l2cap_le_connect()
1376 req.credits = cpu_to_le16(chan->rx_credits); in l2cap_le_connect()
1378 chan->ident = l2cap_get_ident(conn); in l2cap_le_connect()
1380 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ, in l2cap_le_connect()
1389 struct l2cap_chan *chan; member
1394 static void l2cap_ecred_defer_connect(struct l2cap_chan *chan, void *data) in l2cap_ecred_defer_connect() argument
1399 if (chan == conn->chan) in l2cap_ecred_defer_connect()
1402 if (!test_and_clear_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_ecred_defer_connect()
1405 pid = chan->ops->get_peer_pid(chan); in l2cap_ecred_defer_connect()
1408 if (conn->pid != pid || chan->psm != conn->chan->psm || chan->ident || in l2cap_ecred_defer_connect()
1409 chan->mode != L2CAP_MODE_EXT_FLOWCTL || chan->state != BT_CONNECT) in l2cap_ecred_defer_connect()
1412 if (test_and_set_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags)) in l2cap_ecred_defer_connect()
1415 l2cap_ecred_init(chan, 0); in l2cap_ecred_defer_connect()
1418 chan->ident = conn->chan->ident; in l2cap_ecred_defer_connect()
1421 conn->pdu.scid[conn->count] = cpu_to_le16(chan->scid); in l2cap_ecred_defer_connect()
1426 static void l2cap_ecred_connect(struct l2cap_chan *chan) in l2cap_ecred_connect() argument
1428 struct l2cap_conn *conn = chan->conn; in l2cap_ecred_connect()
1431 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_ecred_connect()
1434 if (test_and_set_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags)) in l2cap_ecred_connect()
1437 l2cap_ecred_init(chan, 0); in l2cap_ecred_connect()
1439 data.pdu.req.psm = chan->psm; in l2cap_ecred_connect()
1440 data.pdu.req.mtu = cpu_to_le16(chan->imtu); in l2cap_ecred_connect()
1441 data.pdu.req.mps = cpu_to_le16(chan->mps); in l2cap_ecred_connect()
1442 data.pdu.req.credits = cpu_to_le16(chan->rx_credits); in l2cap_ecred_connect()
1443 data.pdu.scid[0] = cpu_to_le16(chan->scid); in l2cap_ecred_connect()
1445 chan->ident = l2cap_get_ident(conn); in l2cap_ecred_connect()
1446 data.pid = chan->ops->get_peer_pid(chan); in l2cap_ecred_connect()
1449 data.chan = chan; in l2cap_ecred_connect()
1450 data.pid = chan->ops->get_peer_pid(chan); in l2cap_ecred_connect()
1454 l2cap_send_cmd(conn, chan->ident, L2CAP_ECRED_CONN_REQ, in l2cap_ecred_connect()
1459 static void l2cap_le_start(struct l2cap_chan *chan) in l2cap_le_start() argument
1461 struct l2cap_conn *conn = chan->conn; in l2cap_le_start()
1463 if (!smp_conn_security(conn->hcon, chan->sec_level)) in l2cap_le_start()
1466 if (!chan->psm) { in l2cap_le_start()
1467 l2cap_chan_ready(chan); in l2cap_le_start()
1471 if (chan->state == BT_CONNECT) { in l2cap_le_start()
1472 if (chan->mode == L2CAP_MODE_EXT_FLOWCTL) in l2cap_le_start()
1473 l2cap_ecred_connect(chan); in l2cap_le_start()
1475 l2cap_le_connect(chan); in l2cap_le_start()
1479 static void l2cap_start_connection(struct l2cap_chan *chan) in l2cap_start_connection() argument
1481 if (__amp_capable(chan)) { in l2cap_start_connection()
1482 BT_DBG("chan %p AMP capable: discover AMPs", chan); in l2cap_start_connection()
1483 a2mp_discover_amp(chan); in l2cap_start_connection()
1484 } else if (chan->conn->hcon->type == LE_LINK) { in l2cap_start_connection()
1485 l2cap_le_start(chan); in l2cap_start_connection()
1487 l2cap_send_conn_req(chan); in l2cap_start_connection()
1530 static void l2cap_do_start(struct l2cap_chan *chan) in l2cap_do_start() argument
1532 struct l2cap_conn *conn = chan->conn; in l2cap_do_start()
1535 l2cap_le_start(chan); in l2cap_do_start()
1547 if (!l2cap_chan_check_security(chan, true) || in l2cap_do_start()
1548 !__l2cap_no_conn_pending(chan)) in l2cap_do_start()
1552 l2cap_start_connection(chan); in l2cap_do_start()
1554 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); in l2cap_do_start()
1573 static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err) in l2cap_send_disconn_req() argument
1575 struct l2cap_conn *conn = chan->conn; in l2cap_send_disconn_req()
1581 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) { in l2cap_send_disconn_req()
1582 __clear_retrans_timer(chan); in l2cap_send_disconn_req()
1583 __clear_monitor_timer(chan); in l2cap_send_disconn_req()
1584 __clear_ack_timer(chan); in l2cap_send_disconn_req()
1587 if (chan->scid == L2CAP_CID_A2MP) { in l2cap_send_disconn_req()
1588 l2cap_state_change(chan, BT_DISCONN); in l2cap_send_disconn_req()
1592 req.dcid = cpu_to_le16(chan->dcid); in l2cap_send_disconn_req()
1593 req.scid = cpu_to_le16(chan->scid); in l2cap_send_disconn_req()
1597 l2cap_state_change_and_error(chan, BT_DISCONN, err); in l2cap_send_disconn_req()
1603 struct l2cap_chan *chan, *tmp; in l2cap_conn_start() local
1609 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) { in l2cap_conn_start()
1610 l2cap_chan_lock(chan); in l2cap_conn_start()
1612 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_conn_start()
1613 l2cap_chan_ready(chan); in l2cap_conn_start()
1614 l2cap_chan_unlock(chan); in l2cap_conn_start()
1618 if (chan->state == BT_CONNECT) { in l2cap_conn_start()
1619 if (!l2cap_chan_check_security(chan, true) || in l2cap_conn_start()
1620 !__l2cap_no_conn_pending(chan)) { in l2cap_conn_start()
1621 l2cap_chan_unlock(chan); in l2cap_conn_start()
1625 if (!l2cap_mode_supported(chan->mode, conn->feat_mask) in l2cap_conn_start()
1627 &chan->conf_state)) { in l2cap_conn_start()
1628 l2cap_chan_close(chan, ECONNRESET); in l2cap_conn_start()
1629 l2cap_chan_unlock(chan); in l2cap_conn_start()
1634 l2cap_start_connection(chan); in l2cap_conn_start()
1636 l2cap_chan_close(chan, ECONNREFUSED); in l2cap_conn_start()
1638 } else if (chan->state == BT_CONNECT2) { in l2cap_conn_start()
1641 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_conn_start()
1642 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_conn_start()
1644 if (l2cap_chan_check_security(chan, false)) { in l2cap_conn_start()
1645 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_conn_start()
1648 chan->ops->defer(chan); in l2cap_conn_start()
1651 l2cap_state_change(chan, BT_CONFIG); in l2cap_conn_start()
1660 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, in l2cap_conn_start()
1663 if (test_bit(CONF_REQ_SENT, &chan->conf_state) || in l2cap_conn_start()
1665 l2cap_chan_unlock(chan); in l2cap_conn_start()
1669 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_conn_start()
1671 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_conn_start()
1672 chan->num_conf_req++; in l2cap_conn_start()
1675 l2cap_chan_unlock(chan); in l2cap_conn_start()
1716 struct l2cap_chan *chan; in l2cap_conn_ready() local
1726 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_ready()
1728 l2cap_chan_lock(chan); in l2cap_conn_ready()
1730 if (chan->scid == L2CAP_CID_A2MP) { in l2cap_conn_ready()
1731 l2cap_chan_unlock(chan); in l2cap_conn_ready()
1736 l2cap_le_start(chan); in l2cap_conn_ready()
1737 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_conn_ready()
1739 l2cap_chan_ready(chan); in l2cap_conn_ready()
1740 } else if (chan->state == BT_CONNECT) { in l2cap_conn_ready()
1741 l2cap_do_start(chan); in l2cap_conn_ready()
1744 l2cap_chan_unlock(chan); in l2cap_conn_ready()
1758 struct l2cap_chan *chan; in l2cap_conn_unreliable() local
1764 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_unreliable()
1765 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags)) in l2cap_conn_unreliable()
1766 l2cap_chan_set_err(chan, err); in l2cap_conn_unreliable()
1865 struct l2cap_chan *chan, *l; in l2cap_conn_del() local
1894 list_for_each_entry_safe(chan, l, &conn->chan_l, list) { in l2cap_conn_del()
1895 l2cap_chan_hold(chan); in l2cap_conn_del()
1896 l2cap_chan_lock(chan); in l2cap_conn_del()
1898 l2cap_chan_del(chan, err); in l2cap_conn_del()
1900 chan->ops->close(chan); in l2cap_conn_del()
1902 l2cap_chan_unlock(chan); in l2cap_conn_del()
1903 l2cap_chan_put(chan); in l2cap_conn_del()
1995 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_monitor_timeout() local
1998 BT_DBG("chan %p", chan); in l2cap_monitor_timeout()
2000 l2cap_chan_lock(chan); in l2cap_monitor_timeout()
2002 if (!chan->conn) { in l2cap_monitor_timeout()
2003 l2cap_chan_unlock(chan); in l2cap_monitor_timeout()
2004 l2cap_chan_put(chan); in l2cap_monitor_timeout()
2008 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO); in l2cap_monitor_timeout()
2010 l2cap_chan_unlock(chan); in l2cap_monitor_timeout()
2011 l2cap_chan_put(chan); in l2cap_monitor_timeout()
2016 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_retrans_timeout() local
2019 BT_DBG("chan %p", chan); in l2cap_retrans_timeout()
2021 l2cap_chan_lock(chan); in l2cap_retrans_timeout()
2023 if (!chan->conn) { in l2cap_retrans_timeout()
2024 l2cap_chan_unlock(chan); in l2cap_retrans_timeout()
2025 l2cap_chan_put(chan); in l2cap_retrans_timeout()
2029 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO); in l2cap_retrans_timeout()
2030 l2cap_chan_unlock(chan); in l2cap_retrans_timeout()
2031 l2cap_chan_put(chan); in l2cap_retrans_timeout()
2034 static void l2cap_streaming_send(struct l2cap_chan *chan, in l2cap_streaming_send() argument
2040 BT_DBG("chan %p, skbs %p", chan, skbs); in l2cap_streaming_send()
2042 if (__chan_is_moving(chan)) in l2cap_streaming_send()
2045 skb_queue_splice_tail_init(skbs, &chan->tx_q); in l2cap_streaming_send()
2047 while (!skb_queue_empty(&chan->tx_q)) { in l2cap_streaming_send()
2049 skb = skb_dequeue(&chan->tx_q); in l2cap_streaming_send()
2055 control->txseq = chan->next_tx_seq; in l2cap_streaming_send()
2057 __pack_control(chan, control, skb); in l2cap_streaming_send()
2059 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_streaming_send()
2064 l2cap_do_send(chan, skb); in l2cap_streaming_send()
2068 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq); in l2cap_streaming_send()
2069 chan->frames_sent++; in l2cap_streaming_send()
2073 static int l2cap_ertm_send(struct l2cap_chan *chan) in l2cap_ertm_send() argument
2079 BT_DBG("chan %p", chan); in l2cap_ertm_send()
2081 if (chan->state != BT_CONNECTED) in l2cap_ertm_send()
2084 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) in l2cap_ertm_send()
2087 if (__chan_is_moving(chan)) in l2cap_ertm_send()
2090 while (chan->tx_send_head && in l2cap_ertm_send()
2091 chan->unacked_frames < chan->remote_tx_win && in l2cap_ertm_send()
2092 chan->tx_state == L2CAP_TX_STATE_XMIT) { in l2cap_ertm_send()
2094 skb = chan->tx_send_head; in l2cap_ertm_send()
2099 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state)) in l2cap_ertm_send()
2102 control->reqseq = chan->buffer_seq; in l2cap_ertm_send()
2103 chan->last_acked_seq = chan->buffer_seq; in l2cap_ertm_send()
2104 control->txseq = chan->next_tx_seq; in l2cap_ertm_send()
2106 __pack_control(chan, control, skb); in l2cap_ertm_send()
2108 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_ertm_send()
2121 __set_retrans_timer(chan); in l2cap_ertm_send()
2123 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq); in l2cap_ertm_send()
2124 chan->unacked_frames++; in l2cap_ertm_send()
2125 chan->frames_sent++; in l2cap_ertm_send()
2128 if (skb_queue_is_last(&chan->tx_q, skb)) in l2cap_ertm_send()
2129 chan->tx_send_head = NULL; in l2cap_ertm_send()
2131 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb); in l2cap_ertm_send()
2133 l2cap_do_send(chan, tx_skb); in l2cap_ertm_send()
2138 chan->unacked_frames, skb_queue_len(&chan->tx_q)); in l2cap_ertm_send()
2143 static void l2cap_ertm_resend(struct l2cap_chan *chan) in l2cap_ertm_resend() argument
2150 BT_DBG("chan %p", chan); in l2cap_ertm_resend()
2152 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) in l2cap_ertm_resend()
2155 if (__chan_is_moving(chan)) in l2cap_ertm_resend()
2158 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) { in l2cap_ertm_resend()
2159 seq = l2cap_seq_list_pop(&chan->retrans_list); in l2cap_ertm_resend()
2161 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq); in l2cap_ertm_resend()
2171 if (chan->max_tx != 0 && in l2cap_ertm_resend()
2172 bt_cb(skb)->l2cap.retries > chan->max_tx) { in l2cap_ertm_resend()
2173 BT_DBG("Retry limit exceeded (%d)", chan->max_tx); in l2cap_ertm_resend()
2174 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_ertm_resend()
2175 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_ertm_resend()
2179 control.reqseq = chan->buffer_seq; in l2cap_ertm_resend()
2180 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state)) in l2cap_ertm_resend()
2195 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_ertm_resend()
2200 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) { in l2cap_ertm_resend()
2209 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_ertm_resend()
2216 l2cap_do_send(chan, tx_skb); in l2cap_ertm_resend()
2220 chan->last_acked_seq = chan->buffer_seq; in l2cap_ertm_resend()
2224 static void l2cap_retransmit(struct l2cap_chan *chan, in l2cap_retransmit() argument
2227 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit()
2229 l2cap_seq_list_append(&chan->retrans_list, control->reqseq); in l2cap_retransmit()
2230 l2cap_ertm_resend(chan); in l2cap_retransmit()
2233 static void l2cap_retransmit_all(struct l2cap_chan *chan, in l2cap_retransmit_all() argument
2238 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit_all()
2241 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_retransmit_all()
2243 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_retransmit_all()
2245 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) in l2cap_retransmit_all()
2248 if (chan->unacked_frames) { in l2cap_retransmit_all()
2249 skb_queue_walk(&chan->tx_q, skb) { in l2cap_retransmit_all()
2251 skb == chan->tx_send_head) in l2cap_retransmit_all()
2255 skb_queue_walk_from(&chan->tx_q, skb) { in l2cap_retransmit_all()
2256 if (skb == chan->tx_send_head) in l2cap_retransmit_all()
2259 l2cap_seq_list_append(&chan->retrans_list, in l2cap_retransmit_all()
2263 l2cap_ertm_resend(chan); in l2cap_retransmit_all()
2267 static void l2cap_send_ack(struct l2cap_chan *chan) in l2cap_send_ack() argument
2270 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq, in l2cap_send_ack()
2271 chan->last_acked_seq); in l2cap_send_ack()
2275 chan, chan->last_acked_seq, chan->buffer_seq); in l2cap_send_ack()
2280 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) && in l2cap_send_ack()
2281 chan->rx_state == L2CAP_RX_STATE_RECV) { in l2cap_send_ack()
2282 __clear_ack_timer(chan); in l2cap_send_ack()
2284 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2285 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2287 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) { in l2cap_send_ack()
2288 l2cap_ertm_send(chan); in l2cap_send_ack()
2290 if (chan->buffer_seq == chan->last_acked_seq) in l2cap_send_ack()
2297 threshold = chan->ack_win; in l2cap_send_ack()
2305 __clear_ack_timer(chan); in l2cap_send_ack()
2307 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2308 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2313 __set_ack_timer(chan); in l2cap_send_ack()
2317 static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan, in l2cap_skbuff_fromiovec() argument
2321 struct l2cap_conn *conn = chan->conn; in l2cap_skbuff_fromiovec()
2338 tmp = chan->ops->alloc_skb(chan, 0, count, in l2cap_skbuff_fromiovec()
2361 static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan, in l2cap_create_connless_pdu() argument
2364 struct l2cap_conn *conn = chan->conn; in l2cap_create_connless_pdu()
2369 BT_DBG("chan %p psm 0x%2.2x len %zu", chan, in l2cap_create_connless_pdu()
2370 __le16_to_cpu(chan->psm), len); in l2cap_create_connless_pdu()
2374 skb = chan->ops->alloc_skb(chan, hlen, count, in l2cap_create_connless_pdu()
2381 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_connless_pdu()
2383 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE)); in l2cap_create_connless_pdu()
2385 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_connless_pdu()
2393 static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan, in l2cap_create_basic_pdu() argument
2396 struct l2cap_conn *conn = chan->conn; in l2cap_create_basic_pdu()
2401 BT_DBG("chan %p len %zu", chan, len); in l2cap_create_basic_pdu()
2405 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count, in l2cap_create_basic_pdu()
2412 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_basic_pdu()
2415 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_basic_pdu()
2423 static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan, in l2cap_create_iframe_pdu() argument
2427 struct l2cap_conn *conn = chan->conn; in l2cap_create_iframe_pdu()
2432 BT_DBG("chan %p len %zu", chan, len); in l2cap_create_iframe_pdu()
2437 hlen = __ertm_hdr_size(chan); in l2cap_create_iframe_pdu()
2442 if (chan->fcs == L2CAP_FCS_CRC16) in l2cap_create_iframe_pdu()
2447 skb = chan->ops->alloc_skb(chan, hlen, count, in l2cap_create_iframe_pdu()
2454 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_iframe_pdu()
2458 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_create_iframe_pdu()
2466 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_iframe_pdu()
2472 bt_cb(skb)->l2cap.fcs = chan->fcs; in l2cap_create_iframe_pdu()
2477 static int l2cap_segment_sdu(struct l2cap_chan *chan, in l2cap_segment_sdu() argument
2486 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len); in l2cap_segment_sdu()
2494 pdu_len = chan->conn->mtu; in l2cap_segment_sdu()
2497 if (!chan->hs_hcon) in l2cap_segment_sdu()
2501 if (chan->fcs) in l2cap_segment_sdu()
2504 pdu_len -= __ertm_hdr_size(chan); in l2cap_segment_sdu()
2507 pdu_len = min_t(size_t, pdu_len, chan->remote_mps); in l2cap_segment_sdu()
2519 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len); in l2cap_segment_sdu()
2544 static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan, in l2cap_create_le_flowctl_pdu() argument
2548 struct l2cap_conn *conn = chan->conn; in l2cap_create_le_flowctl_pdu()
2553 BT_DBG("chan %p len %zu", chan, len); in l2cap_create_le_flowctl_pdu()
2565 skb = chan->ops->alloc_skb(chan, hlen, count, in l2cap_create_le_flowctl_pdu()
2572 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_le_flowctl_pdu()
2578 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_le_flowctl_pdu()
2587 static int l2cap_segment_le_sdu(struct l2cap_chan *chan, in l2cap_segment_le_sdu() argument
2595 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len); in l2cap_segment_le_sdu()
2598 pdu_len = chan->remote_mps - L2CAP_SDULEN_SIZE; in l2cap_segment_le_sdu()
2604 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len); in l2cap_segment_le_sdu()
2623 static void l2cap_le_flowctl_send(struct l2cap_chan *chan) in l2cap_le_flowctl_send() argument
2627 BT_DBG("chan %p", chan); in l2cap_le_flowctl_send()
2629 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) { in l2cap_le_flowctl_send()
2630 l2cap_do_send(chan, skb_dequeue(&chan->tx_q)); in l2cap_le_flowctl_send()
2631 chan->tx_credits--; in l2cap_le_flowctl_send()
2635 BT_DBG("Sent %d credits %u queued %u", sent, chan->tx_credits, in l2cap_le_flowctl_send()
2636 skb_queue_len(&chan->tx_q)); in l2cap_le_flowctl_send()
2639 int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len) in l2cap_chan_send() argument
2645 if (!chan->conn) in l2cap_chan_send()
2649 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) { in l2cap_chan_send()
2650 skb = l2cap_create_connless_pdu(chan, msg, len); in l2cap_chan_send()
2657 if (chan->state != BT_CONNECTED) { in l2cap_chan_send()
2662 l2cap_do_send(chan, skb); in l2cap_chan_send()
2666 switch (chan->mode) { in l2cap_chan_send()
2670 if (len > chan->omtu) in l2cap_chan_send()
2675 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len); in l2cap_chan_send()
2677 if (chan->state != BT_CONNECTED) { in l2cap_chan_send()
2685 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q); in l2cap_chan_send()
2687 l2cap_le_flowctl_send(chan); in l2cap_chan_send()
2689 if (!chan->tx_credits) in l2cap_chan_send()
2690 chan->ops->suspend(chan); in l2cap_chan_send()
2698 if (len > chan->omtu) in l2cap_chan_send()
2702 skb = l2cap_create_basic_pdu(chan, msg, len); in l2cap_chan_send()
2709 if (chan->state != BT_CONNECTED) { in l2cap_chan_send()
2714 l2cap_do_send(chan, skb); in l2cap_chan_send()
2721 if (len > chan->omtu) { in l2cap_chan_send()
2732 err = l2cap_segment_sdu(chan, &seg_queue, msg, len); in l2cap_chan_send()
2737 if (chan->state != BT_CONNECTED) { in l2cap_chan_send()
2745 if (chan->mode == L2CAP_MODE_ERTM) in l2cap_chan_send()
2746 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST); in l2cap_chan_send()
2748 l2cap_streaming_send(chan, &seg_queue); in l2cap_chan_send()
2759 BT_DBG("bad state %1.1x", chan->mode); in l2cap_chan_send()
2767 static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq) in l2cap_send_srej() argument
2772 BT_DBG("chan %p, txseq %u", chan, txseq); in l2cap_send_srej()
2778 for (seq = chan->expected_tx_seq; seq != txseq; in l2cap_send_srej()
2779 seq = __next_seq(chan, seq)) { in l2cap_send_srej()
2780 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) { in l2cap_send_srej()
2782 l2cap_send_sframe(chan, &control); in l2cap_send_srej()
2783 l2cap_seq_list_append(&chan->srej_list, seq); in l2cap_send_srej()
2787 chan->expected_tx_seq = __next_seq(chan, txseq); in l2cap_send_srej()
2790 static void l2cap_send_srej_tail(struct l2cap_chan *chan) in l2cap_send_srej_tail() argument
2794 BT_DBG("chan %p", chan); in l2cap_send_srej_tail()
2796 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR) in l2cap_send_srej_tail()
2802 control.reqseq = chan->srej_list.tail; in l2cap_send_srej_tail()
2803 l2cap_send_sframe(chan, &control); in l2cap_send_srej_tail()
2806 static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq) in l2cap_send_srej_list() argument
2812 BT_DBG("chan %p, txseq %u", chan, txseq); in l2cap_send_srej_list()
2819 initial_head = chan->srej_list.head; in l2cap_send_srej_list()
2822 seq = l2cap_seq_list_pop(&chan->srej_list); in l2cap_send_srej_list()
2827 l2cap_send_sframe(chan, &control); in l2cap_send_srej_list()
2828 l2cap_seq_list_append(&chan->srej_list, seq); in l2cap_send_srej_list()
2829 } while (chan->srej_list.head != initial_head); in l2cap_send_srej_list()
2832 static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq) in l2cap_process_reqseq() argument
2837 BT_DBG("chan %p, reqseq %u", chan, reqseq); in l2cap_process_reqseq()
2839 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq) in l2cap_process_reqseq()
2843 chan->expected_ack_seq, chan->unacked_frames); in l2cap_process_reqseq()
2845 for (ackseq = chan->expected_ack_seq; ackseq != reqseq; in l2cap_process_reqseq()
2846 ackseq = __next_seq(chan, ackseq)) { in l2cap_process_reqseq()
2848 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq); in l2cap_process_reqseq()
2850 skb_unlink(acked_skb, &chan->tx_q); in l2cap_process_reqseq()
2852 chan->unacked_frames--; in l2cap_process_reqseq()
2856 chan->expected_ack_seq = reqseq; in l2cap_process_reqseq()
2858 if (chan->unacked_frames == 0) in l2cap_process_reqseq()
2859 __clear_retrans_timer(chan); in l2cap_process_reqseq()
2861 BT_DBG("unacked_frames %u", chan->unacked_frames); in l2cap_process_reqseq()
2864 static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan) in l2cap_abort_rx_srej_sent() argument
2866 BT_DBG("chan %p", chan); in l2cap_abort_rx_srej_sent()
2868 chan->expected_tx_seq = chan->buffer_seq; in l2cap_abort_rx_srej_sent()
2869 l2cap_seq_list_clear(&chan->srej_list); in l2cap_abort_rx_srej_sent()
2870 skb_queue_purge(&chan->srej_q); in l2cap_abort_rx_srej_sent()
2871 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_abort_rx_srej_sent()
2874 static void l2cap_tx_state_xmit(struct l2cap_chan *chan, in l2cap_tx_state_xmit() argument
2878 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_xmit()
2883 if (chan->tx_send_head == NULL) in l2cap_tx_state_xmit()
2884 chan->tx_send_head = skb_peek(skbs); in l2cap_tx_state_xmit()
2886 skb_queue_splice_tail_init(skbs, &chan->tx_q); in l2cap_tx_state_xmit()
2887 l2cap_ertm_send(chan); in l2cap_tx_state_xmit()
2891 set_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_xmit()
2893 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) { in l2cap_tx_state_xmit()
2897 l2cap_abort_rx_srej_sent(chan); in l2cap_tx_state_xmit()
2900 l2cap_send_ack(chan); in l2cap_tx_state_xmit()
2905 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_xmit()
2907 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) { in l2cap_tx_state_xmit()
2914 local_control.reqseq = chan->buffer_seq; in l2cap_tx_state_xmit()
2915 l2cap_send_sframe(chan, &local_control); in l2cap_tx_state_xmit()
2917 chan->retry_count = 1; in l2cap_tx_state_xmit()
2918 __set_monitor_timer(chan); in l2cap_tx_state_xmit()
2919 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_xmit()
2923 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_xmit()
2926 l2cap_send_rr_or_rnr(chan, 1); in l2cap_tx_state_xmit()
2927 chan->retry_count = 1; in l2cap_tx_state_xmit()
2928 __set_monitor_timer(chan); in l2cap_tx_state_xmit()
2929 __clear_ack_timer(chan); in l2cap_tx_state_xmit()
2930 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_xmit()
2933 l2cap_send_rr_or_rnr(chan, 1); in l2cap_tx_state_xmit()
2934 chan->retry_count = 1; in l2cap_tx_state_xmit()
2935 __set_monitor_timer(chan); in l2cap_tx_state_xmit()
2936 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_xmit()
2946 static void l2cap_tx_state_wait_f(struct l2cap_chan *chan, in l2cap_tx_state_wait_f() argument
2950 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_wait_f()
2955 if (chan->tx_send_head == NULL) in l2cap_tx_state_wait_f()
2956 chan->tx_send_head = skb_peek(skbs); in l2cap_tx_state_wait_f()
2958 skb_queue_splice_tail_init(skbs, &chan->tx_q); in l2cap_tx_state_wait_f()
2962 set_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_wait_f()
2964 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) { in l2cap_tx_state_wait_f()
2968 l2cap_abort_rx_srej_sent(chan); in l2cap_tx_state_wait_f()
2971 l2cap_send_ack(chan); in l2cap_tx_state_wait_f()
2976 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_wait_f()
2978 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) { in l2cap_tx_state_wait_f()
2984 local_control.reqseq = chan->buffer_seq; in l2cap_tx_state_wait_f()
2985 l2cap_send_sframe(chan, &local_control); in l2cap_tx_state_wait_f()
2987 chan->retry_count = 1; in l2cap_tx_state_wait_f()
2988 __set_monitor_timer(chan); in l2cap_tx_state_wait_f()
2989 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_wait_f()
2993 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_wait_f()
2998 __clear_monitor_timer(chan); in l2cap_tx_state_wait_f()
2999 if (chan->unacked_frames > 0) in l2cap_tx_state_wait_f()
3000 __set_retrans_timer(chan); in l2cap_tx_state_wait_f()
3001 chan->retry_count = 0; in l2cap_tx_state_wait_f()
3002 chan->tx_state = L2CAP_TX_STATE_XMIT; in l2cap_tx_state_wait_f()
3003 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state); in l2cap_tx_state_wait_f()
3010 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) { in l2cap_tx_state_wait_f()
3011 l2cap_send_rr_or_rnr(chan, 1); in l2cap_tx_state_wait_f()
3012 __set_monitor_timer(chan); in l2cap_tx_state_wait_f()
3013 chan->retry_count++; in l2cap_tx_state_wait_f()
3015 l2cap_send_disconn_req(chan, ECONNABORTED); in l2cap_tx_state_wait_f()
3023 static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_tx() argument
3027 chan, control, skbs, event, chan->tx_state); in l2cap_tx()
3029 switch (chan->tx_state) { in l2cap_tx()
3031 l2cap_tx_state_xmit(chan, control, skbs, event); in l2cap_tx()
3034 l2cap_tx_state_wait_f(chan, control, skbs, event); in l2cap_tx()
3042 static void l2cap_pass_to_tx(struct l2cap_chan *chan, in l2cap_pass_to_tx() argument
3045 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx()
3046 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT); in l2cap_pass_to_tx()
3049 static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan, in l2cap_pass_to_tx_fbit() argument
3052 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx_fbit()
3053 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT); in l2cap_pass_to_tx_fbit()
3060 struct l2cap_chan *chan; in l2cap_raw_recv() local
3066 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_raw_recv()
3067 if (chan->chan_type != L2CAP_CHAN_RAW) in l2cap_raw_recv()
3071 if (bt_cb(skb)->l2cap.chan == chan) in l2cap_raw_recv()
3077 if (chan->ops->recv(chan, nskb)) in l2cap_raw_recv()
3218 static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan, size_t size) in l2cap_add_opt_efs() argument
3222 switch (chan->mode) { in l2cap_add_opt_efs()
3224 efs.id = chan->local_id; in l2cap_add_opt_efs()
3225 efs.stype = chan->local_stype; in l2cap_add_opt_efs()
3226 efs.msdu = cpu_to_le16(chan->local_msdu); in l2cap_add_opt_efs()
3227 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime); in l2cap_add_opt_efs()
3235 efs.msdu = cpu_to_le16(chan->local_msdu); in l2cap_add_opt_efs()
3236 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime); in l2cap_add_opt_efs()
3251 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_ack_timeout() local
3255 BT_DBG("chan %p", chan); in l2cap_ack_timeout()
3257 l2cap_chan_lock(chan); in l2cap_ack_timeout()
3259 frames_to_ack = __seq_offset(chan, chan->buffer_seq, in l2cap_ack_timeout()
3260 chan->last_acked_seq); in l2cap_ack_timeout()
3263 l2cap_send_rr_or_rnr(chan, 0); in l2cap_ack_timeout()
3265 l2cap_chan_unlock(chan); in l2cap_ack_timeout()
3266 l2cap_chan_put(chan); in l2cap_ack_timeout()
3269 int l2cap_ertm_init(struct l2cap_chan *chan) in l2cap_ertm_init() argument
3273 chan->next_tx_seq = 0; in l2cap_ertm_init()
3274 chan->expected_tx_seq = 0; in l2cap_ertm_init()
3275 chan->expected_ack_seq = 0; in l2cap_ertm_init()
3276 chan->unacked_frames = 0; in l2cap_ertm_init()
3277 chan->buffer_seq = 0; in l2cap_ertm_init()
3278 chan->frames_sent = 0; in l2cap_ertm_init()
3279 chan->last_acked_seq = 0; in l2cap_ertm_init()
3280 chan->sdu = NULL; in l2cap_ertm_init()
3281 chan->sdu_last_frag = NULL; in l2cap_ertm_init()
3282 chan->sdu_len = 0; in l2cap_ertm_init()
3284 skb_queue_head_init(&chan->tx_q); in l2cap_ertm_init()
3286 chan->local_amp_id = AMP_ID_BREDR; in l2cap_ertm_init()
3287 chan->move_id = AMP_ID_BREDR; in l2cap_ertm_init()
3288 chan->move_state = L2CAP_MOVE_STABLE; in l2cap_ertm_init()
3289 chan->move_role = L2CAP_MOVE_ROLE_NONE; in l2cap_ertm_init()
3291 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_ertm_init()
3294 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_ertm_init()
3295 chan->tx_state = L2CAP_TX_STATE_XMIT; in l2cap_ertm_init()
3297 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout); in l2cap_ertm_init()
3298 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout); in l2cap_ertm_init()
3299 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout); in l2cap_ertm_init()
3301 skb_queue_head_init(&chan->srej_q); in l2cap_ertm_init()
3303 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win); in l2cap_ertm_init()
3307 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win); in l2cap_ertm_init()
3309 l2cap_seq_list_free(&chan->srej_list); in l2cap_ertm_init()
3339 static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan, in __l2cap_set_ertm_timeouts() argument
3342 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) { in __l2cap_set_ertm_timeouts()
3343 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to; in __l2cap_set_ertm_timeouts()
3377 static inline void l2cap_txwin_setup(struct l2cap_chan *chan) in l2cap_txwin_setup() argument
3379 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW && in l2cap_txwin_setup()
3380 __l2cap_ews_supported(chan->conn)) { in l2cap_txwin_setup()
3382 set_bit(FLAG_EXT_CTRL, &chan->flags); in l2cap_txwin_setup()
3383 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW; in l2cap_txwin_setup()
3385 chan->tx_win = min_t(u16, chan->tx_win, in l2cap_txwin_setup()
3387 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW; in l2cap_txwin_setup()
3389 chan->ack_win = chan->tx_win; in l2cap_txwin_setup()
3392 static void l2cap_mtu_auto(struct l2cap_chan *chan) in l2cap_mtu_auto() argument
3394 struct hci_conn *conn = chan->conn->hcon; in l2cap_mtu_auto()
3396 chan->imtu = L2CAP_DEFAULT_MIN_MTU; in l2cap_mtu_auto()
3402 chan->imtu = 54; in l2cap_mtu_auto()
3408 chan->imtu = 83; in l2cap_mtu_auto()
3414 chan->imtu = 367; in l2cap_mtu_auto()
3420 chan->imtu = 552; in l2cap_mtu_auto()
3426 chan->imtu = 679; in l2cap_mtu_auto()
3432 chan->imtu = 1021; in l2cap_mtu_auto()
3435 static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size) in l2cap_build_conf_req() argument
3438 struct l2cap_conf_rfc rfc = { .mode = chan->mode }; in l2cap_build_conf_req()
3443 BT_DBG("chan %p", chan); in l2cap_build_conf_req()
3445 if (chan->num_conf_req || chan->num_conf_rsp) in l2cap_build_conf_req()
3448 switch (chan->mode) { in l2cap_build_conf_req()
3451 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) in l2cap_build_conf_req()
3454 if (__l2cap_efs_supported(chan->conn)) in l2cap_build_conf_req()
3455 set_bit(FLAG_EFS_ENABLE, &chan->flags); in l2cap_build_conf_req()
3459 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask); in l2cap_build_conf_req()
3464 if (chan->imtu != L2CAP_DEFAULT_MTU) { in l2cap_build_conf_req()
3465 if (!chan->imtu) in l2cap_build_conf_req()
3466 l2cap_mtu_auto(chan); in l2cap_build_conf_req()
3467 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, in l2cap_build_conf_req()
3471 switch (chan->mode) { in l2cap_build_conf_req()
3476 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) && in l2cap_build_conf_req()
3477 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING)) in l2cap_build_conf_req()
3493 rfc.max_transmit = chan->max_tx; in l2cap_build_conf_req()
3495 __l2cap_set_ertm_timeouts(chan, &rfc); in l2cap_build_conf_req()
3497 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu - in l2cap_build_conf_req()
3502 l2cap_txwin_setup(chan); in l2cap_build_conf_req()
3504 rfc.txwin_size = min_t(u16, chan->tx_win, in l2cap_build_conf_req()
3510 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) in l2cap_build_conf_req()
3511 l2cap_add_opt_efs(&ptr, chan, endptr - ptr); in l2cap_build_conf_req()
3513 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_build_conf_req()
3515 chan->tx_win, endptr - ptr); in l2cap_build_conf_req()
3517 if (chan->conn->feat_mask & L2CAP_FEAT_FCS) in l2cap_build_conf_req()
3518 if (chan->fcs == L2CAP_FCS_NONE || in l2cap_build_conf_req()
3519 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) { in l2cap_build_conf_req()
3520 chan->fcs = L2CAP_FCS_NONE; in l2cap_build_conf_req()
3522 chan->fcs, endptr - ptr); in l2cap_build_conf_req()
3527 l2cap_txwin_setup(chan); in l2cap_build_conf_req()
3534 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu - in l2cap_build_conf_req()
3542 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) in l2cap_build_conf_req()
3543 l2cap_add_opt_efs(&ptr, chan, endptr - ptr); in l2cap_build_conf_req()
3545 if (chan->conn->feat_mask & L2CAP_FEAT_FCS) in l2cap_build_conf_req()
3546 if (chan->fcs == L2CAP_FCS_NONE || in l2cap_build_conf_req()
3547 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) { in l2cap_build_conf_req()
3548 chan->fcs = L2CAP_FCS_NONE; in l2cap_build_conf_req()
3550 chan->fcs, endptr - ptr); in l2cap_build_conf_req()
3555 req->dcid = cpu_to_le16(chan->dcid); in l2cap_build_conf_req()
3561 static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data_size) in l2cap_parse_conf_req() argument
3566 void *req = chan->conf_req; in l2cap_parse_conf_req()
3567 int len = chan->conf_len; in l2cap_parse_conf_req()
3577 BT_DBG("chan %p", chan); in l2cap_parse_conf_req()
3597 chan->flush_to = val; in l2cap_parse_conf_req()
3613 set_bit(CONF_RECV_NO_FCS, &chan->conf_state); in l2cap_parse_conf_req()
3626 if (!(chan->conn->local_fixed_chan & L2CAP_FC_A2MP)) in l2cap_parse_conf_req()
3628 set_bit(FLAG_EXT_CTRL, &chan->flags); in l2cap_parse_conf_req()
3629 set_bit(CONF_EWS_RECV, &chan->conf_state); in l2cap_parse_conf_req()
3630 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW; in l2cap_parse_conf_req()
3631 chan->remote_tx_win = val; in l2cap_parse_conf_req()
3643 if (chan->num_conf_rsp || chan->num_conf_req > 1) in l2cap_parse_conf_req()
3646 switch (chan->mode) { in l2cap_parse_conf_req()
3649 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) { in l2cap_parse_conf_req()
3650 chan->mode = l2cap_select_mode(rfc.mode, in l2cap_parse_conf_req()
3651 chan->conn->feat_mask); in l2cap_parse_conf_req()
3656 if (__l2cap_efs_supported(chan->conn)) in l2cap_parse_conf_req()
3657 set_bit(FLAG_EFS_ENABLE, &chan->flags); in l2cap_parse_conf_req()
3662 if (chan->mode != rfc.mode) in l2cap_parse_conf_req()
3669 if (chan->mode != rfc.mode) { in l2cap_parse_conf_req()
3671 rfc.mode = chan->mode; in l2cap_parse_conf_req()
3673 if (chan->num_conf_rsp == 1) in l2cap_parse_conf_req()
3687 chan->omtu = mtu; in l2cap_parse_conf_req()
3688 set_bit(CONF_MTU_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3690 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu, endptr - ptr); in l2cap_parse_conf_req()
3693 if (chan->local_stype != L2CAP_SERV_NOTRAFIC && in l2cap_parse_conf_req()
3695 efs.stype != chan->local_stype) { in l2cap_parse_conf_req()
3699 if (chan->num_conf_req >= 1) in l2cap_parse_conf_req()
3708 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state); in l2cap_parse_conf_req()
3714 chan->fcs = L2CAP_FCS_NONE; in l2cap_parse_conf_req()
3715 set_bit(CONF_MODE_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3719 if (!test_bit(CONF_EWS_RECV, &chan->conf_state)) in l2cap_parse_conf_req()
3720 chan->remote_tx_win = rfc.txwin_size; in l2cap_parse_conf_req()
3724 chan->remote_max_tx = rfc.max_transmit; in l2cap_parse_conf_req()
3727 chan->conn->mtu - L2CAP_EXT_HDR_SIZE - in l2cap_parse_conf_req()
3730 chan->remote_mps = size; in l2cap_parse_conf_req()
3732 __l2cap_set_ertm_timeouts(chan, &rfc); in l2cap_parse_conf_req()
3734 set_bit(CONF_MODE_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3739 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) { in l2cap_parse_conf_req()
3740 chan->remote_id = efs.id; in l2cap_parse_conf_req()
3741 chan->remote_stype = efs.stype; in l2cap_parse_conf_req()
3742 chan->remote_msdu = le16_to_cpu(efs.msdu); in l2cap_parse_conf_req()
3743 chan->remote_flush_to = in l2cap_parse_conf_req()
3745 chan->remote_acc_lat = in l2cap_parse_conf_req()
3747 chan->remote_sdu_itime = in l2cap_parse_conf_req()
3757 chan->conn->mtu - L2CAP_EXT_HDR_SIZE - in l2cap_parse_conf_req()
3760 chan->remote_mps = size; in l2cap_parse_conf_req()
3762 set_bit(CONF_MODE_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3773 rfc.mode = chan->mode; in l2cap_parse_conf_req()
3777 set_bit(CONF_OUTPUT_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3779 rsp->scid = cpu_to_le16(chan->dcid); in l2cap_parse_conf_req()
3786 static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, in l2cap_parse_conf_rsp() argument
3797 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data); in l2cap_parse_conf_rsp()
3810 chan->imtu = L2CAP_DEFAULT_MIN_MTU; in l2cap_parse_conf_rsp()
3812 chan->imtu = val; in l2cap_parse_conf_rsp()
3813 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, in l2cap_parse_conf_rsp()
3820 chan->flush_to = val; in l2cap_parse_conf_rsp()
3822 chan->flush_to, endptr - ptr); in l2cap_parse_conf_rsp()
3829 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) && in l2cap_parse_conf_rsp()
3830 rfc.mode != chan->mode) in l2cap_parse_conf_rsp()
3832 chan->fcs = 0; in l2cap_parse_conf_rsp()
3840 chan->ack_win = min_t(u16, val, chan->ack_win); in l2cap_parse_conf_rsp()
3842 chan->tx_win, endptr - ptr); in l2cap_parse_conf_rsp()
3849 if (chan->local_stype != L2CAP_SERV_NOTRAFIC && in l2cap_parse_conf_rsp()
3851 efs.stype != chan->local_stype) in l2cap_parse_conf_rsp()
3863 &chan->conf_state); in l2cap_parse_conf_rsp()
3868 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode) in l2cap_parse_conf_rsp()
3871 chan->mode = rfc.mode; in l2cap_parse_conf_rsp()
3876 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout); in l2cap_parse_conf_rsp()
3877 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout); in l2cap_parse_conf_rsp()
3878 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_parse_conf_rsp()
3879 if (!test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_parse_conf_rsp()
3880 chan->ack_win = min_t(u16, chan->ack_win, in l2cap_parse_conf_rsp()
3883 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) { in l2cap_parse_conf_rsp()
3884 chan->local_msdu = le16_to_cpu(efs.msdu); in l2cap_parse_conf_rsp()
3885 chan->local_sdu_itime = in l2cap_parse_conf_rsp()
3887 chan->local_acc_lat = le32_to_cpu(efs.acc_lat); in l2cap_parse_conf_rsp()
3888 chan->local_flush_to = in l2cap_parse_conf_rsp()
3894 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_parse_conf_rsp()
3898 req->dcid = cpu_to_le16(chan->dcid); in l2cap_parse_conf_rsp()
3904 static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data, in l2cap_build_conf_rsp() argument
3910 BT_DBG("chan %p", chan); in l2cap_build_conf_rsp()
3912 rsp->scid = cpu_to_le16(chan->dcid); in l2cap_build_conf_rsp()
3919 void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan) in __l2cap_le_connect_rsp_defer() argument
3922 struct l2cap_conn *conn = chan->conn; in __l2cap_le_connect_rsp_defer()
3924 BT_DBG("chan %p", chan); in __l2cap_le_connect_rsp_defer()
3926 rsp.dcid = cpu_to_le16(chan->scid); in __l2cap_le_connect_rsp_defer()
3927 rsp.mtu = cpu_to_le16(chan->imtu); in __l2cap_le_connect_rsp_defer()
3928 rsp.mps = cpu_to_le16(chan->mps); in __l2cap_le_connect_rsp_defer()
3929 rsp.credits = cpu_to_le16(chan->rx_credits); in __l2cap_le_connect_rsp_defer()
3932 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in __l2cap_le_connect_rsp_defer()
3936 void __l2cap_ecred_conn_rsp_defer(struct l2cap_chan *chan) in __l2cap_ecred_conn_rsp_defer() argument
3942 struct l2cap_conn *conn = chan->conn; in __l2cap_ecred_conn_rsp_defer()
3943 u16 ident = chan->ident; in __l2cap_ecred_conn_rsp_defer()
3949 BT_DBG("chan %p ident %d", chan, ident); in __l2cap_ecred_conn_rsp_defer()
3951 pdu.rsp.mtu = cpu_to_le16(chan->imtu); in __l2cap_ecred_conn_rsp_defer()
3952 pdu.rsp.mps = cpu_to_le16(chan->mps); in __l2cap_ecred_conn_rsp_defer()
3953 pdu.rsp.credits = cpu_to_le16(chan->rx_credits); in __l2cap_ecred_conn_rsp_defer()
3958 list_for_each_entry(chan, &conn->chan_l, list) { in __l2cap_ecred_conn_rsp_defer()
3959 if (chan->ident != ident) in __l2cap_ecred_conn_rsp_defer()
3963 chan->ident = 0; in __l2cap_ecred_conn_rsp_defer()
3966 pdu.dcid[i++] = cpu_to_le16(chan->scid); in __l2cap_ecred_conn_rsp_defer()
3975 void __l2cap_connect_rsp_defer(struct l2cap_chan *chan) in __l2cap_connect_rsp_defer() argument
3978 struct l2cap_conn *conn = chan->conn; in __l2cap_connect_rsp_defer()
3982 rsp.scid = cpu_to_le16(chan->dcid); in __l2cap_connect_rsp_defer()
3983 rsp.dcid = cpu_to_le16(chan->scid); in __l2cap_connect_rsp_defer()
3987 if (chan->hs_hcon) in __l2cap_connect_rsp_defer()
3992 BT_DBG("chan %p rsp_code %u", chan, rsp_code); in __l2cap_connect_rsp_defer()
3994 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp); in __l2cap_connect_rsp_defer()
3996 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) in __l2cap_connect_rsp_defer()
4000 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in __l2cap_connect_rsp_defer()
4001 chan->num_conf_req++; in __l2cap_connect_rsp_defer()
4004 static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len) in l2cap_conf_rfc_get() argument
4011 u16 txwin_ext = chan->ack_win; in l2cap_conf_rfc_get()
4013 .mode = chan->mode, in l2cap_conf_rfc_get()
4016 .max_pdu_size = cpu_to_le16(chan->imtu), in l2cap_conf_rfc_get()
4017 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW), in l2cap_conf_rfc_get()
4020 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len); in l2cap_conf_rfc_get()
4022 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING)) in l2cap_conf_rfc_get()
4046 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout); in l2cap_conf_rfc_get()
4047 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout); in l2cap_conf_rfc_get()
4048 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_conf_rfc_get()
4049 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_conf_rfc_get()
4050 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext); in l2cap_conf_rfc_get()
4052 chan->ack_win = min_t(u16, chan->ack_win, in l2cap_conf_rfc_get()
4056 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_conf_rfc_get()
4091 struct l2cap_chan *chan = NULL, *pchan; in l2cap_connect() local
4132 chan = pchan->ops->new_connection(pchan); in l2cap_connect()
4133 if (!chan) in l2cap_connect()
4143 bacpy(&chan->src, &conn->hcon->src); in l2cap_connect()
4144 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_connect()
4145 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_connect()
4146 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_connect()
4147 chan->psm = psm; in l2cap_connect()
4148 chan->dcid = scid; in l2cap_connect()
4149 chan->local_amp_id = amp_id; in l2cap_connect()
4151 __l2cap_chan_add(conn, chan); in l2cap_connect()
4153 dcid = chan->scid; in l2cap_connect()
4155 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_connect()
4157 chan->ident = cmd->ident; in l2cap_connect()
4160 if (l2cap_chan_check_security(chan, false)) { in l2cap_connect()
4161 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_connect()
4162 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4165 chan->ops->defer(chan); in l2cap_connect()
4172 l2cap_state_change(chan, BT_CONFIG); in l2cap_connect()
4175 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4181 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4186 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4216 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) && in l2cap_connect()
4219 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_connect()
4221 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_connect()
4222 chan->num_conf_req++; in l2cap_connect()
4225 return chan; in l2cap_connect()
4253 struct l2cap_chan *chan; in l2cap_connect_create_rsp() local
4271 chan = __l2cap_get_chan_by_scid(conn, scid); in l2cap_connect_create_rsp()
4272 if (!chan) { in l2cap_connect_create_rsp()
4277 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_connect_create_rsp()
4278 if (!chan) { in l2cap_connect_create_rsp()
4286 l2cap_chan_lock(chan); in l2cap_connect_create_rsp()
4290 l2cap_state_change(chan, BT_CONFIG); in l2cap_connect_create_rsp()
4291 chan->ident = 0; in l2cap_connect_create_rsp()
4292 chan->dcid = dcid; in l2cap_connect_create_rsp()
4293 clear_bit(CONF_CONNECT_PEND, &chan->conf_state); in l2cap_connect_create_rsp()
4295 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) in l2cap_connect_create_rsp()
4299 l2cap_build_conf_req(chan, req, sizeof(req)), req); in l2cap_connect_create_rsp()
4300 chan->num_conf_req++; in l2cap_connect_create_rsp()
4304 set_bit(CONF_CONNECT_PEND, &chan->conf_state); in l2cap_connect_create_rsp()
4308 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_connect_create_rsp()
4312 l2cap_chan_unlock(chan); in l2cap_connect_create_rsp()
4320 static inline void set_default_fcs(struct l2cap_chan *chan) in set_default_fcs() argument
4325 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING) in set_default_fcs()
4326 chan->fcs = L2CAP_FCS_NONE; in set_default_fcs()
4327 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) in set_default_fcs()
4328 chan->fcs = L2CAP_FCS_CRC16; in set_default_fcs()
4331 static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data, in l2cap_send_efs_conf_rsp() argument
4334 struct l2cap_conn *conn = chan->conn; in l2cap_send_efs_conf_rsp()
4336 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident, in l2cap_send_efs_conf_rsp()
4339 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state); in l2cap_send_efs_conf_rsp()
4340 set_bit(CONF_OUTPUT_DONE, &chan->conf_state); in l2cap_send_efs_conf_rsp()
4343 l2cap_build_conf_rsp(chan, data, in l2cap_send_efs_conf_rsp()
4366 struct l2cap_chan *chan; in l2cap_config_req() local
4377 chan = l2cap_get_chan_by_scid(conn, dcid); in l2cap_config_req()
4378 if (!chan) { in l2cap_config_req()
4383 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2 && in l2cap_config_req()
4384 chan->state != BT_CONNECTED) { in l2cap_config_req()
4385 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid, in l2cap_config_req()
4386 chan->dcid); in l2cap_config_req()
4392 if (chan->conf_len + len > sizeof(chan->conf_req)) { in l2cap_config_req()
4394 l2cap_build_conf_rsp(chan, rsp, in l2cap_config_req()
4400 memcpy(chan->conf_req + chan->conf_len, req->data, len); in l2cap_config_req()
4401 chan->conf_len += len; in l2cap_config_req()
4406 l2cap_build_conf_rsp(chan, rsp, in l2cap_config_req()
4412 len = l2cap_parse_conf_req(chan, rsp, sizeof(rsp)); in l2cap_config_req()
4414 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_req()
4418 chan->ident = cmd->ident; in l2cap_config_req()
4420 chan->num_conf_rsp++; in l2cap_config_req()
4423 chan->conf_len = 0; in l2cap_config_req()
4425 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) in l2cap_config_req()
4428 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) { in l2cap_config_req()
4429 set_default_fcs(chan); in l2cap_config_req()
4431 if (chan->mode == L2CAP_MODE_ERTM || in l2cap_config_req()
4432 chan->mode == L2CAP_MODE_STREAMING) in l2cap_config_req()
4433 err = l2cap_ertm_init(chan); in l2cap_config_req()
4436 l2cap_send_disconn_req(chan, -err); in l2cap_config_req()
4438 l2cap_chan_ready(chan); in l2cap_config_req()
4443 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) { in l2cap_config_req()
4446 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_config_req()
4447 chan->num_conf_req++; in l2cap_config_req()
4452 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) && in l2cap_config_req()
4453 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) { in l2cap_config_req()
4458 if (!chan->hs_hcon) in l2cap_config_req()
4459 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags); in l2cap_config_req()
4461 chan->ident = cmd->ident; in l2cap_config_req()
4465 l2cap_chan_unlock(chan); in l2cap_config_req()
4475 struct l2cap_chan *chan; in l2cap_config_rsp() local
4489 chan = l2cap_get_chan_by_scid(conn, scid); in l2cap_config_rsp()
4490 if (!chan) in l2cap_config_rsp()
4495 l2cap_conf_rfc_get(chan, rsp->data, len); in l2cap_config_rsp()
4496 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state); in l2cap_config_rsp()
4500 set_bit(CONF_REM_CONF_PEND, &chan->conf_state); in l2cap_config_rsp()
4502 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) { in l2cap_config_rsp()
4505 len = l2cap_parse_conf_rsp(chan, rsp->data, len, in l2cap_config_rsp()
4508 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4512 if (!chan->hs_hcon) { in l2cap_config_rsp()
4513 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident, in l2cap_config_rsp()
4516 if (l2cap_check_efs(chan)) { in l2cap_config_rsp()
4517 amp_create_logical_link(chan); in l2cap_config_rsp()
4518 chan->ident = cmd->ident; in l2cap_config_rsp()
4526 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) { in l2cap_config_rsp()
4530 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4536 len = l2cap_parse_conf_rsp(chan, rsp->data, len, in l2cap_config_rsp()
4539 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4545 chan->num_conf_req++; in l2cap_config_rsp()
4553 l2cap_chan_set_err(chan, ECONNRESET); in l2cap_config_rsp()
4555 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT); in l2cap_config_rsp()
4556 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4563 set_bit(CONF_INPUT_DONE, &chan->conf_state); in l2cap_config_rsp()
4565 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) { in l2cap_config_rsp()
4566 set_default_fcs(chan); in l2cap_config_rsp()
4568 if (chan->mode == L2CAP_MODE_ERTM || in l2cap_config_rsp()
4569 chan->mode == L2CAP_MODE_STREAMING) in l2cap_config_rsp()
4570 err = l2cap_ertm_init(chan); in l2cap_config_rsp()
4573 l2cap_send_disconn_req(chan, -err); in l2cap_config_rsp()
4575 l2cap_chan_ready(chan); in l2cap_config_rsp()
4579 l2cap_chan_unlock(chan); in l2cap_config_rsp()
4590 struct l2cap_chan *chan; in l2cap_disconnect_req() local
4602 chan = __l2cap_get_chan_by_scid(conn, dcid); in l2cap_disconnect_req()
4603 if (!chan) { in l2cap_disconnect_req()
4609 l2cap_chan_hold(chan); in l2cap_disconnect_req()
4610 l2cap_chan_lock(chan); in l2cap_disconnect_req()
4612 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_disconnect_req()
4613 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_disconnect_req()
4616 chan->ops->set_shutdown(chan); in l2cap_disconnect_req()
4618 l2cap_chan_del(chan, ECONNRESET); in l2cap_disconnect_req()
4620 chan->ops->close(chan); in l2cap_disconnect_req()
4622 l2cap_chan_unlock(chan); in l2cap_disconnect_req()
4623 l2cap_chan_put(chan); in l2cap_disconnect_req()
4636 struct l2cap_chan *chan; in l2cap_disconnect_rsp() local
4648 chan = __l2cap_get_chan_by_scid(conn, scid); in l2cap_disconnect_rsp()
4649 if (!chan) { in l2cap_disconnect_rsp()
4654 l2cap_chan_hold(chan); in l2cap_disconnect_rsp()
4655 l2cap_chan_lock(chan); in l2cap_disconnect_rsp()
4657 if (chan->state != BT_DISCONN) { in l2cap_disconnect_rsp()
4658 l2cap_chan_unlock(chan); in l2cap_disconnect_rsp()
4659 l2cap_chan_put(chan); in l2cap_disconnect_rsp()
4664 l2cap_chan_del(chan, 0); in l2cap_disconnect_rsp()
4666 chan->ops->close(chan); in l2cap_disconnect_rsp()
4668 l2cap_chan_unlock(chan); in l2cap_disconnect_rsp()
4669 l2cap_chan_put(chan); in l2cap_disconnect_rsp()
4796 struct l2cap_chan *chan; in l2cap_create_channel_req() local
4828 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP, in l2cap_create_channel_req()
4830 if (chan) { in l2cap_create_channel_req()
4838 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid, in l2cap_create_channel_req()
4839 chan->dcid); in l2cap_create_channel_req()
4843 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon); in l2cap_create_channel_req()
4845 mgr->bredr_chan = chan; in l2cap_create_channel_req()
4846 chan->hs_hcon = hs_hcon; in l2cap_create_channel_req()
4847 chan->fcs = L2CAP_FCS_NONE; in l2cap_create_channel_req()
4867 static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id) in l2cap_send_move_chan_req() argument
4872 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id); in l2cap_send_move_chan_req()
4874 ident = l2cap_get_ident(chan->conn); in l2cap_send_move_chan_req()
4875 chan->ident = ident; in l2cap_send_move_chan_req()
4877 req.icid = cpu_to_le16(chan->scid); in l2cap_send_move_chan_req()
4880 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req), in l2cap_send_move_chan_req()
4883 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT); in l2cap_send_move_chan_req()
4886 static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result) in l2cap_send_move_chan_rsp() argument
4890 BT_DBG("chan %p, result 0x%4.4x", chan, result); in l2cap_send_move_chan_rsp()
4892 rsp.icid = cpu_to_le16(chan->dcid); in l2cap_send_move_chan_rsp()
4895 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP, in l2cap_send_move_chan_rsp()
4899 static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result) in l2cap_send_move_chan_cfm() argument
4903 BT_DBG("chan %p, result 0x%4.4x", chan, result); in l2cap_send_move_chan_cfm()
4905 chan->ident = l2cap_get_ident(chan->conn); in l2cap_send_move_chan_cfm()
4907 cfm.icid = cpu_to_le16(chan->scid); in l2cap_send_move_chan_cfm()
4910 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM, in l2cap_send_move_chan_cfm()
4913 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT); in l2cap_send_move_chan_cfm()
4940 static void __release_logical_link(struct l2cap_chan *chan) in __release_logical_link() argument
4942 chan->hs_hchan = NULL; in __release_logical_link()
4943 chan->hs_hcon = NULL; in __release_logical_link()
4948 static void l2cap_logical_fail(struct l2cap_chan *chan) in l2cap_logical_fail() argument
4951 if (chan->state != BT_CONNECTED) { in l2cap_logical_fail()
4953 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_logical_fail()
4957 switch (chan->move_role) { in l2cap_logical_fail()
4959 l2cap_move_done(chan); in l2cap_logical_fail()
4960 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP); in l2cap_logical_fail()
4963 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP || in l2cap_logical_fail()
4964 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) { in l2cap_logical_fail()
4968 l2cap_move_done(chan); in l2cap_logical_fail()
4974 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED); in l2cap_logical_fail()
4979 static void l2cap_logical_finish_create(struct l2cap_chan *chan, in l2cap_logical_finish_create() argument
4984 chan->hs_hchan = hchan; in l2cap_logical_finish_create()
4985 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_logical_finish_create()
4987 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0); in l2cap_logical_finish_create()
4989 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) { in l2cap_logical_finish_create()
4992 set_default_fcs(chan); in l2cap_logical_finish_create()
4994 err = l2cap_ertm_init(chan); in l2cap_logical_finish_create()
4996 l2cap_send_disconn_req(chan, -err); in l2cap_logical_finish_create()
4998 l2cap_chan_ready(chan); in l2cap_logical_finish_create()
5002 static void l2cap_logical_finish_move(struct l2cap_chan *chan, in l2cap_logical_finish_move() argument
5005 chan->hs_hcon = hchan->conn; in l2cap_logical_finish_move()
5006 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_logical_finish_move()
5008 BT_DBG("move_state %d", chan->move_state); in l2cap_logical_finish_move()
5010 switch (chan->move_state) { in l2cap_logical_finish_move()
5015 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS; in l2cap_logical_finish_move()
5018 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_logical_finish_move()
5019 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY; in l2cap_logical_finish_move()
5020 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) { in l2cap_logical_finish_move()
5021 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP; in l2cap_logical_finish_move()
5022 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED); in l2cap_logical_finish_move()
5023 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) { in l2cap_logical_finish_move()
5024 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM; in l2cap_logical_finish_move()
5025 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS); in l2cap_logical_finish_move()
5030 __release_logical_link(chan); in l2cap_logical_finish_move()
5032 chan->move_state = L2CAP_MOVE_STABLE; in l2cap_logical_finish_move()
5037 void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan, in l2cap_logical_cfm() argument
5040 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status); in l2cap_logical_cfm()
5043 l2cap_logical_fail(chan); in l2cap_logical_cfm()
5044 __release_logical_link(chan); in l2cap_logical_cfm()
5048 if (chan->state != BT_CONNECTED) { in l2cap_logical_cfm()
5050 if (chan->local_amp_id != AMP_ID_BREDR) in l2cap_logical_cfm()
5051 l2cap_logical_finish_create(chan, hchan); in l2cap_logical_cfm()
5053 l2cap_logical_finish_move(chan, hchan); in l2cap_logical_cfm()
5057 void l2cap_move_start(struct l2cap_chan *chan) in l2cap_move_start() argument
5059 BT_DBG("chan %p", chan); in l2cap_move_start()
5061 if (chan->local_amp_id == AMP_ID_BREDR) { in l2cap_move_start()
5062 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED) in l2cap_move_start()
5064 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR; in l2cap_move_start()
5065 chan->move_state = L2CAP_MOVE_WAIT_PREPARE; in l2cap_move_start()
5068 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR; in l2cap_move_start()
5069 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS; in l2cap_move_start()
5070 chan->move_id = 0; in l2cap_move_start()
5071 l2cap_move_setup(chan); in l2cap_move_start()
5072 l2cap_send_move_chan_req(chan, 0); in l2cap_move_start()
5076 static void l2cap_do_create(struct l2cap_chan *chan, int result, in l2cap_do_create() argument
5079 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state), in l2cap_do_create()
5082 chan->fcs = L2CAP_FCS_NONE; in l2cap_do_create()
5085 if (chan->state == BT_CONNECT) { in l2cap_do_create()
5087 chan->local_amp_id = local_amp_id; in l2cap_do_create()
5088 l2cap_send_create_chan_req(chan, remote_amp_id); in l2cap_do_create()
5091 l2cap_send_conn_req(chan); in l2cap_do_create()
5098 if (__l2cap_no_conn_pending(chan)) { in l2cap_do_create()
5101 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_do_create()
5102 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_do_create()
5114 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP, in l2cap_do_create()
5118 l2cap_state_change(chan, BT_CONFIG); in l2cap_do_create()
5119 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_do_create()
5120 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn), in l2cap_do_create()
5122 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_do_create()
5123 chan->num_conf_req++; in l2cap_do_create()
5128 static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id, in l2cap_do_move_initiate() argument
5131 l2cap_move_setup(chan); in l2cap_do_move_initiate()
5132 chan->move_id = local_amp_id; in l2cap_do_move_initiate()
5133 chan->move_state = L2CAP_MOVE_WAIT_RSP; in l2cap_do_move_initiate()
5135 l2cap_send_move_chan_req(chan, remote_amp_id); in l2cap_do_move_initiate()
5138 static void l2cap_do_move_respond(struct l2cap_chan *chan, int result) in l2cap_do_move_respond() argument
5147 chan->hs_hcon = hchan->conn; in l2cap_do_move_respond()
5148 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_do_move_respond()
5149 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM; in l2cap_do_move_respond()
5150 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS); in l2cap_do_move_respond()
5152 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS); in l2cap_do_move_respond()
5155 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM; in l2cap_do_move_respond()
5159 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED); in l2cap_do_move_respond()
5163 static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result) in l2cap_do_move_cancel() argument
5165 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) { in l2cap_do_move_cancel()
5172 l2cap_send_move_chan_rsp(chan, rsp_result); in l2cap_do_move_cancel()
5175 chan->move_role = L2CAP_MOVE_ROLE_NONE; in l2cap_do_move_cancel()
5176 chan->move_state = L2CAP_MOVE_STABLE; in l2cap_do_move_cancel()
5179 l2cap_ertm_send(chan); in l2cap_do_move_cancel()
5183 void __l2cap_physical_cfm(struct l2cap_chan *chan, int result) in __l2cap_physical_cfm() argument
5185 u8 local_amp_id = chan->local_amp_id; in __l2cap_physical_cfm()
5186 u8 remote_amp_id = chan->remote_amp_id; in __l2cap_physical_cfm()
5189 chan, result, local_amp_id, remote_amp_id); in __l2cap_physical_cfm()
5191 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) in __l2cap_physical_cfm()
5194 if (chan->state != BT_CONNECTED) { in __l2cap_physical_cfm()
5195 l2cap_do_create(chan, result, local_amp_id, remote_amp_id); in __l2cap_physical_cfm()
5197 l2cap_do_move_cancel(chan, result); in __l2cap_physical_cfm()
5199 switch (chan->move_role) { in __l2cap_physical_cfm()
5201 l2cap_do_move_initiate(chan, local_amp_id, in __l2cap_physical_cfm()
5205 l2cap_do_move_respond(chan, result); in __l2cap_physical_cfm()
5208 l2cap_do_move_cancel(chan, result); in __l2cap_physical_cfm()
5220 struct l2cap_chan *chan; in l2cap_move_channel_req() local
5234 chan = l2cap_get_chan_by_dcid(conn, icid); in l2cap_move_channel_req()
5235 if (!chan) { in l2cap_move_channel_req()
5243 chan->ident = cmd->ident; in l2cap_move_channel_req()
5245 if (chan->scid < L2CAP_CID_DYN_START || in l2cap_move_channel_req()
5246 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY || in l2cap_move_channel_req()
5247 (chan->mode != L2CAP_MODE_ERTM && in l2cap_move_channel_req()
5248 chan->mode != L2CAP_MODE_STREAMING)) { in l2cap_move_channel_req()
5253 if (chan->local_amp_id == req->dest_amp_id) { in l2cap_move_channel_req()
5276 if ((__chan_is_moving(chan) || in l2cap_move_channel_req()
5277 chan->move_role != L2CAP_MOVE_ROLE_NONE) && in l2cap_move_channel_req()
5283 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER; in l2cap_move_channel_req()
5284 l2cap_move_setup(chan); in l2cap_move_channel_req()
5285 chan->move_id = req->dest_amp_id; in l2cap_move_channel_req()
5289 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_move_channel_req()
5290 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY; in l2cap_move_channel_req()
5293 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM; in l2cap_move_channel_req()
5297 chan->move_state = L2CAP_MOVE_WAIT_PREPARE; in l2cap_move_channel_req()
5304 l2cap_send_move_chan_rsp(chan, result); in l2cap_move_channel_req()
5306 l2cap_chan_unlock(chan); in l2cap_move_channel_req()
5313 struct l2cap_chan *chan; in l2cap_move_continue() local
5316 chan = l2cap_get_chan_by_scid(conn, icid); in l2cap_move_continue()
5317 if (!chan) { in l2cap_move_continue()
5322 __clear_chan_timer(chan); in l2cap_move_continue()
5324 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT); in l2cap_move_continue()
5326 switch (chan->move_state) { in l2cap_move_continue()
5331 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM; in l2cap_move_continue()
5337 &chan->conn_state)) { in l2cap_move_continue()
5338 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY; in l2cap_move_continue()
5343 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP; in l2cap_move_continue()
5344 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED); in l2cap_move_continue()
5353 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM; in l2cap_move_continue()
5358 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP; in l2cap_move_continue()
5364 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED); in l2cap_move_continue()
5376 chan->hs_hcon = hchan->conn; in l2cap_move_continue()
5377 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_move_continue()
5381 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED); in l2cap_move_continue()
5386 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS; in l2cap_move_continue()
5389 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS); in l2cap_move_continue()
5393 chan->move_id = chan->local_amp_id; in l2cap_move_continue()
5394 l2cap_move_done(chan); in l2cap_move_continue()
5395 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED); in l2cap_move_continue()
5398 l2cap_chan_unlock(chan); in l2cap_move_continue()
5404 struct l2cap_chan *chan; in l2cap_move_fail() local
5406 chan = l2cap_get_chan_by_ident(conn, ident); in l2cap_move_fail()
5407 if (!chan) { in l2cap_move_fail()
5413 __clear_chan_timer(chan); in l2cap_move_fail()
5415 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) { in l2cap_move_fail()
5417 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER; in l2cap_move_fail()
5420 chan->move_id = chan->local_amp_id; in l2cap_move_fail()
5421 l2cap_move_done(chan); in l2cap_move_fail()
5425 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED); in l2cap_move_fail()
5427 l2cap_chan_unlock(chan); in l2cap_move_fail()
5458 struct l2cap_chan *chan; in l2cap_move_channel_confirm() local
5469 chan = l2cap_get_chan_by_dcid(conn, icid); in l2cap_move_channel_confirm()
5470 if (!chan) { in l2cap_move_channel_confirm()
5476 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) { in l2cap_move_channel_confirm()
5478 chan->local_amp_id = chan->move_id; in l2cap_move_channel_confirm()
5479 if (chan->local_amp_id == AMP_ID_BREDR) in l2cap_move_channel_confirm()
5480 __release_logical_link(chan); in l2cap_move_channel_confirm()
5482 chan->move_id = chan->local_amp_id; in l2cap_move_channel_confirm()
5485 l2cap_move_done(chan); in l2cap_move_channel_confirm()
5490 l2cap_chan_unlock(chan); in l2cap_move_channel_confirm()
5500 struct l2cap_chan *chan; in l2cap_move_channel_confirm_rsp() local
5510 chan = l2cap_get_chan_by_scid(conn, icid); in l2cap_move_channel_confirm_rsp()
5511 if (!chan) in l2cap_move_channel_confirm_rsp()
5514 __clear_chan_timer(chan); in l2cap_move_channel_confirm_rsp()
5516 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) { in l2cap_move_channel_confirm_rsp()
5517 chan->local_amp_id = chan->move_id; in l2cap_move_channel_confirm_rsp()
5519 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan) in l2cap_move_channel_confirm_rsp()
5520 __release_logical_link(chan); in l2cap_move_channel_confirm_rsp()
5522 l2cap_move_done(chan); in l2cap_move_channel_confirm_rsp()
5525 l2cap_chan_unlock(chan); in l2cap_move_channel_confirm_rsp()
5587 struct l2cap_chan *chan; in l2cap_le_connect_rsp() local
5609 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_le_connect_rsp()
5610 if (!chan) { in l2cap_le_connect_rsp()
5617 l2cap_chan_lock(chan); in l2cap_le_connect_rsp()
5626 chan->ident = 0; in l2cap_le_connect_rsp()
5627 chan->dcid = dcid; in l2cap_le_connect_rsp()
5628 chan->omtu = mtu; in l2cap_le_connect_rsp()
5629 chan->remote_mps = mps; in l2cap_le_connect_rsp()
5630 chan->tx_credits = credits; in l2cap_le_connect_rsp()
5631 l2cap_chan_ready(chan); in l2cap_le_connect_rsp()
5640 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_le_connect_rsp()
5645 if (chan->sec_level < sec_level) in l2cap_le_connect_rsp()
5646 chan->sec_level = sec_level; in l2cap_le_connect_rsp()
5649 clear_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags); in l2cap_le_connect_rsp()
5651 smp_conn_security(hcon, chan->sec_level); in l2cap_le_connect_rsp()
5655 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_le_connect_rsp()
5659 l2cap_chan_unlock(chan); in l2cap_le_connect_rsp()
5753 struct l2cap_chan *chan, *pchan; in l2cap_le_connect_req() local
5779 chan = NULL; in l2cap_le_connect_req()
5789 chan = NULL; in l2cap_le_connect_req()
5796 chan = NULL; in l2cap_le_connect_req()
5803 chan = NULL; in l2cap_le_connect_req()
5807 chan = pchan->ops->new_connection(pchan); in l2cap_le_connect_req()
5808 if (!chan) { in l2cap_le_connect_req()
5813 bacpy(&chan->src, &conn->hcon->src); in l2cap_le_connect_req()
5814 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_le_connect_req()
5815 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_le_connect_req()
5816 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_le_connect_req()
5817 chan->psm = psm; in l2cap_le_connect_req()
5818 chan->dcid = scid; in l2cap_le_connect_req()
5819 chan->omtu = mtu; in l2cap_le_connect_req()
5820 chan->remote_mps = mps; in l2cap_le_connect_req()
5822 __l2cap_chan_add(conn, chan); in l2cap_le_connect_req()
5824 l2cap_le_flowctl_init(chan, __le16_to_cpu(req->credits)); in l2cap_le_connect_req()
5826 dcid = chan->scid; in l2cap_le_connect_req()
5827 credits = chan->rx_credits; in l2cap_le_connect_req()
5829 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_le_connect_req()
5831 chan->ident = cmd->ident; in l2cap_le_connect_req()
5833 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_le_connect_req()
5834 l2cap_state_change(chan, BT_CONNECT2); in l2cap_le_connect_req()
5841 chan->ops->defer(chan); in l2cap_le_connect_req()
5843 l2cap_chan_ready(chan); in l2cap_le_connect_req()
5856 if (chan) { in l2cap_le_connect_req()
5857 rsp.mtu = cpu_to_le16(chan->imtu); in l2cap_le_connect_req()
5858 rsp.mps = cpu_to_le16(chan->mps); in l2cap_le_connect_req()
5878 struct l2cap_chan *chan; in l2cap_le_credits() local
5890 chan = l2cap_get_chan_by_dcid(conn, cid); in l2cap_le_credits()
5891 if (!chan) in l2cap_le_credits()
5894 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits; in l2cap_le_credits()
5897 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_le_credits()
5898 l2cap_chan_unlock(chan); in l2cap_le_credits()
5906 chan->tx_credits += credits; in l2cap_le_credits()
5909 l2cap_le_flowctl_send(chan); in l2cap_le_credits()
5911 if (chan->tx_credits) in l2cap_le_credits()
5912 chan->ops->resume(chan); in l2cap_le_credits()
5914 l2cap_chan_unlock(chan); in l2cap_le_credits()
5928 struct l2cap_chan *chan, *pchan; in l2cap_ecred_conn_req() local
6004 chan = pchan->ops->new_connection(pchan); in l2cap_ecred_conn_req()
6005 if (!chan) { in l2cap_ecred_conn_req()
6010 bacpy(&chan->src, &conn->hcon->src); in l2cap_ecred_conn_req()
6011 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_ecred_conn_req()
6012 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_ecred_conn_req()
6013 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_ecred_conn_req()
6014 chan->psm = psm; in l2cap_ecred_conn_req()
6015 chan->dcid = scid; in l2cap_ecred_conn_req()
6016 chan->omtu = mtu; in l2cap_ecred_conn_req()
6017 chan->remote_mps = mps; in l2cap_ecred_conn_req()
6019 __l2cap_chan_add(conn, chan); in l2cap_ecred_conn_req()
6021 l2cap_ecred_init(chan, __le16_to_cpu(req->credits)); in l2cap_ecred_conn_req()
6025 pdu.rsp.mtu = cpu_to_le16(chan->imtu); in l2cap_ecred_conn_req()
6026 pdu.rsp.mps = cpu_to_le16(chan->mps); in l2cap_ecred_conn_req()
6027 pdu.rsp.credits = cpu_to_le16(chan->rx_credits); in l2cap_ecred_conn_req()
6030 pdu.dcid[i] = cpu_to_le16(chan->scid); in l2cap_ecred_conn_req()
6032 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_ecred_conn_req()
6034 chan->ident = cmd->ident; in l2cap_ecred_conn_req()
6036 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_ecred_conn_req()
6037 l2cap_state_change(chan, BT_CONNECT2); in l2cap_ecred_conn_req()
6039 chan->ops->defer(chan); in l2cap_ecred_conn_req()
6041 l2cap_chan_ready(chan); in l2cap_ecred_conn_req()
6069 struct l2cap_chan *chan, *tmp; in l2cap_ecred_conn_rsp() local
6088 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) { in l2cap_ecred_conn_rsp()
6091 if (chan->ident != cmd->ident || in l2cap_ecred_conn_rsp()
6092 chan->mode != L2CAP_MODE_EXT_FLOWCTL || in l2cap_ecred_conn_rsp()
6093 chan->state == BT_CONNECTED) in l2cap_ecred_conn_rsp()
6096 l2cap_chan_lock(chan); in l2cap_ecred_conn_rsp()
6100 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6101 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
6118 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6119 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
6120 chan = __l2cap_get_chan_by_dcid(conn, dcid); in l2cap_ecred_conn_rsp()
6121 l2cap_chan_lock(chan); in l2cap_ecred_conn_rsp()
6122 l2cap_chan_del(chan, ECONNRESET); in l2cap_ecred_conn_rsp()
6123 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
6134 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6139 if (chan->sec_level < sec_level) in l2cap_ecred_conn_rsp()
6140 chan->sec_level = sec_level; in l2cap_ecred_conn_rsp()
6143 clear_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags); in l2cap_ecred_conn_rsp()
6145 smp_conn_security(hcon, chan->sec_level); in l2cap_ecred_conn_rsp()
6149 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6155 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6159 chan->ident = 0; in l2cap_ecred_conn_rsp()
6160 chan->dcid = dcid; in l2cap_ecred_conn_rsp()
6161 chan->omtu = mtu; in l2cap_ecred_conn_rsp()
6162 chan->remote_mps = mps; in l2cap_ecred_conn_rsp()
6163 chan->tx_credits = credits; in l2cap_ecred_conn_rsp()
6164 l2cap_chan_ready(chan); in l2cap_ecred_conn_rsp()
6168 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
6183 struct l2cap_chan *chan; in l2cap_ecred_reconf_req() local
6220 chan = __l2cap_get_chan_by_dcid(conn, scid); in l2cap_ecred_reconf_req()
6221 if (!chan) in l2cap_ecred_reconf_req()
6228 if (chan->omtu > mtu) { in l2cap_ecred_reconf_req()
6229 BT_ERR("chan %p decreased MTU %u -> %u", chan, in l2cap_ecred_reconf_req()
6230 chan->omtu, mtu); in l2cap_ecred_reconf_req()
6234 chan->omtu = mtu; in l2cap_ecred_reconf_req()
6235 chan->remote_mps = mps; in l2cap_ecred_reconf_req()
6251 struct l2cap_chan *chan, *tmp; in l2cap_ecred_reconf_rsp() local
6265 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) { in l2cap_ecred_reconf_rsp()
6266 if (chan->ident != cmd->ident) in l2cap_ecred_reconf_rsp()
6269 l2cap_chan_del(chan, ECONNRESET); in l2cap_ecred_reconf_rsp()
6280 struct l2cap_chan *chan; in l2cap_le_command_rej() local
6287 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_le_command_rej()
6288 if (!chan) in l2cap_le_command_rej()
6291 l2cap_chan_lock(chan); in l2cap_le_command_rej()
6292 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_le_command_rej()
6293 l2cap_chan_unlock(chan); in l2cap_le_command_rej()
6450 static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_check_fcs() argument
6455 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_check_fcs()
6460 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_check_fcs()
6471 static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan) in l2cap_send_i_or_rr_or_rnr() argument
6475 BT_DBG("chan %p", chan); in l2cap_send_i_or_rr_or_rnr()
6480 control.reqseq = chan->buffer_seq; in l2cap_send_i_or_rr_or_rnr()
6481 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_send_i_or_rr_or_rnr()
6483 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_send_i_or_rr_or_rnr()
6485 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
6488 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) && in l2cap_send_i_or_rr_or_rnr()
6489 chan->unacked_frames > 0) in l2cap_send_i_or_rr_or_rnr()
6490 __set_retrans_timer(chan); in l2cap_send_i_or_rr_or_rnr()
6493 l2cap_ertm_send(chan); in l2cap_send_i_or_rr_or_rnr()
6495 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) && in l2cap_send_i_or_rr_or_rnr()
6496 test_bit(CONN_SEND_FBIT, &chan->conn_state)) { in l2cap_send_i_or_rr_or_rnr()
6501 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
6524 static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb, in l2cap_reassemble_sdu() argument
6531 if (chan->sdu) in l2cap_reassemble_sdu()
6534 err = chan->ops->recv(chan, skb); in l2cap_reassemble_sdu()
6538 if (chan->sdu) in l2cap_reassemble_sdu()
6544 chan->sdu_len = get_unaligned_le16(skb->data); in l2cap_reassemble_sdu()
6547 if (chan->sdu_len > chan->imtu) { in l2cap_reassemble_sdu()
6552 if (skb->len >= chan->sdu_len) in l2cap_reassemble_sdu()
6555 chan->sdu = skb; in l2cap_reassemble_sdu()
6556 chan->sdu_last_frag = skb; in l2cap_reassemble_sdu()
6563 if (!chan->sdu) in l2cap_reassemble_sdu()
6566 append_skb_frag(chan->sdu, skb, in l2cap_reassemble_sdu()
6567 &chan->sdu_last_frag); in l2cap_reassemble_sdu()
6570 if (chan->sdu->len >= chan->sdu_len) in l2cap_reassemble_sdu()
6577 if (!chan->sdu) in l2cap_reassemble_sdu()
6580 append_skb_frag(chan->sdu, skb, in l2cap_reassemble_sdu()
6581 &chan->sdu_last_frag); in l2cap_reassemble_sdu()
6584 if (chan->sdu->len != chan->sdu_len) in l2cap_reassemble_sdu()
6587 err = chan->ops->recv(chan, chan->sdu); in l2cap_reassemble_sdu()
6591 chan->sdu = NULL; in l2cap_reassemble_sdu()
6592 chan->sdu_last_frag = NULL; in l2cap_reassemble_sdu()
6593 chan->sdu_len = 0; in l2cap_reassemble_sdu()
6600 kfree_skb(chan->sdu); in l2cap_reassemble_sdu()
6601 chan->sdu = NULL; in l2cap_reassemble_sdu()
6602 chan->sdu_last_frag = NULL; in l2cap_reassemble_sdu()
6603 chan->sdu_len = 0; in l2cap_reassemble_sdu()
6609 static int l2cap_resegment(struct l2cap_chan *chan) in l2cap_resegment() argument
6615 void l2cap_chan_busy(struct l2cap_chan *chan, int busy) in l2cap_chan_busy() argument
6619 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_chan_busy()
6623 l2cap_tx(chan, NULL, NULL, event); in l2cap_chan_busy()
6626 static int l2cap_rx_queued_iframes(struct l2cap_chan *chan) in l2cap_rx_queued_iframes() argument
6633 BT_DBG("chan %p", chan); in l2cap_rx_queued_iframes()
6635 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_rx_queued_iframes()
6638 chan->buffer_seq, skb_queue_len(&chan->srej_q)); in l2cap_rx_queued_iframes()
6640 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq); in l2cap_rx_queued_iframes()
6645 skb_unlink(skb, &chan->srej_q); in l2cap_rx_queued_iframes()
6646 chan->buffer_seq = __next_seq(chan, chan->buffer_seq); in l2cap_rx_queued_iframes()
6647 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->l2cap); in l2cap_rx_queued_iframes()
6652 if (skb_queue_empty(&chan->srej_q)) { in l2cap_rx_queued_iframes()
6653 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_rx_queued_iframes()
6654 l2cap_send_ack(chan); in l2cap_rx_queued_iframes()
6660 static void l2cap_handle_srej(struct l2cap_chan *chan, in l2cap_handle_srej() argument
6665 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_srej()
6667 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_srej()
6669 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_srej()
6673 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_srej()
6681 if (chan->max_tx != 0 && bt_cb(skb)->l2cap.retries >= chan->max_tx) { in l2cap_handle_srej()
6682 BT_DBG("Retry limit exceeded (%d)", chan->max_tx); in l2cap_handle_srej()
6683 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_srej()
6687 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_handle_srej()
6690 l2cap_pass_to_tx(chan, control); in l2cap_handle_srej()
6692 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_handle_srej()
6693 l2cap_retransmit(chan, control); in l2cap_handle_srej()
6694 l2cap_ertm_send(chan); in l2cap_handle_srej()
6696 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) { in l2cap_handle_srej()
6697 set_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_handle_srej()
6698 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
6701 l2cap_pass_to_tx_fbit(chan, control); in l2cap_handle_srej()
6704 if (chan->srej_save_reqseq != control->reqseq || in l2cap_handle_srej()
6706 &chan->conn_state)) in l2cap_handle_srej()
6707 l2cap_retransmit(chan, control); in l2cap_handle_srej()
6709 l2cap_retransmit(chan, control); in l2cap_handle_srej()
6710 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) { in l2cap_handle_srej()
6711 set_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_handle_srej()
6712 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
6718 static void l2cap_handle_rej(struct l2cap_chan *chan, in l2cap_handle_rej() argument
6723 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_rej()
6725 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_rej()
6727 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_rej()
6731 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_rej()
6733 if (chan->max_tx && skb && in l2cap_handle_rej()
6734 bt_cb(skb)->l2cap.retries >= chan->max_tx) { in l2cap_handle_rej()
6735 BT_DBG("Retry limit exceeded (%d)", chan->max_tx); in l2cap_handle_rej()
6736 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_rej()
6740 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_handle_rej()
6742 l2cap_pass_to_tx(chan, control); in l2cap_handle_rej()
6745 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state)) in l2cap_handle_rej()
6746 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
6748 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
6749 l2cap_ertm_send(chan); in l2cap_handle_rej()
6750 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) in l2cap_handle_rej()
6751 set_bit(CONN_REJ_ACT, &chan->conn_state); in l2cap_handle_rej()
6755 static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq) in l2cap_classify_txseq() argument
6757 BT_DBG("chan %p, txseq %d", chan, txseq); in l2cap_classify_txseq()
6759 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq, in l2cap_classify_txseq()
6760 chan->expected_tx_seq); in l2cap_classify_txseq()
6762 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) { in l2cap_classify_txseq()
6763 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= in l2cap_classify_txseq()
6764 chan->tx_win) { in l2cap_classify_txseq()
6768 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) { in l2cap_classify_txseq()
6777 if (chan->srej_list.head == txseq) { in l2cap_classify_txseq()
6782 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) { in l2cap_classify_txseq()
6787 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) { in l2cap_classify_txseq()
6793 if (chan->expected_tx_seq == txseq) { in l2cap_classify_txseq()
6794 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= in l2cap_classify_txseq()
6795 chan->tx_win) { in l2cap_classify_txseq()
6804 if (__seq_offset(chan, txseq, chan->last_acked_seq) < in l2cap_classify_txseq()
6805 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) { in l2cap_classify_txseq()
6810 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) { in l2cap_classify_txseq()
6828 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) { in l2cap_classify_txseq()
6841 static int l2cap_rx_state_recv(struct l2cap_chan *chan, in l2cap_rx_state_recv() argument
6848 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_recv()
6853 switch (l2cap_classify_txseq(chan, control->txseq)) { in l2cap_rx_state_recv()
6855 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6857 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_rx_state_recv()
6863 chan->expected_tx_seq = __next_seq(chan, in l2cap_rx_state_recv()
6866 chan->buffer_seq = chan->expected_tx_seq; in l2cap_rx_state_recv()
6869 err = l2cap_reassemble_sdu(chan, skb, control); in l2cap_rx_state_recv()
6875 &chan->conn_state)) { in l2cap_rx_state_recv()
6877 l2cap_retransmit_all(chan, control); in l2cap_rx_state_recv()
6878 l2cap_ertm_send(chan); in l2cap_rx_state_recv()
6882 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) in l2cap_rx_state_recv()
6883 l2cap_send_ack(chan); in l2cap_rx_state_recv()
6886 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6892 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_rx_state_recv()
6902 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_recv()
6905 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_recv()
6907 clear_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_rx_state_recv()
6908 l2cap_seq_list_clear(&chan->srej_list); in l2cap_rx_state_recv()
6909 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_recv()
6911 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT; in l2cap_rx_state_recv()
6914 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6920 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_rx_state_recv()
6925 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6927 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_recv()
6929 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) && in l2cap_rx_state_recv()
6930 !__chan_is_moving(chan)) { in l2cap_rx_state_recv()
6932 l2cap_retransmit_all(chan, control); in l2cap_rx_state_recv()
6935 l2cap_ertm_send(chan); in l2cap_rx_state_recv()
6937 l2cap_send_i_or_rr_or_rnr(chan); in l2cap_rx_state_recv()
6940 &chan->conn_state) && in l2cap_rx_state_recv()
6941 chan->unacked_frames) in l2cap_rx_state_recv()
6942 __set_retrans_timer(chan); in l2cap_rx_state_recv()
6944 l2cap_ertm_send(chan); in l2cap_rx_state_recv()
6948 set_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_recv()
6949 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6951 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_rx_state_recv()
6952 l2cap_send_rr_or_rnr(chan, 0); in l2cap_rx_state_recv()
6954 __clear_retrans_timer(chan); in l2cap_rx_state_recv()
6955 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_rx_state_recv()
6958 l2cap_handle_rej(chan, control); in l2cap_rx_state_recv()
6961 l2cap_handle_srej(chan, control); in l2cap_rx_state_recv()
6975 static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan, in l2cap_rx_state_srej_sent() argument
6983 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_srej_sent()
6988 switch (l2cap_classify_txseq(chan, txseq)) { in l2cap_rx_state_srej_sent()
6991 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6992 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
6995 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
6997 chan->expected_tx_seq = __next_seq(chan, txseq); in l2cap_rx_state_srej_sent()
7000 l2cap_seq_list_pop(&chan->srej_list); in l2cap_rx_state_srej_sent()
7002 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7003 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
7006 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
7008 err = l2cap_rx_queued_iframes(chan); in l2cap_rx_state_srej_sent()
7018 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
7021 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
7023 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7024 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_srej_sent()
7032 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
7035 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
7037 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7038 l2cap_send_srej_list(chan, control->txseq); in l2cap_rx_state_srej_sent()
7042 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7053 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_rx_state_srej_sent()
7058 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7060 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_srej_sent()
7063 &chan->conn_state)) { in l2cap_rx_state_srej_sent()
7065 l2cap_retransmit_all(chan, control); in l2cap_rx_state_srej_sent()
7068 l2cap_ertm_send(chan); in l2cap_rx_state_srej_sent()
7071 &chan->conn_state) && in l2cap_rx_state_srej_sent()
7072 chan->unacked_frames) { in l2cap_rx_state_srej_sent()
7073 __set_retrans_timer(chan); in l2cap_rx_state_srej_sent()
7076 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_rx_state_srej_sent()
7077 l2cap_send_srej_tail(chan); in l2cap_rx_state_srej_sent()
7080 &chan->conn_state) && in l2cap_rx_state_srej_sent()
7081 chan->unacked_frames) in l2cap_rx_state_srej_sent()
7082 __set_retrans_timer(chan); in l2cap_rx_state_srej_sent()
7084 l2cap_send_ack(chan); in l2cap_rx_state_srej_sent()
7088 set_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_srej_sent()
7089 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7091 l2cap_send_srej_tail(chan); in l2cap_rx_state_srej_sent()
7097 rr_control.reqseq = chan->buffer_seq; in l2cap_rx_state_srej_sent()
7098 l2cap_send_sframe(chan, &rr_control); in l2cap_rx_state_srej_sent()
7103 l2cap_handle_rej(chan, control); in l2cap_rx_state_srej_sent()
7106 l2cap_handle_srej(chan, control); in l2cap_rx_state_srej_sent()
7118 static int l2cap_finish_move(struct l2cap_chan *chan) in l2cap_finish_move() argument
7120 BT_DBG("chan %p", chan); in l2cap_finish_move()
7122 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_finish_move()
7124 if (chan->hs_hcon) in l2cap_finish_move()
7125 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu; in l2cap_finish_move()
7127 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu; in l2cap_finish_move()
7129 return l2cap_resegment(chan); in l2cap_finish_move()
7132 static int l2cap_rx_state_wait_p(struct l2cap_chan *chan, in l2cap_rx_state_wait_p() argument
7138 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_wait_p()
7144 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_p()
7146 if (!skb_queue_empty(&chan->tx_q)) in l2cap_rx_state_wait_p()
7147 chan->tx_send_head = skb_peek(&chan->tx_q); in l2cap_rx_state_wait_p()
7149 chan->tx_send_head = NULL; in l2cap_rx_state_wait_p()
7154 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_p()
7155 chan->unacked_frames = 0; in l2cap_rx_state_wait_p()
7157 err = l2cap_finish_move(chan); in l2cap_rx_state_wait_p()
7161 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_rx_state_wait_p()
7162 l2cap_send_i_or_rr_or_rnr(chan); in l2cap_rx_state_wait_p()
7167 return l2cap_rx_state_recv(chan, control, NULL, event); in l2cap_rx_state_wait_p()
7170 static int l2cap_rx_state_wait_f(struct l2cap_chan *chan, in l2cap_rx_state_wait_f() argument
7179 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_wait_f()
7181 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_rx_state_wait_f()
7182 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_f()
7184 if (!skb_queue_empty(&chan->tx_q)) in l2cap_rx_state_wait_f()
7185 chan->tx_send_head = skb_peek(&chan->tx_q); in l2cap_rx_state_wait_f()
7187 chan->tx_send_head = NULL; in l2cap_rx_state_wait_f()
7192 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_f()
7193 chan->unacked_frames = 0; in l2cap_rx_state_wait_f()
7195 if (chan->hs_hcon) in l2cap_rx_state_wait_f()
7196 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu; in l2cap_rx_state_wait_f()
7198 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu; in l2cap_rx_state_wait_f()
7200 err = l2cap_resegment(chan); in l2cap_rx_state_wait_f()
7203 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx_state_wait_f()
7208 static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq) in __valid_reqseq() argument
7213 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq); in __valid_reqseq()
7214 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked; in __valid_reqseq()
7217 static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_rx() argument
7222 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan, in l2cap_rx()
7223 control, skb, event, chan->rx_state); in l2cap_rx()
7225 if (__valid_reqseq(chan, control->reqseq)) { in l2cap_rx()
7226 switch (chan->rx_state) { in l2cap_rx()
7228 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx()
7231 err = l2cap_rx_state_srej_sent(chan, control, skb, in l2cap_rx()
7235 err = l2cap_rx_state_wait_p(chan, control, skb, event); in l2cap_rx()
7238 err = l2cap_rx_state_wait_f(chan, control, skb, event); in l2cap_rx()
7246 control->reqseq, chan->next_tx_seq, in l2cap_rx()
7247 chan->expected_ack_seq); in l2cap_rx()
7248 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_rx()
7254 static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_stream_rx() argument
7257 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb, in l2cap_stream_rx()
7258 chan->rx_state); in l2cap_stream_rx()
7260 if (l2cap_classify_txseq(chan, control->txseq) == in l2cap_stream_rx()
7262 l2cap_pass_to_tx(chan, control); in l2cap_stream_rx()
7264 BT_DBG("buffer_seq %u->%u", chan->buffer_seq, in l2cap_stream_rx()
7265 __next_seq(chan, chan->buffer_seq)); in l2cap_stream_rx()
7267 chan->buffer_seq = __next_seq(chan, chan->buffer_seq); in l2cap_stream_rx()
7269 l2cap_reassemble_sdu(chan, skb, control); in l2cap_stream_rx()
7271 if (chan->sdu) { in l2cap_stream_rx()
7272 kfree_skb(chan->sdu); in l2cap_stream_rx()
7273 chan->sdu = NULL; in l2cap_stream_rx()
7275 chan->sdu_last_frag = NULL; in l2cap_stream_rx()
7276 chan->sdu_len = 0; in l2cap_stream_rx()
7284 chan->last_acked_seq = control->txseq; in l2cap_stream_rx()
7285 chan->expected_tx_seq = __next_seq(chan, control->txseq); in l2cap_stream_rx()
7290 static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_data_rcv() argument
7296 __unpack_control(chan, skb); in l2cap_data_rcv()
7305 if (l2cap_check_fcs(chan, skb)) in l2cap_data_rcv()
7311 if (chan->fcs == L2CAP_FCS_CRC16) in l2cap_data_rcv()
7314 if (len > chan->mps) { in l2cap_data_rcv()
7315 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
7319 if (chan->ops->filter) { in l2cap_data_rcv()
7320 if (chan->ops->filter(chan, skb)) in l2cap_data_rcv()
7334 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F) in l2cap_data_rcv()
7337 if (chan->mode != L2CAP_MODE_STREAMING) { in l2cap_data_rcv()
7339 err = l2cap_rx(chan, control, skb, event); in l2cap_data_rcv()
7341 err = l2cap_stream_rx(chan, control, skb); in l2cap_data_rcv()
7345 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
7353 if (chan->mode == L2CAP_MODE_STREAMING) in l2cap_data_rcv()
7362 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
7368 chan->tx_state != L2CAP_TX_STATE_WAIT_F)) in l2cap_data_rcv()
7372 if (l2cap_rx(chan, control, skb, event)) in l2cap_data_rcv()
7373 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
7383 static void l2cap_chan_le_send_credits(struct l2cap_chan *chan) in l2cap_chan_le_send_credits() argument
7385 struct l2cap_conn *conn = chan->conn; in l2cap_chan_le_send_credits()
7389 return_credits = (chan->imtu / chan->mps) + 1; in l2cap_chan_le_send_credits()
7391 if (chan->rx_credits >= return_credits) in l2cap_chan_le_send_credits()
7394 return_credits -= chan->rx_credits; in l2cap_chan_le_send_credits()
7396 BT_DBG("chan %p returning %u credits to sender", chan, return_credits); in l2cap_chan_le_send_credits()
7398 chan->rx_credits += return_credits; in l2cap_chan_le_send_credits()
7400 pkt.cid = cpu_to_le16(chan->scid); in l2cap_chan_le_send_credits()
7403 chan->ident = l2cap_get_ident(conn); in l2cap_chan_le_send_credits()
7405 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt); in l2cap_chan_le_send_credits()
7408 static int l2cap_ecred_recv(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_ecred_recv() argument
7412 BT_DBG("SDU reassemble complete: chan %p skb->len %u", chan, skb->len); in l2cap_ecred_recv()
7415 err = chan->ops->recv(chan, skb); in l2cap_ecred_recv()
7418 l2cap_chan_le_send_credits(chan); in l2cap_ecred_recv()
7423 static int l2cap_ecred_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_ecred_data_rcv() argument
7427 if (!chan->rx_credits) { in l2cap_ecred_data_rcv()
7429 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_ecred_data_rcv()
7433 if (chan->imtu < skb->len) { in l2cap_ecred_data_rcv()
7438 chan->rx_credits--; in l2cap_ecred_data_rcv()
7439 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits); in l2cap_ecred_data_rcv()
7444 if (!chan->rx_credits) in l2cap_ecred_data_rcv()
7445 l2cap_chan_le_send_credits(chan); in l2cap_ecred_data_rcv()
7449 if (!chan->sdu) { in l2cap_ecred_data_rcv()
7456 sdu_len, skb->len, chan->imtu); in l2cap_ecred_data_rcv()
7458 if (sdu_len > chan->imtu) { in l2cap_ecred_data_rcv()
7471 return l2cap_ecred_recv(chan, skb); in l2cap_ecred_data_rcv()
7473 chan->sdu = skb; in l2cap_ecred_data_rcv()
7474 chan->sdu_len = sdu_len; in l2cap_ecred_data_rcv()
7475 chan->sdu_last_frag = skb; in l2cap_ecred_data_rcv()
7478 if (skb->len + L2CAP_SDULEN_SIZE < chan->mps) { in l2cap_ecred_data_rcv()
7482 BT_DBG("chan->mps %u -> %u", chan->mps, mps_len); in l2cap_ecred_data_rcv()
7483 chan->mps = mps_len; in l2cap_ecred_data_rcv()
7484 l2cap_chan_le_send_credits(chan); in l2cap_ecred_data_rcv()
7491 chan->sdu->len, skb->len, chan->sdu_len); in l2cap_ecred_data_rcv()
7493 if (chan->sdu->len + skb->len > chan->sdu_len) { in l2cap_ecred_data_rcv()
7499 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag); in l2cap_ecred_data_rcv()
7502 if (chan->sdu->len == chan->sdu_len) { in l2cap_ecred_data_rcv()
7503 err = l2cap_ecred_recv(chan, chan->sdu); in l2cap_ecred_data_rcv()
7505 chan->sdu = NULL; in l2cap_ecred_data_rcv()
7506 chan->sdu_last_frag = NULL; in l2cap_ecred_data_rcv()
7507 chan->sdu_len = 0; in l2cap_ecred_data_rcv()
7514 kfree_skb(chan->sdu); in l2cap_ecred_data_rcv()
7515 chan->sdu = NULL; in l2cap_ecred_data_rcv()
7516 chan->sdu_last_frag = NULL; in l2cap_ecred_data_rcv()
7517 chan->sdu_len = 0; in l2cap_ecred_data_rcv()
7530 struct l2cap_chan *chan; in l2cap_data_channel() local
7532 chan = l2cap_get_chan_by_scid(conn, cid); in l2cap_data_channel()
7533 if (!chan) { in l2cap_data_channel()
7535 chan = a2mp_channel_create(conn, skb); in l2cap_data_channel()
7536 if (!chan) { in l2cap_data_channel()
7541 l2cap_chan_lock(chan); in l2cap_data_channel()
7550 BT_DBG("chan %p, len %d", chan, skb->len); in l2cap_data_channel()
7556 if (chan->chan_type == L2CAP_CHAN_FIXED) in l2cap_data_channel()
7557 l2cap_chan_ready(chan); in l2cap_data_channel()
7559 if (chan->state != BT_CONNECTED) in l2cap_data_channel()
7562 switch (chan->mode) { in l2cap_data_channel()
7565 if (l2cap_ecred_data_rcv(chan, skb) < 0) in l2cap_data_channel()
7576 if (chan->imtu < skb->len) { in l2cap_data_channel()
7581 if (!chan->ops->recv(chan, skb)) in l2cap_data_channel()
7587 l2cap_data_rcv(chan, skb); in l2cap_data_channel()
7591 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode); in l2cap_data_channel()
7599 l2cap_chan_unlock(chan); in l2cap_data_channel()
7606 struct l2cap_chan *chan; in l2cap_conless_channel() local
7611 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst, in l2cap_conless_channel()
7613 if (!chan) in l2cap_conless_channel()
7616 BT_DBG("chan %p, len %d", chan, skb->len); in l2cap_conless_channel()
7618 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED) in l2cap_conless_channel()
7621 if (chan->imtu < skb->len) in l2cap_conless_channel()
7628 if (!chan->ops->recv(chan, skb)) { in l2cap_conless_channel()
7629 l2cap_chan_put(chan); in l2cap_conless_channel()
7634 l2cap_chan_put(chan); in l2cap_conless_channel()
7786 struct l2cap_chan *chan; member
7791 static void l2cap_chan_by_pid(struct l2cap_chan *chan, void *data) in l2cap_chan_by_pid() argument
7796 if (chan == d->chan) in l2cap_chan_by_pid()
7799 if (!test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_by_pid()
7802 pid = chan->ops->get_peer_pid(chan); in l2cap_chan_by_pid()
7805 if (d->pid != pid || chan->psm != d->chan->psm || chan->ident || in l2cap_chan_by_pid()
7806 chan->mode != L2CAP_MODE_EXT_FLOWCTL || chan->state != BT_CONNECT) in l2cap_chan_by_pid()
7812 int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, in l2cap_chan_connect() argument
7820 BT_DBG("%pMR -> %pMR (type %u) psm 0x%4.4x mode 0x%2.2x", &chan->src, in l2cap_chan_connect()
7821 dst, dst_type, __le16_to_cpu(psm), chan->mode); in l2cap_chan_connect()
7823 hdev = hci_get_route(dst, &chan->src, chan->src_type); in l2cap_chan_connect()
7830 chan->chan_type != L2CAP_CHAN_RAW) { in l2cap_chan_connect()
7835 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) { in l2cap_chan_connect()
7840 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) { in l2cap_chan_connect()
7845 switch (chan->mode) { in l2cap_chan_connect()
7866 switch (chan->state) { in l2cap_chan_connect()
7890 bacpy(&chan->dst, dst); in l2cap_chan_connect()
7891 chan->dst_type = dst_type; in l2cap_chan_connect()
7893 chan->psm = psm; in l2cap_chan_connect()
7894 chan->dcid = cid; in l2cap_chan_connect()
7906 chan->sec_level, in l2cap_chan_connect()
7911 chan->sec_level, in l2cap_chan_connect()
7916 u8 auth_type = l2cap_get_auth_type(chan); in l2cap_chan_connect()
7917 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type, in l2cap_chan_connect()
7933 if (chan->mode == L2CAP_MODE_EXT_FLOWCTL) { in l2cap_chan_connect()
7936 data.chan = chan; in l2cap_chan_connect()
7937 data.pid = chan->ops->get_peer_pid(chan); in l2cap_chan_connect()
7951 l2cap_chan_lock(chan); in l2cap_chan_connect()
7960 bacpy(&chan->src, &hcon->src); in l2cap_chan_connect()
7961 chan->src_type = bdaddr_src_type(hcon); in l2cap_chan_connect()
7963 __l2cap_chan_add(conn, chan); in l2cap_chan_connect()
7968 l2cap_state_change(chan, BT_CONNECT); in l2cap_chan_connect()
7969 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_chan_connect()
7975 chan->sport = 0; in l2cap_chan_connect()
7979 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_chan_connect()
7980 __clear_chan_timer(chan); in l2cap_chan_connect()
7981 if (l2cap_chan_check_security(chan, true)) in l2cap_chan_connect()
7982 l2cap_state_change(chan, BT_CONNECTED); in l2cap_chan_connect()
7984 l2cap_do_start(chan); in l2cap_chan_connect()
7990 l2cap_chan_unlock(chan); in l2cap_chan_connect()
7999 static void l2cap_ecred_reconfigure(struct l2cap_chan *chan) in l2cap_ecred_reconfigure() argument
8001 struct l2cap_conn *conn = chan->conn; in l2cap_ecred_reconfigure()
8007 pdu.req.mtu = cpu_to_le16(chan->imtu); in l2cap_ecred_reconfigure()
8008 pdu.req.mps = cpu_to_le16(chan->mps); in l2cap_ecred_reconfigure()
8009 pdu.scid = cpu_to_le16(chan->scid); in l2cap_ecred_reconfigure()
8011 chan->ident = l2cap_get_ident(conn); in l2cap_ecred_reconfigure()
8013 l2cap_send_cmd(conn, chan->ident, L2CAP_ECRED_RECONF_REQ, in l2cap_ecred_reconfigure()
8017 int l2cap_chan_reconfigure(struct l2cap_chan *chan, __u16 mtu) in l2cap_chan_reconfigure() argument
8019 if (chan->imtu > mtu) in l2cap_chan_reconfigure()
8022 BT_DBG("chan %p mtu 0x%4.4x", chan, mtu); in l2cap_chan_reconfigure()
8024 chan->imtu = mtu; in l2cap_chan_reconfigure()
8026 l2cap_ecred_reconfigure(chan); in l2cap_chan_reconfigure()
8132 struct l2cap_chan *chan, *next; in l2cap_connect_cfm() local
8139 chan = pchan->ops->new_connection(pchan); in l2cap_connect_cfm()
8140 if (chan) { in l2cap_connect_cfm()
8141 bacpy(&chan->src, &hcon->src); in l2cap_connect_cfm()
8142 bacpy(&chan->dst, &hcon->dst); in l2cap_connect_cfm()
8143 chan->src_type = bdaddr_src_type(hcon); in l2cap_connect_cfm()
8144 chan->dst_type = dst_type; in l2cap_connect_cfm()
8146 __l2cap_chan_add(conn, chan); in l2cap_connect_cfm()
8180 static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt) in l2cap_check_encryption() argument
8182 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) in l2cap_check_encryption()
8186 if (chan->sec_level == BT_SECURITY_MEDIUM) { in l2cap_check_encryption()
8187 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT); in l2cap_check_encryption()
8188 } else if (chan->sec_level == BT_SECURITY_HIGH || in l2cap_check_encryption()
8189 chan->sec_level == BT_SECURITY_FIPS) in l2cap_check_encryption()
8190 l2cap_chan_close(chan, ECONNREFUSED); in l2cap_check_encryption()
8192 if (chan->sec_level == BT_SECURITY_MEDIUM) in l2cap_check_encryption()
8193 __clear_chan_timer(chan); in l2cap_check_encryption()
8200 struct l2cap_chan *chan; in l2cap_security_cfm() local
8209 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_security_cfm()
8210 l2cap_chan_lock(chan); in l2cap_security_cfm()
8212 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid, in l2cap_security_cfm()
8213 state_to_string(chan->state)); in l2cap_security_cfm()
8215 if (chan->scid == L2CAP_CID_A2MP) { in l2cap_security_cfm()
8216 l2cap_chan_unlock(chan); in l2cap_security_cfm()
8221 chan->sec_level = hcon->sec_level; in l2cap_security_cfm()
8223 if (!__l2cap_no_conn_pending(chan)) { in l2cap_security_cfm()
8224 l2cap_chan_unlock(chan); in l2cap_security_cfm()
8228 if (!status && (chan->state == BT_CONNECTED || in l2cap_security_cfm()
8229 chan->state == BT_CONFIG)) { in l2cap_security_cfm()
8230 chan->ops->resume(chan); in l2cap_security_cfm()
8231 l2cap_check_encryption(chan, encrypt); in l2cap_security_cfm()
8232 l2cap_chan_unlock(chan); in l2cap_security_cfm()
8236 if (chan->state == BT_CONNECT) { in l2cap_security_cfm()
8238 l2cap_start_connection(chan); in l2cap_security_cfm()
8240 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); in l2cap_security_cfm()
8241 } else if (chan->state == BT_CONNECT2 && in l2cap_security_cfm()
8242 !(chan->mode == L2CAP_MODE_EXT_FLOWCTL || in l2cap_security_cfm()
8243 chan->mode == L2CAP_MODE_LE_FLOWCTL)) { in l2cap_security_cfm()
8248 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_security_cfm()
8251 chan->ops->defer(chan); in l2cap_security_cfm()
8253 l2cap_state_change(chan, BT_CONFIG); in l2cap_security_cfm()
8258 l2cap_state_change(chan, BT_DISCONN); in l2cap_security_cfm()
8259 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); in l2cap_security_cfm()
8264 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_security_cfm()
8265 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_security_cfm()
8268 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, in l2cap_security_cfm()
8271 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) && in l2cap_security_cfm()
8274 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_security_cfm()
8277 l2cap_build_conf_req(chan, buf, sizeof(buf)), in l2cap_security_cfm()
8279 chan->num_conf_req++; in l2cap_security_cfm()
8283 l2cap_chan_unlock(chan); in l2cap_security_cfm()