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 mutex_init(&chan->lock); in l2cap_chan_create()
457 atomic_set(&chan->nesting, L2CAP_NESTING_NORMAL); in l2cap_chan_create()
460 list_add(&chan->global_l, &chan_list); in l2cap_chan_create()
463 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout); in l2cap_chan_create()
465 chan->state = BT_OPEN; in l2cap_chan_create()
467 kref_init(&chan->kref); in l2cap_chan_create()
470 set_bit(CONF_NOT_COMPLETE, &chan->conf_state); in l2cap_chan_create()
472 BT_DBG("chan %p", chan); in l2cap_chan_create()
474 return chan; in l2cap_chan_create()
480 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref); in l2cap_chan_destroy() local
482 BT_DBG("chan %p", chan); in l2cap_chan_destroy()
485 list_del(&chan->global_l); in l2cap_chan_destroy()
488 kfree(chan); in l2cap_chan_destroy()
506 void l2cap_chan_set_defaults(struct l2cap_chan *chan) in l2cap_chan_set_defaults() argument
508 chan->fcs = L2CAP_FCS_CRC16; in l2cap_chan_set_defaults()
509 chan->max_tx = L2CAP_DEFAULT_MAX_TX; in l2cap_chan_set_defaults()
510 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW; in l2cap_chan_set_defaults()
511 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW; in l2cap_chan_set_defaults()
512 chan->remote_max_tx = chan->max_tx; in l2cap_chan_set_defaults()
513 chan->remote_tx_win = chan->tx_win; in l2cap_chan_set_defaults()
514 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW; in l2cap_chan_set_defaults()
515 chan->sec_level = BT_SECURITY_LOW; in l2cap_chan_set_defaults()
516 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO; in l2cap_chan_set_defaults()
517 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO; in l2cap_chan_set_defaults()
518 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO; in l2cap_chan_set_defaults()
519 chan->conf_state = 0; in l2cap_chan_set_defaults()
521 set_bit(FLAG_FORCE_ACTIVE, &chan->flags); in l2cap_chan_set_defaults()
525 static void l2cap_le_flowctl_init(struct l2cap_chan *chan, u16 tx_credits) in l2cap_le_flowctl_init() argument
527 chan->sdu = NULL; in l2cap_le_flowctl_init()
528 chan->sdu_last_frag = NULL; in l2cap_le_flowctl_init()
529 chan->sdu_len = 0; in l2cap_le_flowctl_init()
530 chan->tx_credits = tx_credits; in l2cap_le_flowctl_init()
532 chan->mps = min_t(u16, chan->imtu, chan->conn->mtu - L2CAP_HDR_SIZE); in l2cap_le_flowctl_init()
534 chan->rx_credits = (chan->imtu / chan->mps) + 1; in l2cap_le_flowctl_init()
536 skb_queue_head_init(&chan->tx_q); in l2cap_le_flowctl_init()
539 static void l2cap_ecred_init(struct l2cap_chan *chan, u16 tx_credits) in l2cap_ecred_init() argument
541 l2cap_le_flowctl_init(chan, tx_credits); in l2cap_ecred_init()
544 if (chan->mps < L2CAP_ECRED_MIN_MPS) { in l2cap_ecred_init()
545 chan->mps = L2CAP_ECRED_MIN_MPS; in l2cap_ecred_init()
546 chan->rx_credits = (chan->imtu / chan->mps) + 1; in l2cap_ecred_init()
550 void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) in __l2cap_chan_add() argument
553 __le16_to_cpu(chan->psm), chan->dcid); in __l2cap_chan_add()
557 chan->conn = conn; in __l2cap_chan_add()
559 switch (chan->chan_type) { in __l2cap_chan_add()
562 chan->scid = l2cap_alloc_cid(conn); in __l2cap_chan_add()
564 chan->omtu = L2CAP_DEFAULT_MTU; in __l2cap_chan_add()
569 chan->scid = L2CAP_CID_CONN_LESS; in __l2cap_chan_add()
570 chan->dcid = L2CAP_CID_CONN_LESS; in __l2cap_chan_add()
571 chan->omtu = L2CAP_DEFAULT_MTU; in __l2cap_chan_add()
580 chan->scid = L2CAP_CID_SIGNALING; in __l2cap_chan_add()
581 chan->dcid = L2CAP_CID_SIGNALING; in __l2cap_chan_add()
582 chan->omtu = L2CAP_DEFAULT_MTU; in __l2cap_chan_add()
585 chan->local_id = L2CAP_BESTEFFORT_ID; in __l2cap_chan_add()
586 chan->local_stype = L2CAP_SERV_BESTEFFORT; in __l2cap_chan_add()
587 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE; in __l2cap_chan_add()
588 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME; in __l2cap_chan_add()
589 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT; in __l2cap_chan_add()
590 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO; in __l2cap_chan_add()
592 l2cap_chan_hold(chan); in __l2cap_chan_add()
595 if (chan->chan_type != L2CAP_CHAN_FIXED || in __l2cap_chan_add()
596 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags)) in __l2cap_chan_add()
599 list_add(&chan->list, &conn->chan_l); in __l2cap_chan_add()
602 void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) in l2cap_chan_add() argument
605 __l2cap_chan_add(conn, chan); in l2cap_chan_add()
609 void l2cap_chan_del(struct l2cap_chan *chan, int err) in l2cap_chan_del() argument
611 struct l2cap_conn *conn = chan->conn; in l2cap_chan_del()
613 __clear_chan_timer(chan); in l2cap_chan_del()
615 BT_DBG("chan %p, conn %p, err %d, state %s", chan, conn, err, in l2cap_chan_del()
616 state_to_string(chan->state)); in l2cap_chan_del()
618 chan->ops->teardown(chan, err); in l2cap_chan_del()
623 list_del(&chan->list); in l2cap_chan_del()
625 l2cap_chan_put(chan); in l2cap_chan_del()
627 chan->conn = NULL; in l2cap_chan_del()
633 if (chan->chan_type != L2CAP_CHAN_FIXED || in l2cap_chan_del()
634 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags)) in l2cap_chan_del()
637 if (mgr && mgr->bredr_chan == chan) in l2cap_chan_del()
641 if (chan->hs_hchan) { in l2cap_chan_del()
642 struct hci_chan *hs_hchan = chan->hs_hchan; in l2cap_chan_del()
644 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan); in l2cap_chan_del()
648 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state)) in l2cap_chan_del()
651 switch(chan->mode) { in l2cap_chan_del()
657 skb_queue_purge(&chan->tx_q); in l2cap_chan_del()
661 __clear_retrans_timer(chan); in l2cap_chan_del()
662 __clear_monitor_timer(chan); in l2cap_chan_del()
663 __clear_ack_timer(chan); in l2cap_chan_del()
665 skb_queue_purge(&chan->srej_q); in l2cap_chan_del()
667 l2cap_seq_list_free(&chan->srej_list); in l2cap_chan_del()
668 l2cap_seq_list_free(&chan->retrans_list); in l2cap_chan_del()
672 skb_queue_purge(&chan->tx_q); in l2cap_chan_del()
683 struct l2cap_chan *chan; in __l2cap_chan_list() local
685 list_for_each_entry(chan, &conn->chan_l, list) { in __l2cap_chan_list()
686 func(chan, data); in __l2cap_chan_list()
708 struct l2cap_chan *chan; in l2cap_conn_update_id_addr() local
712 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_update_id_addr()
713 l2cap_chan_lock(chan); in l2cap_conn_update_id_addr()
714 bacpy(&chan->dst, &hcon->dst); in l2cap_conn_update_id_addr()
715 chan->dst_type = bdaddr_dst_type(hcon); in l2cap_conn_update_id_addr()
716 l2cap_chan_unlock(chan); in l2cap_conn_update_id_addr()
722 static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan) in l2cap_chan_le_connect_reject() argument
724 struct l2cap_conn *conn = chan->conn; in l2cap_chan_le_connect_reject()
728 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_le_connect_reject()
733 l2cap_state_change(chan, BT_DISCONN); in l2cap_chan_le_connect_reject()
735 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_chan_le_connect_reject()
736 rsp.mtu = cpu_to_le16(chan->imtu); in l2cap_chan_le_connect_reject()
737 rsp.mps = cpu_to_le16(chan->mps); in l2cap_chan_le_connect_reject()
738 rsp.credits = cpu_to_le16(chan->rx_credits); in l2cap_chan_le_connect_reject()
741 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in l2cap_chan_le_connect_reject()
745 static void l2cap_chan_ecred_connect_reject(struct l2cap_chan *chan) in l2cap_chan_ecred_connect_reject() argument
747 struct l2cap_conn *conn = chan->conn; in l2cap_chan_ecred_connect_reject()
751 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_ecred_connect_reject()
756 l2cap_state_change(chan, BT_DISCONN); in l2cap_chan_ecred_connect_reject()
762 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in l2cap_chan_ecred_connect_reject()
766 static void l2cap_chan_connect_reject(struct l2cap_chan *chan) in l2cap_chan_connect_reject() argument
768 struct l2cap_conn *conn = chan->conn; in l2cap_chan_connect_reject()
772 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_connect_reject()
777 l2cap_state_change(chan, BT_DISCONN); in l2cap_chan_connect_reject()
779 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_chan_connect_reject()
780 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_chan_connect_reject()
784 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp); in l2cap_chan_connect_reject()
787 void l2cap_chan_close(struct l2cap_chan *chan, int reason) in l2cap_chan_close() argument
789 struct l2cap_conn *conn = chan->conn; in l2cap_chan_close()
791 BT_DBG("chan %p state %s", chan, state_to_string(chan->state)); in l2cap_chan_close()
793 switch (chan->state) { in l2cap_chan_close()
795 chan->ops->teardown(chan, 0); in l2cap_chan_close()
800 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) { in l2cap_chan_close()
801 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_chan_close()
802 l2cap_send_disconn_req(chan, reason); in l2cap_chan_close()
804 l2cap_chan_del(chan, reason); in l2cap_chan_close()
808 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) { in l2cap_chan_close()
810 l2cap_chan_connect_reject(chan); in l2cap_chan_close()
812 switch (chan->mode) { in l2cap_chan_close()
814 l2cap_chan_le_connect_reject(chan); in l2cap_chan_close()
817 l2cap_chan_ecred_connect_reject(chan); in l2cap_chan_close()
823 l2cap_chan_del(chan, reason); in l2cap_chan_close()
828 l2cap_chan_del(chan, reason); in l2cap_chan_close()
832 chan->ops->teardown(chan, 0); in l2cap_chan_close()
838 static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan) in l2cap_get_auth_type() argument
840 switch (chan->chan_type) { in l2cap_get_auth_type()
842 switch (chan->sec_level) { in l2cap_get_auth_type()
853 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) { in l2cap_get_auth_type()
854 if (chan->sec_level == BT_SECURITY_LOW) in l2cap_get_auth_type()
855 chan->sec_level = BT_SECURITY_SDP; in l2cap_get_auth_type()
857 if (chan->sec_level == BT_SECURITY_HIGH || in l2cap_get_auth_type()
858 chan->sec_level == BT_SECURITY_FIPS) in l2cap_get_auth_type()
864 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) { in l2cap_get_auth_type()
865 if (chan->sec_level == BT_SECURITY_LOW) in l2cap_get_auth_type()
866 chan->sec_level = BT_SECURITY_SDP; in l2cap_get_auth_type()
868 if (chan->sec_level == BT_SECURITY_HIGH || in l2cap_get_auth_type()
869 chan->sec_level == BT_SECURITY_FIPS) in l2cap_get_auth_type()
877 switch (chan->sec_level) { in l2cap_get_auth_type()
891 int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator) in l2cap_chan_check_security() argument
893 struct l2cap_conn *conn = chan->conn; in l2cap_chan_check_security()
897 return smp_conn_security(conn->hcon, chan->sec_level); in l2cap_chan_check_security()
899 auth_type = l2cap_get_auth_type(chan); in l2cap_chan_check_security()
901 return hci_conn_security(conn->hcon, chan->sec_level, auth_type, in l2cap_chan_check_security()
952 static bool __chan_is_moving(struct l2cap_chan *chan) in __chan_is_moving() argument
954 return chan->move_state != L2CAP_MOVE_STABLE && in __chan_is_moving()
955 chan->move_state != L2CAP_MOVE_WAIT_PREPARE; in __chan_is_moving()
958 static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_do_send() argument
960 struct hci_conn *hcon = chan->conn->hcon; in l2cap_do_send()
963 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len, in l2cap_do_send()
966 if (chan->hs_hcon && !__chan_is_moving(chan)) { in l2cap_do_send()
967 if (chan->hs_hchan) in l2cap_do_send()
968 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE); in l2cap_do_send()
980 (!test_bit(FLAG_FLUSHABLE, &chan->flags) && in l2cap_do_send()
986 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags); in l2cap_do_send()
987 hci_send_acl(chan->conn->hchan, skb, flags); in l2cap_do_send()
1038 static inline void __unpack_control(struct l2cap_chan *chan, in __unpack_control() argument
1041 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) { in __unpack_control()
1090 static inline void __pack_control(struct l2cap_chan *chan, in __pack_control() argument
1094 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) { in __pack_control()
1103 static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan) in __ertm_hdr_size() argument
1105 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in __ertm_hdr_size()
1111 static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan, in l2cap_create_sframe_pdu() argument
1116 int hlen = __ertm_hdr_size(chan); in l2cap_create_sframe_pdu()
1118 if (chan->fcs == L2CAP_FCS_CRC16) in l2cap_create_sframe_pdu()
1128 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_sframe_pdu()
1130 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_create_sframe_pdu()
1135 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_create_sframe_pdu()
1144 static void l2cap_send_sframe(struct l2cap_chan *chan, in l2cap_send_sframe() argument
1150 BT_DBG("chan %p, control %p", chan, control); in l2cap_send_sframe()
1155 if (__chan_is_moving(chan)) in l2cap_send_sframe()
1158 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) && in l2cap_send_sframe()
1163 clear_bit(CONN_RNR_SENT, &chan->conn_state); in l2cap_send_sframe()
1165 set_bit(CONN_RNR_SENT, &chan->conn_state); in l2cap_send_sframe()
1168 chan->last_acked_seq = control->reqseq; in l2cap_send_sframe()
1169 __clear_ack_timer(chan); in l2cap_send_sframe()
1175 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_send_sframe()
1180 skb = l2cap_create_sframe_pdu(chan, control_field); in l2cap_send_sframe()
1182 l2cap_do_send(chan, skb); in l2cap_send_sframe()
1185 static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll) in l2cap_send_rr_or_rnr() argument
1189 BT_DBG("chan %p, poll %d", chan, poll); in l2cap_send_rr_or_rnr()
1195 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) in l2cap_send_rr_or_rnr()
1200 control.reqseq = chan->buffer_seq; in l2cap_send_rr_or_rnr()
1201 l2cap_send_sframe(chan, &control); in l2cap_send_rr_or_rnr()
1204 static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan) in __l2cap_no_conn_pending() argument
1206 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) in __l2cap_no_conn_pending()
1209 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state); in __l2cap_no_conn_pending()
1212 static bool __amp_capable(struct l2cap_chan *chan) in __amp_capable() argument
1214 struct l2cap_conn *conn = chan->conn; in __amp_capable()
1234 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED) in __amp_capable()
1240 static bool l2cap_check_efs(struct l2cap_chan *chan) in l2cap_check_efs() argument
1246 void l2cap_send_conn_req(struct l2cap_chan *chan) in l2cap_send_conn_req() argument
1248 struct l2cap_conn *conn = chan->conn; in l2cap_send_conn_req()
1251 req.scid = cpu_to_le16(chan->scid); in l2cap_send_conn_req()
1252 req.psm = chan->psm; in l2cap_send_conn_req()
1254 chan->ident = l2cap_get_ident(conn); in l2cap_send_conn_req()
1256 set_bit(CONF_CONNECT_PEND, &chan->conf_state); in l2cap_send_conn_req()
1258 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req); in l2cap_send_conn_req()
1261 static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id) in l2cap_send_create_chan_req() argument
1264 req.scid = cpu_to_le16(chan->scid); in l2cap_send_create_chan_req()
1265 req.psm = chan->psm; in l2cap_send_create_chan_req()
1268 chan->ident = l2cap_get_ident(chan->conn); in l2cap_send_create_chan_req()
1270 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ, in l2cap_send_create_chan_req()
1274 static void l2cap_move_setup(struct l2cap_chan *chan) in l2cap_move_setup() argument
1278 BT_DBG("chan %p", chan); in l2cap_move_setup()
1280 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_move_setup()
1283 __clear_retrans_timer(chan); in l2cap_move_setup()
1284 __clear_monitor_timer(chan); in l2cap_move_setup()
1285 __clear_ack_timer(chan); in l2cap_move_setup()
1287 chan->retry_count = 0; in l2cap_move_setup()
1288 skb_queue_walk(&chan->tx_q, skb) { in l2cap_move_setup()
1295 chan->expected_tx_seq = chan->buffer_seq; in l2cap_move_setup()
1297 clear_bit(CONN_REJ_ACT, &chan->conn_state); in l2cap_move_setup()
1298 clear_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_move_setup()
1299 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_move_setup()
1300 l2cap_seq_list_clear(&chan->srej_list); in l2cap_move_setup()
1301 skb_queue_purge(&chan->srej_q); in l2cap_move_setup()
1303 chan->tx_state = L2CAP_TX_STATE_XMIT; in l2cap_move_setup()
1304 chan->rx_state = L2CAP_RX_STATE_MOVE; in l2cap_move_setup()
1306 set_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_move_setup()
1309 static void l2cap_move_done(struct l2cap_chan *chan) in l2cap_move_done() argument
1311 u8 move_role = chan->move_role; in l2cap_move_done()
1312 BT_DBG("chan %p", chan); in l2cap_move_done()
1314 chan->move_state = L2CAP_MOVE_STABLE; in l2cap_move_done()
1315 chan->move_role = L2CAP_MOVE_ROLE_NONE; in l2cap_move_done()
1317 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_move_done()
1322 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL); in l2cap_move_done()
1323 chan->rx_state = L2CAP_RX_STATE_WAIT_F; in l2cap_move_done()
1326 chan->rx_state = L2CAP_RX_STATE_WAIT_P; in l2cap_move_done()
1331 static void l2cap_chan_ready(struct l2cap_chan *chan) in l2cap_chan_ready() argument
1337 if (chan->state == BT_CONNECTED) in l2cap_chan_ready()
1341 chan->conf_state = 0; in l2cap_chan_ready()
1342 __clear_chan_timer(chan); in l2cap_chan_ready()
1344 switch (chan->mode) { in l2cap_chan_ready()
1347 if (!chan->tx_credits) in l2cap_chan_ready()
1348 chan->ops->suspend(chan); in l2cap_chan_ready()
1352 chan->state = BT_CONNECTED; in l2cap_chan_ready()
1354 chan->ops->ready(chan); in l2cap_chan_ready()
1357 static void l2cap_le_connect(struct l2cap_chan *chan) in l2cap_le_connect() argument
1359 struct l2cap_conn *conn = chan->conn; in l2cap_le_connect()
1362 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags)) in l2cap_le_connect()
1365 if (!chan->imtu) in l2cap_le_connect()
1366 chan->imtu = chan->conn->mtu; in l2cap_le_connect()
1368 l2cap_le_flowctl_init(chan, 0); in l2cap_le_connect()
1370 req.psm = chan->psm; in l2cap_le_connect()
1371 req.scid = cpu_to_le16(chan->scid); in l2cap_le_connect()
1372 req.mtu = cpu_to_le16(chan->imtu); in l2cap_le_connect()
1373 req.mps = cpu_to_le16(chan->mps); in l2cap_le_connect()
1374 req.credits = cpu_to_le16(chan->rx_credits); in l2cap_le_connect()
1376 chan->ident = l2cap_get_ident(conn); in l2cap_le_connect()
1378 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ, in l2cap_le_connect()
1387 struct l2cap_chan *chan; member
1392 static void l2cap_ecred_defer_connect(struct l2cap_chan *chan, void *data) in l2cap_ecred_defer_connect() argument
1397 if (chan == conn->chan) in l2cap_ecred_defer_connect()
1400 if (!test_and_clear_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_ecred_defer_connect()
1403 pid = chan->ops->get_peer_pid(chan); in l2cap_ecred_defer_connect()
1406 if (conn->pid != pid || chan->psm != conn->chan->psm || chan->ident || in l2cap_ecred_defer_connect()
1407 chan->mode != L2CAP_MODE_EXT_FLOWCTL || chan->state != BT_CONNECT) in l2cap_ecred_defer_connect()
1410 if (test_and_set_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags)) in l2cap_ecred_defer_connect()
1413 l2cap_ecred_init(chan, 0); in l2cap_ecred_defer_connect()
1416 chan->ident = conn->chan->ident; in l2cap_ecred_defer_connect()
1419 conn->pdu.scid[conn->count] = cpu_to_le16(chan->scid); in l2cap_ecred_defer_connect()
1424 static void l2cap_ecred_connect(struct l2cap_chan *chan) in l2cap_ecred_connect() argument
1426 struct l2cap_conn *conn = chan->conn; in l2cap_ecred_connect()
1429 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_ecred_connect()
1432 if (test_and_set_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags)) in l2cap_ecred_connect()
1435 l2cap_ecred_init(chan, 0); in l2cap_ecred_connect()
1437 data.pdu.req.psm = chan->psm; in l2cap_ecred_connect()
1438 data.pdu.req.mtu = cpu_to_le16(chan->imtu); in l2cap_ecred_connect()
1439 data.pdu.req.mps = cpu_to_le16(chan->mps); in l2cap_ecred_connect()
1440 data.pdu.req.credits = cpu_to_le16(chan->rx_credits); in l2cap_ecred_connect()
1441 data.pdu.scid[0] = cpu_to_le16(chan->scid); in l2cap_ecred_connect()
1443 chan->ident = l2cap_get_ident(conn); in l2cap_ecred_connect()
1444 data.pid = chan->ops->get_peer_pid(chan); in l2cap_ecred_connect()
1447 data.chan = chan; in l2cap_ecred_connect()
1448 data.pid = chan->ops->get_peer_pid(chan); in l2cap_ecred_connect()
1452 l2cap_send_cmd(conn, chan->ident, L2CAP_ECRED_CONN_REQ, in l2cap_ecred_connect()
1457 static void l2cap_le_start(struct l2cap_chan *chan) in l2cap_le_start() argument
1459 struct l2cap_conn *conn = chan->conn; in l2cap_le_start()
1461 if (!smp_conn_security(conn->hcon, chan->sec_level)) in l2cap_le_start()
1464 if (!chan->psm) { in l2cap_le_start()
1465 l2cap_chan_ready(chan); in l2cap_le_start()
1469 if (chan->state == BT_CONNECT) { in l2cap_le_start()
1470 if (chan->mode == L2CAP_MODE_EXT_FLOWCTL) in l2cap_le_start()
1471 l2cap_ecred_connect(chan); in l2cap_le_start()
1473 l2cap_le_connect(chan); in l2cap_le_start()
1477 static void l2cap_start_connection(struct l2cap_chan *chan) in l2cap_start_connection() argument
1479 if (__amp_capable(chan)) { in l2cap_start_connection()
1480 BT_DBG("chan %p AMP capable: discover AMPs", chan); in l2cap_start_connection()
1481 a2mp_discover_amp(chan); in l2cap_start_connection()
1482 } else if (chan->conn->hcon->type == LE_LINK) { in l2cap_start_connection()
1483 l2cap_le_start(chan); in l2cap_start_connection()
1485 l2cap_send_conn_req(chan); in l2cap_start_connection()
1522 static void l2cap_do_start(struct l2cap_chan *chan) in l2cap_do_start() argument
1524 struct l2cap_conn *conn = chan->conn; in l2cap_do_start()
1527 l2cap_le_start(chan); in l2cap_do_start()
1539 if (!l2cap_chan_check_security(chan, true) || in l2cap_do_start()
1540 !__l2cap_no_conn_pending(chan)) in l2cap_do_start()
1544 l2cap_start_connection(chan); in l2cap_do_start()
1546 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); in l2cap_do_start()
1565 static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err) in l2cap_send_disconn_req() argument
1567 struct l2cap_conn *conn = chan->conn; in l2cap_send_disconn_req()
1573 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) { in l2cap_send_disconn_req()
1574 __clear_retrans_timer(chan); in l2cap_send_disconn_req()
1575 __clear_monitor_timer(chan); in l2cap_send_disconn_req()
1576 __clear_ack_timer(chan); in l2cap_send_disconn_req()
1579 if (chan->scid == L2CAP_CID_A2MP) { in l2cap_send_disconn_req()
1580 l2cap_state_change(chan, BT_DISCONN); in l2cap_send_disconn_req()
1584 req.dcid = cpu_to_le16(chan->dcid); in l2cap_send_disconn_req()
1585 req.scid = cpu_to_le16(chan->scid); in l2cap_send_disconn_req()
1589 l2cap_state_change_and_error(chan, BT_DISCONN, err); in l2cap_send_disconn_req()
1595 struct l2cap_chan *chan, *tmp; in l2cap_conn_start() local
1601 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) { in l2cap_conn_start()
1602 l2cap_chan_lock(chan); in l2cap_conn_start()
1604 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_conn_start()
1605 l2cap_chan_ready(chan); in l2cap_conn_start()
1606 l2cap_chan_unlock(chan); in l2cap_conn_start()
1610 if (chan->state == BT_CONNECT) { in l2cap_conn_start()
1611 if (!l2cap_chan_check_security(chan, true) || in l2cap_conn_start()
1612 !__l2cap_no_conn_pending(chan)) { in l2cap_conn_start()
1613 l2cap_chan_unlock(chan); in l2cap_conn_start()
1617 if (!l2cap_mode_supported(chan->mode, conn->feat_mask) in l2cap_conn_start()
1619 &chan->conf_state)) { in l2cap_conn_start()
1620 l2cap_chan_close(chan, ECONNRESET); in l2cap_conn_start()
1621 l2cap_chan_unlock(chan); in l2cap_conn_start()
1626 l2cap_start_connection(chan); in l2cap_conn_start()
1628 l2cap_chan_close(chan, ECONNREFUSED); in l2cap_conn_start()
1630 } else if (chan->state == BT_CONNECT2) { in l2cap_conn_start()
1633 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_conn_start()
1634 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_conn_start()
1636 if (l2cap_chan_check_security(chan, false)) { in l2cap_conn_start()
1637 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_conn_start()
1640 chan->ops->defer(chan); in l2cap_conn_start()
1643 l2cap_state_change(chan, BT_CONFIG); in l2cap_conn_start()
1652 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, in l2cap_conn_start()
1655 if (test_bit(CONF_REQ_SENT, &chan->conf_state) || in l2cap_conn_start()
1657 l2cap_chan_unlock(chan); in l2cap_conn_start()
1661 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_conn_start()
1663 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_conn_start()
1664 chan->num_conf_req++; in l2cap_conn_start()
1667 l2cap_chan_unlock(chan); in l2cap_conn_start()
1708 struct l2cap_chan *chan; in l2cap_conn_ready() local
1718 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_ready()
1720 l2cap_chan_lock(chan); in l2cap_conn_ready()
1722 if (chan->scid == L2CAP_CID_A2MP) { in l2cap_conn_ready()
1723 l2cap_chan_unlock(chan); in l2cap_conn_ready()
1728 l2cap_le_start(chan); in l2cap_conn_ready()
1729 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_conn_ready()
1731 l2cap_chan_ready(chan); in l2cap_conn_ready()
1732 } else if (chan->state == BT_CONNECT) { in l2cap_conn_ready()
1733 l2cap_do_start(chan); in l2cap_conn_ready()
1736 l2cap_chan_unlock(chan); in l2cap_conn_ready()
1750 struct l2cap_chan *chan; in l2cap_conn_unreliable() local
1756 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_unreliable()
1757 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags)) in l2cap_conn_unreliable()
1758 l2cap_chan_set_err(chan, err); in l2cap_conn_unreliable()
1857 struct l2cap_chan *chan, *l; in l2cap_conn_del() local
1886 list_for_each_entry_safe(chan, l, &conn->chan_l, list) { in l2cap_conn_del()
1887 l2cap_chan_hold(chan); in l2cap_conn_del()
1888 l2cap_chan_lock(chan); in l2cap_conn_del()
1890 l2cap_chan_del(chan, err); in l2cap_conn_del()
1892 chan->ops->close(chan); in l2cap_conn_del()
1894 l2cap_chan_unlock(chan); in l2cap_conn_del()
1895 l2cap_chan_put(chan); in l2cap_conn_del()
1987 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_monitor_timeout() local
1990 BT_DBG("chan %p", chan); in l2cap_monitor_timeout()
1992 l2cap_chan_lock(chan); in l2cap_monitor_timeout()
1994 if (!chan->conn) { in l2cap_monitor_timeout()
1995 l2cap_chan_unlock(chan); in l2cap_monitor_timeout()
1996 l2cap_chan_put(chan); in l2cap_monitor_timeout()
2000 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO); in l2cap_monitor_timeout()
2002 l2cap_chan_unlock(chan); in l2cap_monitor_timeout()
2003 l2cap_chan_put(chan); in l2cap_monitor_timeout()
2008 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_retrans_timeout() local
2011 BT_DBG("chan %p", chan); in l2cap_retrans_timeout()
2013 l2cap_chan_lock(chan); in l2cap_retrans_timeout()
2015 if (!chan->conn) { in l2cap_retrans_timeout()
2016 l2cap_chan_unlock(chan); in l2cap_retrans_timeout()
2017 l2cap_chan_put(chan); in l2cap_retrans_timeout()
2021 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO); in l2cap_retrans_timeout()
2022 l2cap_chan_unlock(chan); in l2cap_retrans_timeout()
2023 l2cap_chan_put(chan); in l2cap_retrans_timeout()
2026 static void l2cap_streaming_send(struct l2cap_chan *chan, in l2cap_streaming_send() argument
2032 BT_DBG("chan %p, skbs %p", chan, skbs); in l2cap_streaming_send()
2034 if (__chan_is_moving(chan)) in l2cap_streaming_send()
2037 skb_queue_splice_tail_init(skbs, &chan->tx_q); in l2cap_streaming_send()
2039 while (!skb_queue_empty(&chan->tx_q)) { in l2cap_streaming_send()
2041 skb = skb_dequeue(&chan->tx_q); in l2cap_streaming_send()
2047 control->txseq = chan->next_tx_seq; in l2cap_streaming_send()
2049 __pack_control(chan, control, skb); in l2cap_streaming_send()
2051 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_streaming_send()
2056 l2cap_do_send(chan, skb); in l2cap_streaming_send()
2060 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq); in l2cap_streaming_send()
2061 chan->frames_sent++; in l2cap_streaming_send()
2065 static int l2cap_ertm_send(struct l2cap_chan *chan) in l2cap_ertm_send() argument
2071 BT_DBG("chan %p", chan); in l2cap_ertm_send()
2073 if (chan->state != BT_CONNECTED) in l2cap_ertm_send()
2076 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) in l2cap_ertm_send()
2079 if (__chan_is_moving(chan)) in l2cap_ertm_send()
2082 while (chan->tx_send_head && in l2cap_ertm_send()
2083 chan->unacked_frames < chan->remote_tx_win && in l2cap_ertm_send()
2084 chan->tx_state == L2CAP_TX_STATE_XMIT) { in l2cap_ertm_send()
2086 skb = chan->tx_send_head; in l2cap_ertm_send()
2091 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state)) in l2cap_ertm_send()
2094 control->reqseq = chan->buffer_seq; in l2cap_ertm_send()
2095 chan->last_acked_seq = chan->buffer_seq; in l2cap_ertm_send()
2096 control->txseq = chan->next_tx_seq; in l2cap_ertm_send()
2098 __pack_control(chan, control, skb); in l2cap_ertm_send()
2100 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_ertm_send()
2113 __set_retrans_timer(chan); in l2cap_ertm_send()
2115 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq); in l2cap_ertm_send()
2116 chan->unacked_frames++; in l2cap_ertm_send()
2117 chan->frames_sent++; in l2cap_ertm_send()
2120 if (skb_queue_is_last(&chan->tx_q, skb)) in l2cap_ertm_send()
2121 chan->tx_send_head = NULL; in l2cap_ertm_send()
2123 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb); in l2cap_ertm_send()
2125 l2cap_do_send(chan, tx_skb); in l2cap_ertm_send()
2130 chan->unacked_frames, skb_queue_len(&chan->tx_q)); in l2cap_ertm_send()
2135 static void l2cap_ertm_resend(struct l2cap_chan *chan) in l2cap_ertm_resend() argument
2142 BT_DBG("chan %p", chan); in l2cap_ertm_resend()
2144 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) in l2cap_ertm_resend()
2147 if (__chan_is_moving(chan)) in l2cap_ertm_resend()
2150 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) { in l2cap_ertm_resend()
2151 seq = l2cap_seq_list_pop(&chan->retrans_list); in l2cap_ertm_resend()
2153 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq); in l2cap_ertm_resend()
2163 if (chan->max_tx != 0 && in l2cap_ertm_resend()
2164 bt_cb(skb)->l2cap.retries > chan->max_tx) { in l2cap_ertm_resend()
2165 BT_DBG("Retry limit exceeded (%d)", chan->max_tx); in l2cap_ertm_resend()
2166 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_ertm_resend()
2167 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_ertm_resend()
2171 control.reqseq = chan->buffer_seq; in l2cap_ertm_resend()
2172 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state)) in l2cap_ertm_resend()
2187 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_ertm_resend()
2192 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) { in l2cap_ertm_resend()
2201 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_ertm_resend()
2208 l2cap_do_send(chan, tx_skb); in l2cap_ertm_resend()
2212 chan->last_acked_seq = chan->buffer_seq; in l2cap_ertm_resend()
2216 static void l2cap_retransmit(struct l2cap_chan *chan, in l2cap_retransmit() argument
2219 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit()
2221 l2cap_seq_list_append(&chan->retrans_list, control->reqseq); in l2cap_retransmit()
2222 l2cap_ertm_resend(chan); in l2cap_retransmit()
2225 static void l2cap_retransmit_all(struct l2cap_chan *chan, in l2cap_retransmit_all() argument
2230 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit_all()
2233 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_retransmit_all()
2235 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_retransmit_all()
2237 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) in l2cap_retransmit_all()
2240 if (chan->unacked_frames) { in l2cap_retransmit_all()
2241 skb_queue_walk(&chan->tx_q, skb) { in l2cap_retransmit_all()
2243 skb == chan->tx_send_head) in l2cap_retransmit_all()
2247 skb_queue_walk_from(&chan->tx_q, skb) { in l2cap_retransmit_all()
2248 if (skb == chan->tx_send_head) in l2cap_retransmit_all()
2251 l2cap_seq_list_append(&chan->retrans_list, in l2cap_retransmit_all()
2255 l2cap_ertm_resend(chan); in l2cap_retransmit_all()
2259 static void l2cap_send_ack(struct l2cap_chan *chan) in l2cap_send_ack() argument
2262 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq, in l2cap_send_ack()
2263 chan->last_acked_seq); in l2cap_send_ack()
2267 chan, chan->last_acked_seq, chan->buffer_seq); in l2cap_send_ack()
2272 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) && in l2cap_send_ack()
2273 chan->rx_state == L2CAP_RX_STATE_RECV) { in l2cap_send_ack()
2274 __clear_ack_timer(chan); in l2cap_send_ack()
2276 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2277 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2279 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) { in l2cap_send_ack()
2280 l2cap_ertm_send(chan); in l2cap_send_ack()
2282 if (chan->buffer_seq == chan->last_acked_seq) in l2cap_send_ack()
2289 threshold = chan->ack_win; in l2cap_send_ack()
2297 __clear_ack_timer(chan); in l2cap_send_ack()
2299 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2300 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2305 __set_ack_timer(chan); in l2cap_send_ack()
2309 static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan, in l2cap_skbuff_fromiovec() argument
2313 struct l2cap_conn *conn = chan->conn; in l2cap_skbuff_fromiovec()
2330 tmp = chan->ops->alloc_skb(chan, 0, count, in l2cap_skbuff_fromiovec()
2353 static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan, in l2cap_create_connless_pdu() argument
2356 struct l2cap_conn *conn = chan->conn; in l2cap_create_connless_pdu()
2361 BT_DBG("chan %p psm 0x%2.2x len %zu", chan, in l2cap_create_connless_pdu()
2362 __le16_to_cpu(chan->psm), len); in l2cap_create_connless_pdu()
2366 skb = chan->ops->alloc_skb(chan, hlen, count, in l2cap_create_connless_pdu()
2373 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_connless_pdu()
2375 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE)); in l2cap_create_connless_pdu()
2377 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_connless_pdu()
2385 static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan, in l2cap_create_basic_pdu() argument
2388 struct l2cap_conn *conn = chan->conn; in l2cap_create_basic_pdu()
2393 BT_DBG("chan %p len %zu", chan, len); in l2cap_create_basic_pdu()
2397 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count, in l2cap_create_basic_pdu()
2404 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_basic_pdu()
2407 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_basic_pdu()
2415 static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan, in l2cap_create_iframe_pdu() argument
2419 struct l2cap_conn *conn = chan->conn; in l2cap_create_iframe_pdu()
2424 BT_DBG("chan %p len %zu", chan, len); in l2cap_create_iframe_pdu()
2429 hlen = __ertm_hdr_size(chan); in l2cap_create_iframe_pdu()
2434 if (chan->fcs == L2CAP_FCS_CRC16) in l2cap_create_iframe_pdu()
2439 skb = chan->ops->alloc_skb(chan, hlen, count, in l2cap_create_iframe_pdu()
2446 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_iframe_pdu()
2450 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_create_iframe_pdu()
2458 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_iframe_pdu()
2464 bt_cb(skb)->l2cap.fcs = chan->fcs; in l2cap_create_iframe_pdu()
2469 static int l2cap_segment_sdu(struct l2cap_chan *chan, in l2cap_segment_sdu() argument
2478 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len); in l2cap_segment_sdu()
2486 pdu_len = chan->conn->mtu; in l2cap_segment_sdu()
2489 if (!chan->hs_hcon) in l2cap_segment_sdu()
2493 if (chan->fcs) in l2cap_segment_sdu()
2496 pdu_len -= __ertm_hdr_size(chan); in l2cap_segment_sdu()
2499 pdu_len = min_t(size_t, pdu_len, chan->remote_mps); in l2cap_segment_sdu()
2511 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len); in l2cap_segment_sdu()
2536 static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan, in l2cap_create_le_flowctl_pdu() argument
2540 struct l2cap_conn *conn = chan->conn; in l2cap_create_le_flowctl_pdu()
2545 BT_DBG("chan %p len %zu", chan, len); in l2cap_create_le_flowctl_pdu()
2557 skb = chan->ops->alloc_skb(chan, hlen, count, in l2cap_create_le_flowctl_pdu()
2564 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_le_flowctl_pdu()
2570 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_le_flowctl_pdu()
2579 static int l2cap_segment_le_sdu(struct l2cap_chan *chan, in l2cap_segment_le_sdu() argument
2587 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len); in l2cap_segment_le_sdu()
2590 pdu_len = chan->remote_mps - L2CAP_SDULEN_SIZE; in l2cap_segment_le_sdu()
2596 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len); in l2cap_segment_le_sdu()
2615 static void l2cap_le_flowctl_send(struct l2cap_chan *chan) in l2cap_le_flowctl_send() argument
2619 BT_DBG("chan %p", chan); in l2cap_le_flowctl_send()
2621 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) { in l2cap_le_flowctl_send()
2622 l2cap_do_send(chan, skb_dequeue(&chan->tx_q)); in l2cap_le_flowctl_send()
2623 chan->tx_credits--; in l2cap_le_flowctl_send()
2627 BT_DBG("Sent %d credits %u queued %u", sent, chan->tx_credits, in l2cap_le_flowctl_send()
2628 skb_queue_len(&chan->tx_q)); in l2cap_le_flowctl_send()
2631 int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len) in l2cap_chan_send() argument
2637 if (!chan->conn) in l2cap_chan_send()
2641 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) { in l2cap_chan_send()
2642 skb = l2cap_create_connless_pdu(chan, msg, len); in l2cap_chan_send()
2649 if (chan->state != BT_CONNECTED) { in l2cap_chan_send()
2654 l2cap_do_send(chan, skb); in l2cap_chan_send()
2658 switch (chan->mode) { in l2cap_chan_send()
2662 if (len > chan->omtu) in l2cap_chan_send()
2667 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len); in l2cap_chan_send()
2669 if (chan->state != BT_CONNECTED) { in l2cap_chan_send()
2677 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q); in l2cap_chan_send()
2679 l2cap_le_flowctl_send(chan); in l2cap_chan_send()
2681 if (!chan->tx_credits) in l2cap_chan_send()
2682 chan->ops->suspend(chan); in l2cap_chan_send()
2690 if (len > chan->omtu) in l2cap_chan_send()
2694 skb = l2cap_create_basic_pdu(chan, msg, len); in l2cap_chan_send()
2701 if (chan->state != BT_CONNECTED) { in l2cap_chan_send()
2706 l2cap_do_send(chan, skb); in l2cap_chan_send()
2713 if (len > chan->omtu) { in l2cap_chan_send()
2724 err = l2cap_segment_sdu(chan, &seg_queue, msg, len); in l2cap_chan_send()
2729 if (chan->state != BT_CONNECTED) { in l2cap_chan_send()
2737 if (chan->mode == L2CAP_MODE_ERTM) in l2cap_chan_send()
2738 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST); in l2cap_chan_send()
2740 l2cap_streaming_send(chan, &seg_queue); in l2cap_chan_send()
2751 BT_DBG("bad state %1.1x", chan->mode); in l2cap_chan_send()
2759 static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq) in l2cap_send_srej() argument
2764 BT_DBG("chan %p, txseq %u", chan, txseq); in l2cap_send_srej()
2770 for (seq = chan->expected_tx_seq; seq != txseq; in l2cap_send_srej()
2771 seq = __next_seq(chan, seq)) { in l2cap_send_srej()
2772 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) { in l2cap_send_srej()
2774 l2cap_send_sframe(chan, &control); in l2cap_send_srej()
2775 l2cap_seq_list_append(&chan->srej_list, seq); in l2cap_send_srej()
2779 chan->expected_tx_seq = __next_seq(chan, txseq); in l2cap_send_srej()
2782 static void l2cap_send_srej_tail(struct l2cap_chan *chan) in l2cap_send_srej_tail() argument
2786 BT_DBG("chan %p", chan); in l2cap_send_srej_tail()
2788 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR) in l2cap_send_srej_tail()
2794 control.reqseq = chan->srej_list.tail; in l2cap_send_srej_tail()
2795 l2cap_send_sframe(chan, &control); in l2cap_send_srej_tail()
2798 static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq) in l2cap_send_srej_list() argument
2804 BT_DBG("chan %p, txseq %u", chan, txseq); in l2cap_send_srej_list()
2811 initial_head = chan->srej_list.head; in l2cap_send_srej_list()
2814 seq = l2cap_seq_list_pop(&chan->srej_list); in l2cap_send_srej_list()
2819 l2cap_send_sframe(chan, &control); in l2cap_send_srej_list()
2820 l2cap_seq_list_append(&chan->srej_list, seq); in l2cap_send_srej_list()
2821 } while (chan->srej_list.head != initial_head); in l2cap_send_srej_list()
2824 static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq) in l2cap_process_reqseq() argument
2829 BT_DBG("chan %p, reqseq %u", chan, reqseq); in l2cap_process_reqseq()
2831 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq) in l2cap_process_reqseq()
2835 chan->expected_ack_seq, chan->unacked_frames); in l2cap_process_reqseq()
2837 for (ackseq = chan->expected_ack_seq; ackseq != reqseq; in l2cap_process_reqseq()
2838 ackseq = __next_seq(chan, ackseq)) { in l2cap_process_reqseq()
2840 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq); in l2cap_process_reqseq()
2842 skb_unlink(acked_skb, &chan->tx_q); in l2cap_process_reqseq()
2844 chan->unacked_frames--; in l2cap_process_reqseq()
2848 chan->expected_ack_seq = reqseq; in l2cap_process_reqseq()
2850 if (chan->unacked_frames == 0) in l2cap_process_reqseq()
2851 __clear_retrans_timer(chan); in l2cap_process_reqseq()
2853 BT_DBG("unacked_frames %u", chan->unacked_frames); in l2cap_process_reqseq()
2856 static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan) in l2cap_abort_rx_srej_sent() argument
2858 BT_DBG("chan %p", chan); in l2cap_abort_rx_srej_sent()
2860 chan->expected_tx_seq = chan->buffer_seq; in l2cap_abort_rx_srej_sent()
2861 l2cap_seq_list_clear(&chan->srej_list); in l2cap_abort_rx_srej_sent()
2862 skb_queue_purge(&chan->srej_q); in l2cap_abort_rx_srej_sent()
2863 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_abort_rx_srej_sent()
2866 static void l2cap_tx_state_xmit(struct l2cap_chan *chan, in l2cap_tx_state_xmit() argument
2870 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_xmit()
2875 if (chan->tx_send_head == NULL) in l2cap_tx_state_xmit()
2876 chan->tx_send_head = skb_peek(skbs); in l2cap_tx_state_xmit()
2878 skb_queue_splice_tail_init(skbs, &chan->tx_q); in l2cap_tx_state_xmit()
2879 l2cap_ertm_send(chan); in l2cap_tx_state_xmit()
2883 set_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_xmit()
2885 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) { in l2cap_tx_state_xmit()
2889 l2cap_abort_rx_srej_sent(chan); in l2cap_tx_state_xmit()
2892 l2cap_send_ack(chan); in l2cap_tx_state_xmit()
2897 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_xmit()
2899 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) { in l2cap_tx_state_xmit()
2906 local_control.reqseq = chan->buffer_seq; in l2cap_tx_state_xmit()
2907 l2cap_send_sframe(chan, &local_control); in l2cap_tx_state_xmit()
2909 chan->retry_count = 1; in l2cap_tx_state_xmit()
2910 __set_monitor_timer(chan); in l2cap_tx_state_xmit()
2911 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_xmit()
2915 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_xmit()
2918 l2cap_send_rr_or_rnr(chan, 1); in l2cap_tx_state_xmit()
2919 chan->retry_count = 1; in l2cap_tx_state_xmit()
2920 __set_monitor_timer(chan); in l2cap_tx_state_xmit()
2921 __clear_ack_timer(chan); in l2cap_tx_state_xmit()
2922 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_xmit()
2925 l2cap_send_rr_or_rnr(chan, 1); in l2cap_tx_state_xmit()
2926 chan->retry_count = 1; in l2cap_tx_state_xmit()
2927 __set_monitor_timer(chan); in l2cap_tx_state_xmit()
2928 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_xmit()
2938 static void l2cap_tx_state_wait_f(struct l2cap_chan *chan, in l2cap_tx_state_wait_f() argument
2942 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_wait_f()
2947 if (chan->tx_send_head == NULL) in l2cap_tx_state_wait_f()
2948 chan->tx_send_head = skb_peek(skbs); in l2cap_tx_state_wait_f()
2950 skb_queue_splice_tail_init(skbs, &chan->tx_q); in l2cap_tx_state_wait_f()
2954 set_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_wait_f()
2956 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) { in l2cap_tx_state_wait_f()
2960 l2cap_abort_rx_srej_sent(chan); in l2cap_tx_state_wait_f()
2963 l2cap_send_ack(chan); in l2cap_tx_state_wait_f()
2968 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_wait_f()
2970 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) { in l2cap_tx_state_wait_f()
2976 local_control.reqseq = chan->buffer_seq; in l2cap_tx_state_wait_f()
2977 l2cap_send_sframe(chan, &local_control); in l2cap_tx_state_wait_f()
2979 chan->retry_count = 1; in l2cap_tx_state_wait_f()
2980 __set_monitor_timer(chan); in l2cap_tx_state_wait_f()
2981 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_wait_f()
2985 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_wait_f()
2990 __clear_monitor_timer(chan); in l2cap_tx_state_wait_f()
2991 if (chan->unacked_frames > 0) in l2cap_tx_state_wait_f()
2992 __set_retrans_timer(chan); in l2cap_tx_state_wait_f()
2993 chan->retry_count = 0; in l2cap_tx_state_wait_f()
2994 chan->tx_state = L2CAP_TX_STATE_XMIT; in l2cap_tx_state_wait_f()
2995 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state); in l2cap_tx_state_wait_f()
3002 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) { in l2cap_tx_state_wait_f()
3003 l2cap_send_rr_or_rnr(chan, 1); in l2cap_tx_state_wait_f()
3004 __set_monitor_timer(chan); in l2cap_tx_state_wait_f()
3005 chan->retry_count++; in l2cap_tx_state_wait_f()
3007 l2cap_send_disconn_req(chan, ECONNABORTED); in l2cap_tx_state_wait_f()
3015 static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_tx() argument
3019 chan, control, skbs, event, chan->tx_state); in l2cap_tx()
3021 switch (chan->tx_state) { in l2cap_tx()
3023 l2cap_tx_state_xmit(chan, control, skbs, event); in l2cap_tx()
3026 l2cap_tx_state_wait_f(chan, control, skbs, event); in l2cap_tx()
3034 static void l2cap_pass_to_tx(struct l2cap_chan *chan, in l2cap_pass_to_tx() argument
3037 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx()
3038 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT); in l2cap_pass_to_tx()
3041 static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan, in l2cap_pass_to_tx_fbit() argument
3044 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx_fbit()
3045 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT); in l2cap_pass_to_tx_fbit()
3052 struct l2cap_chan *chan; in l2cap_raw_recv() local
3058 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_raw_recv()
3059 if (chan->chan_type != L2CAP_CHAN_RAW) in l2cap_raw_recv()
3063 if (bt_cb(skb)->l2cap.chan == chan) in l2cap_raw_recv()
3069 if (chan->ops->recv(chan, nskb)) in l2cap_raw_recv()
3210 static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan, size_t size) in l2cap_add_opt_efs() argument
3214 switch (chan->mode) { in l2cap_add_opt_efs()
3216 efs.id = chan->local_id; in l2cap_add_opt_efs()
3217 efs.stype = chan->local_stype; in l2cap_add_opt_efs()
3218 efs.msdu = cpu_to_le16(chan->local_msdu); in l2cap_add_opt_efs()
3219 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime); in l2cap_add_opt_efs()
3227 efs.msdu = cpu_to_le16(chan->local_msdu); in l2cap_add_opt_efs()
3228 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime); in l2cap_add_opt_efs()
3243 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_ack_timeout() local
3247 BT_DBG("chan %p", chan); in l2cap_ack_timeout()
3249 l2cap_chan_lock(chan); in l2cap_ack_timeout()
3251 frames_to_ack = __seq_offset(chan, chan->buffer_seq, in l2cap_ack_timeout()
3252 chan->last_acked_seq); in l2cap_ack_timeout()
3255 l2cap_send_rr_or_rnr(chan, 0); in l2cap_ack_timeout()
3257 l2cap_chan_unlock(chan); in l2cap_ack_timeout()
3258 l2cap_chan_put(chan); in l2cap_ack_timeout()
3261 int l2cap_ertm_init(struct l2cap_chan *chan) in l2cap_ertm_init() argument
3265 chan->next_tx_seq = 0; in l2cap_ertm_init()
3266 chan->expected_tx_seq = 0; in l2cap_ertm_init()
3267 chan->expected_ack_seq = 0; in l2cap_ertm_init()
3268 chan->unacked_frames = 0; in l2cap_ertm_init()
3269 chan->buffer_seq = 0; in l2cap_ertm_init()
3270 chan->frames_sent = 0; in l2cap_ertm_init()
3271 chan->last_acked_seq = 0; in l2cap_ertm_init()
3272 chan->sdu = NULL; in l2cap_ertm_init()
3273 chan->sdu_last_frag = NULL; in l2cap_ertm_init()
3274 chan->sdu_len = 0; in l2cap_ertm_init()
3276 skb_queue_head_init(&chan->tx_q); in l2cap_ertm_init()
3278 chan->local_amp_id = AMP_ID_BREDR; in l2cap_ertm_init()
3279 chan->move_id = AMP_ID_BREDR; in l2cap_ertm_init()
3280 chan->move_state = L2CAP_MOVE_STABLE; in l2cap_ertm_init()
3281 chan->move_role = L2CAP_MOVE_ROLE_NONE; in l2cap_ertm_init()
3283 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_ertm_init()
3286 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_ertm_init()
3287 chan->tx_state = L2CAP_TX_STATE_XMIT; in l2cap_ertm_init()
3289 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout); in l2cap_ertm_init()
3290 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout); in l2cap_ertm_init()
3291 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout); in l2cap_ertm_init()
3293 skb_queue_head_init(&chan->srej_q); in l2cap_ertm_init()
3295 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win); in l2cap_ertm_init()
3299 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win); in l2cap_ertm_init()
3301 l2cap_seq_list_free(&chan->srej_list); in l2cap_ertm_init()
3331 static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan, in __l2cap_set_ertm_timeouts() argument
3334 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) { in __l2cap_set_ertm_timeouts()
3335 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to; in __l2cap_set_ertm_timeouts()
3369 static inline void l2cap_txwin_setup(struct l2cap_chan *chan) in l2cap_txwin_setup() argument
3371 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW && in l2cap_txwin_setup()
3372 __l2cap_ews_supported(chan->conn)) { in l2cap_txwin_setup()
3374 set_bit(FLAG_EXT_CTRL, &chan->flags); in l2cap_txwin_setup()
3375 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW; in l2cap_txwin_setup()
3377 chan->tx_win = min_t(u16, chan->tx_win, in l2cap_txwin_setup()
3379 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW; in l2cap_txwin_setup()
3381 chan->ack_win = chan->tx_win; in l2cap_txwin_setup()
3384 static void l2cap_mtu_auto(struct l2cap_chan *chan) in l2cap_mtu_auto() argument
3386 struct hci_conn *conn = chan->conn->hcon; in l2cap_mtu_auto()
3388 chan->imtu = L2CAP_DEFAULT_MIN_MTU; in l2cap_mtu_auto()
3394 chan->imtu = 54; in l2cap_mtu_auto()
3400 chan->imtu = 83; in l2cap_mtu_auto()
3406 chan->imtu = 367; in l2cap_mtu_auto()
3412 chan->imtu = 552; in l2cap_mtu_auto()
3418 chan->imtu = 679; in l2cap_mtu_auto()
3424 chan->imtu = 1021; in l2cap_mtu_auto()
3427 static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size) in l2cap_build_conf_req() argument
3430 struct l2cap_conf_rfc rfc = { .mode = chan->mode }; in l2cap_build_conf_req()
3435 BT_DBG("chan %p", chan); in l2cap_build_conf_req()
3437 if (chan->num_conf_req || chan->num_conf_rsp) in l2cap_build_conf_req()
3440 switch (chan->mode) { in l2cap_build_conf_req()
3443 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) in l2cap_build_conf_req()
3446 if (__l2cap_efs_supported(chan->conn)) in l2cap_build_conf_req()
3447 set_bit(FLAG_EFS_ENABLE, &chan->flags); in l2cap_build_conf_req()
3451 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask); in l2cap_build_conf_req()
3456 if (chan->imtu != L2CAP_DEFAULT_MTU) { in l2cap_build_conf_req()
3457 if (!chan->imtu) in l2cap_build_conf_req()
3458 l2cap_mtu_auto(chan); in l2cap_build_conf_req()
3459 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, in l2cap_build_conf_req()
3463 switch (chan->mode) { in l2cap_build_conf_req()
3468 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) && in l2cap_build_conf_req()
3469 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING)) in l2cap_build_conf_req()
3485 rfc.max_transmit = chan->max_tx; in l2cap_build_conf_req()
3487 __l2cap_set_ertm_timeouts(chan, &rfc); in l2cap_build_conf_req()
3489 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu - in l2cap_build_conf_req()
3494 l2cap_txwin_setup(chan); in l2cap_build_conf_req()
3496 rfc.txwin_size = min_t(u16, chan->tx_win, in l2cap_build_conf_req()
3502 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) in l2cap_build_conf_req()
3503 l2cap_add_opt_efs(&ptr, chan, endptr - ptr); in l2cap_build_conf_req()
3505 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_build_conf_req()
3507 chan->tx_win, endptr - ptr); in l2cap_build_conf_req()
3509 if (chan->conn->feat_mask & L2CAP_FEAT_FCS) in l2cap_build_conf_req()
3510 if (chan->fcs == L2CAP_FCS_NONE || in l2cap_build_conf_req()
3511 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) { in l2cap_build_conf_req()
3512 chan->fcs = L2CAP_FCS_NONE; in l2cap_build_conf_req()
3514 chan->fcs, endptr - ptr); in l2cap_build_conf_req()
3519 l2cap_txwin_setup(chan); in l2cap_build_conf_req()
3526 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu - in l2cap_build_conf_req()
3534 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) in l2cap_build_conf_req()
3535 l2cap_add_opt_efs(&ptr, chan, endptr - ptr); in l2cap_build_conf_req()
3537 if (chan->conn->feat_mask & L2CAP_FEAT_FCS) in l2cap_build_conf_req()
3538 if (chan->fcs == L2CAP_FCS_NONE || in l2cap_build_conf_req()
3539 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) { in l2cap_build_conf_req()
3540 chan->fcs = L2CAP_FCS_NONE; in l2cap_build_conf_req()
3542 chan->fcs, endptr - ptr); in l2cap_build_conf_req()
3547 req->dcid = cpu_to_le16(chan->dcid); in l2cap_build_conf_req()
3553 static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data_size) in l2cap_parse_conf_req() argument
3558 void *req = chan->conf_req; in l2cap_parse_conf_req()
3559 int len = chan->conf_len; in l2cap_parse_conf_req()
3569 BT_DBG("chan %p", chan); in l2cap_parse_conf_req()
3589 chan->flush_to = val; in l2cap_parse_conf_req()
3605 set_bit(CONF_RECV_NO_FCS, &chan->conf_state); in l2cap_parse_conf_req()
3618 if (!(chan->conn->local_fixed_chan & L2CAP_FC_A2MP)) in l2cap_parse_conf_req()
3620 set_bit(FLAG_EXT_CTRL, &chan->flags); in l2cap_parse_conf_req()
3621 set_bit(CONF_EWS_RECV, &chan->conf_state); in l2cap_parse_conf_req()
3622 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW; in l2cap_parse_conf_req()
3623 chan->remote_tx_win = val; in l2cap_parse_conf_req()
3635 if (chan->num_conf_rsp || chan->num_conf_req > 1) in l2cap_parse_conf_req()
3638 switch (chan->mode) { in l2cap_parse_conf_req()
3641 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) { in l2cap_parse_conf_req()
3642 chan->mode = l2cap_select_mode(rfc.mode, in l2cap_parse_conf_req()
3643 chan->conn->feat_mask); in l2cap_parse_conf_req()
3648 if (__l2cap_efs_supported(chan->conn)) in l2cap_parse_conf_req()
3649 set_bit(FLAG_EFS_ENABLE, &chan->flags); in l2cap_parse_conf_req()
3654 if (chan->mode != rfc.mode) in l2cap_parse_conf_req()
3661 if (chan->mode != rfc.mode) { in l2cap_parse_conf_req()
3663 rfc.mode = chan->mode; in l2cap_parse_conf_req()
3665 if (chan->num_conf_rsp == 1) in l2cap_parse_conf_req()
3679 chan->omtu = mtu; in l2cap_parse_conf_req()
3680 set_bit(CONF_MTU_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3682 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu, endptr - ptr); in l2cap_parse_conf_req()
3685 if (chan->local_stype != L2CAP_SERV_NOTRAFIC && in l2cap_parse_conf_req()
3687 efs.stype != chan->local_stype) { in l2cap_parse_conf_req()
3691 if (chan->num_conf_req >= 1) in l2cap_parse_conf_req()
3700 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state); in l2cap_parse_conf_req()
3706 chan->fcs = L2CAP_FCS_NONE; in l2cap_parse_conf_req()
3707 set_bit(CONF_MODE_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3711 if (!test_bit(CONF_EWS_RECV, &chan->conf_state)) in l2cap_parse_conf_req()
3712 chan->remote_tx_win = rfc.txwin_size; in l2cap_parse_conf_req()
3716 chan->remote_max_tx = rfc.max_transmit; in l2cap_parse_conf_req()
3719 chan->conn->mtu - L2CAP_EXT_HDR_SIZE - in l2cap_parse_conf_req()
3722 chan->remote_mps = size; in l2cap_parse_conf_req()
3724 __l2cap_set_ertm_timeouts(chan, &rfc); in l2cap_parse_conf_req()
3726 set_bit(CONF_MODE_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3731 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) { in l2cap_parse_conf_req()
3732 chan->remote_id = efs.id; in l2cap_parse_conf_req()
3733 chan->remote_stype = efs.stype; in l2cap_parse_conf_req()
3734 chan->remote_msdu = le16_to_cpu(efs.msdu); in l2cap_parse_conf_req()
3735 chan->remote_flush_to = in l2cap_parse_conf_req()
3737 chan->remote_acc_lat = in l2cap_parse_conf_req()
3739 chan->remote_sdu_itime = in l2cap_parse_conf_req()
3749 chan->conn->mtu - L2CAP_EXT_HDR_SIZE - in l2cap_parse_conf_req()
3752 chan->remote_mps = size; in l2cap_parse_conf_req()
3754 set_bit(CONF_MODE_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3765 rfc.mode = chan->mode; in l2cap_parse_conf_req()
3769 set_bit(CONF_OUTPUT_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3771 rsp->scid = cpu_to_le16(chan->dcid); in l2cap_parse_conf_req()
3778 static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, in l2cap_parse_conf_rsp() argument
3789 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data); in l2cap_parse_conf_rsp()
3802 chan->imtu = L2CAP_DEFAULT_MIN_MTU; in l2cap_parse_conf_rsp()
3804 chan->imtu = val; in l2cap_parse_conf_rsp()
3805 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, in l2cap_parse_conf_rsp()
3812 chan->flush_to = val; in l2cap_parse_conf_rsp()
3814 chan->flush_to, endptr - ptr); in l2cap_parse_conf_rsp()
3821 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) && in l2cap_parse_conf_rsp()
3822 rfc.mode != chan->mode) in l2cap_parse_conf_rsp()
3824 chan->fcs = 0; in l2cap_parse_conf_rsp()
3832 chan->ack_win = min_t(u16, val, chan->ack_win); in l2cap_parse_conf_rsp()
3834 chan->tx_win, endptr - ptr); in l2cap_parse_conf_rsp()
3841 if (chan->local_stype != L2CAP_SERV_NOTRAFIC && in l2cap_parse_conf_rsp()
3843 efs.stype != chan->local_stype) in l2cap_parse_conf_rsp()
3855 &chan->conf_state); in l2cap_parse_conf_rsp()
3860 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode) in l2cap_parse_conf_rsp()
3863 chan->mode = rfc.mode; in l2cap_parse_conf_rsp()
3868 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout); in l2cap_parse_conf_rsp()
3869 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout); in l2cap_parse_conf_rsp()
3870 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_parse_conf_rsp()
3871 if (!test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_parse_conf_rsp()
3872 chan->ack_win = min_t(u16, chan->ack_win, in l2cap_parse_conf_rsp()
3875 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) { in l2cap_parse_conf_rsp()
3876 chan->local_msdu = le16_to_cpu(efs.msdu); in l2cap_parse_conf_rsp()
3877 chan->local_sdu_itime = in l2cap_parse_conf_rsp()
3879 chan->local_acc_lat = le32_to_cpu(efs.acc_lat); in l2cap_parse_conf_rsp()
3880 chan->local_flush_to = in l2cap_parse_conf_rsp()
3886 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_parse_conf_rsp()
3890 req->dcid = cpu_to_le16(chan->dcid); in l2cap_parse_conf_rsp()
3896 static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data, in l2cap_build_conf_rsp() argument
3902 BT_DBG("chan %p", chan); in l2cap_build_conf_rsp()
3904 rsp->scid = cpu_to_le16(chan->dcid); in l2cap_build_conf_rsp()
3911 void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan) in __l2cap_le_connect_rsp_defer() argument
3914 struct l2cap_conn *conn = chan->conn; in __l2cap_le_connect_rsp_defer()
3916 BT_DBG("chan %p", chan); in __l2cap_le_connect_rsp_defer()
3918 rsp.dcid = cpu_to_le16(chan->scid); in __l2cap_le_connect_rsp_defer()
3919 rsp.mtu = cpu_to_le16(chan->imtu); in __l2cap_le_connect_rsp_defer()
3920 rsp.mps = cpu_to_le16(chan->mps); in __l2cap_le_connect_rsp_defer()
3921 rsp.credits = cpu_to_le16(chan->rx_credits); in __l2cap_le_connect_rsp_defer()
3924 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in __l2cap_le_connect_rsp_defer()
3928 void __l2cap_ecred_conn_rsp_defer(struct l2cap_chan *chan) in __l2cap_ecred_conn_rsp_defer() argument
3934 struct l2cap_conn *conn = chan->conn; in __l2cap_ecred_conn_rsp_defer()
3935 u16 ident = chan->ident; in __l2cap_ecred_conn_rsp_defer()
3941 BT_DBG("chan %p ident %d", chan, ident); in __l2cap_ecred_conn_rsp_defer()
3943 pdu.rsp.mtu = cpu_to_le16(chan->imtu); in __l2cap_ecred_conn_rsp_defer()
3944 pdu.rsp.mps = cpu_to_le16(chan->mps); in __l2cap_ecred_conn_rsp_defer()
3945 pdu.rsp.credits = cpu_to_le16(chan->rx_credits); in __l2cap_ecred_conn_rsp_defer()
3950 list_for_each_entry(chan, &conn->chan_l, list) { in __l2cap_ecred_conn_rsp_defer()
3951 if (chan->ident != ident) in __l2cap_ecred_conn_rsp_defer()
3955 chan->ident = 0; in __l2cap_ecred_conn_rsp_defer()
3958 pdu.dcid[i++] = cpu_to_le16(chan->scid); in __l2cap_ecred_conn_rsp_defer()
3967 void __l2cap_connect_rsp_defer(struct l2cap_chan *chan) in __l2cap_connect_rsp_defer() argument
3970 struct l2cap_conn *conn = chan->conn; in __l2cap_connect_rsp_defer()
3974 rsp.scid = cpu_to_le16(chan->dcid); in __l2cap_connect_rsp_defer()
3975 rsp.dcid = cpu_to_le16(chan->scid); in __l2cap_connect_rsp_defer()
3979 if (chan->hs_hcon) in __l2cap_connect_rsp_defer()
3984 BT_DBG("chan %p rsp_code %u", chan, rsp_code); in __l2cap_connect_rsp_defer()
3986 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp); in __l2cap_connect_rsp_defer()
3988 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) in __l2cap_connect_rsp_defer()
3992 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in __l2cap_connect_rsp_defer()
3993 chan->num_conf_req++; in __l2cap_connect_rsp_defer()
3996 static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len) in l2cap_conf_rfc_get() argument
4003 u16 txwin_ext = chan->ack_win; in l2cap_conf_rfc_get()
4005 .mode = chan->mode, in l2cap_conf_rfc_get()
4008 .max_pdu_size = cpu_to_le16(chan->imtu), in l2cap_conf_rfc_get()
4009 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW), in l2cap_conf_rfc_get()
4012 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len); in l2cap_conf_rfc_get()
4014 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING)) in l2cap_conf_rfc_get()
4038 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout); in l2cap_conf_rfc_get()
4039 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout); in l2cap_conf_rfc_get()
4040 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_conf_rfc_get()
4041 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_conf_rfc_get()
4042 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext); in l2cap_conf_rfc_get()
4044 chan->ack_win = min_t(u16, chan->ack_win, in l2cap_conf_rfc_get()
4048 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_conf_rfc_get()
4083 struct l2cap_chan *chan = NULL, *pchan; in l2cap_connect() local
4124 chan = pchan->ops->new_connection(pchan); in l2cap_connect()
4125 if (!chan) in l2cap_connect()
4135 bacpy(&chan->src, &conn->hcon->src); in l2cap_connect()
4136 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_connect()
4137 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_connect()
4138 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_connect()
4139 chan->psm = psm; in l2cap_connect()
4140 chan->dcid = scid; in l2cap_connect()
4141 chan->local_amp_id = amp_id; in l2cap_connect()
4143 __l2cap_chan_add(conn, chan); in l2cap_connect()
4145 dcid = chan->scid; in l2cap_connect()
4147 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_connect()
4149 chan->ident = cmd->ident; in l2cap_connect()
4152 if (l2cap_chan_check_security(chan, false)) { in l2cap_connect()
4153 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_connect()
4154 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4157 chan->ops->defer(chan); in l2cap_connect()
4164 l2cap_state_change(chan, BT_CONFIG); in l2cap_connect()
4167 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4173 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4178 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4208 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) && in l2cap_connect()
4211 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_connect()
4213 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_connect()
4214 chan->num_conf_req++; in l2cap_connect()
4217 return chan; in l2cap_connect()
4245 struct l2cap_chan *chan; in l2cap_connect_create_rsp() local
4263 chan = __l2cap_get_chan_by_scid(conn, scid); in l2cap_connect_create_rsp()
4264 if (!chan) { in l2cap_connect_create_rsp()
4269 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_connect_create_rsp()
4270 if (!chan) { in l2cap_connect_create_rsp()
4278 l2cap_chan_lock(chan); in l2cap_connect_create_rsp()
4282 l2cap_state_change(chan, BT_CONFIG); in l2cap_connect_create_rsp()
4283 chan->ident = 0; in l2cap_connect_create_rsp()
4284 chan->dcid = dcid; in l2cap_connect_create_rsp()
4285 clear_bit(CONF_CONNECT_PEND, &chan->conf_state); in l2cap_connect_create_rsp()
4287 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) in l2cap_connect_create_rsp()
4291 l2cap_build_conf_req(chan, req, sizeof(req)), req); in l2cap_connect_create_rsp()
4292 chan->num_conf_req++; in l2cap_connect_create_rsp()
4296 set_bit(CONF_CONNECT_PEND, &chan->conf_state); in l2cap_connect_create_rsp()
4300 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_connect_create_rsp()
4304 l2cap_chan_unlock(chan); in l2cap_connect_create_rsp()
4312 static inline void set_default_fcs(struct l2cap_chan *chan) in set_default_fcs() argument
4317 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING) in set_default_fcs()
4318 chan->fcs = L2CAP_FCS_NONE; in set_default_fcs()
4319 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) in set_default_fcs()
4320 chan->fcs = L2CAP_FCS_CRC16; in set_default_fcs()
4323 static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data, in l2cap_send_efs_conf_rsp() argument
4326 struct l2cap_conn *conn = chan->conn; in l2cap_send_efs_conf_rsp()
4328 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident, in l2cap_send_efs_conf_rsp()
4331 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state); in l2cap_send_efs_conf_rsp()
4332 set_bit(CONF_OUTPUT_DONE, &chan->conf_state); in l2cap_send_efs_conf_rsp()
4335 l2cap_build_conf_rsp(chan, data, in l2cap_send_efs_conf_rsp()
4358 struct l2cap_chan *chan; in l2cap_config_req() local
4369 chan = l2cap_get_chan_by_scid(conn, dcid); in l2cap_config_req()
4370 if (!chan) { in l2cap_config_req()
4375 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2 && in l2cap_config_req()
4376 chan->state != BT_CONNECTED) { in l2cap_config_req()
4377 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid, in l2cap_config_req()
4378 chan->dcid); in l2cap_config_req()
4384 if (chan->conf_len + len > sizeof(chan->conf_req)) { in l2cap_config_req()
4386 l2cap_build_conf_rsp(chan, rsp, in l2cap_config_req()
4392 memcpy(chan->conf_req + chan->conf_len, req->data, len); in l2cap_config_req()
4393 chan->conf_len += len; in l2cap_config_req()
4398 l2cap_build_conf_rsp(chan, rsp, in l2cap_config_req()
4404 len = l2cap_parse_conf_req(chan, rsp, sizeof(rsp)); in l2cap_config_req()
4406 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_req()
4410 chan->ident = cmd->ident; in l2cap_config_req()
4412 chan->num_conf_rsp++; in l2cap_config_req()
4415 chan->conf_len = 0; in l2cap_config_req()
4417 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) in l2cap_config_req()
4420 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) { in l2cap_config_req()
4421 set_default_fcs(chan); in l2cap_config_req()
4423 if (chan->mode == L2CAP_MODE_ERTM || in l2cap_config_req()
4424 chan->mode == L2CAP_MODE_STREAMING) in l2cap_config_req()
4425 err = l2cap_ertm_init(chan); in l2cap_config_req()
4428 l2cap_send_disconn_req(chan, -err); in l2cap_config_req()
4430 l2cap_chan_ready(chan); in l2cap_config_req()
4435 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) { in l2cap_config_req()
4438 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_config_req()
4439 chan->num_conf_req++; in l2cap_config_req()
4444 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) && in l2cap_config_req()
4445 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) { in l2cap_config_req()
4450 if (!chan->hs_hcon) in l2cap_config_req()
4451 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags); in l2cap_config_req()
4453 chan->ident = cmd->ident; in l2cap_config_req()
4457 l2cap_chan_unlock(chan); in l2cap_config_req()
4467 struct l2cap_chan *chan; in l2cap_config_rsp() local
4481 chan = l2cap_get_chan_by_scid(conn, scid); in l2cap_config_rsp()
4482 if (!chan) in l2cap_config_rsp()
4487 l2cap_conf_rfc_get(chan, rsp->data, len); in l2cap_config_rsp()
4488 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state); in l2cap_config_rsp()
4492 set_bit(CONF_REM_CONF_PEND, &chan->conf_state); in l2cap_config_rsp()
4494 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) { in l2cap_config_rsp()
4497 len = l2cap_parse_conf_rsp(chan, rsp->data, len, in l2cap_config_rsp()
4500 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4504 if (!chan->hs_hcon) { in l2cap_config_rsp()
4505 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident, in l2cap_config_rsp()
4508 if (l2cap_check_efs(chan)) { in l2cap_config_rsp()
4509 amp_create_logical_link(chan); in l2cap_config_rsp()
4510 chan->ident = cmd->ident; in l2cap_config_rsp()
4517 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) { in l2cap_config_rsp()
4521 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4527 len = l2cap_parse_conf_rsp(chan, rsp->data, len, in l2cap_config_rsp()
4530 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4536 chan->num_conf_req++; in l2cap_config_rsp()
4544 l2cap_chan_set_err(chan, ECONNRESET); in l2cap_config_rsp()
4546 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT); in l2cap_config_rsp()
4547 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4554 set_bit(CONF_INPUT_DONE, &chan->conf_state); in l2cap_config_rsp()
4556 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) { in l2cap_config_rsp()
4557 set_default_fcs(chan); in l2cap_config_rsp()
4559 if (chan->mode == L2CAP_MODE_ERTM || in l2cap_config_rsp()
4560 chan->mode == L2CAP_MODE_STREAMING) in l2cap_config_rsp()
4561 err = l2cap_ertm_init(chan); in l2cap_config_rsp()
4564 l2cap_send_disconn_req(chan, -err); in l2cap_config_rsp()
4566 l2cap_chan_ready(chan); in l2cap_config_rsp()
4570 l2cap_chan_unlock(chan); in l2cap_config_rsp()
4581 struct l2cap_chan *chan; in l2cap_disconnect_req() local
4593 chan = __l2cap_get_chan_by_scid(conn, dcid); in l2cap_disconnect_req()
4594 if (!chan) { in l2cap_disconnect_req()
4600 l2cap_chan_hold(chan); in l2cap_disconnect_req()
4601 l2cap_chan_lock(chan); in l2cap_disconnect_req()
4603 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_disconnect_req()
4604 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_disconnect_req()
4607 chan->ops->set_shutdown(chan); in l2cap_disconnect_req()
4609 l2cap_chan_del(chan, ECONNRESET); in l2cap_disconnect_req()
4611 chan->ops->close(chan); in l2cap_disconnect_req()
4613 l2cap_chan_unlock(chan); in l2cap_disconnect_req()
4614 l2cap_chan_put(chan); in l2cap_disconnect_req()
4627 struct l2cap_chan *chan; in l2cap_disconnect_rsp() local
4639 chan = __l2cap_get_chan_by_scid(conn, scid); in l2cap_disconnect_rsp()
4640 if (!chan) { in l2cap_disconnect_rsp()
4645 l2cap_chan_hold(chan); in l2cap_disconnect_rsp()
4646 l2cap_chan_lock(chan); in l2cap_disconnect_rsp()
4648 if (chan->state != BT_DISCONN) { in l2cap_disconnect_rsp()
4649 l2cap_chan_unlock(chan); in l2cap_disconnect_rsp()
4650 l2cap_chan_put(chan); in l2cap_disconnect_rsp()
4655 l2cap_chan_del(chan, 0); in l2cap_disconnect_rsp()
4657 chan->ops->close(chan); in l2cap_disconnect_rsp()
4659 l2cap_chan_unlock(chan); in l2cap_disconnect_rsp()
4660 l2cap_chan_put(chan); in l2cap_disconnect_rsp()
4787 struct l2cap_chan *chan; in l2cap_create_channel_req() local
4819 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP, in l2cap_create_channel_req()
4821 if (chan) { in l2cap_create_channel_req()
4829 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid, in l2cap_create_channel_req()
4830 chan->dcid); in l2cap_create_channel_req()
4834 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon); in l2cap_create_channel_req()
4836 mgr->bredr_chan = chan; in l2cap_create_channel_req()
4837 chan->hs_hcon = hs_hcon; in l2cap_create_channel_req()
4838 chan->fcs = L2CAP_FCS_NONE; in l2cap_create_channel_req()
4858 static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id) in l2cap_send_move_chan_req() argument
4863 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id); in l2cap_send_move_chan_req()
4865 ident = l2cap_get_ident(chan->conn); in l2cap_send_move_chan_req()
4866 chan->ident = ident; in l2cap_send_move_chan_req()
4868 req.icid = cpu_to_le16(chan->scid); in l2cap_send_move_chan_req()
4871 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req), in l2cap_send_move_chan_req()
4874 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT); in l2cap_send_move_chan_req()
4877 static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result) in l2cap_send_move_chan_rsp() argument
4881 BT_DBG("chan %p, result 0x%4.4x", chan, result); in l2cap_send_move_chan_rsp()
4883 rsp.icid = cpu_to_le16(chan->dcid); in l2cap_send_move_chan_rsp()
4886 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP, in l2cap_send_move_chan_rsp()
4890 static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result) in l2cap_send_move_chan_cfm() argument
4894 BT_DBG("chan %p, result 0x%4.4x", chan, result); in l2cap_send_move_chan_cfm()
4896 chan->ident = l2cap_get_ident(chan->conn); in l2cap_send_move_chan_cfm()
4898 cfm.icid = cpu_to_le16(chan->scid); in l2cap_send_move_chan_cfm()
4901 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM, in l2cap_send_move_chan_cfm()
4904 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT); in l2cap_send_move_chan_cfm()
4931 static void __release_logical_link(struct l2cap_chan *chan) in __release_logical_link() argument
4933 chan->hs_hchan = NULL; in __release_logical_link()
4934 chan->hs_hcon = NULL; in __release_logical_link()
4939 static void l2cap_logical_fail(struct l2cap_chan *chan) in l2cap_logical_fail() argument
4942 if (chan->state != BT_CONNECTED) { in l2cap_logical_fail()
4944 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_logical_fail()
4948 switch (chan->move_role) { in l2cap_logical_fail()
4950 l2cap_move_done(chan); in l2cap_logical_fail()
4951 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP); in l2cap_logical_fail()
4954 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP || in l2cap_logical_fail()
4955 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) { in l2cap_logical_fail()
4959 l2cap_move_done(chan); in l2cap_logical_fail()
4965 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED); in l2cap_logical_fail()
4970 static void l2cap_logical_finish_create(struct l2cap_chan *chan, in l2cap_logical_finish_create() argument
4975 chan->hs_hchan = hchan; in l2cap_logical_finish_create()
4976 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_logical_finish_create()
4978 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0); in l2cap_logical_finish_create()
4980 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) { in l2cap_logical_finish_create()
4983 set_default_fcs(chan); in l2cap_logical_finish_create()
4985 err = l2cap_ertm_init(chan); in l2cap_logical_finish_create()
4987 l2cap_send_disconn_req(chan, -err); in l2cap_logical_finish_create()
4989 l2cap_chan_ready(chan); in l2cap_logical_finish_create()
4993 static void l2cap_logical_finish_move(struct l2cap_chan *chan, in l2cap_logical_finish_move() argument
4996 chan->hs_hcon = hchan->conn; in l2cap_logical_finish_move()
4997 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_logical_finish_move()
4999 BT_DBG("move_state %d", chan->move_state); in l2cap_logical_finish_move()
5001 switch (chan->move_state) { in l2cap_logical_finish_move()
5006 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS; in l2cap_logical_finish_move()
5009 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_logical_finish_move()
5010 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY; in l2cap_logical_finish_move()
5011 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) { in l2cap_logical_finish_move()
5012 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP; in l2cap_logical_finish_move()
5013 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED); in l2cap_logical_finish_move()
5014 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) { in l2cap_logical_finish_move()
5015 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM; in l2cap_logical_finish_move()
5016 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS); in l2cap_logical_finish_move()
5021 __release_logical_link(chan); in l2cap_logical_finish_move()
5023 chan->move_state = L2CAP_MOVE_STABLE; in l2cap_logical_finish_move()
5028 void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan, in l2cap_logical_cfm() argument
5031 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status); in l2cap_logical_cfm()
5034 l2cap_logical_fail(chan); in l2cap_logical_cfm()
5035 __release_logical_link(chan); in l2cap_logical_cfm()
5039 if (chan->state != BT_CONNECTED) { in l2cap_logical_cfm()
5041 if (chan->local_amp_id != AMP_ID_BREDR) in l2cap_logical_cfm()
5042 l2cap_logical_finish_create(chan, hchan); in l2cap_logical_cfm()
5044 l2cap_logical_finish_move(chan, hchan); in l2cap_logical_cfm()
5048 void l2cap_move_start(struct l2cap_chan *chan) in l2cap_move_start() argument
5050 BT_DBG("chan %p", chan); in l2cap_move_start()
5052 if (chan->local_amp_id == AMP_ID_BREDR) { in l2cap_move_start()
5053 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED) in l2cap_move_start()
5055 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR; in l2cap_move_start()
5056 chan->move_state = L2CAP_MOVE_WAIT_PREPARE; in l2cap_move_start()
5059 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR; in l2cap_move_start()
5060 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS; in l2cap_move_start()
5061 chan->move_id = 0; in l2cap_move_start()
5062 l2cap_move_setup(chan); in l2cap_move_start()
5063 l2cap_send_move_chan_req(chan, 0); in l2cap_move_start()
5067 static void l2cap_do_create(struct l2cap_chan *chan, int result, in l2cap_do_create() argument
5070 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state), in l2cap_do_create()
5073 chan->fcs = L2CAP_FCS_NONE; in l2cap_do_create()
5076 if (chan->state == BT_CONNECT) { in l2cap_do_create()
5078 chan->local_amp_id = local_amp_id; in l2cap_do_create()
5079 l2cap_send_create_chan_req(chan, remote_amp_id); in l2cap_do_create()
5082 l2cap_send_conn_req(chan); in l2cap_do_create()
5089 if (__l2cap_no_conn_pending(chan)) { in l2cap_do_create()
5092 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_do_create()
5093 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_do_create()
5105 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP, in l2cap_do_create()
5109 l2cap_state_change(chan, BT_CONFIG); in l2cap_do_create()
5110 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_do_create()
5111 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn), in l2cap_do_create()
5113 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_do_create()
5114 chan->num_conf_req++; in l2cap_do_create()
5119 static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id, in l2cap_do_move_initiate() argument
5122 l2cap_move_setup(chan); in l2cap_do_move_initiate()
5123 chan->move_id = local_amp_id; in l2cap_do_move_initiate()
5124 chan->move_state = L2CAP_MOVE_WAIT_RSP; in l2cap_do_move_initiate()
5126 l2cap_send_move_chan_req(chan, remote_amp_id); in l2cap_do_move_initiate()
5129 static void l2cap_do_move_respond(struct l2cap_chan *chan, int result) in l2cap_do_move_respond() argument
5138 chan->hs_hcon = hchan->conn; in l2cap_do_move_respond()
5139 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_do_move_respond()
5140 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM; in l2cap_do_move_respond()
5141 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS); in l2cap_do_move_respond()
5143 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS); in l2cap_do_move_respond()
5146 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM; in l2cap_do_move_respond()
5150 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED); in l2cap_do_move_respond()
5154 static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result) in l2cap_do_move_cancel() argument
5156 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) { in l2cap_do_move_cancel()
5163 l2cap_send_move_chan_rsp(chan, rsp_result); in l2cap_do_move_cancel()
5166 chan->move_role = L2CAP_MOVE_ROLE_NONE; in l2cap_do_move_cancel()
5167 chan->move_state = L2CAP_MOVE_STABLE; in l2cap_do_move_cancel()
5170 l2cap_ertm_send(chan); in l2cap_do_move_cancel()
5174 void __l2cap_physical_cfm(struct l2cap_chan *chan, int result) in __l2cap_physical_cfm() argument
5176 u8 local_amp_id = chan->local_amp_id; in __l2cap_physical_cfm()
5177 u8 remote_amp_id = chan->remote_amp_id; in __l2cap_physical_cfm()
5180 chan, result, local_amp_id, remote_amp_id); in __l2cap_physical_cfm()
5182 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) in __l2cap_physical_cfm()
5185 if (chan->state != BT_CONNECTED) { in __l2cap_physical_cfm()
5186 l2cap_do_create(chan, result, local_amp_id, remote_amp_id); in __l2cap_physical_cfm()
5188 l2cap_do_move_cancel(chan, result); in __l2cap_physical_cfm()
5190 switch (chan->move_role) { in __l2cap_physical_cfm()
5192 l2cap_do_move_initiate(chan, local_amp_id, in __l2cap_physical_cfm()
5196 l2cap_do_move_respond(chan, result); in __l2cap_physical_cfm()
5199 l2cap_do_move_cancel(chan, result); in __l2cap_physical_cfm()
5211 struct l2cap_chan *chan; in l2cap_move_channel_req() local
5225 chan = l2cap_get_chan_by_dcid(conn, icid); in l2cap_move_channel_req()
5226 if (!chan) { in l2cap_move_channel_req()
5234 chan->ident = cmd->ident; in l2cap_move_channel_req()
5236 if (chan->scid < L2CAP_CID_DYN_START || in l2cap_move_channel_req()
5237 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY || in l2cap_move_channel_req()
5238 (chan->mode != L2CAP_MODE_ERTM && in l2cap_move_channel_req()
5239 chan->mode != L2CAP_MODE_STREAMING)) { in l2cap_move_channel_req()
5244 if (chan->local_amp_id == req->dest_amp_id) { in l2cap_move_channel_req()
5267 if ((__chan_is_moving(chan) || in l2cap_move_channel_req()
5268 chan->move_role != L2CAP_MOVE_ROLE_NONE) && in l2cap_move_channel_req()
5274 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER; in l2cap_move_channel_req()
5275 l2cap_move_setup(chan); in l2cap_move_channel_req()
5276 chan->move_id = req->dest_amp_id; in l2cap_move_channel_req()
5280 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_move_channel_req()
5281 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY; in l2cap_move_channel_req()
5284 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM; in l2cap_move_channel_req()
5288 chan->move_state = L2CAP_MOVE_WAIT_PREPARE; in l2cap_move_channel_req()
5295 l2cap_send_move_chan_rsp(chan, result); in l2cap_move_channel_req()
5297 l2cap_chan_unlock(chan); in l2cap_move_channel_req()
5304 struct l2cap_chan *chan; in l2cap_move_continue() local
5307 chan = l2cap_get_chan_by_scid(conn, icid); in l2cap_move_continue()
5308 if (!chan) { in l2cap_move_continue()
5313 __clear_chan_timer(chan); in l2cap_move_continue()
5315 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT); in l2cap_move_continue()
5317 switch (chan->move_state) { in l2cap_move_continue()
5322 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM; in l2cap_move_continue()
5328 &chan->conn_state)) { in l2cap_move_continue()
5329 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY; in l2cap_move_continue()
5334 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP; in l2cap_move_continue()
5335 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED); in l2cap_move_continue()
5344 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM; in l2cap_move_continue()
5349 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP; in l2cap_move_continue()
5355 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED); in l2cap_move_continue()
5367 chan->hs_hcon = hchan->conn; in l2cap_move_continue()
5368 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_move_continue()
5372 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED); in l2cap_move_continue()
5377 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS; in l2cap_move_continue()
5380 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS); in l2cap_move_continue()
5384 chan->move_id = chan->local_amp_id; in l2cap_move_continue()
5385 l2cap_move_done(chan); in l2cap_move_continue()
5386 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED); in l2cap_move_continue()
5389 l2cap_chan_unlock(chan); in l2cap_move_continue()
5395 struct l2cap_chan *chan; in l2cap_move_fail() local
5397 chan = l2cap_get_chan_by_ident(conn, ident); in l2cap_move_fail()
5398 if (!chan) { in l2cap_move_fail()
5404 __clear_chan_timer(chan); in l2cap_move_fail()
5406 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) { in l2cap_move_fail()
5408 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER; in l2cap_move_fail()
5411 chan->move_id = chan->local_amp_id; in l2cap_move_fail()
5412 l2cap_move_done(chan); in l2cap_move_fail()
5416 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED); in l2cap_move_fail()
5418 l2cap_chan_unlock(chan); in l2cap_move_fail()
5449 struct l2cap_chan *chan; in l2cap_move_channel_confirm() local
5460 chan = l2cap_get_chan_by_dcid(conn, icid); in l2cap_move_channel_confirm()
5461 if (!chan) { in l2cap_move_channel_confirm()
5467 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) { in l2cap_move_channel_confirm()
5469 chan->local_amp_id = chan->move_id; in l2cap_move_channel_confirm()
5470 if (chan->local_amp_id == AMP_ID_BREDR) in l2cap_move_channel_confirm()
5471 __release_logical_link(chan); in l2cap_move_channel_confirm()
5473 chan->move_id = chan->local_amp_id; in l2cap_move_channel_confirm()
5476 l2cap_move_done(chan); in l2cap_move_channel_confirm()
5481 l2cap_chan_unlock(chan); in l2cap_move_channel_confirm()
5491 struct l2cap_chan *chan; in l2cap_move_channel_confirm_rsp() local
5501 chan = l2cap_get_chan_by_scid(conn, icid); in l2cap_move_channel_confirm_rsp()
5502 if (!chan) in l2cap_move_channel_confirm_rsp()
5505 __clear_chan_timer(chan); in l2cap_move_channel_confirm_rsp()
5507 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) { in l2cap_move_channel_confirm_rsp()
5508 chan->local_amp_id = chan->move_id; in l2cap_move_channel_confirm_rsp()
5510 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan) in l2cap_move_channel_confirm_rsp()
5511 __release_logical_link(chan); in l2cap_move_channel_confirm_rsp()
5513 l2cap_move_done(chan); in l2cap_move_channel_confirm_rsp()
5516 l2cap_chan_unlock(chan); in l2cap_move_channel_confirm_rsp()
5578 struct l2cap_chan *chan; in l2cap_le_connect_rsp() local
5600 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_le_connect_rsp()
5601 if (!chan) { in l2cap_le_connect_rsp()
5608 l2cap_chan_lock(chan); in l2cap_le_connect_rsp()
5617 chan->ident = 0; in l2cap_le_connect_rsp()
5618 chan->dcid = dcid; in l2cap_le_connect_rsp()
5619 chan->omtu = mtu; in l2cap_le_connect_rsp()
5620 chan->remote_mps = mps; in l2cap_le_connect_rsp()
5621 chan->tx_credits = credits; in l2cap_le_connect_rsp()
5622 l2cap_chan_ready(chan); in l2cap_le_connect_rsp()
5631 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_le_connect_rsp()
5636 if (chan->sec_level < sec_level) in l2cap_le_connect_rsp()
5637 chan->sec_level = sec_level; in l2cap_le_connect_rsp()
5640 clear_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags); in l2cap_le_connect_rsp()
5642 smp_conn_security(hcon, chan->sec_level); in l2cap_le_connect_rsp()
5646 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_le_connect_rsp()
5650 l2cap_chan_unlock(chan); in l2cap_le_connect_rsp()
5744 struct l2cap_chan *chan, *pchan; in l2cap_le_connect_req() local
5770 chan = NULL; in l2cap_le_connect_req()
5780 chan = NULL; in l2cap_le_connect_req()
5787 chan = NULL; in l2cap_le_connect_req()
5794 chan = NULL; in l2cap_le_connect_req()
5798 chan = pchan->ops->new_connection(pchan); in l2cap_le_connect_req()
5799 if (!chan) { in l2cap_le_connect_req()
5804 bacpy(&chan->src, &conn->hcon->src); in l2cap_le_connect_req()
5805 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_le_connect_req()
5806 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_le_connect_req()
5807 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_le_connect_req()
5808 chan->psm = psm; in l2cap_le_connect_req()
5809 chan->dcid = scid; in l2cap_le_connect_req()
5810 chan->omtu = mtu; in l2cap_le_connect_req()
5811 chan->remote_mps = mps; in l2cap_le_connect_req()
5813 __l2cap_chan_add(conn, chan); in l2cap_le_connect_req()
5815 l2cap_le_flowctl_init(chan, __le16_to_cpu(req->credits)); in l2cap_le_connect_req()
5817 dcid = chan->scid; in l2cap_le_connect_req()
5818 credits = chan->rx_credits; in l2cap_le_connect_req()
5820 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_le_connect_req()
5822 chan->ident = cmd->ident; in l2cap_le_connect_req()
5824 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_le_connect_req()
5825 l2cap_state_change(chan, BT_CONNECT2); in l2cap_le_connect_req()
5832 chan->ops->defer(chan); in l2cap_le_connect_req()
5834 l2cap_chan_ready(chan); in l2cap_le_connect_req()
5847 if (chan) { in l2cap_le_connect_req()
5848 rsp.mtu = cpu_to_le16(chan->imtu); in l2cap_le_connect_req()
5849 rsp.mps = cpu_to_le16(chan->mps); in l2cap_le_connect_req()
5869 struct l2cap_chan *chan; in l2cap_le_credits() local
5881 chan = l2cap_get_chan_by_dcid(conn, cid); in l2cap_le_credits()
5882 if (!chan) in l2cap_le_credits()
5885 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits; in l2cap_le_credits()
5888 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_le_credits()
5889 l2cap_chan_unlock(chan); in l2cap_le_credits()
5897 chan->tx_credits += credits; in l2cap_le_credits()
5900 l2cap_le_flowctl_send(chan); in l2cap_le_credits()
5902 if (chan->tx_credits) in l2cap_le_credits()
5903 chan->ops->resume(chan); in l2cap_le_credits()
5905 l2cap_chan_unlock(chan); in l2cap_le_credits()
5919 struct l2cap_chan *chan, *pchan; in l2cap_ecred_conn_req() local
5989 chan = pchan->ops->new_connection(pchan); in l2cap_ecred_conn_req()
5990 if (!chan) { in l2cap_ecred_conn_req()
5995 bacpy(&chan->src, &conn->hcon->src); in l2cap_ecred_conn_req()
5996 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_ecred_conn_req()
5997 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_ecred_conn_req()
5998 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_ecred_conn_req()
5999 chan->psm = psm; in l2cap_ecred_conn_req()
6000 chan->dcid = scid; in l2cap_ecred_conn_req()
6001 chan->omtu = mtu; in l2cap_ecred_conn_req()
6002 chan->remote_mps = mps; in l2cap_ecred_conn_req()
6004 __l2cap_chan_add(conn, chan); in l2cap_ecred_conn_req()
6006 l2cap_ecred_init(chan, __le16_to_cpu(req->credits)); in l2cap_ecred_conn_req()
6010 pdu.rsp.mtu = cpu_to_le16(chan->imtu); in l2cap_ecred_conn_req()
6011 pdu.rsp.mps = cpu_to_le16(chan->mps); in l2cap_ecred_conn_req()
6012 pdu.rsp.credits = cpu_to_le16(chan->rx_credits); in l2cap_ecred_conn_req()
6015 pdu.dcid[i] = cpu_to_le16(chan->scid); in l2cap_ecred_conn_req()
6017 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_ecred_conn_req()
6019 chan->ident = cmd->ident; in l2cap_ecred_conn_req()
6021 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_ecred_conn_req()
6022 l2cap_state_change(chan, BT_CONNECT2); in l2cap_ecred_conn_req()
6024 chan->ops->defer(chan); in l2cap_ecred_conn_req()
6026 l2cap_chan_ready(chan); in l2cap_ecred_conn_req()
6054 struct l2cap_chan *chan; in l2cap_ecred_conn_rsp() local
6073 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_ecred_conn_rsp()
6076 if (chan->ident != cmd->ident || in l2cap_ecred_conn_rsp()
6077 chan->mode != L2CAP_MODE_EXT_FLOWCTL || in l2cap_ecred_conn_rsp()
6078 chan->state == BT_CONNECTED) in l2cap_ecred_conn_rsp()
6081 l2cap_chan_lock(chan); in l2cap_ecred_conn_rsp()
6085 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6086 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
6103 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6104 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
6105 chan = __l2cap_get_chan_by_dcid(conn, dcid); in l2cap_ecred_conn_rsp()
6106 l2cap_chan_lock(chan); in l2cap_ecred_conn_rsp()
6107 l2cap_chan_del(chan, ECONNRESET); in l2cap_ecred_conn_rsp()
6108 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
6119 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6124 if (chan->sec_level < sec_level) in l2cap_ecred_conn_rsp()
6125 chan->sec_level = sec_level; in l2cap_ecred_conn_rsp()
6128 clear_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags); in l2cap_ecred_conn_rsp()
6130 smp_conn_security(hcon, chan->sec_level); in l2cap_ecred_conn_rsp()
6134 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6140 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6144 chan->ident = 0; in l2cap_ecred_conn_rsp()
6145 chan->dcid = dcid; in l2cap_ecred_conn_rsp()
6146 chan->omtu = mtu; in l2cap_ecred_conn_rsp()
6147 chan->remote_mps = mps; in l2cap_ecred_conn_rsp()
6148 chan->tx_credits = credits; in l2cap_ecred_conn_rsp()
6149 l2cap_chan_ready(chan); in l2cap_ecred_conn_rsp()
6153 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
6168 struct l2cap_chan *chan; in l2cap_ecred_reconf_req() local
6205 chan = __l2cap_get_chan_by_dcid(conn, scid); in l2cap_ecred_reconf_req()
6206 if (!chan) in l2cap_ecred_reconf_req()
6213 if (chan->omtu > mtu) { in l2cap_ecred_reconf_req()
6214 BT_ERR("chan %p decreased MTU %u -> %u", chan, in l2cap_ecred_reconf_req()
6215 chan->omtu, mtu); in l2cap_ecred_reconf_req()
6219 chan->omtu = mtu; in l2cap_ecred_reconf_req()
6220 chan->remote_mps = mps; in l2cap_ecred_reconf_req()
6236 struct l2cap_chan *chan; in l2cap_ecred_reconf_rsp() local
6250 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_ecred_reconf_rsp()
6251 if (chan->ident != cmd->ident) in l2cap_ecred_reconf_rsp()
6254 l2cap_chan_del(chan, ECONNRESET); in l2cap_ecred_reconf_rsp()
6265 struct l2cap_chan *chan; in l2cap_le_command_rej() local
6272 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_le_command_rej()
6273 if (!chan) in l2cap_le_command_rej()
6276 l2cap_chan_lock(chan); in l2cap_le_command_rej()
6277 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_le_command_rej()
6278 l2cap_chan_unlock(chan); in l2cap_le_command_rej()
6435 static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_check_fcs() argument
6440 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_check_fcs()
6445 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_check_fcs()
6456 static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan) in l2cap_send_i_or_rr_or_rnr() argument
6460 BT_DBG("chan %p", chan); in l2cap_send_i_or_rr_or_rnr()
6465 control.reqseq = chan->buffer_seq; in l2cap_send_i_or_rr_or_rnr()
6466 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_send_i_or_rr_or_rnr()
6468 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_send_i_or_rr_or_rnr()
6470 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
6473 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) && in l2cap_send_i_or_rr_or_rnr()
6474 chan->unacked_frames > 0) in l2cap_send_i_or_rr_or_rnr()
6475 __set_retrans_timer(chan); in l2cap_send_i_or_rr_or_rnr()
6478 l2cap_ertm_send(chan); in l2cap_send_i_or_rr_or_rnr()
6480 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) && in l2cap_send_i_or_rr_or_rnr()
6481 test_bit(CONN_SEND_FBIT, &chan->conn_state)) { in l2cap_send_i_or_rr_or_rnr()
6486 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
6509 static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb, in l2cap_reassemble_sdu() argument
6516 if (chan->sdu) in l2cap_reassemble_sdu()
6519 err = chan->ops->recv(chan, skb); in l2cap_reassemble_sdu()
6523 if (chan->sdu) in l2cap_reassemble_sdu()
6529 chan->sdu_len = get_unaligned_le16(skb->data); in l2cap_reassemble_sdu()
6532 if (chan->sdu_len > chan->imtu) { in l2cap_reassemble_sdu()
6537 if (skb->len >= chan->sdu_len) in l2cap_reassemble_sdu()
6540 chan->sdu = skb; in l2cap_reassemble_sdu()
6541 chan->sdu_last_frag = skb; in l2cap_reassemble_sdu()
6548 if (!chan->sdu) in l2cap_reassemble_sdu()
6551 append_skb_frag(chan->sdu, skb, in l2cap_reassemble_sdu()
6552 &chan->sdu_last_frag); in l2cap_reassemble_sdu()
6555 if (chan->sdu->len >= chan->sdu_len) in l2cap_reassemble_sdu()
6562 if (!chan->sdu) in l2cap_reassemble_sdu()
6565 append_skb_frag(chan->sdu, skb, in l2cap_reassemble_sdu()
6566 &chan->sdu_last_frag); in l2cap_reassemble_sdu()
6569 if (chan->sdu->len != chan->sdu_len) in l2cap_reassemble_sdu()
6572 err = chan->ops->recv(chan, chan->sdu); in l2cap_reassemble_sdu()
6576 chan->sdu = NULL; in l2cap_reassemble_sdu()
6577 chan->sdu_last_frag = NULL; in l2cap_reassemble_sdu()
6578 chan->sdu_len = 0; in l2cap_reassemble_sdu()
6585 kfree_skb(chan->sdu); in l2cap_reassemble_sdu()
6586 chan->sdu = NULL; in l2cap_reassemble_sdu()
6587 chan->sdu_last_frag = NULL; in l2cap_reassemble_sdu()
6588 chan->sdu_len = 0; in l2cap_reassemble_sdu()
6594 static int l2cap_resegment(struct l2cap_chan *chan) in l2cap_resegment() argument
6600 void l2cap_chan_busy(struct l2cap_chan *chan, int busy) in l2cap_chan_busy() argument
6604 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_chan_busy()
6608 l2cap_tx(chan, NULL, NULL, event); in l2cap_chan_busy()
6611 static int l2cap_rx_queued_iframes(struct l2cap_chan *chan) in l2cap_rx_queued_iframes() argument
6618 BT_DBG("chan %p", chan); in l2cap_rx_queued_iframes()
6620 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_rx_queued_iframes()
6623 chan->buffer_seq, skb_queue_len(&chan->srej_q)); in l2cap_rx_queued_iframes()
6625 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq); in l2cap_rx_queued_iframes()
6630 skb_unlink(skb, &chan->srej_q); in l2cap_rx_queued_iframes()
6631 chan->buffer_seq = __next_seq(chan, chan->buffer_seq); in l2cap_rx_queued_iframes()
6632 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->l2cap); in l2cap_rx_queued_iframes()
6637 if (skb_queue_empty(&chan->srej_q)) { in l2cap_rx_queued_iframes()
6638 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_rx_queued_iframes()
6639 l2cap_send_ack(chan); in l2cap_rx_queued_iframes()
6645 static void l2cap_handle_srej(struct l2cap_chan *chan, in l2cap_handle_srej() argument
6650 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_srej()
6652 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_srej()
6654 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_srej()
6658 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_srej()
6666 if (chan->max_tx != 0 && bt_cb(skb)->l2cap.retries >= chan->max_tx) { in l2cap_handle_srej()
6667 BT_DBG("Retry limit exceeded (%d)", chan->max_tx); in l2cap_handle_srej()
6668 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_srej()
6672 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_handle_srej()
6675 l2cap_pass_to_tx(chan, control); in l2cap_handle_srej()
6677 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_handle_srej()
6678 l2cap_retransmit(chan, control); in l2cap_handle_srej()
6679 l2cap_ertm_send(chan); in l2cap_handle_srej()
6681 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) { in l2cap_handle_srej()
6682 set_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_handle_srej()
6683 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
6686 l2cap_pass_to_tx_fbit(chan, control); in l2cap_handle_srej()
6689 if (chan->srej_save_reqseq != control->reqseq || in l2cap_handle_srej()
6691 &chan->conn_state)) in l2cap_handle_srej()
6692 l2cap_retransmit(chan, control); in l2cap_handle_srej()
6694 l2cap_retransmit(chan, control); in l2cap_handle_srej()
6695 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) { in l2cap_handle_srej()
6696 set_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_handle_srej()
6697 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
6703 static void l2cap_handle_rej(struct l2cap_chan *chan, in l2cap_handle_rej() argument
6708 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_rej()
6710 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_rej()
6712 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_rej()
6716 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_rej()
6718 if (chan->max_tx && skb && in l2cap_handle_rej()
6719 bt_cb(skb)->l2cap.retries >= chan->max_tx) { in l2cap_handle_rej()
6720 BT_DBG("Retry limit exceeded (%d)", chan->max_tx); in l2cap_handle_rej()
6721 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_rej()
6725 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_handle_rej()
6727 l2cap_pass_to_tx(chan, control); in l2cap_handle_rej()
6730 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state)) in l2cap_handle_rej()
6731 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
6733 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
6734 l2cap_ertm_send(chan); in l2cap_handle_rej()
6735 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) in l2cap_handle_rej()
6736 set_bit(CONN_REJ_ACT, &chan->conn_state); in l2cap_handle_rej()
6740 static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq) in l2cap_classify_txseq() argument
6742 BT_DBG("chan %p, txseq %d", chan, txseq); in l2cap_classify_txseq()
6744 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq, in l2cap_classify_txseq()
6745 chan->expected_tx_seq); in l2cap_classify_txseq()
6747 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) { in l2cap_classify_txseq()
6748 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= in l2cap_classify_txseq()
6749 chan->tx_win) { in l2cap_classify_txseq()
6753 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) { in l2cap_classify_txseq()
6762 if (chan->srej_list.head == txseq) { in l2cap_classify_txseq()
6767 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) { in l2cap_classify_txseq()
6772 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) { in l2cap_classify_txseq()
6778 if (chan->expected_tx_seq == txseq) { in l2cap_classify_txseq()
6779 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= in l2cap_classify_txseq()
6780 chan->tx_win) { in l2cap_classify_txseq()
6789 if (__seq_offset(chan, txseq, chan->last_acked_seq) < in l2cap_classify_txseq()
6790 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) { in l2cap_classify_txseq()
6795 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) { in l2cap_classify_txseq()
6813 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) { in l2cap_classify_txseq()
6826 static int l2cap_rx_state_recv(struct l2cap_chan *chan, in l2cap_rx_state_recv() argument
6833 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_recv()
6838 switch (l2cap_classify_txseq(chan, control->txseq)) { in l2cap_rx_state_recv()
6840 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6842 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_rx_state_recv()
6848 chan->expected_tx_seq = __next_seq(chan, in l2cap_rx_state_recv()
6851 chan->buffer_seq = chan->expected_tx_seq; in l2cap_rx_state_recv()
6854 err = l2cap_reassemble_sdu(chan, skb, control); in l2cap_rx_state_recv()
6860 &chan->conn_state)) { in l2cap_rx_state_recv()
6862 l2cap_retransmit_all(chan, control); in l2cap_rx_state_recv()
6863 l2cap_ertm_send(chan); in l2cap_rx_state_recv()
6867 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) in l2cap_rx_state_recv()
6868 l2cap_send_ack(chan); in l2cap_rx_state_recv()
6871 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6877 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_rx_state_recv()
6887 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_recv()
6890 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_recv()
6892 clear_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_rx_state_recv()
6893 l2cap_seq_list_clear(&chan->srej_list); in l2cap_rx_state_recv()
6894 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_recv()
6896 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT; in l2cap_rx_state_recv()
6899 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6905 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_rx_state_recv()
6910 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6912 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_recv()
6914 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) && in l2cap_rx_state_recv()
6915 !__chan_is_moving(chan)) { in l2cap_rx_state_recv()
6917 l2cap_retransmit_all(chan, control); in l2cap_rx_state_recv()
6920 l2cap_ertm_send(chan); in l2cap_rx_state_recv()
6922 l2cap_send_i_or_rr_or_rnr(chan); in l2cap_rx_state_recv()
6925 &chan->conn_state) && in l2cap_rx_state_recv()
6926 chan->unacked_frames) in l2cap_rx_state_recv()
6927 __set_retrans_timer(chan); in l2cap_rx_state_recv()
6929 l2cap_ertm_send(chan); in l2cap_rx_state_recv()
6933 set_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_recv()
6934 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6936 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_rx_state_recv()
6937 l2cap_send_rr_or_rnr(chan, 0); in l2cap_rx_state_recv()
6939 __clear_retrans_timer(chan); in l2cap_rx_state_recv()
6940 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_rx_state_recv()
6943 l2cap_handle_rej(chan, control); in l2cap_rx_state_recv()
6946 l2cap_handle_srej(chan, control); in l2cap_rx_state_recv()
6960 static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan, in l2cap_rx_state_srej_sent() argument
6968 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_srej_sent()
6973 switch (l2cap_classify_txseq(chan, txseq)) { in l2cap_rx_state_srej_sent()
6976 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6977 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
6980 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
6982 chan->expected_tx_seq = __next_seq(chan, txseq); in l2cap_rx_state_srej_sent()
6985 l2cap_seq_list_pop(&chan->srej_list); in l2cap_rx_state_srej_sent()
6987 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6988 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
6991 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
6993 err = l2cap_rx_queued_iframes(chan); 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 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7009 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_srej_sent()
7017 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
7020 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
7022 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7023 l2cap_send_srej_list(chan, control->txseq); in l2cap_rx_state_srej_sent()
7027 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7038 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_rx_state_srej_sent()
7043 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7045 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_srej_sent()
7048 &chan->conn_state)) { in l2cap_rx_state_srej_sent()
7050 l2cap_retransmit_all(chan, control); in l2cap_rx_state_srej_sent()
7053 l2cap_ertm_send(chan); in l2cap_rx_state_srej_sent()
7056 &chan->conn_state) && in l2cap_rx_state_srej_sent()
7057 chan->unacked_frames) { in l2cap_rx_state_srej_sent()
7058 __set_retrans_timer(chan); in l2cap_rx_state_srej_sent()
7061 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_rx_state_srej_sent()
7062 l2cap_send_srej_tail(chan); in l2cap_rx_state_srej_sent()
7065 &chan->conn_state) && in l2cap_rx_state_srej_sent()
7066 chan->unacked_frames) in l2cap_rx_state_srej_sent()
7067 __set_retrans_timer(chan); in l2cap_rx_state_srej_sent()
7069 l2cap_send_ack(chan); in l2cap_rx_state_srej_sent()
7073 set_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_srej_sent()
7074 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7076 l2cap_send_srej_tail(chan); in l2cap_rx_state_srej_sent()
7082 rr_control.reqseq = chan->buffer_seq; in l2cap_rx_state_srej_sent()
7083 l2cap_send_sframe(chan, &rr_control); in l2cap_rx_state_srej_sent()
7088 l2cap_handle_rej(chan, control); in l2cap_rx_state_srej_sent()
7091 l2cap_handle_srej(chan, control); in l2cap_rx_state_srej_sent()
7103 static int l2cap_finish_move(struct l2cap_chan *chan) in l2cap_finish_move() argument
7105 BT_DBG("chan %p", chan); in l2cap_finish_move()
7107 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_finish_move()
7109 if (chan->hs_hcon) in l2cap_finish_move()
7110 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu; in l2cap_finish_move()
7112 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu; in l2cap_finish_move()
7114 return l2cap_resegment(chan); in l2cap_finish_move()
7117 static int l2cap_rx_state_wait_p(struct l2cap_chan *chan, in l2cap_rx_state_wait_p() argument
7123 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_wait_p()
7129 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_p()
7131 if (!skb_queue_empty(&chan->tx_q)) in l2cap_rx_state_wait_p()
7132 chan->tx_send_head = skb_peek(&chan->tx_q); in l2cap_rx_state_wait_p()
7134 chan->tx_send_head = NULL; in l2cap_rx_state_wait_p()
7139 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_p()
7140 chan->unacked_frames = 0; in l2cap_rx_state_wait_p()
7142 err = l2cap_finish_move(chan); in l2cap_rx_state_wait_p()
7146 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_rx_state_wait_p()
7147 l2cap_send_i_or_rr_or_rnr(chan); in l2cap_rx_state_wait_p()
7152 return l2cap_rx_state_recv(chan, control, NULL, event); in l2cap_rx_state_wait_p()
7155 static int l2cap_rx_state_wait_f(struct l2cap_chan *chan, in l2cap_rx_state_wait_f() argument
7164 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_wait_f()
7166 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_rx_state_wait_f()
7167 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_f()
7169 if (!skb_queue_empty(&chan->tx_q)) in l2cap_rx_state_wait_f()
7170 chan->tx_send_head = skb_peek(&chan->tx_q); in l2cap_rx_state_wait_f()
7172 chan->tx_send_head = NULL; in l2cap_rx_state_wait_f()
7177 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_f()
7178 chan->unacked_frames = 0; in l2cap_rx_state_wait_f()
7180 if (chan->hs_hcon) in l2cap_rx_state_wait_f()
7181 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu; in l2cap_rx_state_wait_f()
7183 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu; in l2cap_rx_state_wait_f()
7185 err = l2cap_resegment(chan); in l2cap_rx_state_wait_f()
7188 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx_state_wait_f()
7193 static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq) in __valid_reqseq() argument
7198 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq); in __valid_reqseq()
7199 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked; in __valid_reqseq()
7202 static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_rx() argument
7207 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan, in l2cap_rx()
7208 control, skb, event, chan->rx_state); in l2cap_rx()
7210 if (__valid_reqseq(chan, control->reqseq)) { in l2cap_rx()
7211 switch (chan->rx_state) { in l2cap_rx()
7213 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx()
7216 err = l2cap_rx_state_srej_sent(chan, control, skb, in l2cap_rx()
7220 err = l2cap_rx_state_wait_p(chan, control, skb, event); in l2cap_rx()
7223 err = l2cap_rx_state_wait_f(chan, control, skb, event); in l2cap_rx()
7231 control->reqseq, chan->next_tx_seq, in l2cap_rx()
7232 chan->expected_ack_seq); in l2cap_rx()
7233 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_rx()
7239 static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_stream_rx() argument
7242 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb, in l2cap_stream_rx()
7243 chan->rx_state); in l2cap_stream_rx()
7245 if (l2cap_classify_txseq(chan, control->txseq) == in l2cap_stream_rx()
7247 l2cap_pass_to_tx(chan, control); in l2cap_stream_rx()
7249 BT_DBG("buffer_seq %d->%d", chan->buffer_seq, in l2cap_stream_rx()
7250 __next_seq(chan, chan->buffer_seq)); in l2cap_stream_rx()
7252 chan->buffer_seq = __next_seq(chan, chan->buffer_seq); in l2cap_stream_rx()
7254 l2cap_reassemble_sdu(chan, skb, control); in l2cap_stream_rx()
7256 if (chan->sdu) { in l2cap_stream_rx()
7257 kfree_skb(chan->sdu); in l2cap_stream_rx()
7258 chan->sdu = NULL; in l2cap_stream_rx()
7260 chan->sdu_last_frag = NULL; in l2cap_stream_rx()
7261 chan->sdu_len = 0; in l2cap_stream_rx()
7269 chan->last_acked_seq = control->txseq; in l2cap_stream_rx()
7270 chan->expected_tx_seq = __next_seq(chan, control->txseq); in l2cap_stream_rx()
7275 static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_data_rcv() argument
7281 __unpack_control(chan, skb); in l2cap_data_rcv()
7290 if (l2cap_check_fcs(chan, skb)) in l2cap_data_rcv()
7296 if (chan->fcs == L2CAP_FCS_CRC16) in l2cap_data_rcv()
7299 if (len > chan->mps) { in l2cap_data_rcv()
7300 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
7304 if (chan->ops->filter) { in l2cap_data_rcv()
7305 if (chan->ops->filter(chan, skb)) in l2cap_data_rcv()
7319 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F) in l2cap_data_rcv()
7322 if (chan->mode != L2CAP_MODE_STREAMING) { in l2cap_data_rcv()
7324 err = l2cap_rx(chan, control, skb, event); in l2cap_data_rcv()
7326 err = l2cap_stream_rx(chan, control, skb); in l2cap_data_rcv()
7330 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
7338 if (chan->mode == L2CAP_MODE_STREAMING) in l2cap_data_rcv()
7347 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
7353 chan->tx_state != L2CAP_TX_STATE_WAIT_F)) in l2cap_data_rcv()
7357 if (l2cap_rx(chan, control, skb, event)) in l2cap_data_rcv()
7358 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
7368 static void l2cap_chan_le_send_credits(struct l2cap_chan *chan) in l2cap_chan_le_send_credits() argument
7370 struct l2cap_conn *conn = chan->conn; in l2cap_chan_le_send_credits()
7374 return_credits = (chan->imtu / chan->mps) + 1; in l2cap_chan_le_send_credits()
7376 if (chan->rx_credits >= return_credits) in l2cap_chan_le_send_credits()
7379 return_credits -= chan->rx_credits; in l2cap_chan_le_send_credits()
7381 BT_DBG("chan %p returning %u credits to sender", chan, return_credits); in l2cap_chan_le_send_credits()
7383 chan->rx_credits += return_credits; in l2cap_chan_le_send_credits()
7385 pkt.cid = cpu_to_le16(chan->scid); in l2cap_chan_le_send_credits()
7388 chan->ident = l2cap_get_ident(conn); in l2cap_chan_le_send_credits()
7390 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt); in l2cap_chan_le_send_credits()
7393 static int l2cap_ecred_recv(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_ecred_recv() argument
7397 BT_DBG("SDU reassemble complete: chan %p skb->len %u", chan, skb->len); in l2cap_ecred_recv()
7400 err = chan->ops->recv(chan, skb); in l2cap_ecred_recv()
7403 l2cap_chan_le_send_credits(chan); in l2cap_ecred_recv()
7408 static int l2cap_ecred_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_ecred_data_rcv() argument
7412 if (!chan->rx_credits) { in l2cap_ecred_data_rcv()
7414 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_ecred_data_rcv()
7418 if (chan->imtu < skb->len) { in l2cap_ecred_data_rcv()
7423 chan->rx_credits--; in l2cap_ecred_data_rcv()
7424 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits); in l2cap_ecred_data_rcv()
7429 if (!chan->rx_credits) in l2cap_ecred_data_rcv()
7430 l2cap_chan_le_send_credits(chan); in l2cap_ecred_data_rcv()
7434 if (!chan->sdu) { in l2cap_ecred_data_rcv()
7441 sdu_len, skb->len, chan->imtu); in l2cap_ecred_data_rcv()
7443 if (sdu_len > chan->imtu) { in l2cap_ecred_data_rcv()
7456 return l2cap_ecred_recv(chan, skb); in l2cap_ecred_data_rcv()
7458 chan->sdu = skb; in l2cap_ecred_data_rcv()
7459 chan->sdu_len = sdu_len; in l2cap_ecred_data_rcv()
7460 chan->sdu_last_frag = skb; in l2cap_ecred_data_rcv()
7463 if (skb->len + L2CAP_SDULEN_SIZE < chan->mps) { in l2cap_ecred_data_rcv()
7467 BT_DBG("chan->mps %u -> %u", chan->mps, mps_len); in l2cap_ecred_data_rcv()
7468 chan->mps = mps_len; in l2cap_ecred_data_rcv()
7469 l2cap_chan_le_send_credits(chan); in l2cap_ecred_data_rcv()
7476 chan->sdu->len, skb->len, chan->sdu_len); in l2cap_ecred_data_rcv()
7478 if (chan->sdu->len + skb->len > chan->sdu_len) { in l2cap_ecred_data_rcv()
7484 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag); in l2cap_ecred_data_rcv()
7487 if (chan->sdu->len == chan->sdu_len) { in l2cap_ecred_data_rcv()
7488 err = l2cap_ecred_recv(chan, chan->sdu); in l2cap_ecred_data_rcv()
7490 chan->sdu = NULL; in l2cap_ecred_data_rcv()
7491 chan->sdu_last_frag = NULL; in l2cap_ecred_data_rcv()
7492 chan->sdu_len = 0; in l2cap_ecred_data_rcv()
7499 kfree_skb(chan->sdu); in l2cap_ecred_data_rcv()
7500 chan->sdu = NULL; in l2cap_ecred_data_rcv()
7501 chan->sdu_last_frag = NULL; in l2cap_ecred_data_rcv()
7502 chan->sdu_len = 0; in l2cap_ecred_data_rcv()
7515 struct l2cap_chan *chan; in l2cap_data_channel() local
7517 chan = l2cap_get_chan_by_scid(conn, cid); in l2cap_data_channel()
7518 if (!chan) { in l2cap_data_channel()
7520 chan = a2mp_channel_create(conn, skb); in l2cap_data_channel()
7521 if (!chan) { in l2cap_data_channel()
7526 l2cap_chan_lock(chan); in l2cap_data_channel()
7535 BT_DBG("chan %p, len %d", chan, skb->len); in l2cap_data_channel()
7541 if (chan->chan_type == L2CAP_CHAN_FIXED) in l2cap_data_channel()
7542 l2cap_chan_ready(chan); in l2cap_data_channel()
7544 if (chan->state != BT_CONNECTED) in l2cap_data_channel()
7547 switch (chan->mode) { in l2cap_data_channel()
7550 if (l2cap_ecred_data_rcv(chan, skb) < 0) in l2cap_data_channel()
7561 if (chan->imtu < skb->len) { in l2cap_data_channel()
7566 if (!chan->ops->recv(chan, skb)) in l2cap_data_channel()
7572 l2cap_data_rcv(chan, skb); in l2cap_data_channel()
7576 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode); in l2cap_data_channel()
7584 l2cap_chan_unlock(chan); in l2cap_data_channel()
7591 struct l2cap_chan *chan; in l2cap_conless_channel() local
7596 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst, in l2cap_conless_channel()
7598 if (!chan) in l2cap_conless_channel()
7601 BT_DBG("chan %p, len %d", chan, skb->len); in l2cap_conless_channel()
7603 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED) in l2cap_conless_channel()
7606 if (chan->imtu < skb->len) in l2cap_conless_channel()
7613 if (!chan->ops->recv(chan, skb)) { in l2cap_conless_channel()
7614 l2cap_chan_put(chan); in l2cap_conless_channel()
7619 l2cap_chan_put(chan); in l2cap_conless_channel()
7770 struct l2cap_chan *chan; member
7775 static void l2cap_chan_by_pid(struct l2cap_chan *chan, void *data) in l2cap_chan_by_pid() argument
7780 if (chan == d->chan) in l2cap_chan_by_pid()
7783 if (!test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_by_pid()
7786 pid = chan->ops->get_peer_pid(chan); in l2cap_chan_by_pid()
7789 if (d->pid != pid || chan->psm != d->chan->psm || chan->ident || in l2cap_chan_by_pid()
7790 chan->mode != L2CAP_MODE_EXT_FLOWCTL || chan->state != BT_CONNECT) in l2cap_chan_by_pid()
7796 int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, in l2cap_chan_connect() argument
7804 BT_DBG("%pMR -> %pMR (type %u) psm 0x%4.4x mode 0x%2.2x", &chan->src, in l2cap_chan_connect()
7805 dst, dst_type, __le16_to_cpu(psm), chan->mode); in l2cap_chan_connect()
7807 hdev = hci_get_route(dst, &chan->src, chan->src_type); in l2cap_chan_connect()
7814 chan->chan_type != L2CAP_CHAN_RAW) { in l2cap_chan_connect()
7819 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) { in l2cap_chan_connect()
7824 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) { in l2cap_chan_connect()
7829 switch (chan->mode) { in l2cap_chan_connect()
7850 switch (chan->state) { in l2cap_chan_connect()
7874 bacpy(&chan->dst, dst); in l2cap_chan_connect()
7875 chan->dst_type = dst_type; in l2cap_chan_connect()
7877 chan->psm = psm; in l2cap_chan_connect()
7878 chan->dcid = cid; in l2cap_chan_connect()
7890 chan->sec_level, in l2cap_chan_connect()
7895 chan->sec_level, in l2cap_chan_connect()
7900 u8 auth_type = l2cap_get_auth_type(chan); in l2cap_chan_connect()
7901 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type, in l2cap_chan_connect()
7917 if (chan->mode == L2CAP_MODE_EXT_FLOWCTL) { in l2cap_chan_connect()
7920 data.chan = chan; in l2cap_chan_connect()
7921 data.pid = chan->ops->get_peer_pid(chan); in l2cap_chan_connect()
7935 l2cap_chan_lock(chan); in l2cap_chan_connect()
7944 bacpy(&chan->src, &hcon->src); in l2cap_chan_connect()
7945 chan->src_type = bdaddr_src_type(hcon); in l2cap_chan_connect()
7947 __l2cap_chan_add(conn, chan); in l2cap_chan_connect()
7952 l2cap_state_change(chan, BT_CONNECT); in l2cap_chan_connect()
7953 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_chan_connect()
7959 chan->sport = 0; in l2cap_chan_connect()
7963 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_chan_connect()
7964 __clear_chan_timer(chan); in l2cap_chan_connect()
7965 if (l2cap_chan_check_security(chan, true)) in l2cap_chan_connect()
7966 l2cap_state_change(chan, BT_CONNECTED); in l2cap_chan_connect()
7968 l2cap_do_start(chan); in l2cap_chan_connect()
7974 l2cap_chan_unlock(chan); in l2cap_chan_connect()
7983 static void l2cap_ecred_reconfigure(struct l2cap_chan *chan) in l2cap_ecred_reconfigure() argument
7985 struct l2cap_conn *conn = chan->conn; in l2cap_ecred_reconfigure()
7991 pdu.req.mtu = cpu_to_le16(chan->imtu); in l2cap_ecred_reconfigure()
7992 pdu.req.mps = cpu_to_le16(chan->mps); in l2cap_ecred_reconfigure()
7993 pdu.scid = cpu_to_le16(chan->scid); in l2cap_ecred_reconfigure()
7995 chan->ident = l2cap_get_ident(conn); in l2cap_ecred_reconfigure()
7997 l2cap_send_cmd(conn, chan->ident, L2CAP_ECRED_RECONF_REQ, in l2cap_ecred_reconfigure()
8001 int l2cap_chan_reconfigure(struct l2cap_chan *chan, __u16 mtu) in l2cap_chan_reconfigure() argument
8003 if (chan->imtu > mtu) in l2cap_chan_reconfigure()
8006 BT_DBG("chan %p mtu 0x%4.4x", chan, mtu); in l2cap_chan_reconfigure()
8008 chan->imtu = mtu; in l2cap_chan_reconfigure()
8010 l2cap_ecred_reconfigure(chan); in l2cap_chan_reconfigure()
8116 struct l2cap_chan *chan, *next; in l2cap_connect_cfm() local
8123 chan = pchan->ops->new_connection(pchan); in l2cap_connect_cfm()
8124 if (chan) { in l2cap_connect_cfm()
8125 bacpy(&chan->src, &hcon->src); in l2cap_connect_cfm()
8126 bacpy(&chan->dst, &hcon->dst); in l2cap_connect_cfm()
8127 chan->src_type = bdaddr_src_type(hcon); in l2cap_connect_cfm()
8128 chan->dst_type = dst_type; in l2cap_connect_cfm()
8130 __l2cap_chan_add(conn, chan); in l2cap_connect_cfm()
8164 static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt) in l2cap_check_encryption() argument
8166 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) in l2cap_check_encryption()
8170 if (chan->sec_level == BT_SECURITY_MEDIUM) { in l2cap_check_encryption()
8171 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT); in l2cap_check_encryption()
8172 } else if (chan->sec_level == BT_SECURITY_HIGH || in l2cap_check_encryption()
8173 chan->sec_level == BT_SECURITY_FIPS) in l2cap_check_encryption()
8174 l2cap_chan_close(chan, ECONNREFUSED); in l2cap_check_encryption()
8176 if (chan->sec_level == BT_SECURITY_MEDIUM) in l2cap_check_encryption()
8177 __clear_chan_timer(chan); in l2cap_check_encryption()
8184 struct l2cap_chan *chan; in l2cap_security_cfm() local
8193 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_security_cfm()
8194 l2cap_chan_lock(chan); in l2cap_security_cfm()
8196 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid, in l2cap_security_cfm()
8197 state_to_string(chan->state)); in l2cap_security_cfm()
8199 if (chan->scid == L2CAP_CID_A2MP) { in l2cap_security_cfm()
8200 l2cap_chan_unlock(chan); in l2cap_security_cfm()
8205 chan->sec_level = hcon->sec_level; in l2cap_security_cfm()
8207 if (!__l2cap_no_conn_pending(chan)) { in l2cap_security_cfm()
8208 l2cap_chan_unlock(chan); in l2cap_security_cfm()
8212 if (!status && (chan->state == BT_CONNECTED || in l2cap_security_cfm()
8213 chan->state == BT_CONFIG)) { in l2cap_security_cfm()
8214 chan->ops->resume(chan); in l2cap_security_cfm()
8215 l2cap_check_encryption(chan, encrypt); in l2cap_security_cfm()
8216 l2cap_chan_unlock(chan); in l2cap_security_cfm()
8220 if (chan->state == BT_CONNECT) { in l2cap_security_cfm()
8222 l2cap_start_connection(chan); in l2cap_security_cfm()
8224 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); in l2cap_security_cfm()
8225 } else if (chan->state == BT_CONNECT2 && in l2cap_security_cfm()
8226 !(chan->mode == L2CAP_MODE_EXT_FLOWCTL || in l2cap_security_cfm()
8227 chan->mode == L2CAP_MODE_LE_FLOWCTL)) { in l2cap_security_cfm()
8232 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_security_cfm()
8235 chan->ops->defer(chan); in l2cap_security_cfm()
8237 l2cap_state_change(chan, BT_CONFIG); in l2cap_security_cfm()
8242 l2cap_state_change(chan, BT_DISCONN); in l2cap_security_cfm()
8243 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); in l2cap_security_cfm()
8248 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_security_cfm()
8249 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_security_cfm()
8252 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, in l2cap_security_cfm()
8255 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) && in l2cap_security_cfm()
8258 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_security_cfm()
8261 l2cap_build_conf_req(chan, buf, sizeof(buf)), in l2cap_security_cfm()
8263 chan->num_conf_req++; in l2cap_security_cfm()
8267 l2cap_chan_unlock(chan); in l2cap_security_cfm()