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,
206 int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm) in l2cap_add_psm() argument
212 if (psm && __l2cap_global_chan_by_addr(psm, src, chan->src_type)) { in l2cap_add_psm()
218 chan->psm = psm; in l2cap_add_psm()
219 chan->sport = psm; in l2cap_add_psm()
224 if (chan->src_type == BDADDR_BREDR) { in l2cap_add_psm()
237 chan->src_type)) { in l2cap_add_psm()
238 chan->psm = cpu_to_le16(p); in l2cap_add_psm()
239 chan->sport = cpu_to_le16(p); in l2cap_add_psm()
251 int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid) in l2cap_add_scid() argument
256 chan->omtu = L2CAP_DEFAULT_MTU; in l2cap_add_scid()
257 chan->chan_type = L2CAP_CHAN_FIXED; in l2cap_add_scid()
259 chan->scid = scid; in l2cap_add_scid()
283 static void l2cap_state_change(struct l2cap_chan *chan, int state) in l2cap_state_change() argument
285 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state), in l2cap_state_change()
288 chan->state = state; in l2cap_state_change()
289 chan->ops->state_change(chan, state, 0); in l2cap_state_change()
292 static inline void l2cap_state_change_and_error(struct l2cap_chan *chan, in l2cap_state_change_and_error() argument
295 chan->state = state; in l2cap_state_change_and_error()
296 chan->ops->state_change(chan, chan->state, err); in l2cap_state_change_and_error()
299 static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err) in l2cap_chan_set_err() argument
301 chan->ops->state_change(chan, chan->state, err); in l2cap_chan_set_err()
304 static void __set_retrans_timer(struct l2cap_chan *chan) in __set_retrans_timer() argument
306 if (!delayed_work_pending(&chan->monitor_timer) && in __set_retrans_timer()
307 chan->retrans_timeout) { in __set_retrans_timer()
308 l2cap_set_timer(chan, &chan->retrans_timer, in __set_retrans_timer()
309 msecs_to_jiffies(chan->retrans_timeout)); in __set_retrans_timer()
313 static void __set_monitor_timer(struct l2cap_chan *chan) in __set_monitor_timer() argument
315 __clear_retrans_timer(chan); in __set_monitor_timer()
316 if (chan->monitor_timeout) { in __set_monitor_timer()
317 l2cap_set_timer(chan, &chan->monitor_timer, in __set_monitor_timer()
318 msecs_to_jiffies(chan->monitor_timeout)); in __set_monitor_timer()
431 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_chan_timeout() local
433 struct l2cap_conn *conn = chan->conn; in l2cap_chan_timeout()
436 BT_DBG("chan %p state %s", chan, state_to_string(chan->state)); in l2cap_chan_timeout()
442 l2cap_chan_lock(chan); in l2cap_chan_timeout()
444 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG) in l2cap_chan_timeout()
446 else if (chan->state == BT_CONNECT && in l2cap_chan_timeout()
447 chan->sec_level != BT_SECURITY_SDP) in l2cap_chan_timeout()
452 l2cap_chan_close(chan, reason); in l2cap_chan_timeout()
454 chan->ops->close(chan); in l2cap_chan_timeout()
456 l2cap_chan_unlock(chan); in l2cap_chan_timeout()
457 l2cap_chan_put(chan); in l2cap_chan_timeout()
464 struct l2cap_chan *chan; in l2cap_chan_create() local
466 chan = kzalloc(sizeof(*chan), GFP_ATOMIC); in l2cap_chan_create()
467 if (!chan) in l2cap_chan_create()
470 skb_queue_head_init(&chan->tx_q); in l2cap_chan_create()
471 skb_queue_head_init(&chan->srej_q); in l2cap_chan_create()
472 mutex_init(&chan->lock); in l2cap_chan_create()
475 atomic_set(&chan->nesting, L2CAP_NESTING_NORMAL); in l2cap_chan_create()
478 list_add(&chan->global_l, &chan_list); in l2cap_chan_create()
481 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout); in l2cap_chan_create()
482 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout); in l2cap_chan_create()
483 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout); in l2cap_chan_create()
484 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout); in l2cap_chan_create()
486 chan->state = BT_OPEN; in l2cap_chan_create()
488 kref_init(&chan->kref); in l2cap_chan_create()
491 set_bit(CONF_NOT_COMPLETE, &chan->conf_state); in l2cap_chan_create()
493 BT_DBG("chan %p", chan); in l2cap_chan_create()
495 return chan; in l2cap_chan_create()
501 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref); in l2cap_chan_destroy() local
503 BT_DBG("chan %p", chan); in l2cap_chan_destroy()
506 list_del(&chan->global_l); in l2cap_chan_destroy()
509 kfree(chan); in l2cap_chan_destroy()
537 void l2cap_chan_set_defaults(struct l2cap_chan *chan) in l2cap_chan_set_defaults() argument
539 chan->fcs = L2CAP_FCS_CRC16; in l2cap_chan_set_defaults()
540 chan->max_tx = L2CAP_DEFAULT_MAX_TX; in l2cap_chan_set_defaults()
541 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW; in l2cap_chan_set_defaults()
542 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW; in l2cap_chan_set_defaults()
543 chan->remote_max_tx = chan->max_tx; in l2cap_chan_set_defaults()
544 chan->remote_tx_win = chan->tx_win; in l2cap_chan_set_defaults()
545 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW; in l2cap_chan_set_defaults()
546 chan->sec_level = BT_SECURITY_LOW; in l2cap_chan_set_defaults()
547 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO; in l2cap_chan_set_defaults()
548 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO; in l2cap_chan_set_defaults()
549 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO; in l2cap_chan_set_defaults()
551 chan->conf_state = 0; in l2cap_chan_set_defaults()
552 set_bit(CONF_NOT_COMPLETE, &chan->conf_state); in l2cap_chan_set_defaults()
554 set_bit(FLAG_FORCE_ACTIVE, &chan->flags); in l2cap_chan_set_defaults()
558 static void l2cap_le_flowctl_init(struct l2cap_chan *chan, u16 tx_credits) in l2cap_le_flowctl_init() argument
560 chan->sdu = NULL; in l2cap_le_flowctl_init()
561 chan->sdu_last_frag = NULL; in l2cap_le_flowctl_init()
562 chan->sdu_len = 0; in l2cap_le_flowctl_init()
563 chan->tx_credits = tx_credits; in l2cap_le_flowctl_init()
565 chan->mps = min_t(u16, chan->imtu, chan->conn->mtu - L2CAP_HDR_SIZE); in l2cap_le_flowctl_init()
567 chan->rx_credits = (chan->imtu / chan->mps) + 1; in l2cap_le_flowctl_init()
569 skb_queue_head_init(&chan->tx_q); in l2cap_le_flowctl_init()
572 static void l2cap_ecred_init(struct l2cap_chan *chan, u16 tx_credits) in l2cap_ecred_init() argument
574 l2cap_le_flowctl_init(chan, tx_credits); in l2cap_ecred_init()
577 if (chan->mps < L2CAP_ECRED_MIN_MPS) { in l2cap_ecred_init()
578 chan->mps = L2CAP_ECRED_MIN_MPS; in l2cap_ecred_init()
579 chan->rx_credits = (chan->imtu / chan->mps) + 1; in l2cap_ecred_init()
583 void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) in __l2cap_chan_add() argument
586 __le16_to_cpu(chan->psm), chan->dcid); in __l2cap_chan_add()
590 chan->conn = conn; in __l2cap_chan_add()
592 switch (chan->chan_type) { in __l2cap_chan_add()
595 chan->scid = l2cap_alloc_cid(conn); in __l2cap_chan_add()
597 chan->omtu = L2CAP_DEFAULT_MTU; in __l2cap_chan_add()
602 chan->scid = L2CAP_CID_CONN_LESS; in __l2cap_chan_add()
603 chan->dcid = L2CAP_CID_CONN_LESS; in __l2cap_chan_add()
604 chan->omtu = L2CAP_DEFAULT_MTU; in __l2cap_chan_add()
613 chan->scid = L2CAP_CID_SIGNALING; in __l2cap_chan_add()
614 chan->dcid = L2CAP_CID_SIGNALING; in __l2cap_chan_add()
615 chan->omtu = L2CAP_DEFAULT_MTU; in __l2cap_chan_add()
618 chan->local_id = L2CAP_BESTEFFORT_ID; in __l2cap_chan_add()
619 chan->local_stype = L2CAP_SERV_BESTEFFORT; in __l2cap_chan_add()
620 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE; in __l2cap_chan_add()
621 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME; in __l2cap_chan_add()
622 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT; in __l2cap_chan_add()
623 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO; in __l2cap_chan_add()
625 l2cap_chan_hold(chan); in __l2cap_chan_add()
628 if (chan->chan_type != L2CAP_CHAN_FIXED || in __l2cap_chan_add()
629 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags)) in __l2cap_chan_add()
632 list_add(&chan->list, &conn->chan_l); in __l2cap_chan_add()
635 void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) in l2cap_chan_add() argument
638 __l2cap_chan_add(conn, chan); in l2cap_chan_add()
642 void l2cap_chan_del(struct l2cap_chan *chan, int err) in l2cap_chan_del() argument
644 struct l2cap_conn *conn = chan->conn; in l2cap_chan_del()
646 __clear_chan_timer(chan); in l2cap_chan_del()
648 BT_DBG("chan %p, conn %p, err %d, state %s", chan, conn, err, in l2cap_chan_del()
649 state_to_string(chan->state)); in l2cap_chan_del()
651 chan->ops->teardown(chan, err); in l2cap_chan_del()
656 list_del(&chan->list); in l2cap_chan_del()
658 l2cap_chan_put(chan); in l2cap_chan_del()
660 chan->conn = NULL; in l2cap_chan_del()
666 if (chan->chan_type != L2CAP_CHAN_FIXED || in l2cap_chan_del()
667 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags)) in l2cap_chan_del()
670 if (mgr && mgr->bredr_chan == chan) in l2cap_chan_del()
674 if (chan->hs_hchan) { in l2cap_chan_del()
675 struct hci_chan *hs_hchan = chan->hs_hchan; in l2cap_chan_del()
677 BT_DBG("chan %p disconnect hs_hchan %p", chan, hs_hchan); in l2cap_chan_del()
681 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state)) in l2cap_chan_del()
684 switch (chan->mode) { in l2cap_chan_del()
690 skb_queue_purge(&chan->tx_q); in l2cap_chan_del()
694 __clear_retrans_timer(chan); in l2cap_chan_del()
695 __clear_monitor_timer(chan); in l2cap_chan_del()
696 __clear_ack_timer(chan); in l2cap_chan_del()
698 skb_queue_purge(&chan->srej_q); in l2cap_chan_del()
700 l2cap_seq_list_free(&chan->srej_list); in l2cap_chan_del()
701 l2cap_seq_list_free(&chan->retrans_list); in l2cap_chan_del()
705 skb_queue_purge(&chan->tx_q); in l2cap_chan_del()
714 struct l2cap_chan *chan, *l; in __l2cap_chan_list_id() local
716 list_for_each_entry_safe(chan, l, &conn->chan_l, list) { in __l2cap_chan_list_id()
717 if (chan->ident == id) in __l2cap_chan_list_id()
718 func(chan, data); in __l2cap_chan_list_id()
725 struct l2cap_chan *chan; in __l2cap_chan_list() local
727 list_for_each_entry(chan, &conn->chan_l, list) { in __l2cap_chan_list()
728 func(chan, data); in __l2cap_chan_list()
750 struct l2cap_chan *chan; in l2cap_conn_update_id_addr() local
754 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_update_id_addr()
755 l2cap_chan_lock(chan); in l2cap_conn_update_id_addr()
756 bacpy(&chan->dst, &hcon->dst); in l2cap_conn_update_id_addr()
757 chan->dst_type = bdaddr_dst_type(hcon); in l2cap_conn_update_id_addr()
758 l2cap_chan_unlock(chan); in l2cap_conn_update_id_addr()
764 static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan) in l2cap_chan_le_connect_reject() argument
766 struct l2cap_conn *conn = chan->conn; in l2cap_chan_le_connect_reject()
770 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_le_connect_reject()
775 l2cap_state_change(chan, BT_DISCONN); in l2cap_chan_le_connect_reject()
777 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_chan_le_connect_reject()
778 rsp.mtu = cpu_to_le16(chan->imtu); in l2cap_chan_le_connect_reject()
779 rsp.mps = cpu_to_le16(chan->mps); in l2cap_chan_le_connect_reject()
780 rsp.credits = cpu_to_le16(chan->rx_credits); in l2cap_chan_le_connect_reject()
783 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in l2cap_chan_le_connect_reject()
787 static void l2cap_chan_ecred_connect_reject(struct l2cap_chan *chan) in l2cap_chan_ecred_connect_reject() argument
789 l2cap_state_change(chan, BT_DISCONN); in l2cap_chan_ecred_connect_reject()
791 __l2cap_ecred_conn_rsp_defer(chan); in l2cap_chan_ecred_connect_reject()
794 static void l2cap_chan_connect_reject(struct l2cap_chan *chan) in l2cap_chan_connect_reject() argument
796 struct l2cap_conn *conn = chan->conn; in l2cap_chan_connect_reject()
800 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_connect_reject()
805 l2cap_state_change(chan, BT_DISCONN); in l2cap_chan_connect_reject()
807 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_chan_connect_reject()
808 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_chan_connect_reject()
812 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp); in l2cap_chan_connect_reject()
815 void l2cap_chan_close(struct l2cap_chan *chan, int reason) in l2cap_chan_close() argument
817 struct l2cap_conn *conn = chan->conn; in l2cap_chan_close()
819 BT_DBG("chan %p state %s", chan, state_to_string(chan->state)); in l2cap_chan_close()
821 switch (chan->state) { in l2cap_chan_close()
823 chan->ops->teardown(chan, 0); in l2cap_chan_close()
828 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) { in l2cap_chan_close()
829 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_chan_close()
830 l2cap_send_disconn_req(chan, reason); in l2cap_chan_close()
832 l2cap_chan_del(chan, reason); in l2cap_chan_close()
836 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) { in l2cap_chan_close()
838 l2cap_chan_connect_reject(chan); in l2cap_chan_close()
840 switch (chan->mode) { in l2cap_chan_close()
842 l2cap_chan_le_connect_reject(chan); in l2cap_chan_close()
845 l2cap_chan_ecred_connect_reject(chan); in l2cap_chan_close()
851 l2cap_chan_del(chan, reason); in l2cap_chan_close()
856 l2cap_chan_del(chan, reason); in l2cap_chan_close()
860 chan->ops->teardown(chan, 0); in l2cap_chan_close()
866 static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan) in l2cap_get_auth_type() argument
868 switch (chan->chan_type) { in l2cap_get_auth_type()
870 switch (chan->sec_level) { in l2cap_get_auth_type()
881 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) { in l2cap_get_auth_type()
882 if (chan->sec_level == BT_SECURITY_LOW) in l2cap_get_auth_type()
883 chan->sec_level = BT_SECURITY_SDP; in l2cap_get_auth_type()
885 if (chan->sec_level == BT_SECURITY_HIGH || in l2cap_get_auth_type()
886 chan->sec_level == BT_SECURITY_FIPS) in l2cap_get_auth_type()
892 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) { in l2cap_get_auth_type()
893 if (chan->sec_level == BT_SECURITY_LOW) in l2cap_get_auth_type()
894 chan->sec_level = BT_SECURITY_SDP; in l2cap_get_auth_type()
896 if (chan->sec_level == BT_SECURITY_HIGH || in l2cap_get_auth_type()
897 chan->sec_level == BT_SECURITY_FIPS) in l2cap_get_auth_type()
905 switch (chan->sec_level) { in l2cap_get_auth_type()
919 int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator) in l2cap_chan_check_security() argument
921 struct l2cap_conn *conn = chan->conn; in l2cap_chan_check_security()
925 return smp_conn_security(conn->hcon, chan->sec_level); in l2cap_chan_check_security()
927 auth_type = l2cap_get_auth_type(chan); in l2cap_chan_check_security()
929 return hci_conn_security(conn->hcon, chan->sec_level, auth_type, in l2cap_chan_check_security()
980 static bool __chan_is_moving(struct l2cap_chan *chan) in __chan_is_moving() argument
982 return chan->move_state != L2CAP_MOVE_STABLE && in __chan_is_moving()
983 chan->move_state != L2CAP_MOVE_WAIT_PREPARE; in __chan_is_moving()
986 static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_do_send() argument
988 struct hci_conn *hcon = chan->conn->hcon; in l2cap_do_send()
991 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len, in l2cap_do_send()
994 if (chan->hs_hcon && !__chan_is_moving(chan)) { in l2cap_do_send()
995 if (chan->hs_hchan) in l2cap_do_send()
996 hci_send_acl(chan->hs_hchan, skb, ACL_COMPLETE); in l2cap_do_send()
1008 (!test_bit(FLAG_FLUSHABLE, &chan->flags) && in l2cap_do_send()
1014 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags); in l2cap_do_send()
1015 hci_send_acl(chan->conn->hchan, skb, flags); in l2cap_do_send()
1066 static inline void __unpack_control(struct l2cap_chan *chan, in __unpack_control() argument
1069 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) { in __unpack_control()
1118 static inline void __pack_control(struct l2cap_chan *chan, in __pack_control() argument
1122 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) { in __pack_control()
1131 static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan) in __ertm_hdr_size() argument
1133 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in __ertm_hdr_size()
1139 static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan, in l2cap_create_sframe_pdu() argument
1144 int hlen = __ertm_hdr_size(chan); in l2cap_create_sframe_pdu()
1146 if (chan->fcs == L2CAP_FCS_CRC16) in l2cap_create_sframe_pdu()
1156 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_sframe_pdu()
1158 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_create_sframe_pdu()
1163 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_create_sframe_pdu()
1172 static void l2cap_send_sframe(struct l2cap_chan *chan, in l2cap_send_sframe() argument
1178 BT_DBG("chan %p, control %p", chan, control); in l2cap_send_sframe()
1183 if (__chan_is_moving(chan)) in l2cap_send_sframe()
1186 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) && in l2cap_send_sframe()
1191 clear_bit(CONN_RNR_SENT, &chan->conn_state); in l2cap_send_sframe()
1193 set_bit(CONN_RNR_SENT, &chan->conn_state); in l2cap_send_sframe()
1196 chan->last_acked_seq = control->reqseq; in l2cap_send_sframe()
1197 __clear_ack_timer(chan); in l2cap_send_sframe()
1203 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_send_sframe()
1208 skb = l2cap_create_sframe_pdu(chan, control_field); in l2cap_send_sframe()
1210 l2cap_do_send(chan, skb); in l2cap_send_sframe()
1213 static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll) in l2cap_send_rr_or_rnr() argument
1217 BT_DBG("chan %p, poll %d", chan, poll); in l2cap_send_rr_or_rnr()
1223 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) in l2cap_send_rr_or_rnr()
1228 control.reqseq = chan->buffer_seq; in l2cap_send_rr_or_rnr()
1229 l2cap_send_sframe(chan, &control); in l2cap_send_rr_or_rnr()
1232 static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan) in __l2cap_no_conn_pending() argument
1234 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) in __l2cap_no_conn_pending()
1237 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state); in __l2cap_no_conn_pending()
1240 static bool __amp_capable(struct l2cap_chan *chan) in __amp_capable() argument
1242 struct l2cap_conn *conn = chan->conn; in __amp_capable()
1262 if (chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED) in __amp_capable()
1268 static bool l2cap_check_efs(struct l2cap_chan *chan) in l2cap_check_efs() argument
1274 void l2cap_send_conn_req(struct l2cap_chan *chan) in l2cap_send_conn_req() argument
1276 struct l2cap_conn *conn = chan->conn; in l2cap_send_conn_req()
1279 req.scid = cpu_to_le16(chan->scid); in l2cap_send_conn_req()
1280 req.psm = chan->psm; in l2cap_send_conn_req()
1282 chan->ident = l2cap_get_ident(conn); in l2cap_send_conn_req()
1284 set_bit(CONF_CONNECT_PEND, &chan->conf_state); in l2cap_send_conn_req()
1286 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req); in l2cap_send_conn_req()
1289 static void l2cap_send_create_chan_req(struct l2cap_chan *chan, u8 amp_id) in l2cap_send_create_chan_req() argument
1292 req.scid = cpu_to_le16(chan->scid); in l2cap_send_create_chan_req()
1293 req.psm = chan->psm; in l2cap_send_create_chan_req()
1296 chan->ident = l2cap_get_ident(chan->conn); in l2cap_send_create_chan_req()
1298 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ, in l2cap_send_create_chan_req()
1302 static void l2cap_move_setup(struct l2cap_chan *chan) in l2cap_move_setup() argument
1306 BT_DBG("chan %p", chan); in l2cap_move_setup()
1308 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_move_setup()
1311 __clear_retrans_timer(chan); in l2cap_move_setup()
1312 __clear_monitor_timer(chan); in l2cap_move_setup()
1313 __clear_ack_timer(chan); in l2cap_move_setup()
1315 chan->retry_count = 0; in l2cap_move_setup()
1316 skb_queue_walk(&chan->tx_q, skb) { in l2cap_move_setup()
1323 chan->expected_tx_seq = chan->buffer_seq; in l2cap_move_setup()
1325 clear_bit(CONN_REJ_ACT, &chan->conn_state); in l2cap_move_setup()
1326 clear_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_move_setup()
1327 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_move_setup()
1328 l2cap_seq_list_clear(&chan->srej_list); in l2cap_move_setup()
1329 skb_queue_purge(&chan->srej_q); in l2cap_move_setup()
1331 chan->tx_state = L2CAP_TX_STATE_XMIT; in l2cap_move_setup()
1332 chan->rx_state = L2CAP_RX_STATE_MOVE; in l2cap_move_setup()
1334 set_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_move_setup()
1337 static void l2cap_move_done(struct l2cap_chan *chan) in l2cap_move_done() argument
1339 u8 move_role = chan->move_role; in l2cap_move_done()
1340 BT_DBG("chan %p", chan); in l2cap_move_done()
1342 chan->move_state = L2CAP_MOVE_STABLE; in l2cap_move_done()
1343 chan->move_role = L2CAP_MOVE_ROLE_NONE; in l2cap_move_done()
1345 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_move_done()
1350 l2cap_tx(chan, NULL, NULL, L2CAP_EV_EXPLICIT_POLL); in l2cap_move_done()
1351 chan->rx_state = L2CAP_RX_STATE_WAIT_F; in l2cap_move_done()
1354 chan->rx_state = L2CAP_RX_STATE_WAIT_P; in l2cap_move_done()
1359 static void l2cap_chan_ready(struct l2cap_chan *chan) in l2cap_chan_ready() argument
1365 if (chan->state == BT_CONNECTED) in l2cap_chan_ready()
1369 chan->conf_state = 0; in l2cap_chan_ready()
1370 __clear_chan_timer(chan); in l2cap_chan_ready()
1372 switch (chan->mode) { in l2cap_chan_ready()
1375 if (!chan->tx_credits) in l2cap_chan_ready()
1376 chan->ops->suspend(chan); in l2cap_chan_ready()
1380 chan->state = BT_CONNECTED; in l2cap_chan_ready()
1382 chan->ops->ready(chan); in l2cap_chan_ready()
1385 static void l2cap_le_connect(struct l2cap_chan *chan) in l2cap_le_connect() argument
1387 struct l2cap_conn *conn = chan->conn; in l2cap_le_connect()
1390 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags)) in l2cap_le_connect()
1393 if (!chan->imtu) in l2cap_le_connect()
1394 chan->imtu = chan->conn->mtu; in l2cap_le_connect()
1396 l2cap_le_flowctl_init(chan, 0); in l2cap_le_connect()
1399 req.psm = chan->psm; in l2cap_le_connect()
1400 req.scid = cpu_to_le16(chan->scid); in l2cap_le_connect()
1401 req.mtu = cpu_to_le16(chan->imtu); in l2cap_le_connect()
1402 req.mps = cpu_to_le16(chan->mps); in l2cap_le_connect()
1403 req.credits = cpu_to_le16(chan->rx_credits); in l2cap_le_connect()
1405 chan->ident = l2cap_get_ident(conn); in l2cap_le_connect()
1407 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ, in l2cap_le_connect()
1416 struct l2cap_chan *chan; member
1421 static void l2cap_ecred_defer_connect(struct l2cap_chan *chan, void *data) in l2cap_ecred_defer_connect() argument
1426 if (chan == conn->chan) in l2cap_ecred_defer_connect()
1429 if (!test_and_clear_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_ecred_defer_connect()
1432 pid = chan->ops->get_peer_pid(chan); in l2cap_ecred_defer_connect()
1435 if (conn->pid != pid || chan->psm != conn->chan->psm || chan->ident || in l2cap_ecred_defer_connect()
1436 chan->mode != L2CAP_MODE_EXT_FLOWCTL || chan->state != BT_CONNECT) in l2cap_ecred_defer_connect()
1439 if (test_and_set_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags)) in l2cap_ecred_defer_connect()
1442 l2cap_ecred_init(chan, 0); in l2cap_ecred_defer_connect()
1445 chan->ident = conn->chan->ident; in l2cap_ecred_defer_connect()
1448 conn->pdu.scid[conn->count] = cpu_to_le16(chan->scid); in l2cap_ecred_defer_connect()
1453 static void l2cap_ecred_connect(struct l2cap_chan *chan) in l2cap_ecred_connect() argument
1455 struct l2cap_conn *conn = chan->conn; in l2cap_ecred_connect()
1458 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_ecred_connect()
1461 if (test_and_set_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags)) in l2cap_ecred_connect()
1464 l2cap_ecred_init(chan, 0); in l2cap_ecred_connect()
1467 data.pdu.req.psm = chan->psm; in l2cap_ecred_connect()
1468 data.pdu.req.mtu = cpu_to_le16(chan->imtu); in l2cap_ecred_connect()
1469 data.pdu.req.mps = cpu_to_le16(chan->mps); in l2cap_ecred_connect()
1470 data.pdu.req.credits = cpu_to_le16(chan->rx_credits); in l2cap_ecred_connect()
1471 data.pdu.scid[0] = cpu_to_le16(chan->scid); in l2cap_ecred_connect()
1473 chan->ident = l2cap_get_ident(conn); in l2cap_ecred_connect()
1476 data.chan = chan; in l2cap_ecred_connect()
1477 data.pid = chan->ops->get_peer_pid(chan); in l2cap_ecred_connect()
1481 l2cap_send_cmd(conn, chan->ident, L2CAP_ECRED_CONN_REQ, in l2cap_ecred_connect()
1486 static void l2cap_le_start(struct l2cap_chan *chan) in l2cap_le_start() argument
1488 struct l2cap_conn *conn = chan->conn; in l2cap_le_start()
1490 if (!smp_conn_security(conn->hcon, chan->sec_level)) in l2cap_le_start()
1493 if (!chan->psm) { in l2cap_le_start()
1494 l2cap_chan_ready(chan); in l2cap_le_start()
1498 if (chan->state == BT_CONNECT) { in l2cap_le_start()
1499 if (chan->mode == L2CAP_MODE_EXT_FLOWCTL) in l2cap_le_start()
1500 l2cap_ecred_connect(chan); in l2cap_le_start()
1502 l2cap_le_connect(chan); in l2cap_le_start()
1506 static void l2cap_start_connection(struct l2cap_chan *chan) in l2cap_start_connection() argument
1508 if (__amp_capable(chan)) { in l2cap_start_connection()
1509 BT_DBG("chan %p AMP capable: discover AMPs", chan); in l2cap_start_connection()
1510 a2mp_discover_amp(chan); in l2cap_start_connection()
1511 } else if (chan->conn->hcon->type == LE_LINK) { in l2cap_start_connection()
1512 l2cap_le_start(chan); in l2cap_start_connection()
1514 l2cap_send_conn_req(chan); in l2cap_start_connection()
1557 static void l2cap_do_start(struct l2cap_chan *chan) in l2cap_do_start() argument
1559 struct l2cap_conn *conn = chan->conn; in l2cap_do_start()
1562 l2cap_le_start(chan); in l2cap_do_start()
1574 if (!l2cap_chan_check_security(chan, true) || in l2cap_do_start()
1575 !__l2cap_no_conn_pending(chan)) in l2cap_do_start()
1579 l2cap_start_connection(chan); in l2cap_do_start()
1581 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); in l2cap_do_start()
1600 static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err) in l2cap_send_disconn_req() argument
1602 struct l2cap_conn *conn = chan->conn; in l2cap_send_disconn_req()
1608 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) { in l2cap_send_disconn_req()
1609 __clear_retrans_timer(chan); in l2cap_send_disconn_req()
1610 __clear_monitor_timer(chan); in l2cap_send_disconn_req()
1611 __clear_ack_timer(chan); in l2cap_send_disconn_req()
1614 if (chan->scid == L2CAP_CID_A2MP) { in l2cap_send_disconn_req()
1615 l2cap_state_change(chan, BT_DISCONN); in l2cap_send_disconn_req()
1619 req.dcid = cpu_to_le16(chan->dcid); in l2cap_send_disconn_req()
1620 req.scid = cpu_to_le16(chan->scid); in l2cap_send_disconn_req()
1624 l2cap_state_change_and_error(chan, BT_DISCONN, err); in l2cap_send_disconn_req()
1630 struct l2cap_chan *chan, *tmp; in l2cap_conn_start() local
1636 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) { in l2cap_conn_start()
1637 l2cap_chan_lock(chan); in l2cap_conn_start()
1639 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_conn_start()
1640 l2cap_chan_ready(chan); in l2cap_conn_start()
1641 l2cap_chan_unlock(chan); in l2cap_conn_start()
1645 if (chan->state == BT_CONNECT) { in l2cap_conn_start()
1646 if (!l2cap_chan_check_security(chan, true) || in l2cap_conn_start()
1647 !__l2cap_no_conn_pending(chan)) { in l2cap_conn_start()
1648 l2cap_chan_unlock(chan); in l2cap_conn_start()
1652 if (!l2cap_mode_supported(chan->mode, conn->feat_mask) in l2cap_conn_start()
1654 &chan->conf_state)) { in l2cap_conn_start()
1655 l2cap_chan_close(chan, ECONNRESET); in l2cap_conn_start()
1656 l2cap_chan_unlock(chan); in l2cap_conn_start()
1661 l2cap_start_connection(chan); in l2cap_conn_start()
1663 l2cap_chan_close(chan, ECONNREFUSED); in l2cap_conn_start()
1665 } else if (chan->state == BT_CONNECT2) { in l2cap_conn_start()
1668 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_conn_start()
1669 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_conn_start()
1671 if (l2cap_chan_check_security(chan, false)) { in l2cap_conn_start()
1672 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_conn_start()
1675 chan->ops->defer(chan); in l2cap_conn_start()
1678 l2cap_state_change(chan, BT_CONFIG); in l2cap_conn_start()
1687 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, in l2cap_conn_start()
1690 if (test_bit(CONF_REQ_SENT, &chan->conf_state) || in l2cap_conn_start()
1692 l2cap_chan_unlock(chan); in l2cap_conn_start()
1696 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_conn_start()
1698 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_conn_start()
1699 chan->num_conf_req++; in l2cap_conn_start()
1702 l2cap_chan_unlock(chan); in l2cap_conn_start()
1743 struct l2cap_chan *chan; in l2cap_conn_ready() local
1753 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_ready()
1755 l2cap_chan_lock(chan); in l2cap_conn_ready()
1757 if (chan->scid == L2CAP_CID_A2MP) { in l2cap_conn_ready()
1758 l2cap_chan_unlock(chan); in l2cap_conn_ready()
1763 l2cap_le_start(chan); in l2cap_conn_ready()
1764 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_conn_ready()
1766 l2cap_chan_ready(chan); in l2cap_conn_ready()
1767 } else if (chan->state == BT_CONNECT) { in l2cap_conn_ready()
1768 l2cap_do_start(chan); in l2cap_conn_ready()
1771 l2cap_chan_unlock(chan); in l2cap_conn_ready()
1785 struct l2cap_chan *chan; in l2cap_conn_unreliable() local
1791 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_unreliable()
1792 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags)) in l2cap_conn_unreliable()
1793 l2cap_chan_set_err(chan, err); in l2cap_conn_unreliable()
1892 struct l2cap_chan *chan, *l; in l2cap_conn_del() local
1920 list_for_each_entry_safe(chan, l, &conn->chan_l, list) { in l2cap_conn_del()
1921 l2cap_chan_hold(chan); in l2cap_conn_del()
1922 l2cap_chan_lock(chan); in l2cap_conn_del()
1924 l2cap_chan_del(chan, err); in l2cap_conn_del()
1926 chan->ops->close(chan); in l2cap_conn_del()
1928 l2cap_chan_unlock(chan); in l2cap_conn_del()
1929 l2cap_chan_put(chan); in l2cap_conn_del()
2023 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_monitor_timeout() local
2026 BT_DBG("chan %p", chan); in l2cap_monitor_timeout()
2028 l2cap_chan_lock(chan); in l2cap_monitor_timeout()
2030 if (!chan->conn) { in l2cap_monitor_timeout()
2031 l2cap_chan_unlock(chan); in l2cap_monitor_timeout()
2032 l2cap_chan_put(chan); in l2cap_monitor_timeout()
2036 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO); in l2cap_monitor_timeout()
2038 l2cap_chan_unlock(chan); in l2cap_monitor_timeout()
2039 l2cap_chan_put(chan); in l2cap_monitor_timeout()
2044 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_retrans_timeout() local
2047 BT_DBG("chan %p", chan); in l2cap_retrans_timeout()
2049 l2cap_chan_lock(chan); in l2cap_retrans_timeout()
2051 if (!chan->conn) { in l2cap_retrans_timeout()
2052 l2cap_chan_unlock(chan); in l2cap_retrans_timeout()
2053 l2cap_chan_put(chan); in l2cap_retrans_timeout()
2057 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO); in l2cap_retrans_timeout()
2058 l2cap_chan_unlock(chan); in l2cap_retrans_timeout()
2059 l2cap_chan_put(chan); in l2cap_retrans_timeout()
2062 static void l2cap_streaming_send(struct l2cap_chan *chan, in l2cap_streaming_send() argument
2068 BT_DBG("chan %p, skbs %p", chan, skbs); in l2cap_streaming_send()
2070 if (__chan_is_moving(chan)) in l2cap_streaming_send()
2073 skb_queue_splice_tail_init(skbs, &chan->tx_q); in l2cap_streaming_send()
2075 while (!skb_queue_empty(&chan->tx_q)) { in l2cap_streaming_send()
2077 skb = skb_dequeue(&chan->tx_q); in l2cap_streaming_send()
2083 control->txseq = chan->next_tx_seq; in l2cap_streaming_send()
2085 __pack_control(chan, control, skb); in l2cap_streaming_send()
2087 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_streaming_send()
2092 l2cap_do_send(chan, skb); in l2cap_streaming_send()
2096 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq); in l2cap_streaming_send()
2097 chan->frames_sent++; in l2cap_streaming_send()
2101 static int l2cap_ertm_send(struct l2cap_chan *chan) in l2cap_ertm_send() argument
2107 BT_DBG("chan %p", chan); in l2cap_ertm_send()
2109 if (chan->state != BT_CONNECTED) in l2cap_ertm_send()
2112 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) in l2cap_ertm_send()
2115 if (__chan_is_moving(chan)) in l2cap_ertm_send()
2118 while (chan->tx_send_head && in l2cap_ertm_send()
2119 chan->unacked_frames < chan->remote_tx_win && in l2cap_ertm_send()
2120 chan->tx_state == L2CAP_TX_STATE_XMIT) { in l2cap_ertm_send()
2122 skb = chan->tx_send_head; in l2cap_ertm_send()
2127 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state)) in l2cap_ertm_send()
2130 control->reqseq = chan->buffer_seq; in l2cap_ertm_send()
2131 chan->last_acked_seq = chan->buffer_seq; in l2cap_ertm_send()
2132 control->txseq = chan->next_tx_seq; in l2cap_ertm_send()
2134 __pack_control(chan, control, skb); in l2cap_ertm_send()
2136 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_ertm_send()
2149 __set_retrans_timer(chan); in l2cap_ertm_send()
2151 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq); in l2cap_ertm_send()
2152 chan->unacked_frames++; in l2cap_ertm_send()
2153 chan->frames_sent++; in l2cap_ertm_send()
2156 if (skb_queue_is_last(&chan->tx_q, skb)) in l2cap_ertm_send()
2157 chan->tx_send_head = NULL; in l2cap_ertm_send()
2159 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb); in l2cap_ertm_send()
2161 l2cap_do_send(chan, tx_skb); in l2cap_ertm_send()
2166 chan->unacked_frames, skb_queue_len(&chan->tx_q)); in l2cap_ertm_send()
2171 static void l2cap_ertm_resend(struct l2cap_chan *chan) in l2cap_ertm_resend() argument
2178 BT_DBG("chan %p", chan); in l2cap_ertm_resend()
2180 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) in l2cap_ertm_resend()
2183 if (__chan_is_moving(chan)) in l2cap_ertm_resend()
2186 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) { in l2cap_ertm_resend()
2187 seq = l2cap_seq_list_pop(&chan->retrans_list); in l2cap_ertm_resend()
2189 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq); in l2cap_ertm_resend()
2199 if (chan->max_tx != 0 && in l2cap_ertm_resend()
2200 bt_cb(skb)->l2cap.retries > chan->max_tx) { in l2cap_ertm_resend()
2201 BT_DBG("Retry limit exceeded (%d)", chan->max_tx); in l2cap_ertm_resend()
2202 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_ertm_resend()
2203 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_ertm_resend()
2207 control.reqseq = chan->buffer_seq; in l2cap_ertm_resend()
2208 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state)) in l2cap_ertm_resend()
2223 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_ertm_resend()
2228 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) { in l2cap_ertm_resend()
2237 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_ertm_resend()
2244 l2cap_do_send(chan, tx_skb); in l2cap_ertm_resend()
2248 chan->last_acked_seq = chan->buffer_seq; in l2cap_ertm_resend()
2252 static void l2cap_retransmit(struct l2cap_chan *chan, in l2cap_retransmit() argument
2255 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit()
2257 l2cap_seq_list_append(&chan->retrans_list, control->reqseq); in l2cap_retransmit()
2258 l2cap_ertm_resend(chan); in l2cap_retransmit()
2261 static void l2cap_retransmit_all(struct l2cap_chan *chan, in l2cap_retransmit_all() argument
2266 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit_all()
2269 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_retransmit_all()
2271 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_retransmit_all()
2273 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) in l2cap_retransmit_all()
2276 if (chan->unacked_frames) { in l2cap_retransmit_all()
2277 skb_queue_walk(&chan->tx_q, skb) { in l2cap_retransmit_all()
2279 skb == chan->tx_send_head) in l2cap_retransmit_all()
2283 skb_queue_walk_from(&chan->tx_q, skb) { in l2cap_retransmit_all()
2284 if (skb == chan->tx_send_head) in l2cap_retransmit_all()
2287 l2cap_seq_list_append(&chan->retrans_list, in l2cap_retransmit_all()
2291 l2cap_ertm_resend(chan); in l2cap_retransmit_all()
2295 static void l2cap_send_ack(struct l2cap_chan *chan) in l2cap_send_ack() argument
2298 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq, in l2cap_send_ack()
2299 chan->last_acked_seq); in l2cap_send_ack()
2303 chan, chan->last_acked_seq, chan->buffer_seq); in l2cap_send_ack()
2308 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) && in l2cap_send_ack()
2309 chan->rx_state == L2CAP_RX_STATE_RECV) { in l2cap_send_ack()
2310 __clear_ack_timer(chan); in l2cap_send_ack()
2312 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2313 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2315 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) { in l2cap_send_ack()
2316 l2cap_ertm_send(chan); in l2cap_send_ack()
2318 if (chan->buffer_seq == chan->last_acked_seq) in l2cap_send_ack()
2325 threshold = chan->ack_win; in l2cap_send_ack()
2333 __clear_ack_timer(chan); in l2cap_send_ack()
2335 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2336 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2341 __set_ack_timer(chan); in l2cap_send_ack()
2345 static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan, in l2cap_skbuff_fromiovec() argument
2349 struct l2cap_conn *conn = chan->conn; in l2cap_skbuff_fromiovec()
2366 tmp = chan->ops->alloc_skb(chan, 0, count, in l2cap_skbuff_fromiovec()
2389 static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan, in l2cap_create_connless_pdu() argument
2392 struct l2cap_conn *conn = chan->conn; in l2cap_create_connless_pdu()
2397 BT_DBG("chan %p psm 0x%2.2x len %zu", chan, in l2cap_create_connless_pdu()
2398 __le16_to_cpu(chan->psm), len); in l2cap_create_connless_pdu()
2402 skb = chan->ops->alloc_skb(chan, hlen, count, in l2cap_create_connless_pdu()
2409 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_connless_pdu()
2411 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE)); in l2cap_create_connless_pdu()
2413 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_connless_pdu()
2421 static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan, in l2cap_create_basic_pdu() argument
2424 struct l2cap_conn *conn = chan->conn; in l2cap_create_basic_pdu()
2429 BT_DBG("chan %p len %zu", chan, len); in l2cap_create_basic_pdu()
2433 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count, in l2cap_create_basic_pdu()
2440 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_basic_pdu()
2443 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_basic_pdu()
2451 static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan, in l2cap_create_iframe_pdu() argument
2455 struct l2cap_conn *conn = chan->conn; in l2cap_create_iframe_pdu()
2460 BT_DBG("chan %p len %zu", chan, len); in l2cap_create_iframe_pdu()
2465 hlen = __ertm_hdr_size(chan); in l2cap_create_iframe_pdu()
2470 if (chan->fcs == L2CAP_FCS_CRC16) in l2cap_create_iframe_pdu()
2475 skb = chan->ops->alloc_skb(chan, hlen, count, in l2cap_create_iframe_pdu()
2482 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_iframe_pdu()
2486 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_create_iframe_pdu()
2494 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_iframe_pdu()
2500 bt_cb(skb)->l2cap.fcs = chan->fcs; in l2cap_create_iframe_pdu()
2505 static int l2cap_segment_sdu(struct l2cap_chan *chan, in l2cap_segment_sdu() argument
2514 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len); in l2cap_segment_sdu()
2522 pdu_len = chan->conn->mtu; in l2cap_segment_sdu()
2525 if (!chan->hs_hcon) in l2cap_segment_sdu()
2529 if (chan->fcs) in l2cap_segment_sdu()
2532 pdu_len -= __ertm_hdr_size(chan); in l2cap_segment_sdu()
2535 pdu_len = min_t(size_t, pdu_len, chan->remote_mps); in l2cap_segment_sdu()
2547 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len); in l2cap_segment_sdu()
2572 static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan, in l2cap_create_le_flowctl_pdu() argument
2576 struct l2cap_conn *conn = chan->conn; in l2cap_create_le_flowctl_pdu()
2581 BT_DBG("chan %p len %zu", chan, len); in l2cap_create_le_flowctl_pdu()
2593 skb = chan->ops->alloc_skb(chan, hlen, count, in l2cap_create_le_flowctl_pdu()
2600 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_le_flowctl_pdu()
2606 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_le_flowctl_pdu()
2615 static int l2cap_segment_le_sdu(struct l2cap_chan *chan, in l2cap_segment_le_sdu() argument
2623 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len); in l2cap_segment_le_sdu()
2626 pdu_len = chan->remote_mps - L2CAP_SDULEN_SIZE; in l2cap_segment_le_sdu()
2632 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len); in l2cap_segment_le_sdu()
2651 static void l2cap_le_flowctl_send(struct l2cap_chan *chan) in l2cap_le_flowctl_send() argument
2655 BT_DBG("chan %p", chan); in l2cap_le_flowctl_send()
2657 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) { in l2cap_le_flowctl_send()
2658 l2cap_do_send(chan, skb_dequeue(&chan->tx_q)); in l2cap_le_flowctl_send()
2659 chan->tx_credits--; in l2cap_le_flowctl_send()
2663 BT_DBG("Sent %d credits %u queued %u", sent, chan->tx_credits, in l2cap_le_flowctl_send()
2664 skb_queue_len(&chan->tx_q)); in l2cap_le_flowctl_send()
2667 int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len) in l2cap_chan_send() argument
2673 if (!chan->conn) in l2cap_chan_send()
2677 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) { in l2cap_chan_send()
2678 skb = l2cap_create_connless_pdu(chan, msg, len); in l2cap_chan_send()
2682 l2cap_do_send(chan, skb); in l2cap_chan_send()
2686 switch (chan->mode) { in l2cap_chan_send()
2690 if (len > chan->omtu) in l2cap_chan_send()
2695 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len); in l2cap_chan_send()
2697 if (chan->state != BT_CONNECTED) { in l2cap_chan_send()
2705 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q); in l2cap_chan_send()
2707 l2cap_le_flowctl_send(chan); in l2cap_chan_send()
2709 if (!chan->tx_credits) in l2cap_chan_send()
2710 chan->ops->suspend(chan); in l2cap_chan_send()
2718 if (len > chan->omtu) in l2cap_chan_send()
2722 skb = l2cap_create_basic_pdu(chan, msg, len); in l2cap_chan_send()
2726 l2cap_do_send(chan, skb); in l2cap_chan_send()
2733 if (len > chan->omtu) { in l2cap_chan_send()
2744 err = l2cap_segment_sdu(chan, &seg_queue, msg, len); in l2cap_chan_send()
2749 if (chan->mode == L2CAP_MODE_ERTM) in l2cap_chan_send()
2750 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST); in l2cap_chan_send()
2752 l2cap_streaming_send(chan, &seg_queue); in l2cap_chan_send()
2763 BT_DBG("bad state %1.1x", chan->mode); in l2cap_chan_send()
2771 static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq) in l2cap_send_srej() argument
2776 BT_DBG("chan %p, txseq %u", chan, txseq); in l2cap_send_srej()
2782 for (seq = chan->expected_tx_seq; seq != txseq; in l2cap_send_srej()
2783 seq = __next_seq(chan, seq)) { in l2cap_send_srej()
2784 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) { in l2cap_send_srej()
2786 l2cap_send_sframe(chan, &control); in l2cap_send_srej()
2787 l2cap_seq_list_append(&chan->srej_list, seq); in l2cap_send_srej()
2791 chan->expected_tx_seq = __next_seq(chan, txseq); in l2cap_send_srej()
2794 static void l2cap_send_srej_tail(struct l2cap_chan *chan) in l2cap_send_srej_tail() argument
2798 BT_DBG("chan %p", chan); in l2cap_send_srej_tail()
2800 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR) in l2cap_send_srej_tail()
2806 control.reqseq = chan->srej_list.tail; in l2cap_send_srej_tail()
2807 l2cap_send_sframe(chan, &control); in l2cap_send_srej_tail()
2810 static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq) in l2cap_send_srej_list() argument
2816 BT_DBG("chan %p, txseq %u", chan, txseq); in l2cap_send_srej_list()
2823 initial_head = chan->srej_list.head; in l2cap_send_srej_list()
2826 seq = l2cap_seq_list_pop(&chan->srej_list); in l2cap_send_srej_list()
2831 l2cap_send_sframe(chan, &control); in l2cap_send_srej_list()
2832 l2cap_seq_list_append(&chan->srej_list, seq); in l2cap_send_srej_list()
2833 } while (chan->srej_list.head != initial_head); in l2cap_send_srej_list()
2836 static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq) in l2cap_process_reqseq() argument
2841 BT_DBG("chan %p, reqseq %u", chan, reqseq); in l2cap_process_reqseq()
2843 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq) in l2cap_process_reqseq()
2847 chan->expected_ack_seq, chan->unacked_frames); in l2cap_process_reqseq()
2849 for (ackseq = chan->expected_ack_seq; ackseq != reqseq; in l2cap_process_reqseq()
2850 ackseq = __next_seq(chan, ackseq)) { in l2cap_process_reqseq()
2852 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq); in l2cap_process_reqseq()
2854 skb_unlink(acked_skb, &chan->tx_q); in l2cap_process_reqseq()
2856 chan->unacked_frames--; in l2cap_process_reqseq()
2860 chan->expected_ack_seq = reqseq; in l2cap_process_reqseq()
2862 if (chan->unacked_frames == 0) in l2cap_process_reqseq()
2863 __clear_retrans_timer(chan); in l2cap_process_reqseq()
2865 BT_DBG("unacked_frames %u", chan->unacked_frames); in l2cap_process_reqseq()
2868 static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan) in l2cap_abort_rx_srej_sent() argument
2870 BT_DBG("chan %p", chan); in l2cap_abort_rx_srej_sent()
2872 chan->expected_tx_seq = chan->buffer_seq; in l2cap_abort_rx_srej_sent()
2873 l2cap_seq_list_clear(&chan->srej_list); in l2cap_abort_rx_srej_sent()
2874 skb_queue_purge(&chan->srej_q); in l2cap_abort_rx_srej_sent()
2875 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_abort_rx_srej_sent()
2878 static void l2cap_tx_state_xmit(struct l2cap_chan *chan, in l2cap_tx_state_xmit() argument
2882 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_xmit()
2887 if (chan->tx_send_head == NULL) in l2cap_tx_state_xmit()
2888 chan->tx_send_head = skb_peek(skbs); in l2cap_tx_state_xmit()
2890 skb_queue_splice_tail_init(skbs, &chan->tx_q); in l2cap_tx_state_xmit()
2891 l2cap_ertm_send(chan); in l2cap_tx_state_xmit()
2895 set_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_xmit()
2897 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) { in l2cap_tx_state_xmit()
2901 l2cap_abort_rx_srej_sent(chan); in l2cap_tx_state_xmit()
2904 l2cap_send_ack(chan); in l2cap_tx_state_xmit()
2909 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_xmit()
2911 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) { in l2cap_tx_state_xmit()
2918 local_control.reqseq = chan->buffer_seq; in l2cap_tx_state_xmit()
2919 l2cap_send_sframe(chan, &local_control); in l2cap_tx_state_xmit()
2921 chan->retry_count = 1; in l2cap_tx_state_xmit()
2922 __set_monitor_timer(chan); in l2cap_tx_state_xmit()
2923 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_xmit()
2927 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_xmit()
2930 l2cap_send_rr_or_rnr(chan, 1); in l2cap_tx_state_xmit()
2931 chan->retry_count = 1; in l2cap_tx_state_xmit()
2932 __set_monitor_timer(chan); in l2cap_tx_state_xmit()
2933 __clear_ack_timer(chan); in l2cap_tx_state_xmit()
2934 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_xmit()
2937 l2cap_send_rr_or_rnr(chan, 1); in l2cap_tx_state_xmit()
2938 chan->retry_count = 1; in l2cap_tx_state_xmit()
2939 __set_monitor_timer(chan); in l2cap_tx_state_xmit()
2940 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_xmit()
2950 static void l2cap_tx_state_wait_f(struct l2cap_chan *chan, in l2cap_tx_state_wait_f() argument
2954 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_wait_f()
2959 if (chan->tx_send_head == NULL) in l2cap_tx_state_wait_f()
2960 chan->tx_send_head = skb_peek(skbs); in l2cap_tx_state_wait_f()
2962 skb_queue_splice_tail_init(skbs, &chan->tx_q); in l2cap_tx_state_wait_f()
2966 set_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_wait_f()
2968 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) { in l2cap_tx_state_wait_f()
2972 l2cap_abort_rx_srej_sent(chan); in l2cap_tx_state_wait_f()
2975 l2cap_send_ack(chan); in l2cap_tx_state_wait_f()
2980 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_wait_f()
2982 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) { in l2cap_tx_state_wait_f()
2988 local_control.reqseq = chan->buffer_seq; in l2cap_tx_state_wait_f()
2989 l2cap_send_sframe(chan, &local_control); in l2cap_tx_state_wait_f()
2991 chan->retry_count = 1; in l2cap_tx_state_wait_f()
2992 __set_monitor_timer(chan); in l2cap_tx_state_wait_f()
2993 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_wait_f()
2997 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_wait_f()
3002 __clear_monitor_timer(chan); in l2cap_tx_state_wait_f()
3003 if (chan->unacked_frames > 0) in l2cap_tx_state_wait_f()
3004 __set_retrans_timer(chan); in l2cap_tx_state_wait_f()
3005 chan->retry_count = 0; in l2cap_tx_state_wait_f()
3006 chan->tx_state = L2CAP_TX_STATE_XMIT; in l2cap_tx_state_wait_f()
3007 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state); in l2cap_tx_state_wait_f()
3014 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) { in l2cap_tx_state_wait_f()
3015 l2cap_send_rr_or_rnr(chan, 1); in l2cap_tx_state_wait_f()
3016 __set_monitor_timer(chan); in l2cap_tx_state_wait_f()
3017 chan->retry_count++; in l2cap_tx_state_wait_f()
3019 l2cap_send_disconn_req(chan, ECONNABORTED); in l2cap_tx_state_wait_f()
3027 static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_tx() argument
3031 chan, control, skbs, event, chan->tx_state); in l2cap_tx()
3033 switch (chan->tx_state) { in l2cap_tx()
3035 l2cap_tx_state_xmit(chan, control, skbs, event); in l2cap_tx()
3038 l2cap_tx_state_wait_f(chan, control, skbs, event); in l2cap_tx()
3046 static void l2cap_pass_to_tx(struct l2cap_chan *chan, in l2cap_pass_to_tx() argument
3049 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx()
3050 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT); in l2cap_pass_to_tx()
3053 static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan, in l2cap_pass_to_tx_fbit() argument
3056 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx_fbit()
3057 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT); in l2cap_pass_to_tx_fbit()
3064 struct l2cap_chan *chan; in l2cap_raw_recv() local
3070 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_raw_recv()
3071 if (chan->chan_type != L2CAP_CHAN_RAW) in l2cap_raw_recv()
3075 if (bt_cb(skb)->l2cap.chan == chan) in l2cap_raw_recv()
3081 if (chan->ops->recv(chan, nskb)) in l2cap_raw_recv()
3222 static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan, size_t size) in l2cap_add_opt_efs() argument
3226 switch (chan->mode) { in l2cap_add_opt_efs()
3228 efs.id = chan->local_id; in l2cap_add_opt_efs()
3229 efs.stype = chan->local_stype; in l2cap_add_opt_efs()
3230 efs.msdu = cpu_to_le16(chan->local_msdu); in l2cap_add_opt_efs()
3231 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime); in l2cap_add_opt_efs()
3239 efs.msdu = cpu_to_le16(chan->local_msdu); in l2cap_add_opt_efs()
3240 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime); in l2cap_add_opt_efs()
3255 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_ack_timeout() local
3259 BT_DBG("chan %p", chan); in l2cap_ack_timeout()
3261 l2cap_chan_lock(chan); in l2cap_ack_timeout()
3263 frames_to_ack = __seq_offset(chan, chan->buffer_seq, in l2cap_ack_timeout()
3264 chan->last_acked_seq); in l2cap_ack_timeout()
3267 l2cap_send_rr_or_rnr(chan, 0); in l2cap_ack_timeout()
3269 l2cap_chan_unlock(chan); in l2cap_ack_timeout()
3270 l2cap_chan_put(chan); in l2cap_ack_timeout()
3273 int l2cap_ertm_init(struct l2cap_chan *chan) in l2cap_ertm_init() argument
3277 chan->next_tx_seq = 0; in l2cap_ertm_init()
3278 chan->expected_tx_seq = 0; in l2cap_ertm_init()
3279 chan->expected_ack_seq = 0; in l2cap_ertm_init()
3280 chan->unacked_frames = 0; in l2cap_ertm_init()
3281 chan->buffer_seq = 0; in l2cap_ertm_init()
3282 chan->frames_sent = 0; in l2cap_ertm_init()
3283 chan->last_acked_seq = 0; in l2cap_ertm_init()
3284 chan->sdu = NULL; in l2cap_ertm_init()
3285 chan->sdu_last_frag = NULL; in l2cap_ertm_init()
3286 chan->sdu_len = 0; in l2cap_ertm_init()
3288 skb_queue_head_init(&chan->tx_q); in l2cap_ertm_init()
3290 chan->local_amp_id = AMP_ID_BREDR; in l2cap_ertm_init()
3291 chan->move_id = AMP_ID_BREDR; in l2cap_ertm_init()
3292 chan->move_state = L2CAP_MOVE_STABLE; in l2cap_ertm_init()
3293 chan->move_role = L2CAP_MOVE_ROLE_NONE; in l2cap_ertm_init()
3295 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_ertm_init()
3298 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_ertm_init()
3299 chan->tx_state = L2CAP_TX_STATE_XMIT; in l2cap_ertm_init()
3301 skb_queue_head_init(&chan->srej_q); in l2cap_ertm_init()
3303 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win); in l2cap_ertm_init()
3307 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win); in l2cap_ertm_init()
3309 l2cap_seq_list_free(&chan->srej_list); in l2cap_ertm_init()
3339 static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan, in __l2cap_set_ertm_timeouts() argument
3342 if (chan->local_amp_id != AMP_ID_BREDR && chan->hs_hcon) { in __l2cap_set_ertm_timeouts()
3343 u64 ertm_to = chan->hs_hcon->hdev->amp_be_flush_to; in __l2cap_set_ertm_timeouts()
3377 static inline void l2cap_txwin_setup(struct l2cap_chan *chan) in l2cap_txwin_setup() argument
3379 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW && in l2cap_txwin_setup()
3380 __l2cap_ews_supported(chan->conn)) { in l2cap_txwin_setup()
3382 set_bit(FLAG_EXT_CTRL, &chan->flags); in l2cap_txwin_setup()
3383 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW; in l2cap_txwin_setup()
3385 chan->tx_win = min_t(u16, chan->tx_win, in l2cap_txwin_setup()
3387 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW; in l2cap_txwin_setup()
3389 chan->ack_win = chan->tx_win; in l2cap_txwin_setup()
3392 static void l2cap_mtu_auto(struct l2cap_chan *chan) in l2cap_mtu_auto() argument
3394 struct hci_conn *conn = chan->conn->hcon; in l2cap_mtu_auto()
3396 chan->imtu = L2CAP_DEFAULT_MIN_MTU; in l2cap_mtu_auto()
3402 chan->imtu = 54; in l2cap_mtu_auto()
3408 chan->imtu = 83; in l2cap_mtu_auto()
3414 chan->imtu = 367; in l2cap_mtu_auto()
3420 chan->imtu = 552; in l2cap_mtu_auto()
3426 chan->imtu = 679; in l2cap_mtu_auto()
3432 chan->imtu = 1021; in l2cap_mtu_auto()
3435 static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size) in l2cap_build_conf_req() argument
3438 struct l2cap_conf_rfc rfc = { .mode = chan->mode }; in l2cap_build_conf_req()
3443 BT_DBG("chan %p", chan); in l2cap_build_conf_req()
3445 if (chan->num_conf_req || chan->num_conf_rsp) in l2cap_build_conf_req()
3448 switch (chan->mode) { in l2cap_build_conf_req()
3451 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) in l2cap_build_conf_req()
3454 if (__l2cap_efs_supported(chan->conn)) in l2cap_build_conf_req()
3455 set_bit(FLAG_EFS_ENABLE, &chan->flags); in l2cap_build_conf_req()
3459 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask); in l2cap_build_conf_req()
3464 if (chan->imtu != L2CAP_DEFAULT_MTU) { in l2cap_build_conf_req()
3465 if (!chan->imtu) in l2cap_build_conf_req()
3466 l2cap_mtu_auto(chan); in l2cap_build_conf_req()
3467 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, in l2cap_build_conf_req()
3471 switch (chan->mode) { in l2cap_build_conf_req()
3476 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) && in l2cap_build_conf_req()
3477 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING)) in l2cap_build_conf_req()
3493 rfc.max_transmit = chan->max_tx; in l2cap_build_conf_req()
3495 __l2cap_set_ertm_timeouts(chan, &rfc); in l2cap_build_conf_req()
3497 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu - in l2cap_build_conf_req()
3502 l2cap_txwin_setup(chan); in l2cap_build_conf_req()
3504 rfc.txwin_size = min_t(u16, chan->tx_win, in l2cap_build_conf_req()
3510 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) in l2cap_build_conf_req()
3511 l2cap_add_opt_efs(&ptr, chan, endptr - ptr); in l2cap_build_conf_req()
3513 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_build_conf_req()
3515 chan->tx_win, endptr - ptr); in l2cap_build_conf_req()
3517 if (chan->conn->feat_mask & L2CAP_FEAT_FCS) in l2cap_build_conf_req()
3518 if (chan->fcs == L2CAP_FCS_NONE || in l2cap_build_conf_req()
3519 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) { in l2cap_build_conf_req()
3520 chan->fcs = L2CAP_FCS_NONE; in l2cap_build_conf_req()
3522 chan->fcs, endptr - ptr); in l2cap_build_conf_req()
3527 l2cap_txwin_setup(chan); in l2cap_build_conf_req()
3534 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu - in l2cap_build_conf_req()
3542 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) in l2cap_build_conf_req()
3543 l2cap_add_opt_efs(&ptr, chan, endptr - ptr); in l2cap_build_conf_req()
3545 if (chan->conn->feat_mask & L2CAP_FEAT_FCS) in l2cap_build_conf_req()
3546 if (chan->fcs == L2CAP_FCS_NONE || in l2cap_build_conf_req()
3547 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) { in l2cap_build_conf_req()
3548 chan->fcs = L2CAP_FCS_NONE; in l2cap_build_conf_req()
3550 chan->fcs, endptr - ptr); in l2cap_build_conf_req()
3555 req->dcid = cpu_to_le16(chan->dcid); in l2cap_build_conf_req()
3561 static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data_size) in l2cap_parse_conf_req() argument
3566 void *req = chan->conf_req; in l2cap_parse_conf_req()
3567 int len = chan->conf_len; in l2cap_parse_conf_req()
3577 BT_DBG("chan %p", chan); in l2cap_parse_conf_req()
3597 chan->flush_to = val; in l2cap_parse_conf_req()
3613 set_bit(CONF_RECV_NO_FCS, &chan->conf_state); in l2cap_parse_conf_req()
3626 if (!(chan->conn->local_fixed_chan & L2CAP_FC_A2MP)) in l2cap_parse_conf_req()
3628 set_bit(FLAG_EXT_CTRL, &chan->flags); in l2cap_parse_conf_req()
3629 set_bit(CONF_EWS_RECV, &chan->conf_state); in l2cap_parse_conf_req()
3630 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW; in l2cap_parse_conf_req()
3631 chan->remote_tx_win = val; in l2cap_parse_conf_req()
3643 if (chan->num_conf_rsp || chan->num_conf_req > 1) in l2cap_parse_conf_req()
3646 switch (chan->mode) { in l2cap_parse_conf_req()
3649 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) { in l2cap_parse_conf_req()
3650 chan->mode = l2cap_select_mode(rfc.mode, in l2cap_parse_conf_req()
3651 chan->conn->feat_mask); in l2cap_parse_conf_req()
3656 if (__l2cap_efs_supported(chan->conn)) in l2cap_parse_conf_req()
3657 set_bit(FLAG_EFS_ENABLE, &chan->flags); in l2cap_parse_conf_req()
3662 if (chan->mode != rfc.mode) in l2cap_parse_conf_req()
3669 if (chan->mode != rfc.mode) { in l2cap_parse_conf_req()
3671 rfc.mode = chan->mode; in l2cap_parse_conf_req()
3673 if (chan->num_conf_rsp == 1) in l2cap_parse_conf_req()
3687 chan->omtu = mtu; in l2cap_parse_conf_req()
3688 set_bit(CONF_MTU_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3690 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu, endptr - ptr); in l2cap_parse_conf_req()
3693 if (chan->local_stype != L2CAP_SERV_NOTRAFIC && in l2cap_parse_conf_req()
3695 efs.stype != chan->local_stype) { in l2cap_parse_conf_req()
3699 if (chan->num_conf_req >= 1) in l2cap_parse_conf_req()
3708 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state); in l2cap_parse_conf_req()
3714 chan->fcs = L2CAP_FCS_NONE; in l2cap_parse_conf_req()
3715 set_bit(CONF_MODE_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3719 if (!test_bit(CONF_EWS_RECV, &chan->conf_state)) in l2cap_parse_conf_req()
3720 chan->remote_tx_win = rfc.txwin_size; in l2cap_parse_conf_req()
3724 chan->remote_max_tx = rfc.max_transmit; in l2cap_parse_conf_req()
3727 chan->conn->mtu - L2CAP_EXT_HDR_SIZE - in l2cap_parse_conf_req()
3730 chan->remote_mps = size; in l2cap_parse_conf_req()
3732 __l2cap_set_ertm_timeouts(chan, &rfc); in l2cap_parse_conf_req()
3734 set_bit(CONF_MODE_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3740 test_bit(FLAG_EFS_ENABLE, &chan->flags)) { in l2cap_parse_conf_req()
3741 chan->remote_id = efs.id; in l2cap_parse_conf_req()
3742 chan->remote_stype = efs.stype; in l2cap_parse_conf_req()
3743 chan->remote_msdu = le16_to_cpu(efs.msdu); in l2cap_parse_conf_req()
3744 chan->remote_flush_to = in l2cap_parse_conf_req()
3746 chan->remote_acc_lat = in l2cap_parse_conf_req()
3748 chan->remote_sdu_itime = in l2cap_parse_conf_req()
3758 chan->conn->mtu - L2CAP_EXT_HDR_SIZE - in l2cap_parse_conf_req()
3761 chan->remote_mps = size; in l2cap_parse_conf_req()
3763 set_bit(CONF_MODE_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3774 rfc.mode = chan->mode; in l2cap_parse_conf_req()
3778 set_bit(CONF_OUTPUT_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3780 rsp->scid = cpu_to_le16(chan->dcid); in l2cap_parse_conf_req()
3787 static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, in l2cap_parse_conf_rsp() argument
3798 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data); in l2cap_parse_conf_rsp()
3811 chan->imtu = L2CAP_DEFAULT_MIN_MTU; in l2cap_parse_conf_rsp()
3813 chan->imtu = val; in l2cap_parse_conf_rsp()
3814 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, in l2cap_parse_conf_rsp()
3821 chan->flush_to = val; in l2cap_parse_conf_rsp()
3823 chan->flush_to, endptr - ptr); in l2cap_parse_conf_rsp()
3830 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) && in l2cap_parse_conf_rsp()
3831 rfc.mode != chan->mode) in l2cap_parse_conf_rsp()
3833 chan->fcs = 0; in l2cap_parse_conf_rsp()
3841 chan->ack_win = min_t(u16, val, chan->ack_win); in l2cap_parse_conf_rsp()
3843 chan->tx_win, endptr - ptr); in l2cap_parse_conf_rsp()
3850 if (chan->local_stype != L2CAP_SERV_NOTRAFIC && in l2cap_parse_conf_rsp()
3852 efs.stype != chan->local_stype) in l2cap_parse_conf_rsp()
3864 &chan->conf_state); in l2cap_parse_conf_rsp()
3869 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode) in l2cap_parse_conf_rsp()
3872 chan->mode = rfc.mode; in l2cap_parse_conf_rsp()
3877 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout); in l2cap_parse_conf_rsp()
3878 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout); in l2cap_parse_conf_rsp()
3879 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_parse_conf_rsp()
3880 if (!test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_parse_conf_rsp()
3881 chan->ack_win = min_t(u16, chan->ack_win, in l2cap_parse_conf_rsp()
3884 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) { in l2cap_parse_conf_rsp()
3885 chan->local_msdu = le16_to_cpu(efs.msdu); in l2cap_parse_conf_rsp()
3886 chan->local_sdu_itime = in l2cap_parse_conf_rsp()
3888 chan->local_acc_lat = le32_to_cpu(efs.acc_lat); in l2cap_parse_conf_rsp()
3889 chan->local_flush_to = in l2cap_parse_conf_rsp()
3895 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_parse_conf_rsp()
3899 req->dcid = cpu_to_le16(chan->dcid); in l2cap_parse_conf_rsp()
3905 static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data, in l2cap_build_conf_rsp() argument
3911 BT_DBG("chan %p", chan); in l2cap_build_conf_rsp()
3913 rsp->scid = cpu_to_le16(chan->dcid); in l2cap_build_conf_rsp()
3920 void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan) in __l2cap_le_connect_rsp_defer() argument
3923 struct l2cap_conn *conn = chan->conn; in __l2cap_le_connect_rsp_defer()
3925 BT_DBG("chan %p", chan); in __l2cap_le_connect_rsp_defer()
3927 rsp.dcid = cpu_to_le16(chan->scid); in __l2cap_le_connect_rsp_defer()
3928 rsp.mtu = cpu_to_le16(chan->imtu); in __l2cap_le_connect_rsp_defer()
3929 rsp.mps = cpu_to_le16(chan->mps); in __l2cap_le_connect_rsp_defer()
3930 rsp.credits = cpu_to_le16(chan->rx_credits); in __l2cap_le_connect_rsp_defer()
3933 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in __l2cap_le_connect_rsp_defer()
3937 static void l2cap_ecred_list_defer(struct l2cap_chan *chan, void *data) in l2cap_ecred_list_defer() argument
3941 if (*result || test_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags)) in l2cap_ecred_list_defer()
3944 switch (chan->state) { in l2cap_ecred_list_defer()
3966 static void l2cap_ecred_rsp_defer(struct l2cap_chan *chan, void *data) in l2cap_ecred_rsp_defer() argument
3970 if (test_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags)) in l2cap_ecred_rsp_defer()
3974 chan->ident = 0; in l2cap_ecred_rsp_defer()
3978 rsp->pdu.rsp.dcid[rsp->count++] = cpu_to_le16(chan->scid); in l2cap_ecred_rsp_defer()
3980 l2cap_chan_del(chan, ECONNRESET); in l2cap_ecred_rsp_defer()
3983 void __l2cap_ecred_conn_rsp_defer(struct l2cap_chan *chan) in __l2cap_ecred_conn_rsp_defer() argument
3985 struct l2cap_conn *conn = chan->conn; in __l2cap_ecred_conn_rsp_defer()
3987 u16 id = chan->ident; in __l2cap_ecred_conn_rsp_defer()
3993 BT_DBG("chan %p id %d", chan, id); in __l2cap_ecred_conn_rsp_defer()
3997 data.pdu.rsp.mtu = cpu_to_le16(chan->imtu); in __l2cap_ecred_conn_rsp_defer()
3998 data.pdu.rsp.mps = cpu_to_le16(chan->mps); in __l2cap_ecred_conn_rsp_defer()
3999 data.pdu.rsp.credits = cpu_to_le16(chan->rx_credits); in __l2cap_ecred_conn_rsp_defer()
4019 void __l2cap_connect_rsp_defer(struct l2cap_chan *chan) in __l2cap_connect_rsp_defer() argument
4022 struct l2cap_conn *conn = chan->conn; in __l2cap_connect_rsp_defer()
4026 rsp.scid = cpu_to_le16(chan->dcid); in __l2cap_connect_rsp_defer()
4027 rsp.dcid = cpu_to_le16(chan->scid); in __l2cap_connect_rsp_defer()
4031 if (chan->hs_hcon) in __l2cap_connect_rsp_defer()
4036 BT_DBG("chan %p rsp_code %u", chan, rsp_code); in __l2cap_connect_rsp_defer()
4038 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp); in __l2cap_connect_rsp_defer()
4040 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) in __l2cap_connect_rsp_defer()
4044 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in __l2cap_connect_rsp_defer()
4045 chan->num_conf_req++; in __l2cap_connect_rsp_defer()
4048 static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len) in l2cap_conf_rfc_get() argument
4055 u16 txwin_ext = chan->ack_win; in l2cap_conf_rfc_get()
4057 .mode = chan->mode, in l2cap_conf_rfc_get()
4060 .max_pdu_size = cpu_to_le16(chan->imtu), in l2cap_conf_rfc_get()
4061 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW), in l2cap_conf_rfc_get()
4064 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len); in l2cap_conf_rfc_get()
4066 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING)) in l2cap_conf_rfc_get()
4090 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout); in l2cap_conf_rfc_get()
4091 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout); in l2cap_conf_rfc_get()
4092 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_conf_rfc_get()
4093 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_conf_rfc_get()
4094 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext); in l2cap_conf_rfc_get()
4096 chan->ack_win = min_t(u16, chan->ack_win, in l2cap_conf_rfc_get()
4100 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_conf_rfc_get()
4135 struct l2cap_chan *chan = NULL, *pchan; in l2cap_connect() local
4176 chan = pchan->ops->new_connection(pchan); in l2cap_connect()
4177 if (!chan) in l2cap_connect()
4187 bacpy(&chan->src, &conn->hcon->src); in l2cap_connect()
4188 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_connect()
4189 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_connect()
4190 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_connect()
4191 chan->psm = psm; in l2cap_connect()
4192 chan->dcid = scid; in l2cap_connect()
4193 chan->local_amp_id = amp_id; in l2cap_connect()
4195 __l2cap_chan_add(conn, chan); in l2cap_connect()
4197 dcid = chan->scid; in l2cap_connect()
4199 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_connect()
4201 chan->ident = cmd->ident; in l2cap_connect()
4204 if (l2cap_chan_check_security(chan, false)) { in l2cap_connect()
4205 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_connect()
4206 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4209 chan->ops->defer(chan); in l2cap_connect()
4216 l2cap_state_change(chan, BT_CONFIG); in l2cap_connect()
4219 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4225 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4230 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4260 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) && in l2cap_connect()
4263 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_connect()
4265 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_connect()
4266 chan->num_conf_req++; in l2cap_connect()
4269 return chan; in l2cap_connect()
4297 struct l2cap_chan *chan; in l2cap_connect_create_rsp() local
4319 chan = __l2cap_get_chan_by_scid(conn, scid); in l2cap_connect_create_rsp()
4320 if (!chan) { in l2cap_connect_create_rsp()
4325 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_connect_create_rsp()
4326 if (!chan) { in l2cap_connect_create_rsp()
4332 chan = l2cap_chan_hold_unless_zero(chan); in l2cap_connect_create_rsp()
4333 if (!chan) { in l2cap_connect_create_rsp()
4340 l2cap_chan_lock(chan); in l2cap_connect_create_rsp()
4349 l2cap_state_change(chan, BT_CONFIG); in l2cap_connect_create_rsp()
4350 chan->ident = 0; in l2cap_connect_create_rsp()
4351 chan->dcid = dcid; in l2cap_connect_create_rsp()
4352 clear_bit(CONF_CONNECT_PEND, &chan->conf_state); in l2cap_connect_create_rsp()
4354 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) in l2cap_connect_create_rsp()
4358 l2cap_build_conf_req(chan, req, sizeof(req)), req); in l2cap_connect_create_rsp()
4359 chan->num_conf_req++; in l2cap_connect_create_rsp()
4363 set_bit(CONF_CONNECT_PEND, &chan->conf_state); in l2cap_connect_create_rsp()
4367 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_connect_create_rsp()
4371 l2cap_chan_unlock(chan); in l2cap_connect_create_rsp()
4372 l2cap_chan_put(chan); in l2cap_connect_create_rsp()
4380 static inline void set_default_fcs(struct l2cap_chan *chan) in set_default_fcs() argument
4385 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING) in set_default_fcs()
4386 chan->fcs = L2CAP_FCS_NONE; in set_default_fcs()
4387 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) in set_default_fcs()
4388 chan->fcs = L2CAP_FCS_CRC16; in set_default_fcs()
4391 static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data, in l2cap_send_efs_conf_rsp() argument
4394 struct l2cap_conn *conn = chan->conn; in l2cap_send_efs_conf_rsp()
4396 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident, in l2cap_send_efs_conf_rsp()
4399 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state); in l2cap_send_efs_conf_rsp()
4400 set_bit(CONF_OUTPUT_DONE, &chan->conf_state); in l2cap_send_efs_conf_rsp()
4403 l2cap_build_conf_rsp(chan, data, in l2cap_send_efs_conf_rsp()
4426 struct l2cap_chan *chan; in l2cap_config_req() local
4437 chan = l2cap_get_chan_by_scid(conn, dcid); in l2cap_config_req()
4438 if (!chan) { in l2cap_config_req()
4443 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2 && in l2cap_config_req()
4444 chan->state != BT_CONNECTED) { in l2cap_config_req()
4445 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid, in l2cap_config_req()
4446 chan->dcid); in l2cap_config_req()
4452 if (chan->conf_len + len > sizeof(chan->conf_req)) { in l2cap_config_req()
4454 l2cap_build_conf_rsp(chan, rsp, in l2cap_config_req()
4460 memcpy(chan->conf_req + chan->conf_len, req->data, len); in l2cap_config_req()
4461 chan->conf_len += len; in l2cap_config_req()
4466 l2cap_build_conf_rsp(chan, rsp, in l2cap_config_req()
4472 len = l2cap_parse_conf_req(chan, rsp, sizeof(rsp)); in l2cap_config_req()
4474 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_req()
4478 chan->ident = cmd->ident; in l2cap_config_req()
4480 if (chan->num_conf_rsp < L2CAP_CONF_MAX_CONF_RSP) in l2cap_config_req()
4481 chan->num_conf_rsp++; in l2cap_config_req()
4484 chan->conf_len = 0; in l2cap_config_req()
4486 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) in l2cap_config_req()
4489 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) { in l2cap_config_req()
4490 set_default_fcs(chan); in l2cap_config_req()
4492 if (chan->mode == L2CAP_MODE_ERTM || in l2cap_config_req()
4493 chan->mode == L2CAP_MODE_STREAMING) in l2cap_config_req()
4494 err = l2cap_ertm_init(chan); in l2cap_config_req()
4497 l2cap_send_disconn_req(chan, -err); in l2cap_config_req()
4499 l2cap_chan_ready(chan); in l2cap_config_req()
4504 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) { in l2cap_config_req()
4507 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_config_req()
4508 chan->num_conf_req++; in l2cap_config_req()
4513 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) && in l2cap_config_req()
4514 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) { in l2cap_config_req()
4519 if (!chan->hs_hcon) in l2cap_config_req()
4520 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags); in l2cap_config_req()
4522 chan->ident = cmd->ident; in l2cap_config_req()
4526 l2cap_chan_unlock(chan); in l2cap_config_req()
4527 l2cap_chan_put(chan); in l2cap_config_req()
4537 struct l2cap_chan *chan; in l2cap_config_rsp() local
4551 chan = l2cap_get_chan_by_scid(conn, scid); in l2cap_config_rsp()
4552 if (!chan) in l2cap_config_rsp()
4557 l2cap_conf_rfc_get(chan, rsp->data, len); in l2cap_config_rsp()
4558 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state); in l2cap_config_rsp()
4562 set_bit(CONF_REM_CONF_PEND, &chan->conf_state); in l2cap_config_rsp()
4564 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) { in l2cap_config_rsp()
4567 len = l2cap_parse_conf_rsp(chan, rsp->data, len, in l2cap_config_rsp()
4570 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4574 if (!chan->hs_hcon) { in l2cap_config_rsp()
4575 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident, in l2cap_config_rsp()
4578 if (l2cap_check_efs(chan)) { in l2cap_config_rsp()
4579 amp_create_logical_link(chan); in l2cap_config_rsp()
4580 chan->ident = cmd->ident; in l2cap_config_rsp()
4588 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) { in l2cap_config_rsp()
4592 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4598 len = l2cap_parse_conf_rsp(chan, rsp->data, len, in l2cap_config_rsp()
4601 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4607 chan->num_conf_req++; in l2cap_config_rsp()
4615 l2cap_chan_set_err(chan, ECONNRESET); in l2cap_config_rsp()
4617 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT); in l2cap_config_rsp()
4618 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4625 set_bit(CONF_INPUT_DONE, &chan->conf_state); in l2cap_config_rsp()
4627 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) { in l2cap_config_rsp()
4628 set_default_fcs(chan); in l2cap_config_rsp()
4630 if (chan->mode == L2CAP_MODE_ERTM || in l2cap_config_rsp()
4631 chan->mode == L2CAP_MODE_STREAMING) in l2cap_config_rsp()
4632 err = l2cap_ertm_init(chan); in l2cap_config_rsp()
4635 l2cap_send_disconn_req(chan, -err); in l2cap_config_rsp()
4637 l2cap_chan_ready(chan); in l2cap_config_rsp()
4641 l2cap_chan_unlock(chan); in l2cap_config_rsp()
4642 l2cap_chan_put(chan); in l2cap_config_rsp()
4653 struct l2cap_chan *chan; in l2cap_disconnect_req() local
4663 chan = l2cap_get_chan_by_scid(conn, dcid); in l2cap_disconnect_req()
4664 if (!chan) { in l2cap_disconnect_req()
4669 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_disconnect_req()
4670 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_disconnect_req()
4673 chan->ops->set_shutdown(chan); in l2cap_disconnect_req()
4675 l2cap_chan_unlock(chan); in l2cap_disconnect_req()
4677 l2cap_chan_lock(chan); in l2cap_disconnect_req()
4678 l2cap_chan_del(chan, ECONNRESET); in l2cap_disconnect_req()
4681 chan->ops->close(chan); in l2cap_disconnect_req()
4683 l2cap_chan_unlock(chan); in l2cap_disconnect_req()
4684 l2cap_chan_put(chan); in l2cap_disconnect_req()
4695 struct l2cap_chan *chan; in l2cap_disconnect_rsp() local
4705 chan = l2cap_get_chan_by_scid(conn, scid); in l2cap_disconnect_rsp()
4706 if (!chan) { in l2cap_disconnect_rsp()
4710 if (chan->state != BT_DISCONN) { in l2cap_disconnect_rsp()
4711 l2cap_chan_unlock(chan); in l2cap_disconnect_rsp()
4712 l2cap_chan_put(chan); in l2cap_disconnect_rsp()
4716 l2cap_chan_unlock(chan); in l2cap_disconnect_rsp()
4718 l2cap_chan_lock(chan); in l2cap_disconnect_rsp()
4719 l2cap_chan_del(chan, 0); in l2cap_disconnect_rsp()
4722 chan->ops->close(chan); in l2cap_disconnect_rsp()
4724 l2cap_chan_unlock(chan); in l2cap_disconnect_rsp()
4725 l2cap_chan_put(chan); in l2cap_disconnect_rsp()
4850 struct l2cap_chan *chan; in l2cap_create_channel_req() local
4882 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP, in l2cap_create_channel_req()
4884 if (chan) { in l2cap_create_channel_req()
4892 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid, in l2cap_create_channel_req()
4893 chan->dcid); in l2cap_create_channel_req()
4897 BT_DBG("mgr %p bredr_chan %p hs_hcon %p", mgr, chan, hs_hcon); in l2cap_create_channel_req()
4899 mgr->bredr_chan = chan; in l2cap_create_channel_req()
4900 chan->hs_hcon = hs_hcon; in l2cap_create_channel_req()
4901 chan->fcs = L2CAP_FCS_NONE; in l2cap_create_channel_req()
4921 static void l2cap_send_move_chan_req(struct l2cap_chan *chan, u8 dest_amp_id) in l2cap_send_move_chan_req() argument
4926 BT_DBG("chan %p, dest_amp_id %d", chan, dest_amp_id); in l2cap_send_move_chan_req()
4928 ident = l2cap_get_ident(chan->conn); in l2cap_send_move_chan_req()
4929 chan->ident = ident; in l2cap_send_move_chan_req()
4931 req.icid = cpu_to_le16(chan->scid); in l2cap_send_move_chan_req()
4934 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req), in l2cap_send_move_chan_req()
4937 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT); in l2cap_send_move_chan_req()
4940 static void l2cap_send_move_chan_rsp(struct l2cap_chan *chan, u16 result) in l2cap_send_move_chan_rsp() argument
4944 BT_DBG("chan %p, result 0x%4.4x", chan, result); in l2cap_send_move_chan_rsp()
4946 rsp.icid = cpu_to_le16(chan->dcid); in l2cap_send_move_chan_rsp()
4949 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP, in l2cap_send_move_chan_rsp()
4953 static void l2cap_send_move_chan_cfm(struct l2cap_chan *chan, u16 result) in l2cap_send_move_chan_cfm() argument
4957 BT_DBG("chan %p, result 0x%4.4x", chan, result); in l2cap_send_move_chan_cfm()
4959 chan->ident = l2cap_get_ident(chan->conn); in l2cap_send_move_chan_cfm()
4961 cfm.icid = cpu_to_le16(chan->scid); in l2cap_send_move_chan_cfm()
4964 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM, in l2cap_send_move_chan_cfm()
4967 __set_chan_timer(chan, L2CAP_MOVE_TIMEOUT); in l2cap_send_move_chan_cfm()
4994 static void __release_logical_link(struct l2cap_chan *chan) in __release_logical_link() argument
4996 chan->hs_hchan = NULL; in __release_logical_link()
4997 chan->hs_hcon = NULL; in __release_logical_link()
5002 static void l2cap_logical_fail(struct l2cap_chan *chan) in l2cap_logical_fail() argument
5005 if (chan->state != BT_CONNECTED) { in l2cap_logical_fail()
5007 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_logical_fail()
5011 switch (chan->move_role) { in l2cap_logical_fail()
5013 l2cap_move_done(chan); in l2cap_logical_fail()
5014 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_SUPP); in l2cap_logical_fail()
5017 if (chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_COMP || in l2cap_logical_fail()
5018 chan->move_state == L2CAP_MOVE_WAIT_LOGICAL_CFM) { in l2cap_logical_fail()
5022 l2cap_move_done(chan); in l2cap_logical_fail()
5028 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED); in l2cap_logical_fail()
5033 static void l2cap_logical_finish_create(struct l2cap_chan *chan, in l2cap_logical_finish_create() argument
5038 chan->hs_hchan = hchan; in l2cap_logical_finish_create()
5039 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_logical_finish_create()
5041 l2cap_send_efs_conf_rsp(chan, &rsp, chan->ident, 0); in l2cap_logical_finish_create()
5043 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) { in l2cap_logical_finish_create()
5046 set_default_fcs(chan); in l2cap_logical_finish_create()
5048 err = l2cap_ertm_init(chan); in l2cap_logical_finish_create()
5050 l2cap_send_disconn_req(chan, -err); in l2cap_logical_finish_create()
5052 l2cap_chan_ready(chan); in l2cap_logical_finish_create()
5056 static void l2cap_logical_finish_move(struct l2cap_chan *chan, in l2cap_logical_finish_move() argument
5059 chan->hs_hcon = hchan->conn; in l2cap_logical_finish_move()
5060 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_logical_finish_move()
5062 BT_DBG("move_state %d", chan->move_state); in l2cap_logical_finish_move()
5064 switch (chan->move_state) { in l2cap_logical_finish_move()
5069 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS; in l2cap_logical_finish_move()
5072 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_logical_finish_move()
5073 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY; in l2cap_logical_finish_move()
5074 } else if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) { in l2cap_logical_finish_move()
5075 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP; in l2cap_logical_finish_move()
5076 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED); in l2cap_logical_finish_move()
5077 } else if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) { in l2cap_logical_finish_move()
5078 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM; in l2cap_logical_finish_move()
5079 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS); in l2cap_logical_finish_move()
5084 __release_logical_link(chan); in l2cap_logical_finish_move()
5086 chan->move_state = L2CAP_MOVE_STABLE; in l2cap_logical_finish_move()
5091 void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan, in l2cap_logical_cfm() argument
5094 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status); in l2cap_logical_cfm()
5097 l2cap_logical_fail(chan); in l2cap_logical_cfm()
5098 __release_logical_link(chan); in l2cap_logical_cfm()
5102 if (chan->state != BT_CONNECTED) { in l2cap_logical_cfm()
5104 if (chan->local_amp_id != AMP_ID_BREDR) in l2cap_logical_cfm()
5105 l2cap_logical_finish_create(chan, hchan); in l2cap_logical_cfm()
5107 l2cap_logical_finish_move(chan, hchan); in l2cap_logical_cfm()
5111 void l2cap_move_start(struct l2cap_chan *chan) in l2cap_move_start() argument
5113 BT_DBG("chan %p", chan); in l2cap_move_start()
5115 if (chan->local_amp_id == AMP_ID_BREDR) { in l2cap_move_start()
5116 if (chan->chan_policy != BT_CHANNEL_POLICY_AMP_PREFERRED) in l2cap_move_start()
5118 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR; in l2cap_move_start()
5119 chan->move_state = L2CAP_MOVE_WAIT_PREPARE; in l2cap_move_start()
5122 chan->move_role = L2CAP_MOVE_ROLE_INITIATOR; in l2cap_move_start()
5123 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS; in l2cap_move_start()
5124 chan->move_id = 0; in l2cap_move_start()
5125 l2cap_move_setup(chan); in l2cap_move_start()
5126 l2cap_send_move_chan_req(chan, 0); in l2cap_move_start()
5130 static void l2cap_do_create(struct l2cap_chan *chan, int result, in l2cap_do_create() argument
5133 BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state), in l2cap_do_create()
5136 chan->fcs = L2CAP_FCS_NONE; in l2cap_do_create()
5139 if (chan->state == BT_CONNECT) { in l2cap_do_create()
5141 chan->local_amp_id = local_amp_id; in l2cap_do_create()
5142 l2cap_send_create_chan_req(chan, remote_amp_id); in l2cap_do_create()
5145 l2cap_send_conn_req(chan); in l2cap_do_create()
5152 if (__l2cap_no_conn_pending(chan)) { in l2cap_do_create()
5155 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_do_create()
5156 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_do_create()
5168 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP, in l2cap_do_create()
5172 l2cap_state_change(chan, BT_CONFIG); in l2cap_do_create()
5173 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_do_create()
5174 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn), in l2cap_do_create()
5176 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_do_create()
5177 chan->num_conf_req++; in l2cap_do_create()
5182 static void l2cap_do_move_initiate(struct l2cap_chan *chan, u8 local_amp_id, in l2cap_do_move_initiate() argument
5185 l2cap_move_setup(chan); in l2cap_do_move_initiate()
5186 chan->move_id = local_amp_id; in l2cap_do_move_initiate()
5187 chan->move_state = L2CAP_MOVE_WAIT_RSP; in l2cap_do_move_initiate()
5189 l2cap_send_move_chan_req(chan, remote_amp_id); in l2cap_do_move_initiate()
5192 static void l2cap_do_move_respond(struct l2cap_chan *chan, int result) in l2cap_do_move_respond() argument
5201 chan->hs_hcon = hchan->conn; in l2cap_do_move_respond()
5202 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_do_move_respond()
5203 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM; in l2cap_do_move_respond()
5204 l2cap_send_move_chan_rsp(chan, L2CAP_MR_SUCCESS); in l2cap_do_move_respond()
5206 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS); in l2cap_do_move_respond()
5209 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM; in l2cap_do_move_respond()
5213 l2cap_send_move_chan_rsp(chan, L2CAP_MR_NOT_ALLOWED); in l2cap_do_move_respond()
5217 static void l2cap_do_move_cancel(struct l2cap_chan *chan, int result) in l2cap_do_move_cancel() argument
5219 if (chan->move_role == L2CAP_MOVE_ROLE_RESPONDER) { in l2cap_do_move_cancel()
5226 l2cap_send_move_chan_rsp(chan, rsp_result); in l2cap_do_move_cancel()
5229 chan->move_role = L2CAP_MOVE_ROLE_NONE; in l2cap_do_move_cancel()
5230 chan->move_state = L2CAP_MOVE_STABLE; in l2cap_do_move_cancel()
5233 l2cap_ertm_send(chan); in l2cap_do_move_cancel()
5237 void __l2cap_physical_cfm(struct l2cap_chan *chan, int result) in __l2cap_physical_cfm() argument
5239 u8 local_amp_id = chan->local_amp_id; in __l2cap_physical_cfm()
5240 u8 remote_amp_id = chan->remote_amp_id; in __l2cap_physical_cfm()
5243 chan, result, local_amp_id, remote_amp_id); in __l2cap_physical_cfm()
5245 if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) in __l2cap_physical_cfm()
5248 if (chan->state != BT_CONNECTED) { in __l2cap_physical_cfm()
5249 l2cap_do_create(chan, result, local_amp_id, remote_amp_id); in __l2cap_physical_cfm()
5251 l2cap_do_move_cancel(chan, result); in __l2cap_physical_cfm()
5253 switch (chan->move_role) { in __l2cap_physical_cfm()
5255 l2cap_do_move_initiate(chan, local_amp_id, in __l2cap_physical_cfm()
5259 l2cap_do_move_respond(chan, result); in __l2cap_physical_cfm()
5262 l2cap_do_move_cancel(chan, result); in __l2cap_physical_cfm()
5274 struct l2cap_chan *chan; in l2cap_move_channel_req() local
5288 chan = l2cap_get_chan_by_dcid(conn, icid); in l2cap_move_channel_req()
5289 if (!chan) { in l2cap_move_channel_req()
5297 chan->ident = cmd->ident; in l2cap_move_channel_req()
5299 if (chan->scid < L2CAP_CID_DYN_START || in l2cap_move_channel_req()
5300 chan->chan_policy == BT_CHANNEL_POLICY_BREDR_ONLY || in l2cap_move_channel_req()
5301 (chan->mode != L2CAP_MODE_ERTM && in l2cap_move_channel_req()
5302 chan->mode != L2CAP_MODE_STREAMING)) { in l2cap_move_channel_req()
5307 if (chan->local_amp_id == req->dest_amp_id) { in l2cap_move_channel_req()
5330 if ((__chan_is_moving(chan) || in l2cap_move_channel_req()
5331 chan->move_role != L2CAP_MOVE_ROLE_NONE) && in l2cap_move_channel_req()
5337 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER; in l2cap_move_channel_req()
5338 l2cap_move_setup(chan); in l2cap_move_channel_req()
5339 chan->move_id = req->dest_amp_id; in l2cap_move_channel_req()
5343 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_move_channel_req()
5344 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY; in l2cap_move_channel_req()
5347 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM; in l2cap_move_channel_req()
5351 chan->move_state = L2CAP_MOVE_WAIT_PREPARE; in l2cap_move_channel_req()
5358 l2cap_send_move_chan_rsp(chan, result); in l2cap_move_channel_req()
5360 l2cap_chan_unlock(chan); in l2cap_move_channel_req()
5361 l2cap_chan_put(chan); in l2cap_move_channel_req()
5368 struct l2cap_chan *chan; in l2cap_move_continue() local
5371 chan = l2cap_get_chan_by_scid(conn, icid); in l2cap_move_continue()
5372 if (!chan) { in l2cap_move_continue()
5377 __clear_chan_timer(chan); in l2cap_move_continue()
5379 __set_chan_timer(chan, L2CAP_MOVE_ERTX_TIMEOUT); in l2cap_move_continue()
5381 switch (chan->move_state) { in l2cap_move_continue()
5386 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM; in l2cap_move_continue()
5392 &chan->conn_state)) { in l2cap_move_continue()
5393 chan->move_state = L2CAP_MOVE_WAIT_LOCAL_BUSY; in l2cap_move_continue()
5398 chan->move_state = L2CAP_MOVE_WAIT_CONFIRM_RSP; in l2cap_move_continue()
5399 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED); in l2cap_move_continue()
5408 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_CFM; in l2cap_move_continue()
5413 chan->move_state = L2CAP_MOVE_WAIT_LOGICAL_COMP; in l2cap_move_continue()
5419 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED); in l2cap_move_continue()
5431 chan->hs_hcon = hchan->conn; in l2cap_move_continue()
5432 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_move_continue()
5436 l2cap_send_move_chan_cfm(chan, L2CAP_MC_CONFIRMED); in l2cap_move_continue()
5441 chan->move_state = L2CAP_MOVE_WAIT_RSP_SUCCESS; in l2cap_move_continue()
5444 l2cap_logical_cfm(chan, hchan, L2CAP_MR_SUCCESS); in l2cap_move_continue()
5448 chan->move_id = chan->local_amp_id; in l2cap_move_continue()
5449 l2cap_move_done(chan); in l2cap_move_continue()
5450 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED); in l2cap_move_continue()
5453 l2cap_chan_unlock(chan); in l2cap_move_continue()
5454 l2cap_chan_put(chan); in l2cap_move_continue()
5460 struct l2cap_chan *chan; in l2cap_move_fail() local
5462 chan = l2cap_get_chan_by_ident(conn, ident); in l2cap_move_fail()
5463 if (!chan) { in l2cap_move_fail()
5469 __clear_chan_timer(chan); in l2cap_move_fail()
5471 if (chan->move_role == L2CAP_MOVE_ROLE_INITIATOR) { in l2cap_move_fail()
5473 chan->move_role = L2CAP_MOVE_ROLE_RESPONDER; in l2cap_move_fail()
5476 chan->move_id = chan->local_amp_id; in l2cap_move_fail()
5477 l2cap_move_done(chan); in l2cap_move_fail()
5481 l2cap_send_move_chan_cfm(chan, L2CAP_MC_UNCONFIRMED); in l2cap_move_fail()
5483 l2cap_chan_unlock(chan); in l2cap_move_fail()
5484 l2cap_chan_put(chan); in l2cap_move_fail()
5515 struct l2cap_chan *chan; in l2cap_move_channel_confirm() local
5526 chan = l2cap_get_chan_by_dcid(conn, icid); in l2cap_move_channel_confirm()
5527 if (!chan) { in l2cap_move_channel_confirm()
5533 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM) { in l2cap_move_channel_confirm()
5535 chan->local_amp_id = chan->move_id; in l2cap_move_channel_confirm()
5536 if (chan->local_amp_id == AMP_ID_BREDR) in l2cap_move_channel_confirm()
5537 __release_logical_link(chan); in l2cap_move_channel_confirm()
5539 chan->move_id = chan->local_amp_id; in l2cap_move_channel_confirm()
5542 l2cap_move_done(chan); in l2cap_move_channel_confirm()
5547 l2cap_chan_unlock(chan); in l2cap_move_channel_confirm()
5548 l2cap_chan_put(chan); in l2cap_move_channel_confirm()
5558 struct l2cap_chan *chan; in l2cap_move_channel_confirm_rsp() local
5568 chan = l2cap_get_chan_by_scid(conn, icid); in l2cap_move_channel_confirm_rsp()
5569 if (!chan) in l2cap_move_channel_confirm_rsp()
5572 __clear_chan_timer(chan); in l2cap_move_channel_confirm_rsp()
5574 if (chan->move_state == L2CAP_MOVE_WAIT_CONFIRM_RSP) { in l2cap_move_channel_confirm_rsp()
5575 chan->local_amp_id = chan->move_id; in l2cap_move_channel_confirm_rsp()
5577 if (chan->local_amp_id == AMP_ID_BREDR && chan->hs_hchan) in l2cap_move_channel_confirm_rsp()
5578 __release_logical_link(chan); in l2cap_move_channel_confirm_rsp()
5580 l2cap_move_done(chan); in l2cap_move_channel_confirm_rsp()
5583 l2cap_chan_unlock(chan); in l2cap_move_channel_confirm_rsp()
5584 l2cap_chan_put(chan); in l2cap_move_channel_confirm_rsp()
5646 struct l2cap_chan *chan; in l2cap_le_connect_rsp() local
5668 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_le_connect_rsp()
5669 if (!chan) { in l2cap_le_connect_rsp()
5676 l2cap_chan_lock(chan); in l2cap_le_connect_rsp()
5685 chan->ident = 0; in l2cap_le_connect_rsp()
5686 chan->dcid = dcid; in l2cap_le_connect_rsp()
5687 chan->omtu = mtu; in l2cap_le_connect_rsp()
5688 chan->remote_mps = mps; in l2cap_le_connect_rsp()
5689 chan->tx_credits = credits; in l2cap_le_connect_rsp()
5690 l2cap_chan_ready(chan); in l2cap_le_connect_rsp()
5699 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_le_connect_rsp()
5704 if (chan->sec_level < sec_level) in l2cap_le_connect_rsp()
5705 chan->sec_level = sec_level; in l2cap_le_connect_rsp()
5708 clear_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags); in l2cap_le_connect_rsp()
5710 smp_conn_security(hcon, chan->sec_level); in l2cap_le_connect_rsp()
5714 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_le_connect_rsp()
5718 l2cap_chan_unlock(chan); in l2cap_le_connect_rsp()
5812 struct l2cap_chan *chan, *pchan; in l2cap_le_connect_req() local
5842 chan = NULL; in l2cap_le_connect_req()
5851 chan = NULL; in l2cap_le_connect_req()
5861 chan = NULL; in l2cap_le_connect_req()
5868 chan = NULL; in l2cap_le_connect_req()
5875 chan = NULL; in l2cap_le_connect_req()
5879 chan = pchan->ops->new_connection(pchan); in l2cap_le_connect_req()
5880 if (!chan) { in l2cap_le_connect_req()
5885 bacpy(&chan->src, &conn->hcon->src); in l2cap_le_connect_req()
5886 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_le_connect_req()
5887 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_le_connect_req()
5888 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_le_connect_req()
5889 chan->psm = psm; in l2cap_le_connect_req()
5890 chan->dcid = scid; in l2cap_le_connect_req()
5891 chan->omtu = mtu; in l2cap_le_connect_req()
5892 chan->remote_mps = mps; in l2cap_le_connect_req()
5894 __l2cap_chan_add(conn, chan); in l2cap_le_connect_req()
5896 l2cap_le_flowctl_init(chan, __le16_to_cpu(req->credits)); in l2cap_le_connect_req()
5898 dcid = chan->scid; in l2cap_le_connect_req()
5899 credits = chan->rx_credits; in l2cap_le_connect_req()
5901 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_le_connect_req()
5903 chan->ident = cmd->ident; in l2cap_le_connect_req()
5905 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_le_connect_req()
5906 l2cap_state_change(chan, BT_CONNECT2); in l2cap_le_connect_req()
5913 chan->ops->defer(chan); in l2cap_le_connect_req()
5915 l2cap_chan_ready(chan); in l2cap_le_connect_req()
5928 if (chan) { in l2cap_le_connect_req()
5929 rsp.mtu = cpu_to_le16(chan->imtu); in l2cap_le_connect_req()
5930 rsp.mps = cpu_to_le16(chan->mps); in l2cap_le_connect_req()
5950 struct l2cap_chan *chan; in l2cap_le_credits() local
5962 chan = l2cap_get_chan_by_dcid(conn, cid); in l2cap_le_credits()
5963 if (!chan) in l2cap_le_credits()
5966 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits; in l2cap_le_credits()
5969 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_le_credits()
5977 chan->tx_credits += credits; in l2cap_le_credits()
5980 l2cap_le_flowctl_send(chan); in l2cap_le_credits()
5982 if (chan->tx_credits) in l2cap_le_credits()
5983 chan->ops->resume(chan); in l2cap_le_credits()
5986 l2cap_chan_unlock(chan); in l2cap_le_credits()
5987 l2cap_chan_put(chan); in l2cap_le_credits()
6001 struct l2cap_chan *chan, *pchan; in l2cap_ecred_conn_req() local
6089 chan = pchan->ops->new_connection(pchan); in l2cap_ecred_conn_req()
6090 if (!chan) { in l2cap_ecred_conn_req()
6095 bacpy(&chan->src, &conn->hcon->src); in l2cap_ecred_conn_req()
6096 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_ecred_conn_req()
6097 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_ecred_conn_req()
6098 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_ecred_conn_req()
6099 chan->psm = psm; in l2cap_ecred_conn_req()
6100 chan->dcid = scid; in l2cap_ecred_conn_req()
6101 chan->omtu = mtu; in l2cap_ecred_conn_req()
6102 chan->remote_mps = mps; in l2cap_ecred_conn_req()
6104 __l2cap_chan_add(conn, chan); in l2cap_ecred_conn_req()
6106 l2cap_ecred_init(chan, __le16_to_cpu(req->credits)); in l2cap_ecred_conn_req()
6110 pdu.rsp.mtu = cpu_to_le16(chan->imtu); in l2cap_ecred_conn_req()
6111 pdu.rsp.mps = cpu_to_le16(chan->mps); in l2cap_ecred_conn_req()
6112 pdu.rsp.credits = cpu_to_le16(chan->rx_credits); in l2cap_ecred_conn_req()
6115 pdu.dcid[i] = cpu_to_le16(chan->scid); in l2cap_ecred_conn_req()
6117 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_ecred_conn_req()
6119 chan->ident = cmd->ident; in l2cap_ecred_conn_req()
6120 chan->mode = L2CAP_MODE_EXT_FLOWCTL; in l2cap_ecred_conn_req()
6122 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_ecred_conn_req()
6123 l2cap_state_change(chan, BT_CONNECT2); in l2cap_ecred_conn_req()
6125 chan->ops->defer(chan); in l2cap_ecred_conn_req()
6127 l2cap_chan_ready(chan); in l2cap_ecred_conn_req()
6155 struct l2cap_chan *chan, *tmp; in l2cap_ecred_conn_rsp() local
6174 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) { in l2cap_ecred_conn_rsp()
6177 if (chan->ident != cmd->ident || in l2cap_ecred_conn_rsp()
6178 chan->mode != L2CAP_MODE_EXT_FLOWCTL || in l2cap_ecred_conn_rsp()
6179 chan->state == BT_CONNECTED) in l2cap_ecred_conn_rsp()
6182 l2cap_chan_lock(chan); in l2cap_ecred_conn_rsp()
6186 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6187 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
6204 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6205 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
6206 chan = __l2cap_get_chan_by_dcid(conn, dcid); in l2cap_ecred_conn_rsp()
6207 l2cap_chan_lock(chan); in l2cap_ecred_conn_rsp()
6208 l2cap_chan_del(chan, ECONNRESET); in l2cap_ecred_conn_rsp()
6209 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
6220 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6225 if (chan->sec_level < sec_level) in l2cap_ecred_conn_rsp()
6226 chan->sec_level = sec_level; in l2cap_ecred_conn_rsp()
6229 clear_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags); in l2cap_ecred_conn_rsp()
6231 smp_conn_security(hcon, chan->sec_level); in l2cap_ecred_conn_rsp()
6235 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6241 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
6245 chan->ident = 0; in l2cap_ecred_conn_rsp()
6246 chan->dcid = dcid; in l2cap_ecred_conn_rsp()
6247 chan->omtu = mtu; in l2cap_ecred_conn_rsp()
6248 chan->remote_mps = mps; in l2cap_ecred_conn_rsp()
6249 chan->tx_credits = credits; in l2cap_ecred_conn_rsp()
6250 l2cap_chan_ready(chan); in l2cap_ecred_conn_rsp()
6254 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
6269 struct l2cap_chan *chan; in l2cap_ecred_reconf_req() local
6306 chan = __l2cap_get_chan_by_dcid(conn, scid); in l2cap_ecred_reconf_req()
6307 if (!chan) in l2cap_ecred_reconf_req()
6314 if (chan->omtu > mtu) { in l2cap_ecred_reconf_req()
6315 BT_ERR("chan %p decreased MTU %u -> %u", chan, in l2cap_ecred_reconf_req()
6316 chan->omtu, mtu); in l2cap_ecred_reconf_req()
6320 chan->omtu = mtu; in l2cap_ecred_reconf_req()
6321 chan->remote_mps = mps; in l2cap_ecred_reconf_req()
6337 struct l2cap_chan *chan, *tmp; in l2cap_ecred_reconf_rsp() local
6351 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) { in l2cap_ecred_reconf_rsp()
6352 if (chan->ident != cmd->ident) in l2cap_ecred_reconf_rsp()
6355 l2cap_chan_del(chan, ECONNRESET); in l2cap_ecred_reconf_rsp()
6366 struct l2cap_chan *chan; in l2cap_le_command_rej() local
6373 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_le_command_rej()
6374 if (!chan) in l2cap_le_command_rej()
6377 chan = l2cap_chan_hold_unless_zero(chan); in l2cap_le_command_rej()
6378 if (!chan) in l2cap_le_command_rej()
6381 l2cap_chan_lock(chan); in l2cap_le_command_rej()
6382 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_le_command_rej()
6383 l2cap_chan_unlock(chan); in l2cap_le_command_rej()
6384 l2cap_chan_put(chan); in l2cap_le_command_rej()
6541 static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_check_fcs() argument
6546 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_check_fcs()
6551 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_check_fcs()
6562 static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan) in l2cap_send_i_or_rr_or_rnr() argument
6566 BT_DBG("chan %p", chan); in l2cap_send_i_or_rr_or_rnr()
6571 control.reqseq = chan->buffer_seq; in l2cap_send_i_or_rr_or_rnr()
6572 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_send_i_or_rr_or_rnr()
6574 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_send_i_or_rr_or_rnr()
6576 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
6579 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) && in l2cap_send_i_or_rr_or_rnr()
6580 chan->unacked_frames > 0) in l2cap_send_i_or_rr_or_rnr()
6581 __set_retrans_timer(chan); in l2cap_send_i_or_rr_or_rnr()
6584 l2cap_ertm_send(chan); in l2cap_send_i_or_rr_or_rnr()
6586 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) && in l2cap_send_i_or_rr_or_rnr()
6587 test_bit(CONN_SEND_FBIT, &chan->conn_state)) { in l2cap_send_i_or_rr_or_rnr()
6592 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
6615 static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb, in l2cap_reassemble_sdu() argument
6622 if (chan->sdu) in l2cap_reassemble_sdu()
6625 err = chan->ops->recv(chan, skb); in l2cap_reassemble_sdu()
6629 if (chan->sdu) in l2cap_reassemble_sdu()
6635 chan->sdu_len = get_unaligned_le16(skb->data); in l2cap_reassemble_sdu()
6638 if (chan->sdu_len > chan->imtu) { in l2cap_reassemble_sdu()
6643 if (skb->len >= chan->sdu_len) in l2cap_reassemble_sdu()
6646 chan->sdu = skb; in l2cap_reassemble_sdu()
6647 chan->sdu_last_frag = skb; in l2cap_reassemble_sdu()
6654 if (!chan->sdu) in l2cap_reassemble_sdu()
6657 append_skb_frag(chan->sdu, skb, in l2cap_reassemble_sdu()
6658 &chan->sdu_last_frag); in l2cap_reassemble_sdu()
6661 if (chan->sdu->len >= chan->sdu_len) in l2cap_reassemble_sdu()
6668 if (!chan->sdu) in l2cap_reassemble_sdu()
6671 append_skb_frag(chan->sdu, skb, in l2cap_reassemble_sdu()
6672 &chan->sdu_last_frag); in l2cap_reassemble_sdu()
6675 if (chan->sdu->len != chan->sdu_len) in l2cap_reassemble_sdu()
6678 err = chan->ops->recv(chan, chan->sdu); in l2cap_reassemble_sdu()
6682 chan->sdu = NULL; in l2cap_reassemble_sdu()
6683 chan->sdu_last_frag = NULL; in l2cap_reassemble_sdu()
6684 chan->sdu_len = 0; in l2cap_reassemble_sdu()
6691 kfree_skb(chan->sdu); in l2cap_reassemble_sdu()
6692 chan->sdu = NULL; in l2cap_reassemble_sdu()
6693 chan->sdu_last_frag = NULL; in l2cap_reassemble_sdu()
6694 chan->sdu_len = 0; in l2cap_reassemble_sdu()
6700 static int l2cap_resegment(struct l2cap_chan *chan) in l2cap_resegment() argument
6706 void l2cap_chan_busy(struct l2cap_chan *chan, int busy) in l2cap_chan_busy() argument
6710 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_chan_busy()
6714 l2cap_tx(chan, NULL, NULL, event); in l2cap_chan_busy()
6717 static int l2cap_rx_queued_iframes(struct l2cap_chan *chan) in l2cap_rx_queued_iframes() argument
6724 BT_DBG("chan %p", chan); in l2cap_rx_queued_iframes()
6726 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_rx_queued_iframes()
6729 chan->buffer_seq, skb_queue_len(&chan->srej_q)); in l2cap_rx_queued_iframes()
6731 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq); in l2cap_rx_queued_iframes()
6736 skb_unlink(skb, &chan->srej_q); in l2cap_rx_queued_iframes()
6737 chan->buffer_seq = __next_seq(chan, chan->buffer_seq); in l2cap_rx_queued_iframes()
6738 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->l2cap); in l2cap_rx_queued_iframes()
6743 if (skb_queue_empty(&chan->srej_q)) { in l2cap_rx_queued_iframes()
6744 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_rx_queued_iframes()
6745 l2cap_send_ack(chan); in l2cap_rx_queued_iframes()
6751 static void l2cap_handle_srej(struct l2cap_chan *chan, in l2cap_handle_srej() argument
6756 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_srej()
6758 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_srej()
6760 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_srej()
6764 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_srej()
6772 if (chan->max_tx != 0 && bt_cb(skb)->l2cap.retries >= chan->max_tx) { in l2cap_handle_srej()
6773 BT_DBG("Retry limit exceeded (%d)", chan->max_tx); in l2cap_handle_srej()
6774 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_srej()
6778 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_handle_srej()
6781 l2cap_pass_to_tx(chan, control); in l2cap_handle_srej()
6783 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_handle_srej()
6784 l2cap_retransmit(chan, control); in l2cap_handle_srej()
6785 l2cap_ertm_send(chan); in l2cap_handle_srej()
6787 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) { in l2cap_handle_srej()
6788 set_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_handle_srej()
6789 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
6792 l2cap_pass_to_tx_fbit(chan, control); in l2cap_handle_srej()
6795 if (chan->srej_save_reqseq != control->reqseq || in l2cap_handle_srej()
6797 &chan->conn_state)) in l2cap_handle_srej()
6798 l2cap_retransmit(chan, control); in l2cap_handle_srej()
6800 l2cap_retransmit(chan, control); in l2cap_handle_srej()
6801 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) { in l2cap_handle_srej()
6802 set_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_handle_srej()
6803 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
6809 static void l2cap_handle_rej(struct l2cap_chan *chan, in l2cap_handle_rej() argument
6814 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_rej()
6816 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_rej()
6818 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_rej()
6822 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_rej()
6824 if (chan->max_tx && skb && in l2cap_handle_rej()
6825 bt_cb(skb)->l2cap.retries >= chan->max_tx) { in l2cap_handle_rej()
6826 BT_DBG("Retry limit exceeded (%d)", chan->max_tx); in l2cap_handle_rej()
6827 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_rej()
6831 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_handle_rej()
6833 l2cap_pass_to_tx(chan, control); in l2cap_handle_rej()
6836 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state)) in l2cap_handle_rej()
6837 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
6839 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
6840 l2cap_ertm_send(chan); in l2cap_handle_rej()
6841 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) in l2cap_handle_rej()
6842 set_bit(CONN_REJ_ACT, &chan->conn_state); in l2cap_handle_rej()
6846 static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq) in l2cap_classify_txseq() argument
6848 BT_DBG("chan %p, txseq %d", chan, txseq); in l2cap_classify_txseq()
6850 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq, in l2cap_classify_txseq()
6851 chan->expected_tx_seq); in l2cap_classify_txseq()
6853 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) { in l2cap_classify_txseq()
6854 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= in l2cap_classify_txseq()
6855 chan->tx_win) { in l2cap_classify_txseq()
6859 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) { in l2cap_classify_txseq()
6868 if (chan->srej_list.head == txseq) { in l2cap_classify_txseq()
6873 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) { in l2cap_classify_txseq()
6878 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) { in l2cap_classify_txseq()
6884 if (chan->expected_tx_seq == txseq) { in l2cap_classify_txseq()
6885 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= in l2cap_classify_txseq()
6886 chan->tx_win) { in l2cap_classify_txseq()
6895 if (__seq_offset(chan, txseq, chan->last_acked_seq) < in l2cap_classify_txseq()
6896 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) { in l2cap_classify_txseq()
6901 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) { in l2cap_classify_txseq()
6919 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) { in l2cap_classify_txseq()
6932 static int l2cap_rx_state_recv(struct l2cap_chan *chan, in l2cap_rx_state_recv() argument
6940 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_recv()
6945 switch (l2cap_classify_txseq(chan, control->txseq)) { in l2cap_rx_state_recv()
6947 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6949 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_rx_state_recv()
6955 chan->expected_tx_seq = __next_seq(chan, in l2cap_rx_state_recv()
6958 chan->buffer_seq = chan->expected_tx_seq; in l2cap_rx_state_recv()
6978 err = l2cap_reassemble_sdu(chan, skb, control); in l2cap_rx_state_recv()
6984 &chan->conn_state)) { in l2cap_rx_state_recv()
6986 l2cap_retransmit_all(chan, &local_control); in l2cap_rx_state_recv()
6987 l2cap_ertm_send(chan); in l2cap_rx_state_recv()
6991 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) in l2cap_rx_state_recv()
6992 l2cap_send_ack(chan); in l2cap_rx_state_recv()
6995 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
7001 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_rx_state_recv()
7011 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_recv()
7014 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_recv()
7016 clear_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_rx_state_recv()
7017 l2cap_seq_list_clear(&chan->srej_list); in l2cap_rx_state_recv()
7018 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_recv()
7020 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT; in l2cap_rx_state_recv()
7023 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
7029 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_rx_state_recv()
7034 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
7036 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_recv()
7038 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state) && in l2cap_rx_state_recv()
7039 !__chan_is_moving(chan)) { in l2cap_rx_state_recv()
7041 l2cap_retransmit_all(chan, control); in l2cap_rx_state_recv()
7044 l2cap_ertm_send(chan); in l2cap_rx_state_recv()
7046 l2cap_send_i_or_rr_or_rnr(chan); in l2cap_rx_state_recv()
7049 &chan->conn_state) && in l2cap_rx_state_recv()
7050 chan->unacked_frames) in l2cap_rx_state_recv()
7051 __set_retrans_timer(chan); in l2cap_rx_state_recv()
7053 l2cap_ertm_send(chan); in l2cap_rx_state_recv()
7057 set_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_recv()
7058 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
7060 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_rx_state_recv()
7061 l2cap_send_rr_or_rnr(chan, 0); in l2cap_rx_state_recv()
7063 __clear_retrans_timer(chan); in l2cap_rx_state_recv()
7064 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_rx_state_recv()
7067 l2cap_handle_rej(chan, control); in l2cap_rx_state_recv()
7070 l2cap_handle_srej(chan, control); in l2cap_rx_state_recv()
7084 static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan, in l2cap_rx_state_srej_sent() argument
7092 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_srej_sent()
7097 switch (l2cap_classify_txseq(chan, txseq)) { in l2cap_rx_state_srej_sent()
7100 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7101 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
7104 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
7106 chan->expected_tx_seq = __next_seq(chan, txseq); in l2cap_rx_state_srej_sent()
7109 l2cap_seq_list_pop(&chan->srej_list); in l2cap_rx_state_srej_sent()
7111 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7112 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
7115 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
7117 err = l2cap_rx_queued_iframes(chan); in l2cap_rx_state_srej_sent()
7127 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
7130 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
7132 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7133 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_srej_sent()
7141 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
7144 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
7146 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7147 l2cap_send_srej_list(chan, control->txseq); in l2cap_rx_state_srej_sent()
7151 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7162 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_rx_state_srej_sent()
7167 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7169 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_srej_sent()
7172 &chan->conn_state)) { in l2cap_rx_state_srej_sent()
7174 l2cap_retransmit_all(chan, control); in l2cap_rx_state_srej_sent()
7177 l2cap_ertm_send(chan); in l2cap_rx_state_srej_sent()
7180 &chan->conn_state) && in l2cap_rx_state_srej_sent()
7181 chan->unacked_frames) { in l2cap_rx_state_srej_sent()
7182 __set_retrans_timer(chan); in l2cap_rx_state_srej_sent()
7185 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_rx_state_srej_sent()
7186 l2cap_send_srej_tail(chan); in l2cap_rx_state_srej_sent()
7189 &chan->conn_state) && in l2cap_rx_state_srej_sent()
7190 chan->unacked_frames) in l2cap_rx_state_srej_sent()
7191 __set_retrans_timer(chan); in l2cap_rx_state_srej_sent()
7193 l2cap_send_ack(chan); in l2cap_rx_state_srej_sent()
7197 set_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_srej_sent()
7198 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
7200 l2cap_send_srej_tail(chan); in l2cap_rx_state_srej_sent()
7206 rr_control.reqseq = chan->buffer_seq; in l2cap_rx_state_srej_sent()
7207 l2cap_send_sframe(chan, &rr_control); in l2cap_rx_state_srej_sent()
7212 l2cap_handle_rej(chan, control); in l2cap_rx_state_srej_sent()
7215 l2cap_handle_srej(chan, control); in l2cap_rx_state_srej_sent()
7227 static int l2cap_finish_move(struct l2cap_chan *chan) in l2cap_finish_move() argument
7229 BT_DBG("chan %p", chan); in l2cap_finish_move()
7231 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_finish_move()
7233 if (chan->hs_hcon) in l2cap_finish_move()
7234 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu; in l2cap_finish_move()
7236 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu; in l2cap_finish_move()
7238 return l2cap_resegment(chan); in l2cap_finish_move()
7241 static int l2cap_rx_state_wait_p(struct l2cap_chan *chan, in l2cap_rx_state_wait_p() argument
7247 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_wait_p()
7253 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_p()
7255 if (!skb_queue_empty(&chan->tx_q)) in l2cap_rx_state_wait_p()
7256 chan->tx_send_head = skb_peek(&chan->tx_q); in l2cap_rx_state_wait_p()
7258 chan->tx_send_head = NULL; in l2cap_rx_state_wait_p()
7263 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_p()
7264 chan->unacked_frames = 0; in l2cap_rx_state_wait_p()
7266 err = l2cap_finish_move(chan); in l2cap_rx_state_wait_p()
7270 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_rx_state_wait_p()
7271 l2cap_send_i_or_rr_or_rnr(chan); in l2cap_rx_state_wait_p()
7276 return l2cap_rx_state_recv(chan, control, NULL, event); in l2cap_rx_state_wait_p()
7279 static int l2cap_rx_state_wait_f(struct l2cap_chan *chan, in l2cap_rx_state_wait_f() argument
7288 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_wait_f()
7290 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_rx_state_wait_f()
7291 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_f()
7293 if (!skb_queue_empty(&chan->tx_q)) in l2cap_rx_state_wait_f()
7294 chan->tx_send_head = skb_peek(&chan->tx_q); in l2cap_rx_state_wait_f()
7296 chan->tx_send_head = NULL; in l2cap_rx_state_wait_f()
7301 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_f()
7302 chan->unacked_frames = 0; in l2cap_rx_state_wait_f()
7304 if (chan->hs_hcon) in l2cap_rx_state_wait_f()
7305 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu; in l2cap_rx_state_wait_f()
7307 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu; in l2cap_rx_state_wait_f()
7309 err = l2cap_resegment(chan); in l2cap_rx_state_wait_f()
7312 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx_state_wait_f()
7317 static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq) in __valid_reqseq() argument
7322 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq); in __valid_reqseq()
7323 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked; in __valid_reqseq()
7326 static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_rx() argument
7331 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan, in l2cap_rx()
7332 control, skb, event, chan->rx_state); in l2cap_rx()
7334 if (__valid_reqseq(chan, control->reqseq)) { in l2cap_rx()
7335 switch (chan->rx_state) { in l2cap_rx()
7337 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx()
7340 err = l2cap_rx_state_srej_sent(chan, control, skb, in l2cap_rx()
7344 err = l2cap_rx_state_wait_p(chan, control, skb, event); in l2cap_rx()
7347 err = l2cap_rx_state_wait_f(chan, control, skb, event); in l2cap_rx()
7355 control->reqseq, chan->next_tx_seq, in l2cap_rx()
7356 chan->expected_ack_seq); in l2cap_rx()
7357 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_rx()
7363 static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_stream_rx() argument
7383 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb, in l2cap_stream_rx()
7384 chan->rx_state); in l2cap_stream_rx()
7386 if (l2cap_classify_txseq(chan, txseq) == L2CAP_TXSEQ_EXPECTED) { in l2cap_stream_rx()
7387 l2cap_pass_to_tx(chan, control); in l2cap_stream_rx()
7389 BT_DBG("buffer_seq %u->%u", chan->buffer_seq, in l2cap_stream_rx()
7390 __next_seq(chan, chan->buffer_seq)); in l2cap_stream_rx()
7392 chan->buffer_seq = __next_seq(chan, chan->buffer_seq); in l2cap_stream_rx()
7394 l2cap_reassemble_sdu(chan, skb, control); in l2cap_stream_rx()
7396 if (chan->sdu) { in l2cap_stream_rx()
7397 kfree_skb(chan->sdu); in l2cap_stream_rx()
7398 chan->sdu = NULL; in l2cap_stream_rx()
7400 chan->sdu_last_frag = NULL; in l2cap_stream_rx()
7401 chan->sdu_len = 0; in l2cap_stream_rx()
7409 chan->last_acked_seq = txseq; in l2cap_stream_rx()
7410 chan->expected_tx_seq = __next_seq(chan, txseq); in l2cap_stream_rx()
7415 static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_data_rcv() argument
7421 __unpack_control(chan, skb); in l2cap_data_rcv()
7430 if (l2cap_check_fcs(chan, skb)) in l2cap_data_rcv()
7436 if (chan->fcs == L2CAP_FCS_CRC16) in l2cap_data_rcv()
7439 if (len > chan->mps) { in l2cap_data_rcv()
7440 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
7444 if (chan->ops->filter) { in l2cap_data_rcv()
7445 if (chan->ops->filter(chan, skb)) in l2cap_data_rcv()
7459 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F) in l2cap_data_rcv()
7462 if (chan->mode != L2CAP_MODE_STREAMING) { in l2cap_data_rcv()
7464 err = l2cap_rx(chan, control, skb, event); in l2cap_data_rcv()
7466 err = l2cap_stream_rx(chan, control, skb); in l2cap_data_rcv()
7470 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
7478 if (chan->mode == L2CAP_MODE_STREAMING) in l2cap_data_rcv()
7487 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
7493 chan->tx_state != L2CAP_TX_STATE_WAIT_F)) in l2cap_data_rcv()
7497 if (l2cap_rx(chan, control, skb, event)) in l2cap_data_rcv()
7498 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
7508 static void l2cap_chan_le_send_credits(struct l2cap_chan *chan) in l2cap_chan_le_send_credits() argument
7510 struct l2cap_conn *conn = chan->conn; in l2cap_chan_le_send_credits()
7514 return_credits = (chan->imtu / chan->mps) + 1; in l2cap_chan_le_send_credits()
7516 if (chan->rx_credits >= return_credits) in l2cap_chan_le_send_credits()
7519 return_credits -= chan->rx_credits; in l2cap_chan_le_send_credits()
7521 BT_DBG("chan %p returning %u credits to sender", chan, return_credits); in l2cap_chan_le_send_credits()
7523 chan->rx_credits += return_credits; in l2cap_chan_le_send_credits()
7525 pkt.cid = cpu_to_le16(chan->scid); in l2cap_chan_le_send_credits()
7528 chan->ident = l2cap_get_ident(conn); in l2cap_chan_le_send_credits()
7530 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt); in l2cap_chan_le_send_credits()
7533 static int l2cap_ecred_recv(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_ecred_recv() argument
7537 BT_DBG("SDU reassemble complete: chan %p skb->len %u", chan, skb->len); in l2cap_ecred_recv()
7540 err = chan->ops->recv(chan, skb); in l2cap_ecred_recv()
7543 l2cap_chan_le_send_credits(chan); in l2cap_ecred_recv()
7548 static int l2cap_ecred_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_ecred_data_rcv() argument
7552 if (!chan->rx_credits) { in l2cap_ecred_data_rcv()
7554 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_ecred_data_rcv()
7558 if (chan->imtu < skb->len) { in l2cap_ecred_data_rcv()
7563 chan->rx_credits--; in l2cap_ecred_data_rcv()
7564 BT_DBG("rx_credits %u -> %u", chan->rx_credits + 1, chan->rx_credits); in l2cap_ecred_data_rcv()
7569 if (!chan->rx_credits) in l2cap_ecred_data_rcv()
7570 l2cap_chan_le_send_credits(chan); in l2cap_ecred_data_rcv()
7574 if (!chan->sdu) { in l2cap_ecred_data_rcv()
7581 sdu_len, skb->len, chan->imtu); in l2cap_ecred_data_rcv()
7583 if (sdu_len > chan->imtu) { in l2cap_ecred_data_rcv()
7596 return l2cap_ecred_recv(chan, skb); in l2cap_ecred_data_rcv()
7598 chan->sdu = skb; in l2cap_ecred_data_rcv()
7599 chan->sdu_len = sdu_len; in l2cap_ecred_data_rcv()
7600 chan->sdu_last_frag = skb; in l2cap_ecred_data_rcv()
7603 if (skb->len + L2CAP_SDULEN_SIZE < chan->mps) { in l2cap_ecred_data_rcv()
7607 BT_DBG("chan->mps %u -> %u", chan->mps, mps_len); in l2cap_ecred_data_rcv()
7608 chan->mps = mps_len; in l2cap_ecred_data_rcv()
7609 l2cap_chan_le_send_credits(chan); in l2cap_ecred_data_rcv()
7616 chan->sdu->len, skb->len, chan->sdu_len); in l2cap_ecred_data_rcv()
7618 if (chan->sdu->len + skb->len > chan->sdu_len) { in l2cap_ecred_data_rcv()
7624 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag); in l2cap_ecred_data_rcv()
7627 if (chan->sdu->len == chan->sdu_len) { in l2cap_ecred_data_rcv()
7628 err = l2cap_ecred_recv(chan, chan->sdu); in l2cap_ecred_data_rcv()
7630 chan->sdu = NULL; in l2cap_ecred_data_rcv()
7631 chan->sdu_last_frag = NULL; in l2cap_ecred_data_rcv()
7632 chan->sdu_len = 0; in l2cap_ecred_data_rcv()
7639 kfree_skb(chan->sdu); in l2cap_ecred_data_rcv()
7640 chan->sdu = NULL; in l2cap_ecred_data_rcv()
7641 chan->sdu_last_frag = NULL; in l2cap_ecred_data_rcv()
7642 chan->sdu_len = 0; in l2cap_ecred_data_rcv()
7655 struct l2cap_chan *chan; in l2cap_data_channel() local
7657 chan = l2cap_get_chan_by_scid(conn, cid); in l2cap_data_channel()
7658 if (!chan) { in l2cap_data_channel()
7660 chan = a2mp_channel_create(conn, skb); in l2cap_data_channel()
7661 if (!chan) { in l2cap_data_channel()
7666 l2cap_chan_hold(chan); in l2cap_data_channel()
7667 l2cap_chan_lock(chan); in l2cap_data_channel()
7676 BT_DBG("chan %p, len %d", chan, skb->len); in l2cap_data_channel()
7682 if (chan->chan_type == L2CAP_CHAN_FIXED) in l2cap_data_channel()
7683 l2cap_chan_ready(chan); in l2cap_data_channel()
7685 if (chan->state != BT_CONNECTED) in l2cap_data_channel()
7688 switch (chan->mode) { in l2cap_data_channel()
7691 if (l2cap_ecred_data_rcv(chan, skb) < 0) in l2cap_data_channel()
7702 if (chan->imtu < skb->len) { in l2cap_data_channel()
7707 if (!chan->ops->recv(chan, skb)) in l2cap_data_channel()
7713 l2cap_data_rcv(chan, skb); in l2cap_data_channel()
7717 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode); in l2cap_data_channel()
7725 l2cap_chan_unlock(chan); in l2cap_data_channel()
7726 l2cap_chan_put(chan); in l2cap_data_channel()
7733 struct l2cap_chan *chan; in l2cap_conless_channel() local
7738 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst, in l2cap_conless_channel()
7740 if (!chan) in l2cap_conless_channel()
7743 BT_DBG("chan %p, len %d", chan, skb->len); in l2cap_conless_channel()
7745 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED) in l2cap_conless_channel()
7748 if (chan->imtu < skb->len) in l2cap_conless_channel()
7755 if (!chan->ops->recv(chan, skb)) { in l2cap_conless_channel()
7756 l2cap_chan_put(chan); in l2cap_conless_channel()
7761 l2cap_chan_put(chan); in l2cap_conless_channel()
7913 struct l2cap_chan *chan; member
7918 static void l2cap_chan_by_pid(struct l2cap_chan *chan, void *data) in l2cap_chan_by_pid() argument
7923 if (chan == d->chan) in l2cap_chan_by_pid()
7926 if (!test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_by_pid()
7929 pid = chan->ops->get_peer_pid(chan); in l2cap_chan_by_pid()
7932 if (d->pid != pid || chan->psm != d->chan->psm || chan->ident || in l2cap_chan_by_pid()
7933 chan->mode != L2CAP_MODE_EXT_FLOWCTL || chan->state != BT_CONNECT) in l2cap_chan_by_pid()
7939 int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, in l2cap_chan_connect() argument
7947 BT_DBG("%pMR -> %pMR (type %u) psm 0x%4.4x mode 0x%2.2x", &chan->src, in l2cap_chan_connect()
7948 dst, dst_type, __le16_to_cpu(psm), chan->mode); in l2cap_chan_connect()
7950 hdev = hci_get_route(dst, &chan->src, chan->src_type); in l2cap_chan_connect()
7957 chan->chan_type != L2CAP_CHAN_RAW) { in l2cap_chan_connect()
7962 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) { in l2cap_chan_connect()
7967 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) { in l2cap_chan_connect()
7972 switch (chan->mode) { in l2cap_chan_connect()
7993 switch (chan->state) { in l2cap_chan_connect()
8017 bacpy(&chan->dst, dst); in l2cap_chan_connect()
8018 chan->dst_type = dst_type; in l2cap_chan_connect()
8020 chan->psm = psm; in l2cap_chan_connect()
8021 chan->dcid = cid; in l2cap_chan_connect()
8033 chan->sec_level, in l2cap_chan_connect()
8038 chan->sec_level, in l2cap_chan_connect()
8043 u8 auth_type = l2cap_get_auth_type(chan); in l2cap_chan_connect()
8044 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type, in l2cap_chan_connect()
8060 if (chan->mode == L2CAP_MODE_EXT_FLOWCTL) { in l2cap_chan_connect()
8063 data.chan = chan; in l2cap_chan_connect()
8064 data.pid = chan->ops->get_peer_pid(chan); in l2cap_chan_connect()
8078 l2cap_chan_lock(chan); in l2cap_chan_connect()
8087 bacpy(&chan->src, &hcon->src); in l2cap_chan_connect()
8088 chan->src_type = bdaddr_src_type(hcon); in l2cap_chan_connect()
8090 __l2cap_chan_add(conn, chan); in l2cap_chan_connect()
8095 l2cap_state_change(chan, BT_CONNECT); in l2cap_chan_connect()
8096 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_chan_connect()
8102 chan->sport = 0; in l2cap_chan_connect()
8106 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_chan_connect()
8107 __clear_chan_timer(chan); in l2cap_chan_connect()
8108 if (l2cap_chan_check_security(chan, true)) in l2cap_chan_connect()
8109 l2cap_state_change(chan, BT_CONNECTED); in l2cap_chan_connect()
8111 l2cap_do_start(chan); in l2cap_chan_connect()
8117 l2cap_chan_unlock(chan); in l2cap_chan_connect()
8126 static void l2cap_ecred_reconfigure(struct l2cap_chan *chan) in l2cap_ecred_reconfigure() argument
8128 struct l2cap_conn *conn = chan->conn; in l2cap_ecred_reconfigure()
8134 pdu.req.mtu = cpu_to_le16(chan->imtu); in l2cap_ecred_reconfigure()
8135 pdu.req.mps = cpu_to_le16(chan->mps); in l2cap_ecred_reconfigure()
8136 pdu.scid = cpu_to_le16(chan->scid); in l2cap_ecred_reconfigure()
8138 chan->ident = l2cap_get_ident(conn); in l2cap_ecred_reconfigure()
8140 l2cap_send_cmd(conn, chan->ident, L2CAP_ECRED_RECONF_REQ, in l2cap_ecred_reconfigure()
8144 int l2cap_chan_reconfigure(struct l2cap_chan *chan, __u16 mtu) in l2cap_chan_reconfigure() argument
8146 if (chan->imtu > mtu) in l2cap_chan_reconfigure()
8149 BT_DBG("chan %p mtu 0x%4.4x", chan, mtu); in l2cap_chan_reconfigure()
8151 chan->imtu = mtu; in l2cap_chan_reconfigure()
8153 l2cap_ecred_reconfigure(chan); in l2cap_chan_reconfigure()
8259 struct l2cap_chan *chan, *next; in l2cap_connect_cfm() local
8266 chan = pchan->ops->new_connection(pchan); in l2cap_connect_cfm()
8267 if (chan) { in l2cap_connect_cfm()
8268 bacpy(&chan->src, &hcon->src); in l2cap_connect_cfm()
8269 bacpy(&chan->dst, &hcon->dst); in l2cap_connect_cfm()
8270 chan->src_type = bdaddr_src_type(hcon); in l2cap_connect_cfm()
8271 chan->dst_type = dst_type; in l2cap_connect_cfm()
8273 __l2cap_chan_add(conn, chan); in l2cap_connect_cfm()
8307 static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt) in l2cap_check_encryption() argument
8309 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) in l2cap_check_encryption()
8313 if (chan->sec_level == BT_SECURITY_MEDIUM) { in l2cap_check_encryption()
8314 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT); in l2cap_check_encryption()
8315 } else if (chan->sec_level == BT_SECURITY_HIGH || in l2cap_check_encryption()
8316 chan->sec_level == BT_SECURITY_FIPS) in l2cap_check_encryption()
8317 l2cap_chan_close(chan, ECONNREFUSED); in l2cap_check_encryption()
8319 if (chan->sec_level == BT_SECURITY_MEDIUM) in l2cap_check_encryption()
8320 __clear_chan_timer(chan); in l2cap_check_encryption()
8327 struct l2cap_chan *chan; in l2cap_security_cfm() local
8336 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_security_cfm()
8337 l2cap_chan_lock(chan); in l2cap_security_cfm()
8339 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid, in l2cap_security_cfm()
8340 state_to_string(chan->state)); in l2cap_security_cfm()
8342 if (chan->scid == L2CAP_CID_A2MP) { in l2cap_security_cfm()
8343 l2cap_chan_unlock(chan); in l2cap_security_cfm()
8348 chan->sec_level = hcon->sec_level; in l2cap_security_cfm()
8350 if (!__l2cap_no_conn_pending(chan)) { in l2cap_security_cfm()
8351 l2cap_chan_unlock(chan); in l2cap_security_cfm()
8355 if (!status && (chan->state == BT_CONNECTED || in l2cap_security_cfm()
8356 chan->state == BT_CONFIG)) { in l2cap_security_cfm()
8357 chan->ops->resume(chan); in l2cap_security_cfm()
8358 l2cap_check_encryption(chan, encrypt); in l2cap_security_cfm()
8359 l2cap_chan_unlock(chan); in l2cap_security_cfm()
8363 if (chan->state == BT_CONNECT) { in l2cap_security_cfm()
8365 l2cap_start_connection(chan); in l2cap_security_cfm()
8367 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); in l2cap_security_cfm()
8368 } else if (chan->state == BT_CONNECT2 && in l2cap_security_cfm()
8369 !(chan->mode == L2CAP_MODE_EXT_FLOWCTL || in l2cap_security_cfm()
8370 chan->mode == L2CAP_MODE_LE_FLOWCTL)) { in l2cap_security_cfm()
8375 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_security_cfm()
8378 chan->ops->defer(chan); in l2cap_security_cfm()
8380 l2cap_state_change(chan, BT_CONFIG); in l2cap_security_cfm()
8385 l2cap_state_change(chan, BT_DISCONN); in l2cap_security_cfm()
8386 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); in l2cap_security_cfm()
8391 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_security_cfm()
8392 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_security_cfm()
8395 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, in l2cap_security_cfm()
8398 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) && in l2cap_security_cfm()
8401 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_security_cfm()
8404 l2cap_build_conf_req(chan, buf, sizeof(buf)), in l2cap_security_cfm()
8406 chan->num_conf_req++; in l2cap_security_cfm()
8410 l2cap_chan_unlock(chan); in l2cap_security_cfm()