Lines Matching refs:chan
57 static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size);
58 static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err);
60 static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
182 int l2cap_add_psm(struct l2cap_chan *chan, bdaddr_t *src, __le16 psm) in l2cap_add_psm() argument
188 if (psm && __l2cap_global_chan_by_addr(psm, src, chan->src_type)) { in l2cap_add_psm()
194 chan->psm = psm; in l2cap_add_psm()
195 chan->sport = psm; in l2cap_add_psm()
200 if (chan->src_type == BDADDR_BREDR) { in l2cap_add_psm()
213 chan->src_type)) { in l2cap_add_psm()
214 chan->psm = cpu_to_le16(p); in l2cap_add_psm()
215 chan->sport = cpu_to_le16(p); in l2cap_add_psm()
227 int l2cap_add_scid(struct l2cap_chan *chan, __u16 scid) in l2cap_add_scid() argument
232 chan->omtu = L2CAP_DEFAULT_MTU; in l2cap_add_scid()
233 chan->chan_type = L2CAP_CHAN_FIXED; in l2cap_add_scid()
235 chan->scid = scid; in l2cap_add_scid()
259 static void l2cap_state_change(struct l2cap_chan *chan, int state) in l2cap_state_change() argument
261 BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state), in l2cap_state_change()
264 chan->state = state; in l2cap_state_change()
265 chan->ops->state_change(chan, state, 0); in l2cap_state_change()
268 static inline void l2cap_state_change_and_error(struct l2cap_chan *chan, in l2cap_state_change_and_error() argument
271 chan->state = state; in l2cap_state_change_and_error()
272 chan->ops->state_change(chan, chan->state, err); in l2cap_state_change_and_error()
275 static inline void l2cap_chan_set_err(struct l2cap_chan *chan, int err) in l2cap_chan_set_err() argument
277 chan->ops->state_change(chan, chan->state, err); in l2cap_chan_set_err()
280 static void __set_retrans_timer(struct l2cap_chan *chan) in __set_retrans_timer() argument
282 if (!delayed_work_pending(&chan->monitor_timer) && in __set_retrans_timer()
283 chan->retrans_timeout) { in __set_retrans_timer()
284 l2cap_set_timer(chan, &chan->retrans_timer, in __set_retrans_timer()
285 secs_to_jiffies(chan->retrans_timeout)); in __set_retrans_timer()
289 static void __set_monitor_timer(struct l2cap_chan *chan) in __set_monitor_timer() argument
291 __clear_retrans_timer(chan); in __set_monitor_timer()
292 if (chan->monitor_timeout) { in __set_monitor_timer()
293 l2cap_set_timer(chan, &chan->monitor_timer, in __set_monitor_timer()
294 secs_to_jiffies(chan->monitor_timeout)); in __set_monitor_timer()
407 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_chan_timeout() local
409 struct l2cap_conn *conn = chan->conn; in l2cap_chan_timeout()
412 BT_DBG("chan %p state %s", chan, state_to_string(chan->state)); in l2cap_chan_timeout()
421 l2cap_chan_lock(chan); in l2cap_chan_timeout()
423 if (chan->state == BT_CONNECTED || chan->state == BT_CONFIG) in l2cap_chan_timeout()
425 else if (chan->state == BT_CONNECT && in l2cap_chan_timeout()
426 chan->sec_level != BT_SECURITY_SDP) in l2cap_chan_timeout()
431 l2cap_chan_close(chan, reason); in l2cap_chan_timeout()
433 chan->ops->close(chan); in l2cap_chan_timeout()
435 l2cap_chan_unlock(chan); in l2cap_chan_timeout()
436 l2cap_chan_put(chan); in l2cap_chan_timeout()
443 struct l2cap_chan *chan; in l2cap_chan_create() local
445 chan = kzalloc(sizeof(*chan), GFP_ATOMIC); in l2cap_chan_create()
446 if (!chan) in l2cap_chan_create()
449 skb_queue_head_init(&chan->tx_q); in l2cap_chan_create()
450 skb_queue_head_init(&chan->srej_q); in l2cap_chan_create()
451 mutex_init(&chan->lock); in l2cap_chan_create()
454 atomic_set(&chan->nesting, L2CAP_NESTING_NORMAL); in l2cap_chan_create()
457 chan->rx_avail = -1; in l2cap_chan_create()
460 list_add(&chan->global_l, &chan_list); in l2cap_chan_create()
463 INIT_DELAYED_WORK(&chan->chan_timer, l2cap_chan_timeout); in l2cap_chan_create()
464 INIT_DELAYED_WORK(&chan->retrans_timer, l2cap_retrans_timeout); in l2cap_chan_create()
465 INIT_DELAYED_WORK(&chan->monitor_timer, l2cap_monitor_timeout); in l2cap_chan_create()
466 INIT_DELAYED_WORK(&chan->ack_timer, l2cap_ack_timeout); in l2cap_chan_create()
468 chan->state = BT_OPEN; in l2cap_chan_create()
470 kref_init(&chan->kref); in l2cap_chan_create()
473 set_bit(CONF_NOT_COMPLETE, &chan->conf_state); in l2cap_chan_create()
475 BT_DBG("chan %p", chan); in l2cap_chan_create()
477 return chan; in l2cap_chan_create()
483 struct l2cap_chan *chan = container_of(kref, struct l2cap_chan, kref); in l2cap_chan_destroy() local
485 BT_DBG("chan %p", chan); in l2cap_chan_destroy()
488 list_del(&chan->global_l); in l2cap_chan_destroy()
491 kfree(chan); in l2cap_chan_destroy()
519 void l2cap_chan_set_defaults(struct l2cap_chan *chan) in l2cap_chan_set_defaults() argument
521 chan->fcs = L2CAP_FCS_CRC16; in l2cap_chan_set_defaults()
522 chan->max_tx = L2CAP_DEFAULT_MAX_TX; in l2cap_chan_set_defaults()
523 chan->tx_win = L2CAP_DEFAULT_TX_WINDOW; in l2cap_chan_set_defaults()
524 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW; in l2cap_chan_set_defaults()
525 chan->remote_max_tx = chan->max_tx; in l2cap_chan_set_defaults()
526 chan->remote_tx_win = chan->tx_win; in l2cap_chan_set_defaults()
527 chan->ack_win = L2CAP_DEFAULT_TX_WINDOW; in l2cap_chan_set_defaults()
528 chan->sec_level = BT_SECURITY_LOW; in l2cap_chan_set_defaults()
529 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO; in l2cap_chan_set_defaults()
530 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO; in l2cap_chan_set_defaults()
531 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO; in l2cap_chan_set_defaults()
533 chan->conf_state = 0; in l2cap_chan_set_defaults()
534 set_bit(CONF_NOT_COMPLETE, &chan->conf_state); in l2cap_chan_set_defaults()
536 set_bit(FLAG_FORCE_ACTIVE, &chan->flags); in l2cap_chan_set_defaults()
540 static __u16 l2cap_le_rx_credits(struct l2cap_chan *chan) in l2cap_le_rx_credits() argument
542 size_t sdu_len = chan->sdu ? chan->sdu->len : 0; in l2cap_le_rx_credits()
544 if (chan->mps == 0) in l2cap_le_rx_credits()
550 if (chan->rx_avail == -1) in l2cap_le_rx_credits()
551 return (chan->imtu / chan->mps) + 1; in l2cap_le_rx_credits()
556 if (chan->rx_avail <= sdu_len) in l2cap_le_rx_credits()
559 return DIV_ROUND_UP(chan->rx_avail - sdu_len, chan->mps); in l2cap_le_rx_credits()
562 static void l2cap_le_flowctl_init(struct l2cap_chan *chan, u16 tx_credits) in l2cap_le_flowctl_init() argument
564 chan->sdu = NULL; in l2cap_le_flowctl_init()
565 chan->sdu_last_frag = NULL; in l2cap_le_flowctl_init()
566 chan->sdu_len = 0; in l2cap_le_flowctl_init()
567 chan->tx_credits = tx_credits; in l2cap_le_flowctl_init()
569 chan->mps = min_t(u16, chan->imtu, chan->conn->mtu - L2CAP_HDR_SIZE); in l2cap_le_flowctl_init()
570 chan->rx_credits = l2cap_le_rx_credits(chan); in l2cap_le_flowctl_init()
572 skb_queue_head_init(&chan->tx_q); in l2cap_le_flowctl_init()
575 static void l2cap_ecred_init(struct l2cap_chan *chan, u16 tx_credits) in l2cap_ecred_init() argument
577 l2cap_le_flowctl_init(chan, tx_credits); in l2cap_ecred_init()
580 if (chan->mps < L2CAP_ECRED_MIN_MPS) { in l2cap_ecred_init()
581 chan->mps = L2CAP_ECRED_MIN_MPS; in l2cap_ecred_init()
582 chan->rx_credits = l2cap_le_rx_credits(chan); in l2cap_ecred_init()
586 void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) in __l2cap_chan_add() argument
589 __le16_to_cpu(chan->psm), chan->dcid); in __l2cap_chan_add()
593 chan->conn = conn; in __l2cap_chan_add()
595 switch (chan->chan_type) { in __l2cap_chan_add()
598 chan->scid = l2cap_alloc_cid(conn); in __l2cap_chan_add()
600 chan->omtu = L2CAP_DEFAULT_MTU; in __l2cap_chan_add()
605 chan->scid = L2CAP_CID_CONN_LESS; in __l2cap_chan_add()
606 chan->dcid = L2CAP_CID_CONN_LESS; in __l2cap_chan_add()
607 chan->omtu = L2CAP_DEFAULT_MTU; in __l2cap_chan_add()
616 chan->scid = L2CAP_CID_SIGNALING; in __l2cap_chan_add()
617 chan->dcid = L2CAP_CID_SIGNALING; in __l2cap_chan_add()
618 chan->omtu = L2CAP_DEFAULT_MTU; in __l2cap_chan_add()
621 chan->local_id = L2CAP_BESTEFFORT_ID; in __l2cap_chan_add()
622 chan->local_stype = L2CAP_SERV_BESTEFFORT; in __l2cap_chan_add()
623 chan->local_msdu = L2CAP_DEFAULT_MAX_SDU_SIZE; in __l2cap_chan_add()
624 chan->local_sdu_itime = L2CAP_DEFAULT_SDU_ITIME; in __l2cap_chan_add()
625 chan->local_acc_lat = L2CAP_DEFAULT_ACC_LAT; in __l2cap_chan_add()
626 chan->local_flush_to = L2CAP_EFS_DEFAULT_FLUSH_TO; in __l2cap_chan_add()
628 l2cap_chan_hold(chan); in __l2cap_chan_add()
631 if (chan->chan_type != L2CAP_CHAN_FIXED || in __l2cap_chan_add()
632 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags)) in __l2cap_chan_add()
636 list_add_tail(&chan->list, &conn->chan_l); in __l2cap_chan_add()
639 void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) in l2cap_chan_add() argument
642 __l2cap_chan_add(conn, chan); in l2cap_chan_add()
646 void l2cap_chan_del(struct l2cap_chan *chan, int err) in l2cap_chan_del() argument
648 struct l2cap_conn *conn = chan->conn; in l2cap_chan_del()
650 __clear_chan_timer(chan); in l2cap_chan_del()
652 BT_DBG("chan %p, conn %p, err %d, state %s", chan, conn, err, in l2cap_chan_del()
653 state_to_string(chan->state)); in l2cap_chan_del()
655 chan->ops->teardown(chan, err); in l2cap_chan_del()
659 list_del(&chan->list); in l2cap_chan_del()
661 l2cap_chan_put(chan); in l2cap_chan_del()
663 chan->conn = NULL; in l2cap_chan_del()
669 if (chan->chan_type != L2CAP_CHAN_FIXED || in l2cap_chan_del()
670 test_bit(FLAG_HOLD_HCI_CONN, &chan->flags)) in l2cap_chan_del()
674 if (test_bit(CONF_NOT_COMPLETE, &chan->conf_state)) in l2cap_chan_del()
677 switch (chan->mode) { in l2cap_chan_del()
683 skb_queue_purge(&chan->tx_q); in l2cap_chan_del()
687 __clear_retrans_timer(chan); in l2cap_chan_del()
688 __clear_monitor_timer(chan); in l2cap_chan_del()
689 __clear_ack_timer(chan); in l2cap_chan_del()
691 skb_queue_purge(&chan->srej_q); in l2cap_chan_del()
693 l2cap_seq_list_free(&chan->srej_list); in l2cap_chan_del()
694 l2cap_seq_list_free(&chan->retrans_list); in l2cap_chan_del()
698 skb_queue_purge(&chan->tx_q); in l2cap_chan_del()
707 struct l2cap_chan *chan, *l; in __l2cap_chan_list_id() local
709 list_for_each_entry_safe(chan, l, &conn->chan_l, list) { in __l2cap_chan_list_id()
710 if (chan->ident == id) in __l2cap_chan_list_id()
711 func(chan, data); in __l2cap_chan_list_id()
718 struct l2cap_chan *chan; in __l2cap_chan_list() local
720 list_for_each_entry(chan, &conn->chan_l, list) { in __l2cap_chan_list()
721 func(chan, data); in __l2cap_chan_list()
743 struct l2cap_chan *chan; in l2cap_conn_update_id_addr() local
747 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_update_id_addr()
748 l2cap_chan_lock(chan); in l2cap_conn_update_id_addr()
749 bacpy(&chan->dst, &hcon->dst); in l2cap_conn_update_id_addr()
750 chan->dst_type = bdaddr_dst_type(hcon); in l2cap_conn_update_id_addr()
751 l2cap_chan_unlock(chan); in l2cap_conn_update_id_addr()
757 static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan) in l2cap_chan_le_connect_reject() argument
759 struct l2cap_conn *conn = chan->conn; in l2cap_chan_le_connect_reject()
763 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_le_connect_reject()
768 l2cap_state_change(chan, BT_DISCONN); in l2cap_chan_le_connect_reject()
770 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_chan_le_connect_reject()
771 rsp.mtu = cpu_to_le16(chan->imtu); in l2cap_chan_le_connect_reject()
772 rsp.mps = cpu_to_le16(chan->mps); in l2cap_chan_le_connect_reject()
773 rsp.credits = cpu_to_le16(chan->rx_credits); in l2cap_chan_le_connect_reject()
776 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in l2cap_chan_le_connect_reject()
780 static void l2cap_chan_ecred_connect_reject(struct l2cap_chan *chan) in l2cap_chan_ecred_connect_reject() argument
782 l2cap_state_change(chan, BT_DISCONN); in l2cap_chan_ecred_connect_reject()
784 __l2cap_ecred_conn_rsp_defer(chan); in l2cap_chan_ecred_connect_reject()
787 static void l2cap_chan_connect_reject(struct l2cap_chan *chan) in l2cap_chan_connect_reject() argument
789 struct l2cap_conn *conn = chan->conn; in l2cap_chan_connect_reject()
793 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_connect_reject()
798 l2cap_state_change(chan, BT_DISCONN); in l2cap_chan_connect_reject()
800 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_chan_connect_reject()
801 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_chan_connect_reject()
805 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp); in l2cap_chan_connect_reject()
808 void l2cap_chan_close(struct l2cap_chan *chan, int reason) in l2cap_chan_close() argument
810 struct l2cap_conn *conn = chan->conn; in l2cap_chan_close()
812 BT_DBG("chan %p state %s", chan, state_to_string(chan->state)); in l2cap_chan_close()
814 switch (chan->state) { in l2cap_chan_close()
816 chan->ops->teardown(chan, 0); in l2cap_chan_close()
821 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) { in l2cap_chan_close()
822 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_chan_close()
823 l2cap_send_disconn_req(chan, reason); in l2cap_chan_close()
825 l2cap_chan_del(chan, reason); in l2cap_chan_close()
829 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED) { in l2cap_chan_close()
831 l2cap_chan_connect_reject(chan); in l2cap_chan_close()
833 switch (chan->mode) { in l2cap_chan_close()
835 l2cap_chan_le_connect_reject(chan); in l2cap_chan_close()
838 l2cap_chan_ecred_connect_reject(chan); in l2cap_chan_close()
844 l2cap_chan_del(chan, reason); in l2cap_chan_close()
849 l2cap_chan_del(chan, reason); in l2cap_chan_close()
853 chan->ops->teardown(chan, 0); in l2cap_chan_close()
859 static inline u8 l2cap_get_auth_type(struct l2cap_chan *chan) in l2cap_get_auth_type() argument
861 switch (chan->chan_type) { in l2cap_get_auth_type()
863 switch (chan->sec_level) { in l2cap_get_auth_type()
874 if (chan->psm == cpu_to_le16(L2CAP_PSM_3DSP)) { in l2cap_get_auth_type()
875 if (chan->sec_level == BT_SECURITY_LOW) in l2cap_get_auth_type()
876 chan->sec_level = BT_SECURITY_SDP; in l2cap_get_auth_type()
878 if (chan->sec_level == BT_SECURITY_HIGH || in l2cap_get_auth_type()
879 chan->sec_level == BT_SECURITY_FIPS) in l2cap_get_auth_type()
885 if (chan->psm == cpu_to_le16(L2CAP_PSM_SDP)) { in l2cap_get_auth_type()
886 if (chan->sec_level == BT_SECURITY_LOW) in l2cap_get_auth_type()
887 chan->sec_level = BT_SECURITY_SDP; in l2cap_get_auth_type()
889 if (chan->sec_level == BT_SECURITY_HIGH || in l2cap_get_auth_type()
890 chan->sec_level == BT_SECURITY_FIPS) in l2cap_get_auth_type()
898 switch (chan->sec_level) { in l2cap_get_auth_type()
912 int l2cap_chan_check_security(struct l2cap_chan *chan, bool initiator) in l2cap_chan_check_security() argument
914 struct l2cap_conn *conn = chan->conn; in l2cap_chan_check_security()
918 return smp_conn_security(conn->hcon, chan->sec_level); in l2cap_chan_check_security()
920 auth_type = l2cap_get_auth_type(chan); in l2cap_chan_check_security()
922 return hci_conn_security(conn->hcon, chan->sec_level, auth_type, in l2cap_chan_check_security()
983 static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_do_send() argument
985 struct hci_conn *hcon = chan->conn->hcon; in l2cap_do_send()
988 BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len, in l2cap_do_send()
996 (!test_bit(FLAG_FLUSHABLE, &chan->flags) && in l2cap_do_send()
1002 bt_cb(skb)->force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags); in l2cap_do_send()
1003 hci_send_acl(chan->conn->hchan, skb, flags); in l2cap_do_send()
1054 static inline void __unpack_control(struct l2cap_chan *chan, in __unpack_control() argument
1057 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) { in __unpack_control()
1106 static inline void __pack_control(struct l2cap_chan *chan, in __pack_control() argument
1110 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) { in __pack_control()
1119 static inline unsigned int __ertm_hdr_size(struct l2cap_chan *chan) in __ertm_hdr_size() argument
1121 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in __ertm_hdr_size()
1127 static struct sk_buff *l2cap_create_sframe_pdu(struct l2cap_chan *chan, in l2cap_create_sframe_pdu() argument
1132 int hlen = __ertm_hdr_size(chan); in l2cap_create_sframe_pdu()
1134 if (chan->fcs == L2CAP_FCS_CRC16) in l2cap_create_sframe_pdu()
1144 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_sframe_pdu()
1146 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_create_sframe_pdu()
1151 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_create_sframe_pdu()
1160 static void l2cap_send_sframe(struct l2cap_chan *chan, in l2cap_send_sframe() argument
1166 BT_DBG("chan %p, control %p", chan, control); in l2cap_send_sframe()
1171 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state) && in l2cap_send_sframe()
1176 clear_bit(CONN_RNR_SENT, &chan->conn_state); in l2cap_send_sframe()
1178 set_bit(CONN_RNR_SENT, &chan->conn_state); in l2cap_send_sframe()
1181 chan->last_acked_seq = control->reqseq; in l2cap_send_sframe()
1182 __clear_ack_timer(chan); in l2cap_send_sframe()
1188 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_send_sframe()
1193 skb = l2cap_create_sframe_pdu(chan, control_field); in l2cap_send_sframe()
1195 l2cap_do_send(chan, skb); in l2cap_send_sframe()
1198 static void l2cap_send_rr_or_rnr(struct l2cap_chan *chan, bool poll) in l2cap_send_rr_or_rnr() argument
1202 BT_DBG("chan %p, poll %d", chan, poll); in l2cap_send_rr_or_rnr()
1208 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) in l2cap_send_rr_or_rnr()
1213 control.reqseq = chan->buffer_seq; in l2cap_send_rr_or_rnr()
1214 l2cap_send_sframe(chan, &control); in l2cap_send_rr_or_rnr()
1217 static inline int __l2cap_no_conn_pending(struct l2cap_chan *chan) in __l2cap_no_conn_pending() argument
1219 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) in __l2cap_no_conn_pending()
1222 return !test_bit(CONF_CONNECT_PEND, &chan->conf_state); in __l2cap_no_conn_pending()
1225 void l2cap_send_conn_req(struct l2cap_chan *chan) in l2cap_send_conn_req() argument
1227 struct l2cap_conn *conn = chan->conn; in l2cap_send_conn_req()
1230 req.scid = cpu_to_le16(chan->scid); in l2cap_send_conn_req()
1231 req.psm = chan->psm; in l2cap_send_conn_req()
1233 chan->ident = l2cap_get_ident(conn); in l2cap_send_conn_req()
1235 set_bit(CONF_CONNECT_PEND, &chan->conf_state); in l2cap_send_conn_req()
1237 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req); in l2cap_send_conn_req()
1240 static void l2cap_chan_ready(struct l2cap_chan *chan) in l2cap_chan_ready() argument
1246 if (chan->state == BT_CONNECTED) in l2cap_chan_ready()
1250 chan->conf_state = 0; in l2cap_chan_ready()
1251 __clear_chan_timer(chan); in l2cap_chan_ready()
1253 switch (chan->mode) { in l2cap_chan_ready()
1256 if (!chan->tx_credits) in l2cap_chan_ready()
1257 chan->ops->suspend(chan); in l2cap_chan_ready()
1261 chan->state = BT_CONNECTED; in l2cap_chan_ready()
1263 chan->ops->ready(chan); in l2cap_chan_ready()
1266 static void l2cap_le_connect(struct l2cap_chan *chan) in l2cap_le_connect() argument
1268 struct l2cap_conn *conn = chan->conn; in l2cap_le_connect()
1271 if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags)) in l2cap_le_connect()
1274 if (!chan->imtu) in l2cap_le_connect()
1275 chan->imtu = chan->conn->mtu; in l2cap_le_connect()
1277 l2cap_le_flowctl_init(chan, 0); in l2cap_le_connect()
1280 req.psm = chan->psm; in l2cap_le_connect()
1281 req.scid = cpu_to_le16(chan->scid); in l2cap_le_connect()
1282 req.mtu = cpu_to_le16(chan->imtu); in l2cap_le_connect()
1283 req.mps = cpu_to_le16(chan->mps); in l2cap_le_connect()
1284 req.credits = cpu_to_le16(chan->rx_credits); in l2cap_le_connect()
1286 chan->ident = l2cap_get_ident(conn); in l2cap_le_connect()
1288 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ, in l2cap_le_connect()
1297 struct l2cap_chan *chan; member
1302 static void l2cap_ecred_defer_connect(struct l2cap_chan *chan, void *data) in l2cap_ecred_defer_connect() argument
1307 if (chan == conn->chan) in l2cap_ecred_defer_connect()
1310 if (!test_and_clear_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_ecred_defer_connect()
1313 pid = chan->ops->get_peer_pid(chan); in l2cap_ecred_defer_connect()
1316 if (conn->pid != pid || chan->psm != conn->chan->psm || chan->ident || in l2cap_ecred_defer_connect()
1317 chan->mode != L2CAP_MODE_EXT_FLOWCTL || chan->state != BT_CONNECT) in l2cap_ecred_defer_connect()
1320 if (test_and_set_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags)) in l2cap_ecred_defer_connect()
1323 l2cap_ecred_init(chan, 0); in l2cap_ecred_defer_connect()
1326 chan->ident = conn->chan->ident; in l2cap_ecred_defer_connect()
1329 conn->pdu.scid[conn->count] = cpu_to_le16(chan->scid); in l2cap_ecred_defer_connect()
1334 static void l2cap_ecred_connect(struct l2cap_chan *chan) in l2cap_ecred_connect() argument
1336 struct l2cap_conn *conn = chan->conn; in l2cap_ecred_connect()
1339 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_ecred_connect()
1342 if (test_and_set_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags)) in l2cap_ecred_connect()
1345 l2cap_ecred_init(chan, 0); in l2cap_ecred_connect()
1348 data.pdu.req.psm = chan->psm; in l2cap_ecred_connect()
1349 data.pdu.req.mtu = cpu_to_le16(chan->imtu); in l2cap_ecred_connect()
1350 data.pdu.req.mps = cpu_to_le16(chan->mps); in l2cap_ecred_connect()
1351 data.pdu.req.credits = cpu_to_le16(chan->rx_credits); in l2cap_ecred_connect()
1352 data.pdu.scid[0] = cpu_to_le16(chan->scid); in l2cap_ecred_connect()
1354 chan->ident = l2cap_get_ident(conn); in l2cap_ecred_connect()
1357 data.chan = chan; in l2cap_ecred_connect()
1358 data.pid = chan->ops->get_peer_pid(chan); in l2cap_ecred_connect()
1362 l2cap_send_cmd(conn, chan->ident, L2CAP_ECRED_CONN_REQ, in l2cap_ecred_connect()
1367 static void l2cap_le_start(struct l2cap_chan *chan) in l2cap_le_start() argument
1369 struct l2cap_conn *conn = chan->conn; in l2cap_le_start()
1371 if (!smp_conn_security(conn->hcon, chan->sec_level)) in l2cap_le_start()
1374 if (!chan->psm) { in l2cap_le_start()
1375 l2cap_chan_ready(chan); in l2cap_le_start()
1379 if (chan->state == BT_CONNECT) { in l2cap_le_start()
1380 if (chan->mode == L2CAP_MODE_EXT_FLOWCTL) in l2cap_le_start()
1381 l2cap_ecred_connect(chan); in l2cap_le_start()
1383 l2cap_le_connect(chan); in l2cap_le_start()
1387 static void l2cap_start_connection(struct l2cap_chan *chan) in l2cap_start_connection() argument
1389 if (chan->conn->hcon->type == LE_LINK) { in l2cap_start_connection()
1390 l2cap_le_start(chan); in l2cap_start_connection()
1392 l2cap_send_conn_req(chan); in l2cap_start_connection()
1415 struct l2cap_chan *chan) in l2cap_check_enc_key_size() argument
1429 if (chan->sec_level == BT_SECURITY_FIPS) in l2cap_check_enc_key_size()
1436 static void l2cap_do_start(struct l2cap_chan *chan) in l2cap_do_start() argument
1438 struct l2cap_conn *conn = chan->conn; in l2cap_do_start()
1441 l2cap_le_start(chan); in l2cap_do_start()
1453 if (!l2cap_chan_check_security(chan, true) || in l2cap_do_start()
1454 !__l2cap_no_conn_pending(chan)) in l2cap_do_start()
1457 if (l2cap_check_enc_key_size(conn->hcon, chan)) in l2cap_do_start()
1458 l2cap_start_connection(chan); in l2cap_do_start()
1460 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); in l2cap_do_start()
1479 static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err) in l2cap_send_disconn_req() argument
1481 struct l2cap_conn *conn = chan->conn; in l2cap_send_disconn_req()
1487 if (chan->mode == L2CAP_MODE_ERTM && chan->state == BT_CONNECTED) { in l2cap_send_disconn_req()
1488 __clear_retrans_timer(chan); in l2cap_send_disconn_req()
1489 __clear_monitor_timer(chan); in l2cap_send_disconn_req()
1490 __clear_ack_timer(chan); in l2cap_send_disconn_req()
1493 req.dcid = cpu_to_le16(chan->dcid); in l2cap_send_disconn_req()
1494 req.scid = cpu_to_le16(chan->scid); in l2cap_send_disconn_req()
1498 l2cap_state_change_and_error(chan, BT_DISCONN, err); in l2cap_send_disconn_req()
1504 struct l2cap_chan *chan, *tmp; in l2cap_conn_start() local
1508 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) { in l2cap_conn_start()
1509 l2cap_chan_lock(chan); in l2cap_conn_start()
1511 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_conn_start()
1512 l2cap_chan_ready(chan); in l2cap_conn_start()
1513 l2cap_chan_unlock(chan); in l2cap_conn_start()
1517 if (chan->state == BT_CONNECT) { in l2cap_conn_start()
1518 if (!l2cap_chan_check_security(chan, true) || in l2cap_conn_start()
1519 !__l2cap_no_conn_pending(chan)) { in l2cap_conn_start()
1520 l2cap_chan_unlock(chan); in l2cap_conn_start()
1524 if (!l2cap_mode_supported(chan->mode, conn->feat_mask) in l2cap_conn_start()
1526 &chan->conf_state)) { in l2cap_conn_start()
1527 l2cap_chan_close(chan, ECONNRESET); in l2cap_conn_start()
1528 l2cap_chan_unlock(chan); in l2cap_conn_start()
1532 if (l2cap_check_enc_key_size(conn->hcon, chan)) in l2cap_conn_start()
1533 l2cap_start_connection(chan); in l2cap_conn_start()
1535 l2cap_chan_close(chan, ECONNREFUSED); in l2cap_conn_start()
1537 } else if (chan->state == BT_CONNECT2) { in l2cap_conn_start()
1540 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_conn_start()
1541 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_conn_start()
1543 if (l2cap_chan_check_security(chan, false)) { in l2cap_conn_start()
1544 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_conn_start()
1547 chan->ops->defer(chan); in l2cap_conn_start()
1550 l2cap_state_change(chan, BT_CONFIG); in l2cap_conn_start()
1559 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, in l2cap_conn_start()
1562 if (test_bit(CONF_REQ_SENT, &chan->conf_state) || in l2cap_conn_start()
1564 l2cap_chan_unlock(chan); in l2cap_conn_start()
1568 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_conn_start()
1570 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_conn_start()
1571 chan->num_conf_req++; in l2cap_conn_start()
1574 l2cap_chan_unlock(chan); in l2cap_conn_start()
1613 struct l2cap_chan *chan; in l2cap_conn_ready() local
1623 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_ready()
1625 l2cap_chan_lock(chan); in l2cap_conn_ready()
1628 l2cap_le_start(chan); in l2cap_conn_ready()
1629 } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_conn_ready()
1631 l2cap_chan_ready(chan); in l2cap_conn_ready()
1632 } else if (chan->state == BT_CONNECT) { in l2cap_conn_ready()
1633 l2cap_do_start(chan); in l2cap_conn_ready()
1636 l2cap_chan_unlock(chan); in l2cap_conn_ready()
1650 struct l2cap_chan *chan; in l2cap_conn_unreliable() local
1654 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_unreliable()
1655 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags)) in l2cap_conn_unreliable()
1656 l2cap_chan_set_err(chan, err); in l2cap_conn_unreliable()
1755 struct l2cap_chan *chan, *l; in l2cap_conn_del() local
1783 list_for_each_entry_safe(chan, l, &conn->chan_l, list) { in l2cap_conn_del()
1784 l2cap_chan_hold(chan); in l2cap_conn_del()
1785 l2cap_chan_lock(chan); in l2cap_conn_del()
1787 l2cap_chan_del(chan, err); in l2cap_conn_del()
1789 chan->ops->close(chan); in l2cap_conn_del()
1791 l2cap_chan_unlock(chan); in l2cap_conn_del()
1792 l2cap_chan_put(chan); in l2cap_conn_del()
1885 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_monitor_timeout() local
1888 BT_DBG("chan %p", chan); in l2cap_monitor_timeout()
1890 l2cap_chan_lock(chan); in l2cap_monitor_timeout()
1892 if (!chan->conn) { in l2cap_monitor_timeout()
1893 l2cap_chan_unlock(chan); in l2cap_monitor_timeout()
1894 l2cap_chan_put(chan); in l2cap_monitor_timeout()
1898 l2cap_tx(chan, NULL, NULL, L2CAP_EV_MONITOR_TO); in l2cap_monitor_timeout()
1900 l2cap_chan_unlock(chan); in l2cap_monitor_timeout()
1901 l2cap_chan_put(chan); in l2cap_monitor_timeout()
1906 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_retrans_timeout() local
1909 BT_DBG("chan %p", chan); in l2cap_retrans_timeout()
1911 l2cap_chan_lock(chan); in l2cap_retrans_timeout()
1913 if (!chan->conn) { in l2cap_retrans_timeout()
1914 l2cap_chan_unlock(chan); in l2cap_retrans_timeout()
1915 l2cap_chan_put(chan); in l2cap_retrans_timeout()
1919 l2cap_tx(chan, NULL, NULL, L2CAP_EV_RETRANS_TO); in l2cap_retrans_timeout()
1920 l2cap_chan_unlock(chan); in l2cap_retrans_timeout()
1921 l2cap_chan_put(chan); in l2cap_retrans_timeout()
1924 static void l2cap_streaming_send(struct l2cap_chan *chan, in l2cap_streaming_send() argument
1930 BT_DBG("chan %p, skbs %p", chan, skbs); in l2cap_streaming_send()
1932 skb_queue_splice_tail_init(skbs, &chan->tx_q); in l2cap_streaming_send()
1934 while (!skb_queue_empty(&chan->tx_q)) { in l2cap_streaming_send()
1936 skb = skb_dequeue(&chan->tx_q); in l2cap_streaming_send()
1942 control->txseq = chan->next_tx_seq; in l2cap_streaming_send()
1944 __pack_control(chan, control, skb); in l2cap_streaming_send()
1946 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_streaming_send()
1951 l2cap_do_send(chan, skb); in l2cap_streaming_send()
1955 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq); in l2cap_streaming_send()
1956 chan->frames_sent++; in l2cap_streaming_send()
1960 static int l2cap_ertm_send(struct l2cap_chan *chan) in l2cap_ertm_send() argument
1966 BT_DBG("chan %p", chan); in l2cap_ertm_send()
1968 if (chan->state != BT_CONNECTED) in l2cap_ertm_send()
1971 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) in l2cap_ertm_send()
1974 while (chan->tx_send_head && in l2cap_ertm_send()
1975 chan->unacked_frames < chan->remote_tx_win && in l2cap_ertm_send()
1976 chan->tx_state == L2CAP_TX_STATE_XMIT) { in l2cap_ertm_send()
1978 skb = chan->tx_send_head; in l2cap_ertm_send()
1983 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state)) in l2cap_ertm_send()
1986 control->reqseq = chan->buffer_seq; in l2cap_ertm_send()
1987 chan->last_acked_seq = chan->buffer_seq; in l2cap_ertm_send()
1988 control->txseq = chan->next_tx_seq; in l2cap_ertm_send()
1990 __pack_control(chan, control, skb); in l2cap_ertm_send()
1992 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_ertm_send()
2005 __set_retrans_timer(chan); in l2cap_ertm_send()
2007 chan->next_tx_seq = __next_seq(chan, chan->next_tx_seq); in l2cap_ertm_send()
2008 chan->unacked_frames++; in l2cap_ertm_send()
2009 chan->frames_sent++; in l2cap_ertm_send()
2012 if (skb_queue_is_last(&chan->tx_q, skb)) in l2cap_ertm_send()
2013 chan->tx_send_head = NULL; in l2cap_ertm_send()
2015 chan->tx_send_head = skb_queue_next(&chan->tx_q, skb); in l2cap_ertm_send()
2017 l2cap_do_send(chan, tx_skb); in l2cap_ertm_send()
2022 chan->unacked_frames, skb_queue_len(&chan->tx_q)); in l2cap_ertm_send()
2027 static void l2cap_ertm_resend(struct l2cap_chan *chan) in l2cap_ertm_resend() argument
2034 BT_DBG("chan %p", chan); in l2cap_ertm_resend()
2036 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) in l2cap_ertm_resend()
2039 while (chan->retrans_list.head != L2CAP_SEQ_LIST_CLEAR) { in l2cap_ertm_resend()
2040 seq = l2cap_seq_list_pop(&chan->retrans_list); in l2cap_ertm_resend()
2042 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, seq); in l2cap_ertm_resend()
2052 if (chan->max_tx != 0 && in l2cap_ertm_resend()
2053 bt_cb(skb)->l2cap.retries > chan->max_tx) { in l2cap_ertm_resend()
2054 BT_DBG("Retry limit exceeded (%d)", chan->max_tx); in l2cap_ertm_resend()
2055 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_ertm_resend()
2056 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_ertm_resend()
2060 control.reqseq = chan->buffer_seq; in l2cap_ertm_resend()
2061 if (test_and_clear_bit(CONN_SEND_FBIT, &chan->conn_state)) in l2cap_ertm_resend()
2076 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_ertm_resend()
2081 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) { in l2cap_ertm_resend()
2090 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_ertm_resend()
2097 l2cap_do_send(chan, tx_skb); in l2cap_ertm_resend()
2101 chan->last_acked_seq = chan->buffer_seq; in l2cap_ertm_resend()
2105 static void l2cap_retransmit(struct l2cap_chan *chan, in l2cap_retransmit() argument
2108 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit()
2110 l2cap_seq_list_append(&chan->retrans_list, control->reqseq); in l2cap_retransmit()
2111 l2cap_ertm_resend(chan); in l2cap_retransmit()
2114 static void l2cap_retransmit_all(struct l2cap_chan *chan, in l2cap_retransmit_all() argument
2119 BT_DBG("chan %p, control %p", chan, control); in l2cap_retransmit_all()
2122 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_retransmit_all()
2124 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_retransmit_all()
2126 if (test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) in l2cap_retransmit_all()
2129 if (chan->unacked_frames) { in l2cap_retransmit_all()
2130 skb_queue_walk(&chan->tx_q, skb) { in l2cap_retransmit_all()
2132 skb == chan->tx_send_head) in l2cap_retransmit_all()
2136 skb_queue_walk_from(&chan->tx_q, skb) { in l2cap_retransmit_all()
2137 if (skb == chan->tx_send_head) in l2cap_retransmit_all()
2140 l2cap_seq_list_append(&chan->retrans_list, in l2cap_retransmit_all()
2144 l2cap_ertm_resend(chan); in l2cap_retransmit_all()
2148 static void l2cap_send_ack(struct l2cap_chan *chan) in l2cap_send_ack() argument
2151 u16 frames_to_ack = __seq_offset(chan, chan->buffer_seq, in l2cap_send_ack()
2152 chan->last_acked_seq); in l2cap_send_ack()
2156 chan, chan->last_acked_seq, chan->buffer_seq); in l2cap_send_ack()
2161 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state) && in l2cap_send_ack()
2162 chan->rx_state == L2CAP_RX_STATE_RECV) { in l2cap_send_ack()
2163 __clear_ack_timer(chan); in l2cap_send_ack()
2165 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2166 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2168 if (!test_bit(CONN_REMOTE_BUSY, &chan->conn_state)) { in l2cap_send_ack()
2169 l2cap_ertm_send(chan); in l2cap_send_ack()
2171 if (chan->buffer_seq == chan->last_acked_seq) in l2cap_send_ack()
2178 threshold = chan->ack_win; in l2cap_send_ack()
2186 __clear_ack_timer(chan); in l2cap_send_ack()
2188 control.reqseq = chan->buffer_seq; in l2cap_send_ack()
2189 l2cap_send_sframe(chan, &control); in l2cap_send_ack()
2194 __set_ack_timer(chan); in l2cap_send_ack()
2198 static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan, in l2cap_skbuff_fromiovec() argument
2202 struct l2cap_conn *conn = chan->conn; in l2cap_skbuff_fromiovec()
2219 tmp = chan->ops->alloc_skb(chan, 0, count, in l2cap_skbuff_fromiovec()
2242 static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan, in l2cap_create_connless_pdu() argument
2245 struct l2cap_conn *conn = chan->conn; in l2cap_create_connless_pdu()
2250 BT_DBG("chan %p psm 0x%2.2x len %zu", chan, in l2cap_create_connless_pdu()
2251 __le16_to_cpu(chan->psm), len); in l2cap_create_connless_pdu()
2255 skb = chan->ops->alloc_skb(chan, hlen, count, in l2cap_create_connless_pdu()
2262 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_connless_pdu()
2264 put_unaligned(chan->psm, (__le16 *) skb_put(skb, L2CAP_PSMLEN_SIZE)); in l2cap_create_connless_pdu()
2266 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_connless_pdu()
2274 static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan, in l2cap_create_basic_pdu() argument
2277 struct l2cap_conn *conn = chan->conn; in l2cap_create_basic_pdu()
2282 BT_DBG("chan %p len %zu", chan, len); in l2cap_create_basic_pdu()
2286 skb = chan->ops->alloc_skb(chan, L2CAP_HDR_SIZE, count, in l2cap_create_basic_pdu()
2293 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_basic_pdu()
2296 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_basic_pdu()
2304 static struct sk_buff *l2cap_create_iframe_pdu(struct l2cap_chan *chan, in l2cap_create_iframe_pdu() argument
2308 struct l2cap_conn *conn = chan->conn; in l2cap_create_iframe_pdu()
2313 BT_DBG("chan %p len %zu", chan, len); in l2cap_create_iframe_pdu()
2318 hlen = __ertm_hdr_size(chan); in l2cap_create_iframe_pdu()
2323 if (chan->fcs == L2CAP_FCS_CRC16) in l2cap_create_iframe_pdu()
2328 skb = chan->ops->alloc_skb(chan, hlen, count, in l2cap_create_iframe_pdu()
2335 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_iframe_pdu()
2339 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_create_iframe_pdu()
2347 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_iframe_pdu()
2353 bt_cb(skb)->l2cap.fcs = chan->fcs; in l2cap_create_iframe_pdu()
2358 static int l2cap_segment_sdu(struct l2cap_chan *chan, in l2cap_segment_sdu() argument
2367 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len); in l2cap_segment_sdu()
2375 pdu_len = chan->conn->mtu; in l2cap_segment_sdu()
2381 if (chan->fcs) in l2cap_segment_sdu()
2384 pdu_len -= __ertm_hdr_size(chan); in l2cap_segment_sdu()
2387 pdu_len = min_t(size_t, pdu_len, chan->remote_mps); in l2cap_segment_sdu()
2399 skb = l2cap_create_iframe_pdu(chan, msg, pdu_len, sdu_len); in l2cap_segment_sdu()
2424 static struct sk_buff *l2cap_create_le_flowctl_pdu(struct l2cap_chan *chan, in l2cap_create_le_flowctl_pdu() argument
2428 struct l2cap_conn *conn = chan->conn; in l2cap_create_le_flowctl_pdu()
2433 BT_DBG("chan %p len %zu", chan, len); in l2cap_create_le_flowctl_pdu()
2445 skb = chan->ops->alloc_skb(chan, hlen, count, in l2cap_create_le_flowctl_pdu()
2452 lh->cid = cpu_to_le16(chan->dcid); in l2cap_create_le_flowctl_pdu()
2458 err = l2cap_skbuff_fromiovec(chan, msg, len, count, skb); in l2cap_create_le_flowctl_pdu()
2467 static int l2cap_segment_le_sdu(struct l2cap_chan *chan, in l2cap_segment_le_sdu() argument
2475 BT_DBG("chan %p, msg %p, len %zu", chan, msg, len); in l2cap_segment_le_sdu()
2478 pdu_len = chan->remote_mps - L2CAP_SDULEN_SIZE; in l2cap_segment_le_sdu()
2484 skb = l2cap_create_le_flowctl_pdu(chan, msg, pdu_len, sdu_len); in l2cap_segment_le_sdu()
2503 static void l2cap_le_flowctl_send(struct l2cap_chan *chan) in l2cap_le_flowctl_send() argument
2507 BT_DBG("chan %p", chan); in l2cap_le_flowctl_send()
2509 while (chan->tx_credits && !skb_queue_empty(&chan->tx_q)) { in l2cap_le_flowctl_send()
2510 l2cap_do_send(chan, skb_dequeue(&chan->tx_q)); in l2cap_le_flowctl_send()
2511 chan->tx_credits--; in l2cap_le_flowctl_send()
2515 BT_DBG("Sent %d credits %u queued %u", sent, chan->tx_credits, in l2cap_le_flowctl_send()
2516 skb_queue_len(&chan->tx_q)); in l2cap_le_flowctl_send()
2544 int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len, in l2cap_chan_send() argument
2551 if (!chan->conn) in l2cap_chan_send()
2555 if (chan->chan_type == L2CAP_CHAN_CONN_LESS) { in l2cap_chan_send()
2556 skb = l2cap_create_connless_pdu(chan, msg, len); in l2cap_chan_send()
2562 l2cap_do_send(chan, skb); in l2cap_chan_send()
2566 switch (chan->mode) { in l2cap_chan_send()
2570 if (len > chan->omtu) in l2cap_chan_send()
2575 err = l2cap_segment_le_sdu(chan, &seg_queue, msg, len); in l2cap_chan_send()
2577 if (chan->state != BT_CONNECTED) { in l2cap_chan_send()
2587 skb_queue_splice_tail_init(&seg_queue, &chan->tx_q); in l2cap_chan_send()
2589 l2cap_le_flowctl_send(chan); in l2cap_chan_send()
2591 if (!chan->tx_credits) in l2cap_chan_send()
2592 chan->ops->suspend(chan); in l2cap_chan_send()
2600 if (len > chan->omtu) in l2cap_chan_send()
2604 skb = l2cap_create_basic_pdu(chan, msg, len); in l2cap_chan_send()
2610 l2cap_do_send(chan, skb); in l2cap_chan_send()
2617 if (len > chan->omtu) { in l2cap_chan_send()
2628 err = l2cap_segment_sdu(chan, &seg_queue, msg, len); in l2cap_chan_send()
2633 if (chan->mode == L2CAP_MODE_ERTM) { in l2cap_chan_send()
2635 l2cap_tx(chan, NULL, &seg_queue, L2CAP_EV_DATA_REQUEST); in l2cap_chan_send()
2638 l2cap_streaming_send(chan, &seg_queue); in l2cap_chan_send()
2650 BT_DBG("bad state %1.1x", chan->mode); in l2cap_chan_send()
2658 static void l2cap_send_srej(struct l2cap_chan *chan, u16 txseq) in l2cap_send_srej() argument
2663 BT_DBG("chan %p, txseq %u", chan, txseq); in l2cap_send_srej()
2669 for (seq = chan->expected_tx_seq; seq != txseq; in l2cap_send_srej()
2670 seq = __next_seq(chan, seq)) { in l2cap_send_srej()
2671 if (!l2cap_ertm_seq_in_queue(&chan->srej_q, seq)) { in l2cap_send_srej()
2673 l2cap_send_sframe(chan, &control); in l2cap_send_srej()
2674 l2cap_seq_list_append(&chan->srej_list, seq); in l2cap_send_srej()
2678 chan->expected_tx_seq = __next_seq(chan, txseq); in l2cap_send_srej()
2681 static void l2cap_send_srej_tail(struct l2cap_chan *chan) in l2cap_send_srej_tail() argument
2685 BT_DBG("chan %p", chan); in l2cap_send_srej_tail()
2687 if (chan->srej_list.tail == L2CAP_SEQ_LIST_CLEAR) in l2cap_send_srej_tail()
2693 control.reqseq = chan->srej_list.tail; in l2cap_send_srej_tail()
2694 l2cap_send_sframe(chan, &control); in l2cap_send_srej_tail()
2697 static void l2cap_send_srej_list(struct l2cap_chan *chan, u16 txseq) in l2cap_send_srej_list() argument
2703 BT_DBG("chan %p, txseq %u", chan, txseq); in l2cap_send_srej_list()
2710 initial_head = chan->srej_list.head; in l2cap_send_srej_list()
2713 seq = l2cap_seq_list_pop(&chan->srej_list); in l2cap_send_srej_list()
2718 l2cap_send_sframe(chan, &control); in l2cap_send_srej_list()
2719 l2cap_seq_list_append(&chan->srej_list, seq); in l2cap_send_srej_list()
2720 } while (chan->srej_list.head != initial_head); in l2cap_send_srej_list()
2723 static void l2cap_process_reqseq(struct l2cap_chan *chan, u16 reqseq) in l2cap_process_reqseq() argument
2728 BT_DBG("chan %p, reqseq %u", chan, reqseq); in l2cap_process_reqseq()
2730 if (chan->unacked_frames == 0 || reqseq == chan->expected_ack_seq) in l2cap_process_reqseq()
2734 chan->expected_ack_seq, chan->unacked_frames); in l2cap_process_reqseq()
2736 for (ackseq = chan->expected_ack_seq; ackseq != reqseq; in l2cap_process_reqseq()
2737 ackseq = __next_seq(chan, ackseq)) { in l2cap_process_reqseq()
2739 acked_skb = l2cap_ertm_seq_in_queue(&chan->tx_q, ackseq); in l2cap_process_reqseq()
2741 skb_unlink(acked_skb, &chan->tx_q); in l2cap_process_reqseq()
2743 chan->unacked_frames--; in l2cap_process_reqseq()
2747 chan->expected_ack_seq = reqseq; in l2cap_process_reqseq()
2749 if (chan->unacked_frames == 0) in l2cap_process_reqseq()
2750 __clear_retrans_timer(chan); in l2cap_process_reqseq()
2752 BT_DBG("unacked_frames %u", chan->unacked_frames); in l2cap_process_reqseq()
2755 static void l2cap_abort_rx_srej_sent(struct l2cap_chan *chan) in l2cap_abort_rx_srej_sent() argument
2757 BT_DBG("chan %p", chan); in l2cap_abort_rx_srej_sent()
2759 chan->expected_tx_seq = chan->buffer_seq; in l2cap_abort_rx_srej_sent()
2760 l2cap_seq_list_clear(&chan->srej_list); in l2cap_abort_rx_srej_sent()
2761 skb_queue_purge(&chan->srej_q); in l2cap_abort_rx_srej_sent()
2762 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_abort_rx_srej_sent()
2765 static void l2cap_tx_state_xmit(struct l2cap_chan *chan, in l2cap_tx_state_xmit() argument
2769 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_xmit()
2774 if (chan->tx_send_head == NULL) in l2cap_tx_state_xmit()
2775 chan->tx_send_head = skb_peek(skbs); in l2cap_tx_state_xmit()
2777 skb_queue_splice_tail_init(skbs, &chan->tx_q); in l2cap_tx_state_xmit()
2778 l2cap_ertm_send(chan); in l2cap_tx_state_xmit()
2782 set_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_xmit()
2784 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) { in l2cap_tx_state_xmit()
2788 l2cap_abort_rx_srej_sent(chan); in l2cap_tx_state_xmit()
2791 l2cap_send_ack(chan); in l2cap_tx_state_xmit()
2796 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_xmit()
2798 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) { in l2cap_tx_state_xmit()
2805 local_control.reqseq = chan->buffer_seq; in l2cap_tx_state_xmit()
2806 l2cap_send_sframe(chan, &local_control); in l2cap_tx_state_xmit()
2808 chan->retry_count = 1; in l2cap_tx_state_xmit()
2809 __set_monitor_timer(chan); in l2cap_tx_state_xmit()
2810 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_xmit()
2814 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_xmit()
2817 l2cap_send_rr_or_rnr(chan, 1); in l2cap_tx_state_xmit()
2818 chan->retry_count = 1; in l2cap_tx_state_xmit()
2819 __set_monitor_timer(chan); in l2cap_tx_state_xmit()
2820 __clear_ack_timer(chan); in l2cap_tx_state_xmit()
2821 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_xmit()
2824 l2cap_send_rr_or_rnr(chan, 1); in l2cap_tx_state_xmit()
2825 chan->retry_count = 1; in l2cap_tx_state_xmit()
2826 __set_monitor_timer(chan); in l2cap_tx_state_xmit()
2827 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_xmit()
2837 static void l2cap_tx_state_wait_f(struct l2cap_chan *chan, in l2cap_tx_state_wait_f() argument
2841 BT_DBG("chan %p, control %p, skbs %p, event %d", chan, control, skbs, in l2cap_tx_state_wait_f()
2846 if (chan->tx_send_head == NULL) in l2cap_tx_state_wait_f()
2847 chan->tx_send_head = skb_peek(skbs); in l2cap_tx_state_wait_f()
2849 skb_queue_splice_tail_init(skbs, &chan->tx_q); in l2cap_tx_state_wait_f()
2853 set_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_wait_f()
2855 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) { in l2cap_tx_state_wait_f()
2859 l2cap_abort_rx_srej_sent(chan); in l2cap_tx_state_wait_f()
2862 l2cap_send_ack(chan); in l2cap_tx_state_wait_f()
2867 clear_bit(CONN_LOCAL_BUSY, &chan->conn_state); in l2cap_tx_state_wait_f()
2869 if (test_bit(CONN_RNR_SENT, &chan->conn_state)) { in l2cap_tx_state_wait_f()
2875 local_control.reqseq = chan->buffer_seq; in l2cap_tx_state_wait_f()
2876 l2cap_send_sframe(chan, &local_control); in l2cap_tx_state_wait_f()
2878 chan->retry_count = 1; in l2cap_tx_state_wait_f()
2879 __set_monitor_timer(chan); in l2cap_tx_state_wait_f()
2880 chan->tx_state = L2CAP_TX_STATE_WAIT_F; in l2cap_tx_state_wait_f()
2884 l2cap_process_reqseq(chan, control->reqseq); in l2cap_tx_state_wait_f()
2889 __clear_monitor_timer(chan); in l2cap_tx_state_wait_f()
2890 if (chan->unacked_frames > 0) in l2cap_tx_state_wait_f()
2891 __set_retrans_timer(chan); in l2cap_tx_state_wait_f()
2892 chan->retry_count = 0; in l2cap_tx_state_wait_f()
2893 chan->tx_state = L2CAP_TX_STATE_XMIT; in l2cap_tx_state_wait_f()
2894 BT_DBG("recv fbit tx_state 0x2.2%x", chan->tx_state); in l2cap_tx_state_wait_f()
2901 if (chan->max_tx == 0 || chan->retry_count < chan->max_tx) { in l2cap_tx_state_wait_f()
2902 l2cap_send_rr_or_rnr(chan, 1); in l2cap_tx_state_wait_f()
2903 __set_monitor_timer(chan); in l2cap_tx_state_wait_f()
2904 chan->retry_count++; in l2cap_tx_state_wait_f()
2906 l2cap_send_disconn_req(chan, ECONNABORTED); in l2cap_tx_state_wait_f()
2914 static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_tx() argument
2918 chan, control, skbs, event, chan->tx_state); in l2cap_tx()
2920 switch (chan->tx_state) { in l2cap_tx()
2922 l2cap_tx_state_xmit(chan, control, skbs, event); in l2cap_tx()
2925 l2cap_tx_state_wait_f(chan, control, skbs, event); in l2cap_tx()
2933 static void l2cap_pass_to_tx(struct l2cap_chan *chan, in l2cap_pass_to_tx() argument
2936 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx()
2937 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_REQSEQ_AND_FBIT); in l2cap_pass_to_tx()
2940 static void l2cap_pass_to_tx_fbit(struct l2cap_chan *chan, in l2cap_pass_to_tx_fbit() argument
2943 BT_DBG("chan %p, control %p", chan, control); in l2cap_pass_to_tx_fbit()
2944 l2cap_tx(chan, control, NULL, L2CAP_EV_RECV_FBIT); in l2cap_pass_to_tx_fbit()
2951 struct l2cap_chan *chan; in l2cap_raw_recv() local
2955 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_raw_recv()
2956 if (chan->chan_type != L2CAP_CHAN_RAW) in l2cap_raw_recv()
2960 if (bt_cb(skb)->l2cap.chan == chan) in l2cap_raw_recv()
2966 if (chan->ops->recv(chan, nskb)) in l2cap_raw_recv()
3105 static void l2cap_add_opt_efs(void **ptr, struct l2cap_chan *chan, size_t size) in l2cap_add_opt_efs() argument
3109 switch (chan->mode) { in l2cap_add_opt_efs()
3111 efs.id = chan->local_id; in l2cap_add_opt_efs()
3112 efs.stype = chan->local_stype; in l2cap_add_opt_efs()
3113 efs.msdu = cpu_to_le16(chan->local_msdu); in l2cap_add_opt_efs()
3114 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime); in l2cap_add_opt_efs()
3122 efs.msdu = cpu_to_le16(chan->local_msdu); in l2cap_add_opt_efs()
3123 efs.sdu_itime = cpu_to_le32(chan->local_sdu_itime); in l2cap_add_opt_efs()
3138 struct l2cap_chan *chan = container_of(work, struct l2cap_chan, in l2cap_ack_timeout() local
3142 BT_DBG("chan %p", chan); in l2cap_ack_timeout()
3144 l2cap_chan_lock(chan); in l2cap_ack_timeout()
3146 frames_to_ack = __seq_offset(chan, chan->buffer_seq, in l2cap_ack_timeout()
3147 chan->last_acked_seq); in l2cap_ack_timeout()
3150 l2cap_send_rr_or_rnr(chan, 0); in l2cap_ack_timeout()
3152 l2cap_chan_unlock(chan); in l2cap_ack_timeout()
3153 l2cap_chan_put(chan); in l2cap_ack_timeout()
3156 int l2cap_ertm_init(struct l2cap_chan *chan) in l2cap_ertm_init() argument
3160 chan->next_tx_seq = 0; in l2cap_ertm_init()
3161 chan->expected_tx_seq = 0; in l2cap_ertm_init()
3162 chan->expected_ack_seq = 0; in l2cap_ertm_init()
3163 chan->unacked_frames = 0; in l2cap_ertm_init()
3164 chan->buffer_seq = 0; in l2cap_ertm_init()
3165 chan->frames_sent = 0; in l2cap_ertm_init()
3166 chan->last_acked_seq = 0; in l2cap_ertm_init()
3167 chan->sdu = NULL; in l2cap_ertm_init()
3168 chan->sdu_last_frag = NULL; in l2cap_ertm_init()
3169 chan->sdu_len = 0; in l2cap_ertm_init()
3171 skb_queue_head_init(&chan->tx_q); in l2cap_ertm_init()
3173 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_ertm_init()
3176 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_ertm_init()
3177 chan->tx_state = L2CAP_TX_STATE_XMIT; in l2cap_ertm_init()
3179 skb_queue_head_init(&chan->srej_q); in l2cap_ertm_init()
3181 err = l2cap_seq_list_init(&chan->srej_list, chan->tx_win); in l2cap_ertm_init()
3185 err = l2cap_seq_list_init(&chan->retrans_list, chan->remote_tx_win); in l2cap_ertm_init()
3187 l2cap_seq_list_free(&chan->srej_list); in l2cap_ertm_init()
3215 static void __l2cap_set_ertm_timeouts(struct l2cap_chan *chan, in __l2cap_set_ertm_timeouts() argument
3222 static inline void l2cap_txwin_setup(struct l2cap_chan *chan) in l2cap_txwin_setup() argument
3224 if (chan->tx_win > L2CAP_DEFAULT_TX_WINDOW && in l2cap_txwin_setup()
3225 __l2cap_ews_supported(chan->conn)) { in l2cap_txwin_setup()
3227 set_bit(FLAG_EXT_CTRL, &chan->flags); in l2cap_txwin_setup()
3228 chan->tx_win_max = L2CAP_DEFAULT_EXT_WINDOW; in l2cap_txwin_setup()
3230 chan->tx_win = min_t(u16, chan->tx_win, in l2cap_txwin_setup()
3232 chan->tx_win_max = L2CAP_DEFAULT_TX_WINDOW; in l2cap_txwin_setup()
3234 chan->ack_win = chan->tx_win; in l2cap_txwin_setup()
3237 static void l2cap_mtu_auto(struct l2cap_chan *chan) in l2cap_mtu_auto() argument
3239 struct hci_conn *conn = chan->conn->hcon; in l2cap_mtu_auto()
3241 chan->imtu = L2CAP_DEFAULT_MIN_MTU; in l2cap_mtu_auto()
3247 chan->imtu = 54; in l2cap_mtu_auto()
3253 chan->imtu = 83; in l2cap_mtu_auto()
3259 chan->imtu = 367; in l2cap_mtu_auto()
3265 chan->imtu = 552; in l2cap_mtu_auto()
3271 chan->imtu = 679; in l2cap_mtu_auto()
3277 chan->imtu = 1021; in l2cap_mtu_auto()
3280 static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data, size_t data_size) in l2cap_build_conf_req() argument
3283 struct l2cap_conf_rfc rfc = { .mode = chan->mode }; in l2cap_build_conf_req()
3288 BT_DBG("chan %p", chan); in l2cap_build_conf_req()
3290 if (chan->num_conf_req || chan->num_conf_rsp) in l2cap_build_conf_req()
3293 switch (chan->mode) { in l2cap_build_conf_req()
3296 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) in l2cap_build_conf_req()
3299 if (__l2cap_efs_supported(chan->conn)) in l2cap_build_conf_req()
3300 set_bit(FLAG_EFS_ENABLE, &chan->flags); in l2cap_build_conf_req()
3304 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask); in l2cap_build_conf_req()
3309 if (chan->imtu != L2CAP_DEFAULT_MTU) { in l2cap_build_conf_req()
3310 if (!chan->imtu) in l2cap_build_conf_req()
3311 l2cap_mtu_auto(chan); in l2cap_build_conf_req()
3312 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, in l2cap_build_conf_req()
3316 switch (chan->mode) { in l2cap_build_conf_req()
3321 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) && in l2cap_build_conf_req()
3322 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING)) in l2cap_build_conf_req()
3338 rfc.max_transmit = chan->max_tx; in l2cap_build_conf_req()
3340 __l2cap_set_ertm_timeouts(chan, &rfc); in l2cap_build_conf_req()
3342 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu - in l2cap_build_conf_req()
3347 l2cap_txwin_setup(chan); in l2cap_build_conf_req()
3349 rfc.txwin_size = min_t(u16, chan->tx_win, in l2cap_build_conf_req()
3355 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) in l2cap_build_conf_req()
3356 l2cap_add_opt_efs(&ptr, chan, endptr - ptr); in l2cap_build_conf_req()
3358 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_build_conf_req()
3360 chan->tx_win, endptr - ptr); in l2cap_build_conf_req()
3362 if (chan->conn->feat_mask & L2CAP_FEAT_FCS) in l2cap_build_conf_req()
3363 if (chan->fcs == L2CAP_FCS_NONE || in l2cap_build_conf_req()
3364 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) { in l2cap_build_conf_req()
3365 chan->fcs = L2CAP_FCS_NONE; in l2cap_build_conf_req()
3367 chan->fcs, endptr - ptr); in l2cap_build_conf_req()
3372 l2cap_txwin_setup(chan); in l2cap_build_conf_req()
3379 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu - in l2cap_build_conf_req()
3387 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) in l2cap_build_conf_req()
3388 l2cap_add_opt_efs(&ptr, chan, endptr - ptr); in l2cap_build_conf_req()
3390 if (chan->conn->feat_mask & L2CAP_FEAT_FCS) in l2cap_build_conf_req()
3391 if (chan->fcs == L2CAP_FCS_NONE || in l2cap_build_conf_req()
3392 test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) { in l2cap_build_conf_req()
3393 chan->fcs = L2CAP_FCS_NONE; in l2cap_build_conf_req()
3395 chan->fcs, endptr - ptr); in l2cap_build_conf_req()
3400 req->dcid = cpu_to_le16(chan->dcid); in l2cap_build_conf_req()
3406 static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data_size) in l2cap_parse_conf_req() argument
3411 void *req = chan->conf_req; in l2cap_parse_conf_req()
3412 int len = chan->conf_len; in l2cap_parse_conf_req()
3422 BT_DBG("chan %p", chan); in l2cap_parse_conf_req()
3442 chan->flush_to = val; in l2cap_parse_conf_req()
3458 set_bit(CONF_RECV_NO_FCS, &chan->conf_state); in l2cap_parse_conf_req()
3482 if (chan->num_conf_rsp || chan->num_conf_req > 1) in l2cap_parse_conf_req()
3485 switch (chan->mode) { in l2cap_parse_conf_req()
3488 if (!test_bit(CONF_STATE2_DEVICE, &chan->conf_state)) { in l2cap_parse_conf_req()
3489 chan->mode = l2cap_select_mode(rfc.mode, in l2cap_parse_conf_req()
3490 chan->conn->feat_mask); in l2cap_parse_conf_req()
3495 if (__l2cap_efs_supported(chan->conn)) in l2cap_parse_conf_req()
3496 set_bit(FLAG_EFS_ENABLE, &chan->flags); in l2cap_parse_conf_req()
3501 if (chan->mode != rfc.mode) in l2cap_parse_conf_req()
3508 if (chan->mode != rfc.mode) { in l2cap_parse_conf_req()
3510 rfc.mode = chan->mode; in l2cap_parse_conf_req()
3512 if (chan->num_conf_rsp == 1) in l2cap_parse_conf_req()
3526 chan->omtu = mtu; in l2cap_parse_conf_req()
3527 set_bit(CONF_MTU_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3529 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->omtu, endptr - ptr); in l2cap_parse_conf_req()
3532 if (chan->local_stype != L2CAP_SERV_NOTRAFIC && in l2cap_parse_conf_req()
3534 efs.stype != chan->local_stype) { in l2cap_parse_conf_req()
3538 if (chan->num_conf_req >= 1) in l2cap_parse_conf_req()
3547 set_bit(CONF_LOC_CONF_PEND, &chan->conf_state); in l2cap_parse_conf_req()
3553 chan->fcs = L2CAP_FCS_NONE; in l2cap_parse_conf_req()
3554 set_bit(CONF_MODE_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3558 if (!test_bit(CONF_EWS_RECV, &chan->conf_state)) in l2cap_parse_conf_req()
3559 chan->remote_tx_win = rfc.txwin_size; in l2cap_parse_conf_req()
3563 chan->remote_max_tx = rfc.max_transmit; in l2cap_parse_conf_req()
3566 chan->conn->mtu - L2CAP_EXT_HDR_SIZE - in l2cap_parse_conf_req()
3569 chan->remote_mps = size; in l2cap_parse_conf_req()
3571 __l2cap_set_ertm_timeouts(chan, &rfc); in l2cap_parse_conf_req()
3573 set_bit(CONF_MODE_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3579 test_bit(FLAG_EFS_ENABLE, &chan->flags)) { in l2cap_parse_conf_req()
3580 chan->remote_id = efs.id; in l2cap_parse_conf_req()
3581 chan->remote_stype = efs.stype; in l2cap_parse_conf_req()
3582 chan->remote_msdu = le16_to_cpu(efs.msdu); in l2cap_parse_conf_req()
3583 chan->remote_flush_to = in l2cap_parse_conf_req()
3585 chan->remote_acc_lat = in l2cap_parse_conf_req()
3587 chan->remote_sdu_itime = in l2cap_parse_conf_req()
3597 chan->conn->mtu - L2CAP_EXT_HDR_SIZE - in l2cap_parse_conf_req()
3600 chan->remote_mps = size; in l2cap_parse_conf_req()
3602 set_bit(CONF_MODE_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3613 rfc.mode = chan->mode; in l2cap_parse_conf_req()
3617 set_bit(CONF_OUTPUT_DONE, &chan->conf_state); in l2cap_parse_conf_req()
3619 rsp->scid = cpu_to_le16(chan->dcid); in l2cap_parse_conf_req()
3626 static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, in l2cap_parse_conf_rsp() argument
3637 BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data); in l2cap_parse_conf_rsp()
3650 chan->imtu = L2CAP_DEFAULT_MIN_MTU; in l2cap_parse_conf_rsp()
3652 chan->imtu = val; in l2cap_parse_conf_rsp()
3653 l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, chan->imtu, in l2cap_parse_conf_rsp()
3660 chan->flush_to = val; in l2cap_parse_conf_rsp()
3662 chan->flush_to, endptr - ptr); in l2cap_parse_conf_rsp()
3669 if (test_bit(CONF_STATE2_DEVICE, &chan->conf_state) && in l2cap_parse_conf_rsp()
3670 rfc.mode != chan->mode) in l2cap_parse_conf_rsp()
3672 chan->fcs = 0; in l2cap_parse_conf_rsp()
3680 chan->ack_win = min_t(u16, val, chan->ack_win); in l2cap_parse_conf_rsp()
3682 chan->tx_win, endptr - ptr); in l2cap_parse_conf_rsp()
3689 if (chan->local_stype != L2CAP_SERV_NOTRAFIC && in l2cap_parse_conf_rsp()
3691 efs.stype != chan->local_stype) in l2cap_parse_conf_rsp()
3703 &chan->conf_state); in l2cap_parse_conf_rsp()
3708 if (chan->mode == L2CAP_MODE_BASIC && chan->mode != rfc.mode) in l2cap_parse_conf_rsp()
3711 chan->mode = rfc.mode; in l2cap_parse_conf_rsp()
3716 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout); in l2cap_parse_conf_rsp()
3717 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout); in l2cap_parse_conf_rsp()
3718 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_parse_conf_rsp()
3719 if (!test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_parse_conf_rsp()
3720 chan->ack_win = min_t(u16, chan->ack_win, in l2cap_parse_conf_rsp()
3723 if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) { in l2cap_parse_conf_rsp()
3724 chan->local_msdu = le16_to_cpu(efs.msdu); in l2cap_parse_conf_rsp()
3725 chan->local_sdu_itime = in l2cap_parse_conf_rsp()
3727 chan->local_acc_lat = le32_to_cpu(efs.acc_lat); in l2cap_parse_conf_rsp()
3728 chan->local_flush_to = in l2cap_parse_conf_rsp()
3734 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_parse_conf_rsp()
3738 req->dcid = cpu_to_le16(chan->dcid); in l2cap_parse_conf_rsp()
3744 static int l2cap_build_conf_rsp(struct l2cap_chan *chan, void *data, in l2cap_build_conf_rsp() argument
3750 BT_DBG("chan %p", chan); in l2cap_build_conf_rsp()
3752 rsp->scid = cpu_to_le16(chan->dcid); in l2cap_build_conf_rsp()
3759 void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan) in __l2cap_le_connect_rsp_defer() argument
3762 struct l2cap_conn *conn = chan->conn; in __l2cap_le_connect_rsp_defer()
3764 BT_DBG("chan %p", chan); in __l2cap_le_connect_rsp_defer()
3766 rsp.dcid = cpu_to_le16(chan->scid); in __l2cap_le_connect_rsp_defer()
3767 rsp.mtu = cpu_to_le16(chan->imtu); in __l2cap_le_connect_rsp_defer()
3768 rsp.mps = cpu_to_le16(chan->mps); in __l2cap_le_connect_rsp_defer()
3769 rsp.credits = cpu_to_le16(chan->rx_credits); in __l2cap_le_connect_rsp_defer()
3772 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in __l2cap_le_connect_rsp_defer()
3776 static void l2cap_ecred_list_defer(struct l2cap_chan *chan, void *data) in l2cap_ecred_list_defer() argument
3780 if (*result || test_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags)) in l2cap_ecred_list_defer()
3783 switch (chan->state) { in l2cap_ecred_list_defer()
3805 static void l2cap_ecred_rsp_defer(struct l2cap_chan *chan, void *data) in l2cap_ecred_rsp_defer() argument
3814 if (test_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags) || in l2cap_ecred_rsp_defer()
3815 !test_and_clear_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_ecred_rsp_defer()
3819 chan->ident = 0; in l2cap_ecred_rsp_defer()
3823 rsp_flex->dcid[rsp->count++] = cpu_to_le16(chan->scid); in l2cap_ecred_rsp_defer()
3825 l2cap_chan_del(chan, ECONNRESET); in l2cap_ecred_rsp_defer()
3828 void __l2cap_ecred_conn_rsp_defer(struct l2cap_chan *chan) in __l2cap_ecred_conn_rsp_defer() argument
3830 struct l2cap_conn *conn = chan->conn; in __l2cap_ecred_conn_rsp_defer()
3832 u16 id = chan->ident; in __l2cap_ecred_conn_rsp_defer()
3838 BT_DBG("chan %p id %d", chan, id); in __l2cap_ecred_conn_rsp_defer()
3842 data.pdu.rsp.mtu = cpu_to_le16(chan->imtu); in __l2cap_ecred_conn_rsp_defer()
3843 data.pdu.rsp.mps = cpu_to_le16(chan->mps); in __l2cap_ecred_conn_rsp_defer()
3844 data.pdu.rsp.credits = cpu_to_le16(chan->rx_credits); in __l2cap_ecred_conn_rsp_defer()
3864 void __l2cap_connect_rsp_defer(struct l2cap_chan *chan) in __l2cap_connect_rsp_defer() argument
3867 struct l2cap_conn *conn = chan->conn; in __l2cap_connect_rsp_defer()
3871 rsp.scid = cpu_to_le16(chan->dcid); in __l2cap_connect_rsp_defer()
3872 rsp.dcid = cpu_to_le16(chan->scid); in __l2cap_connect_rsp_defer()
3877 BT_DBG("chan %p rsp_code %u", chan, rsp_code); in __l2cap_connect_rsp_defer()
3879 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp); in __l2cap_connect_rsp_defer()
3881 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) in __l2cap_connect_rsp_defer()
3885 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in __l2cap_connect_rsp_defer()
3886 chan->num_conf_req++; in __l2cap_connect_rsp_defer()
3889 static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len) in l2cap_conf_rfc_get() argument
3896 u16 txwin_ext = chan->ack_win; in l2cap_conf_rfc_get()
3898 .mode = chan->mode, in l2cap_conf_rfc_get()
3901 .max_pdu_size = cpu_to_le16(chan->imtu), in l2cap_conf_rfc_get()
3902 .txwin_size = min_t(u16, chan->ack_win, L2CAP_DEFAULT_TX_WINDOW), in l2cap_conf_rfc_get()
3905 BT_DBG("chan %p, rsp %p, len %d", chan, rsp, len); in l2cap_conf_rfc_get()
3907 if ((chan->mode != L2CAP_MODE_ERTM) && (chan->mode != L2CAP_MODE_STREAMING)) in l2cap_conf_rfc_get()
3931 chan->retrans_timeout = le16_to_cpu(rfc.retrans_timeout); in l2cap_conf_rfc_get()
3932 chan->monitor_timeout = le16_to_cpu(rfc.monitor_timeout); in l2cap_conf_rfc_get()
3933 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_conf_rfc_get()
3934 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_conf_rfc_get()
3935 chan->ack_win = min_t(u16, chan->ack_win, txwin_ext); in l2cap_conf_rfc_get()
3937 chan->ack_win = min_t(u16, chan->ack_win, in l2cap_conf_rfc_get()
3941 chan->mps = le16_to_cpu(rfc.max_pdu_size); in l2cap_conf_rfc_get()
3975 struct l2cap_chan *chan = NULL, *pchan = NULL; in l2cap_connect() local
4016 chan = pchan->ops->new_connection(pchan); in l2cap_connect()
4017 if (!chan) in l2cap_connect()
4027 bacpy(&chan->src, &conn->hcon->src); in l2cap_connect()
4028 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_connect()
4029 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_connect()
4030 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_connect()
4031 chan->psm = psm; in l2cap_connect()
4032 chan->dcid = scid; in l2cap_connect()
4034 __l2cap_chan_add(conn, chan); in l2cap_connect()
4036 dcid = chan->scid; in l2cap_connect()
4038 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_connect()
4040 chan->ident = cmd->ident; in l2cap_connect()
4043 if (l2cap_chan_check_security(chan, false)) { in l2cap_connect()
4044 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_connect()
4045 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4048 chan->ops->defer(chan); in l2cap_connect()
4050 l2cap_state_change(chan, BT_CONFIG); in l2cap_connect()
4055 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4060 l2cap_state_change(chan, BT_CONNECT2); in l2cap_connect()
4088 if (chan && !test_bit(CONF_REQ_SENT, &chan->conf_state) && in l2cap_connect()
4091 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_connect()
4093 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_connect()
4094 chan->num_conf_req++; in l2cap_connect()
4117 struct l2cap_chan *chan; in l2cap_connect_create_rsp() local
4137 chan = __l2cap_get_chan_by_scid(conn, scid); in l2cap_connect_create_rsp()
4138 if (!chan) in l2cap_connect_create_rsp()
4141 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_connect_create_rsp()
4142 if (!chan) in l2cap_connect_create_rsp()
4146 chan = l2cap_chan_hold_unless_zero(chan); in l2cap_connect_create_rsp()
4147 if (!chan) in l2cap_connect_create_rsp()
4152 l2cap_chan_lock(chan); in l2cap_connect_create_rsp()
4161 l2cap_state_change(chan, BT_CONFIG); in l2cap_connect_create_rsp()
4162 chan->ident = 0; in l2cap_connect_create_rsp()
4163 chan->dcid = dcid; in l2cap_connect_create_rsp()
4164 clear_bit(CONF_CONNECT_PEND, &chan->conf_state); in l2cap_connect_create_rsp()
4166 if (test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) in l2cap_connect_create_rsp()
4170 l2cap_build_conf_req(chan, req, sizeof(req)), req); in l2cap_connect_create_rsp()
4171 chan->num_conf_req++; in l2cap_connect_create_rsp()
4175 set_bit(CONF_CONNECT_PEND, &chan->conf_state); in l2cap_connect_create_rsp()
4179 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_connect_create_rsp()
4183 l2cap_chan_unlock(chan); in l2cap_connect_create_rsp()
4184 l2cap_chan_put(chan); in l2cap_connect_create_rsp()
4189 static inline void set_default_fcs(struct l2cap_chan *chan) in set_default_fcs() argument
4194 if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING) in set_default_fcs()
4195 chan->fcs = L2CAP_FCS_NONE; in set_default_fcs()
4196 else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) in set_default_fcs()
4197 chan->fcs = L2CAP_FCS_CRC16; in set_default_fcs()
4200 static void l2cap_send_efs_conf_rsp(struct l2cap_chan *chan, void *data, in l2cap_send_efs_conf_rsp() argument
4203 struct l2cap_conn *conn = chan->conn; in l2cap_send_efs_conf_rsp()
4205 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident, in l2cap_send_efs_conf_rsp()
4208 clear_bit(CONF_LOC_CONF_PEND, &chan->conf_state); in l2cap_send_efs_conf_rsp()
4209 set_bit(CONF_OUTPUT_DONE, &chan->conf_state); in l2cap_send_efs_conf_rsp()
4212 l2cap_build_conf_rsp(chan, data, in l2cap_send_efs_conf_rsp()
4235 struct l2cap_chan *chan; in l2cap_config_req() local
4246 chan = l2cap_get_chan_by_scid(conn, dcid); in l2cap_config_req()
4247 if (!chan) { in l2cap_config_req()
4252 if (chan->state != BT_CONFIG && chan->state != BT_CONNECT2 && in l2cap_config_req()
4253 chan->state != BT_CONNECTED) { in l2cap_config_req()
4254 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid, in l2cap_config_req()
4255 chan->dcid); in l2cap_config_req()
4261 if (chan->conf_len + len > sizeof(chan->conf_req)) { in l2cap_config_req()
4263 l2cap_build_conf_rsp(chan, rsp, in l2cap_config_req()
4269 memcpy(chan->conf_req + chan->conf_len, req->data, len); in l2cap_config_req()
4270 chan->conf_len += len; in l2cap_config_req()
4275 l2cap_build_conf_rsp(chan, rsp, in l2cap_config_req()
4281 len = l2cap_parse_conf_req(chan, rsp, sizeof(rsp)); in l2cap_config_req()
4283 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_req()
4287 chan->ident = cmd->ident; in l2cap_config_req()
4289 if (chan->num_conf_rsp < L2CAP_CONF_MAX_CONF_RSP) in l2cap_config_req()
4290 chan->num_conf_rsp++; in l2cap_config_req()
4293 chan->conf_len = 0; in l2cap_config_req()
4295 if (!test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) in l2cap_config_req()
4298 if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) { in l2cap_config_req()
4299 set_default_fcs(chan); in l2cap_config_req()
4301 if (chan->mode == L2CAP_MODE_ERTM || in l2cap_config_req()
4302 chan->mode == L2CAP_MODE_STREAMING) in l2cap_config_req()
4303 err = l2cap_ertm_init(chan); in l2cap_config_req()
4306 l2cap_send_disconn_req(chan, -err); in l2cap_config_req()
4308 l2cap_chan_ready(chan); in l2cap_config_req()
4313 if (!test_and_set_bit(CONF_REQ_SENT, &chan->conf_state)) { in l2cap_config_req()
4316 l2cap_build_conf_req(chan, buf, sizeof(buf)), buf); in l2cap_config_req()
4317 chan->num_conf_req++; in l2cap_config_req()
4322 if (test_bit(CONF_REM_CONF_PEND, &chan->conf_state) && in l2cap_config_req()
4323 test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) { in l2cap_config_req()
4328 l2cap_send_efs_conf_rsp(chan, rsp, cmd->ident, flags); in l2cap_config_req()
4332 l2cap_chan_unlock(chan); in l2cap_config_req()
4333 l2cap_chan_put(chan); in l2cap_config_req()
4343 struct l2cap_chan *chan; in l2cap_config_rsp() local
4357 chan = l2cap_get_chan_by_scid(conn, scid); in l2cap_config_rsp()
4358 if (!chan) in l2cap_config_rsp()
4363 l2cap_conf_rfc_get(chan, rsp->data, len); in l2cap_config_rsp()
4364 clear_bit(CONF_REM_CONF_PEND, &chan->conf_state); in l2cap_config_rsp()
4368 set_bit(CONF_REM_CONF_PEND, &chan->conf_state); in l2cap_config_rsp()
4370 if (test_bit(CONF_LOC_CONF_PEND, &chan->conf_state)) { in l2cap_config_rsp()
4373 len = l2cap_parse_conf_rsp(chan, rsp->data, len, in l2cap_config_rsp()
4376 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4380 l2cap_send_efs_conf_rsp(chan, buf, cmd->ident, 0); in l2cap_config_rsp()
4386 if (chan->num_conf_rsp <= L2CAP_CONF_MAX_CONF_RSP) { in l2cap_config_rsp()
4390 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4396 len = l2cap_parse_conf_rsp(chan, rsp->data, len, in l2cap_config_rsp()
4399 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4405 chan->num_conf_req++; in l2cap_config_rsp()
4413 l2cap_chan_set_err(chan, ECONNRESET); in l2cap_config_rsp()
4415 __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT); in l2cap_config_rsp()
4416 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_config_rsp()
4423 set_bit(CONF_INPUT_DONE, &chan->conf_state); in l2cap_config_rsp()
4425 if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) { in l2cap_config_rsp()
4426 set_default_fcs(chan); in l2cap_config_rsp()
4428 if (chan->mode == L2CAP_MODE_ERTM || in l2cap_config_rsp()
4429 chan->mode == L2CAP_MODE_STREAMING) in l2cap_config_rsp()
4430 err = l2cap_ertm_init(chan); in l2cap_config_rsp()
4433 l2cap_send_disconn_req(chan, -err); in l2cap_config_rsp()
4435 l2cap_chan_ready(chan); in l2cap_config_rsp()
4439 l2cap_chan_unlock(chan); in l2cap_config_rsp()
4440 l2cap_chan_put(chan); in l2cap_config_rsp()
4451 struct l2cap_chan *chan; in l2cap_disconnect_req() local
4461 chan = l2cap_get_chan_by_scid(conn, dcid); in l2cap_disconnect_req()
4462 if (!chan) { in l2cap_disconnect_req()
4467 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_disconnect_req()
4468 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_disconnect_req()
4471 chan->ops->set_shutdown(chan); in l2cap_disconnect_req()
4473 l2cap_chan_del(chan, ECONNRESET); in l2cap_disconnect_req()
4475 chan->ops->close(chan); in l2cap_disconnect_req()
4477 l2cap_chan_unlock(chan); in l2cap_disconnect_req()
4478 l2cap_chan_put(chan); in l2cap_disconnect_req()
4489 struct l2cap_chan *chan; in l2cap_disconnect_rsp() local
4499 chan = l2cap_get_chan_by_scid(conn, scid); in l2cap_disconnect_rsp()
4500 if (!chan) { in l2cap_disconnect_rsp()
4504 if (chan->state != BT_DISCONN) { in l2cap_disconnect_rsp()
4505 l2cap_chan_unlock(chan); in l2cap_disconnect_rsp()
4506 l2cap_chan_put(chan); in l2cap_disconnect_rsp()
4510 l2cap_chan_del(chan, 0); in l2cap_disconnect_rsp()
4512 chan->ops->close(chan); in l2cap_disconnect_rsp()
4514 l2cap_chan_unlock(chan); in l2cap_disconnect_rsp()
4515 l2cap_chan_put(chan); in l2cap_disconnect_rsp()
4688 struct l2cap_chan *chan; in l2cap_le_connect_rsp() local
4708 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_le_connect_rsp()
4709 if (!chan) in l2cap_le_connect_rsp()
4714 l2cap_chan_lock(chan); in l2cap_le_connect_rsp()
4723 chan->ident = 0; in l2cap_le_connect_rsp()
4724 chan->dcid = dcid; in l2cap_le_connect_rsp()
4725 chan->omtu = mtu; in l2cap_le_connect_rsp()
4726 chan->remote_mps = mps; in l2cap_le_connect_rsp()
4727 chan->tx_credits = credits; in l2cap_le_connect_rsp()
4728 l2cap_chan_ready(chan); in l2cap_le_connect_rsp()
4737 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_le_connect_rsp()
4742 if (chan->sec_level < sec_level) in l2cap_le_connect_rsp()
4743 chan->sec_level = sec_level; in l2cap_le_connect_rsp()
4746 clear_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags); in l2cap_le_connect_rsp()
4748 smp_conn_security(hcon, chan->sec_level); in l2cap_le_connect_rsp()
4752 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_le_connect_rsp()
4756 l2cap_chan_unlock(chan); in l2cap_le_connect_rsp()
4826 struct l2cap_chan *chan, *pchan; in l2cap_le_connect_req() local
4856 chan = NULL; in l2cap_le_connect_req()
4865 chan = NULL; in l2cap_le_connect_req()
4874 chan = NULL; in l2cap_le_connect_req()
4881 chan = NULL; in l2cap_le_connect_req()
4888 chan = NULL; in l2cap_le_connect_req()
4892 chan = pchan->ops->new_connection(pchan); in l2cap_le_connect_req()
4893 if (!chan) { in l2cap_le_connect_req()
4898 bacpy(&chan->src, &conn->hcon->src); in l2cap_le_connect_req()
4899 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_le_connect_req()
4900 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_le_connect_req()
4901 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_le_connect_req()
4902 chan->psm = psm; in l2cap_le_connect_req()
4903 chan->dcid = scid; in l2cap_le_connect_req()
4904 chan->omtu = mtu; in l2cap_le_connect_req()
4905 chan->remote_mps = mps; in l2cap_le_connect_req()
4907 __l2cap_chan_add(conn, chan); in l2cap_le_connect_req()
4909 l2cap_le_flowctl_init(chan, __le16_to_cpu(req->credits)); in l2cap_le_connect_req()
4911 dcid = chan->scid; in l2cap_le_connect_req()
4912 credits = chan->rx_credits; in l2cap_le_connect_req()
4914 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_le_connect_req()
4916 chan->ident = cmd->ident; in l2cap_le_connect_req()
4918 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_le_connect_req()
4919 l2cap_state_change(chan, BT_CONNECT2); in l2cap_le_connect_req()
4926 chan->ops->defer(chan); in l2cap_le_connect_req()
4928 l2cap_chan_ready(chan); in l2cap_le_connect_req()
4940 if (chan) { in l2cap_le_connect_req()
4941 rsp.mtu = cpu_to_le16(chan->imtu); in l2cap_le_connect_req()
4942 rsp.mps = cpu_to_le16(chan->mps); in l2cap_le_connect_req()
4962 struct l2cap_chan *chan; in l2cap_le_credits() local
4974 chan = l2cap_get_chan_by_dcid(conn, cid); in l2cap_le_credits()
4975 if (!chan) in l2cap_le_credits()
4978 max_credits = LE_FLOWCTL_MAX_CREDITS - chan->tx_credits; in l2cap_le_credits()
4981 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_le_credits()
4989 chan->tx_credits += credits; in l2cap_le_credits()
4992 l2cap_le_flowctl_send(chan); in l2cap_le_credits()
4994 if (chan->tx_credits) in l2cap_le_credits()
4995 chan->ops->resume(chan); in l2cap_le_credits()
4998 l2cap_chan_unlock(chan); in l2cap_le_credits()
4999 l2cap_chan_put(chan); in l2cap_le_credits()
5010 struct l2cap_chan *chan, *pchan; in l2cap_ecred_conn_req() local
5097 chan = pchan->ops->new_connection(pchan); in l2cap_ecred_conn_req()
5098 if (!chan) { in l2cap_ecred_conn_req()
5103 bacpy(&chan->src, &conn->hcon->src); in l2cap_ecred_conn_req()
5104 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_ecred_conn_req()
5105 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_ecred_conn_req()
5106 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_ecred_conn_req()
5107 chan->psm = psm; in l2cap_ecred_conn_req()
5108 chan->dcid = scid; in l2cap_ecred_conn_req()
5109 chan->omtu = mtu; in l2cap_ecred_conn_req()
5110 chan->remote_mps = mps; in l2cap_ecred_conn_req()
5112 __l2cap_chan_add(conn, chan); in l2cap_ecred_conn_req()
5114 l2cap_ecred_init(chan, __le16_to_cpu(req->credits)); in l2cap_ecred_conn_req()
5118 pdu->mtu = cpu_to_le16(chan->imtu); in l2cap_ecred_conn_req()
5119 pdu->mps = cpu_to_le16(chan->mps); in l2cap_ecred_conn_req()
5120 pdu->credits = cpu_to_le16(chan->rx_credits); in l2cap_ecred_conn_req()
5123 pdu->dcid[i] = cpu_to_le16(chan->scid); in l2cap_ecred_conn_req()
5125 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_ecred_conn_req()
5127 chan->ident = cmd->ident; in l2cap_ecred_conn_req()
5128 chan->mode = L2CAP_MODE_EXT_FLOWCTL; in l2cap_ecred_conn_req()
5130 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_ecred_conn_req()
5131 l2cap_state_change(chan, BT_CONNECT2); in l2cap_ecred_conn_req()
5133 chan->ops->defer(chan); in l2cap_ecred_conn_req()
5135 l2cap_chan_ready(chan); in l2cap_ecred_conn_req()
5162 struct l2cap_chan *chan, *tmp; in l2cap_ecred_conn_rsp() local
5179 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) { in l2cap_ecred_conn_rsp()
5182 if (chan->ident != cmd->ident || in l2cap_ecred_conn_rsp()
5183 chan->mode != L2CAP_MODE_EXT_FLOWCTL || in l2cap_ecred_conn_rsp()
5184 chan->state == BT_CONNECTED) in l2cap_ecred_conn_rsp()
5187 l2cap_chan_lock(chan); in l2cap_ecred_conn_rsp()
5191 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
5192 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
5209 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
5210 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
5211 chan = __l2cap_get_chan_by_dcid(conn, dcid); in l2cap_ecred_conn_rsp()
5212 l2cap_chan_lock(chan); in l2cap_ecred_conn_rsp()
5213 l2cap_chan_del(chan, ECONNRESET); in l2cap_ecred_conn_rsp()
5214 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
5225 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
5230 if (chan->sec_level < sec_level) in l2cap_ecred_conn_rsp()
5231 chan->sec_level = sec_level; in l2cap_ecred_conn_rsp()
5234 clear_bit(FLAG_ECRED_CONN_REQ_SENT, &chan->flags); in l2cap_ecred_conn_rsp()
5236 smp_conn_security(hcon, chan->sec_level); in l2cap_ecred_conn_rsp()
5240 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
5246 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_ecred_conn_rsp()
5250 chan->ident = 0; in l2cap_ecred_conn_rsp()
5251 chan->dcid = dcid; in l2cap_ecred_conn_rsp()
5252 chan->omtu = mtu; in l2cap_ecred_conn_rsp()
5253 chan->remote_mps = mps; in l2cap_ecred_conn_rsp()
5254 chan->tx_credits = credits; in l2cap_ecred_conn_rsp()
5255 l2cap_chan_ready(chan); in l2cap_ecred_conn_rsp()
5259 l2cap_chan_unlock(chan); in l2cap_ecred_conn_rsp()
5272 struct l2cap_chan *chan; in l2cap_ecred_reconf_req() local
5309 chan = __l2cap_get_chan_by_dcid(conn, scid); in l2cap_ecred_reconf_req()
5310 if (!chan) in l2cap_ecred_reconf_req()
5317 if (chan->omtu > mtu) { in l2cap_ecred_reconf_req()
5318 BT_ERR("chan %p decreased MTU %u -> %u", chan, in l2cap_ecred_reconf_req()
5319 chan->omtu, mtu); in l2cap_ecred_reconf_req()
5323 chan->omtu = mtu; in l2cap_ecred_reconf_req()
5324 chan->remote_mps = mps; in l2cap_ecred_reconf_req()
5340 struct l2cap_chan *chan, *tmp; in l2cap_ecred_reconf_rsp() local
5354 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) { in l2cap_ecred_reconf_rsp()
5355 if (chan->ident != cmd->ident) in l2cap_ecred_reconf_rsp()
5358 l2cap_chan_del(chan, ECONNRESET); in l2cap_ecred_reconf_rsp()
5369 struct l2cap_chan *chan; in l2cap_le_command_rej() local
5374 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_le_command_rej()
5375 if (!chan) in l2cap_le_command_rej()
5378 chan = l2cap_chan_hold_unless_zero(chan); in l2cap_le_command_rej()
5379 if (!chan) in l2cap_le_command_rej()
5382 l2cap_chan_lock(chan); in l2cap_le_command_rej()
5383 l2cap_chan_del(chan, ECONNREFUSED); in l2cap_le_command_rej()
5384 l2cap_chan_unlock(chan); in l2cap_le_command_rej()
5385 l2cap_chan_put(chan); in l2cap_le_command_rej()
5551 static int l2cap_check_fcs(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_check_fcs() argument
5556 if (test_bit(FLAG_EXT_CTRL, &chan->flags)) in l2cap_check_fcs()
5561 if (chan->fcs == L2CAP_FCS_CRC16) { in l2cap_check_fcs()
5572 static void l2cap_send_i_or_rr_or_rnr(struct l2cap_chan *chan) in l2cap_send_i_or_rr_or_rnr() argument
5576 BT_DBG("chan %p", chan); in l2cap_send_i_or_rr_or_rnr()
5581 control.reqseq = chan->buffer_seq; in l2cap_send_i_or_rr_or_rnr()
5582 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_send_i_or_rr_or_rnr()
5584 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_send_i_or_rr_or_rnr()
5586 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
5589 if (test_and_clear_bit(CONN_REMOTE_BUSY, &chan->conn_state) && in l2cap_send_i_or_rr_or_rnr()
5590 chan->unacked_frames > 0) in l2cap_send_i_or_rr_or_rnr()
5591 __set_retrans_timer(chan); in l2cap_send_i_or_rr_or_rnr()
5594 l2cap_ertm_send(chan); in l2cap_send_i_or_rr_or_rnr()
5596 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state) && in l2cap_send_i_or_rr_or_rnr()
5597 test_bit(CONN_SEND_FBIT, &chan->conn_state)) { in l2cap_send_i_or_rr_or_rnr()
5602 l2cap_send_sframe(chan, &control); in l2cap_send_i_or_rr_or_rnr()
5625 static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb, in l2cap_reassemble_sdu() argument
5632 if (chan->sdu) in l2cap_reassemble_sdu()
5635 err = chan->ops->recv(chan, skb); in l2cap_reassemble_sdu()
5639 if (chan->sdu) in l2cap_reassemble_sdu()
5645 chan->sdu_len = get_unaligned_le16(skb->data); in l2cap_reassemble_sdu()
5648 if (chan->sdu_len > chan->imtu) { in l2cap_reassemble_sdu()
5653 if (skb->len >= chan->sdu_len) in l2cap_reassemble_sdu()
5656 chan->sdu = skb; in l2cap_reassemble_sdu()
5657 chan->sdu_last_frag = skb; in l2cap_reassemble_sdu()
5664 if (!chan->sdu) in l2cap_reassemble_sdu()
5667 append_skb_frag(chan->sdu, skb, in l2cap_reassemble_sdu()
5668 &chan->sdu_last_frag); in l2cap_reassemble_sdu()
5671 if (chan->sdu->len >= chan->sdu_len) in l2cap_reassemble_sdu()
5678 if (!chan->sdu) in l2cap_reassemble_sdu()
5681 append_skb_frag(chan->sdu, skb, in l2cap_reassemble_sdu()
5682 &chan->sdu_last_frag); in l2cap_reassemble_sdu()
5685 if (chan->sdu->len != chan->sdu_len) in l2cap_reassemble_sdu()
5688 err = chan->ops->recv(chan, chan->sdu); in l2cap_reassemble_sdu()
5692 chan->sdu = NULL; in l2cap_reassemble_sdu()
5693 chan->sdu_last_frag = NULL; in l2cap_reassemble_sdu()
5694 chan->sdu_len = 0; in l2cap_reassemble_sdu()
5701 kfree_skb(chan->sdu); in l2cap_reassemble_sdu()
5702 chan->sdu = NULL; in l2cap_reassemble_sdu()
5703 chan->sdu_last_frag = NULL; in l2cap_reassemble_sdu()
5704 chan->sdu_len = 0; in l2cap_reassemble_sdu()
5710 static int l2cap_resegment(struct l2cap_chan *chan) in l2cap_resegment() argument
5716 void l2cap_chan_busy(struct l2cap_chan *chan, int busy) in l2cap_chan_busy() argument
5720 if (chan->mode != L2CAP_MODE_ERTM) in l2cap_chan_busy()
5724 l2cap_tx(chan, NULL, NULL, event); in l2cap_chan_busy()
5727 static int l2cap_rx_queued_iframes(struct l2cap_chan *chan) in l2cap_rx_queued_iframes() argument
5734 BT_DBG("chan %p", chan); in l2cap_rx_queued_iframes()
5736 while (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_rx_queued_iframes()
5739 chan->buffer_seq, skb_queue_len(&chan->srej_q)); in l2cap_rx_queued_iframes()
5741 skb = l2cap_ertm_seq_in_queue(&chan->srej_q, chan->buffer_seq); in l2cap_rx_queued_iframes()
5746 skb_unlink(skb, &chan->srej_q); in l2cap_rx_queued_iframes()
5747 chan->buffer_seq = __next_seq(chan, chan->buffer_seq); in l2cap_rx_queued_iframes()
5748 err = l2cap_reassemble_sdu(chan, skb, &bt_cb(skb)->l2cap); in l2cap_rx_queued_iframes()
5753 if (skb_queue_empty(&chan->srej_q)) { in l2cap_rx_queued_iframes()
5754 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_rx_queued_iframes()
5755 l2cap_send_ack(chan); in l2cap_rx_queued_iframes()
5761 static void l2cap_handle_srej(struct l2cap_chan *chan, in l2cap_handle_srej() argument
5766 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_srej()
5768 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_srej()
5770 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_srej()
5774 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_srej()
5782 if (chan->max_tx != 0 && bt_cb(skb)->l2cap.retries >= chan->max_tx) { in l2cap_handle_srej()
5783 BT_DBG("Retry limit exceeded (%d)", chan->max_tx); in l2cap_handle_srej()
5784 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_srej()
5788 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_handle_srej()
5791 l2cap_pass_to_tx(chan, control); in l2cap_handle_srej()
5793 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_handle_srej()
5794 l2cap_retransmit(chan, control); in l2cap_handle_srej()
5795 l2cap_ertm_send(chan); in l2cap_handle_srej()
5797 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) { in l2cap_handle_srej()
5798 set_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_handle_srej()
5799 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
5802 l2cap_pass_to_tx_fbit(chan, control); in l2cap_handle_srej()
5805 if (chan->srej_save_reqseq != control->reqseq || in l2cap_handle_srej()
5807 &chan->conn_state)) in l2cap_handle_srej()
5808 l2cap_retransmit(chan, control); in l2cap_handle_srej()
5810 l2cap_retransmit(chan, control); in l2cap_handle_srej()
5811 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) { in l2cap_handle_srej()
5812 set_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_handle_srej()
5813 chan->srej_save_reqseq = control->reqseq; in l2cap_handle_srej()
5819 static void l2cap_handle_rej(struct l2cap_chan *chan, in l2cap_handle_rej() argument
5824 BT_DBG("chan %p, control %p", chan, control); in l2cap_handle_rej()
5826 if (control->reqseq == chan->next_tx_seq) { in l2cap_handle_rej()
5828 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_rej()
5832 skb = l2cap_ertm_seq_in_queue(&chan->tx_q, control->reqseq); in l2cap_handle_rej()
5834 if (chan->max_tx && skb && in l2cap_handle_rej()
5835 bt_cb(skb)->l2cap.retries >= chan->max_tx) { in l2cap_handle_rej()
5836 BT_DBG("Retry limit exceeded (%d)", chan->max_tx); in l2cap_handle_rej()
5837 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_handle_rej()
5841 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_handle_rej()
5843 l2cap_pass_to_tx(chan, control); in l2cap_handle_rej()
5846 if (!test_and_clear_bit(CONN_REJ_ACT, &chan->conn_state)) in l2cap_handle_rej()
5847 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
5849 l2cap_retransmit_all(chan, control); in l2cap_handle_rej()
5850 l2cap_ertm_send(chan); in l2cap_handle_rej()
5851 if (chan->tx_state == L2CAP_TX_STATE_WAIT_F) in l2cap_handle_rej()
5852 set_bit(CONN_REJ_ACT, &chan->conn_state); in l2cap_handle_rej()
5856 static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq) in l2cap_classify_txseq() argument
5858 BT_DBG("chan %p, txseq %d", chan, txseq); in l2cap_classify_txseq()
5860 BT_DBG("last_acked_seq %d, expected_tx_seq %d", chan->last_acked_seq, in l2cap_classify_txseq()
5861 chan->expected_tx_seq); in l2cap_classify_txseq()
5863 if (chan->rx_state == L2CAP_RX_STATE_SREJ_SENT) { in l2cap_classify_txseq()
5864 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= in l2cap_classify_txseq()
5865 chan->tx_win) { in l2cap_classify_txseq()
5869 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) { in l2cap_classify_txseq()
5878 if (chan->srej_list.head == txseq) { in l2cap_classify_txseq()
5883 if (l2cap_ertm_seq_in_queue(&chan->srej_q, txseq)) { in l2cap_classify_txseq()
5888 if (l2cap_seq_list_contains(&chan->srej_list, txseq)) { in l2cap_classify_txseq()
5894 if (chan->expected_tx_seq == txseq) { in l2cap_classify_txseq()
5895 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= in l2cap_classify_txseq()
5896 chan->tx_win) { in l2cap_classify_txseq()
5905 if (__seq_offset(chan, txseq, chan->last_acked_seq) < in l2cap_classify_txseq()
5906 __seq_offset(chan, chan->expected_tx_seq, chan->last_acked_seq)) { in l2cap_classify_txseq()
5911 if (__seq_offset(chan, txseq, chan->last_acked_seq) >= chan->tx_win) { in l2cap_classify_txseq()
5929 if (chan->tx_win <= ((chan->tx_win_max + 1) >> 1)) { in l2cap_classify_txseq()
5942 static int l2cap_rx_state_recv(struct l2cap_chan *chan, in l2cap_rx_state_recv() argument
5950 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_recv()
5955 switch (l2cap_classify_txseq(chan, control->txseq)) { in l2cap_rx_state_recv()
5957 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
5959 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_rx_state_recv()
5965 chan->expected_tx_seq = __next_seq(chan, in l2cap_rx_state_recv()
5968 chan->buffer_seq = chan->expected_tx_seq; in l2cap_rx_state_recv()
5988 err = l2cap_reassemble_sdu(chan, skb, control); in l2cap_rx_state_recv()
5994 &chan->conn_state)) { in l2cap_rx_state_recv()
5996 l2cap_retransmit_all(chan, &local_control); in l2cap_rx_state_recv()
5997 l2cap_ertm_send(chan); in l2cap_rx_state_recv()
6001 if (!test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) in l2cap_rx_state_recv()
6002 l2cap_send_ack(chan); in l2cap_rx_state_recv()
6005 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6011 if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) { in l2cap_rx_state_recv()
6021 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_recv()
6024 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_recv()
6026 clear_bit(CONN_SREJ_ACT, &chan->conn_state); in l2cap_rx_state_recv()
6027 l2cap_seq_list_clear(&chan->srej_list); in l2cap_rx_state_recv()
6028 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_recv()
6030 chan->rx_state = L2CAP_RX_STATE_SREJ_SENT; in l2cap_rx_state_recv()
6033 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6039 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_rx_state_recv()
6044 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6046 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_recv()
6049 &chan->conn_state)) { in l2cap_rx_state_recv()
6051 l2cap_retransmit_all(chan, control); in l2cap_rx_state_recv()
6054 l2cap_ertm_send(chan); in l2cap_rx_state_recv()
6056 l2cap_send_i_or_rr_or_rnr(chan); in l2cap_rx_state_recv()
6059 &chan->conn_state) && in l2cap_rx_state_recv()
6060 chan->unacked_frames) in l2cap_rx_state_recv()
6061 __set_retrans_timer(chan); in l2cap_rx_state_recv()
6063 l2cap_ertm_send(chan); in l2cap_rx_state_recv()
6067 set_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_recv()
6068 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_recv()
6070 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_rx_state_recv()
6071 l2cap_send_rr_or_rnr(chan, 0); in l2cap_rx_state_recv()
6073 __clear_retrans_timer(chan); in l2cap_rx_state_recv()
6074 l2cap_seq_list_clear(&chan->retrans_list); in l2cap_rx_state_recv()
6077 l2cap_handle_rej(chan, control); in l2cap_rx_state_recv()
6080 l2cap_handle_srej(chan, control); in l2cap_rx_state_recv()
6094 static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan, in l2cap_rx_state_srej_sent() argument
6102 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_srej_sent()
6107 switch (l2cap_classify_txseq(chan, txseq)) { in l2cap_rx_state_srej_sent()
6110 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6111 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
6114 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
6116 chan->expected_tx_seq = __next_seq(chan, txseq); in l2cap_rx_state_srej_sent()
6119 l2cap_seq_list_pop(&chan->srej_list); in l2cap_rx_state_srej_sent()
6121 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6122 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
6125 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
6127 err = l2cap_rx_queued_iframes(chan); in l2cap_rx_state_srej_sent()
6137 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
6140 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
6142 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6143 l2cap_send_srej(chan, control->txseq); in l2cap_rx_state_srej_sent()
6151 skb_queue_tail(&chan->srej_q, skb); in l2cap_rx_state_srej_sent()
6154 skb_queue_len(&chan->srej_q)); in l2cap_rx_state_srej_sent()
6156 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6157 l2cap_send_srej_list(chan, control->txseq); in l2cap_rx_state_srej_sent()
6161 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6172 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_rx_state_srej_sent()
6177 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6179 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_srej_sent()
6182 &chan->conn_state)) { in l2cap_rx_state_srej_sent()
6184 l2cap_retransmit_all(chan, control); in l2cap_rx_state_srej_sent()
6187 l2cap_ertm_send(chan); in l2cap_rx_state_srej_sent()
6190 &chan->conn_state) && in l2cap_rx_state_srej_sent()
6191 chan->unacked_frames) { in l2cap_rx_state_srej_sent()
6192 __set_retrans_timer(chan); in l2cap_rx_state_srej_sent()
6195 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_rx_state_srej_sent()
6196 l2cap_send_srej_tail(chan); in l2cap_rx_state_srej_sent()
6199 &chan->conn_state) && in l2cap_rx_state_srej_sent()
6200 chan->unacked_frames) in l2cap_rx_state_srej_sent()
6201 __set_retrans_timer(chan); in l2cap_rx_state_srej_sent()
6203 l2cap_send_ack(chan); in l2cap_rx_state_srej_sent()
6207 set_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_srej_sent()
6208 l2cap_pass_to_tx(chan, control); in l2cap_rx_state_srej_sent()
6210 l2cap_send_srej_tail(chan); in l2cap_rx_state_srej_sent()
6216 rr_control.reqseq = chan->buffer_seq; in l2cap_rx_state_srej_sent()
6217 l2cap_send_sframe(chan, &rr_control); in l2cap_rx_state_srej_sent()
6222 l2cap_handle_rej(chan, control); in l2cap_rx_state_srej_sent()
6225 l2cap_handle_srej(chan, control); in l2cap_rx_state_srej_sent()
6237 static int l2cap_finish_move(struct l2cap_chan *chan) in l2cap_finish_move() argument
6239 BT_DBG("chan %p", chan); in l2cap_finish_move()
6241 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_finish_move()
6242 chan->conn->mtu = chan->conn->hcon->mtu; in l2cap_finish_move()
6244 return l2cap_resegment(chan); in l2cap_finish_move()
6247 static int l2cap_rx_state_wait_p(struct l2cap_chan *chan, in l2cap_rx_state_wait_p() argument
6253 BT_DBG("chan %p, control %p, skb %p, event %d", chan, control, skb, in l2cap_rx_state_wait_p()
6259 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_p()
6261 if (!skb_queue_empty(&chan->tx_q)) in l2cap_rx_state_wait_p()
6262 chan->tx_send_head = skb_peek(&chan->tx_q); in l2cap_rx_state_wait_p()
6264 chan->tx_send_head = NULL; in l2cap_rx_state_wait_p()
6269 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_p()
6270 chan->unacked_frames = 0; in l2cap_rx_state_wait_p()
6272 err = l2cap_finish_move(chan); in l2cap_rx_state_wait_p()
6276 set_bit(CONN_SEND_FBIT, &chan->conn_state); in l2cap_rx_state_wait_p()
6277 l2cap_send_i_or_rr_or_rnr(chan); in l2cap_rx_state_wait_p()
6282 return l2cap_rx_state_recv(chan, control, NULL, event); in l2cap_rx_state_wait_p()
6285 static int l2cap_rx_state_wait_f(struct l2cap_chan *chan, in l2cap_rx_state_wait_f() argument
6294 clear_bit(CONN_REMOTE_BUSY, &chan->conn_state); in l2cap_rx_state_wait_f()
6296 chan->rx_state = L2CAP_RX_STATE_RECV; in l2cap_rx_state_wait_f()
6297 l2cap_process_reqseq(chan, control->reqseq); in l2cap_rx_state_wait_f()
6299 if (!skb_queue_empty(&chan->tx_q)) in l2cap_rx_state_wait_f()
6300 chan->tx_send_head = skb_peek(&chan->tx_q); in l2cap_rx_state_wait_f()
6302 chan->tx_send_head = NULL; in l2cap_rx_state_wait_f()
6307 chan->next_tx_seq = control->reqseq; in l2cap_rx_state_wait_f()
6308 chan->unacked_frames = 0; in l2cap_rx_state_wait_f()
6309 chan->conn->mtu = chan->conn->hcon->mtu; in l2cap_rx_state_wait_f()
6311 err = l2cap_resegment(chan); in l2cap_rx_state_wait_f()
6314 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx_state_wait_f()
6319 static bool __valid_reqseq(struct l2cap_chan *chan, u16 reqseq) in __valid_reqseq() argument
6324 unacked = __seq_offset(chan, chan->next_tx_seq, chan->expected_ack_seq); in __valid_reqseq()
6325 return __seq_offset(chan, chan->next_tx_seq, reqseq) <= unacked; in __valid_reqseq()
6328 static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_rx() argument
6333 BT_DBG("chan %p, control %p, skb %p, event %d, state %d", chan, in l2cap_rx()
6334 control, skb, event, chan->rx_state); in l2cap_rx()
6336 if (__valid_reqseq(chan, control->reqseq)) { in l2cap_rx()
6337 switch (chan->rx_state) { in l2cap_rx()
6339 err = l2cap_rx_state_recv(chan, control, skb, event); in l2cap_rx()
6342 err = l2cap_rx_state_srej_sent(chan, control, skb, in l2cap_rx()
6346 err = l2cap_rx_state_wait_p(chan, control, skb, event); in l2cap_rx()
6349 err = l2cap_rx_state_wait_f(chan, control, skb, event); in l2cap_rx()
6357 control->reqseq, chan->next_tx_seq, in l2cap_rx()
6358 chan->expected_ack_seq); in l2cap_rx()
6359 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_rx()
6365 static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, in l2cap_stream_rx() argument
6385 BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb, in l2cap_stream_rx()
6386 chan->rx_state); in l2cap_stream_rx()
6388 if (l2cap_classify_txseq(chan, txseq) == L2CAP_TXSEQ_EXPECTED) { in l2cap_stream_rx()
6389 l2cap_pass_to_tx(chan, control); in l2cap_stream_rx()
6391 BT_DBG("buffer_seq %u->%u", chan->buffer_seq, in l2cap_stream_rx()
6392 __next_seq(chan, chan->buffer_seq)); in l2cap_stream_rx()
6394 chan->buffer_seq = __next_seq(chan, chan->buffer_seq); in l2cap_stream_rx()
6396 l2cap_reassemble_sdu(chan, skb, control); in l2cap_stream_rx()
6398 if (chan->sdu) { in l2cap_stream_rx()
6399 kfree_skb(chan->sdu); in l2cap_stream_rx()
6400 chan->sdu = NULL; in l2cap_stream_rx()
6402 chan->sdu_last_frag = NULL; in l2cap_stream_rx()
6403 chan->sdu_len = 0; in l2cap_stream_rx()
6411 chan->last_acked_seq = txseq; in l2cap_stream_rx()
6412 chan->expected_tx_seq = __next_seq(chan, txseq); in l2cap_stream_rx()
6417 static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_data_rcv() argument
6423 __unpack_control(chan, skb); in l2cap_data_rcv()
6432 if (l2cap_check_fcs(chan, skb)) in l2cap_data_rcv()
6438 if (chan->fcs == L2CAP_FCS_CRC16) in l2cap_data_rcv()
6441 if (len > chan->mps) { in l2cap_data_rcv()
6442 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
6446 if (chan->ops->filter) { in l2cap_data_rcv()
6447 if (chan->ops->filter(chan, skb)) in l2cap_data_rcv()
6461 if (control->final && chan->tx_state != L2CAP_TX_STATE_WAIT_F) in l2cap_data_rcv()
6464 if (chan->mode != L2CAP_MODE_STREAMING) { in l2cap_data_rcv()
6466 err = l2cap_rx(chan, control, skb, event); in l2cap_data_rcv()
6468 err = l2cap_stream_rx(chan, control, skb); in l2cap_data_rcv()
6472 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
6480 if (chan->mode == L2CAP_MODE_STREAMING) in l2cap_data_rcv()
6489 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
6495 chan->tx_state != L2CAP_TX_STATE_WAIT_F)) in l2cap_data_rcv()
6499 if (l2cap_rx(chan, control, skb, event)) in l2cap_data_rcv()
6500 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_data_rcv()
6510 static void l2cap_chan_le_send_credits(struct l2cap_chan *chan) in l2cap_chan_le_send_credits() argument
6512 struct l2cap_conn *conn = chan->conn; in l2cap_chan_le_send_credits()
6514 u16 return_credits = l2cap_le_rx_credits(chan); in l2cap_chan_le_send_credits()
6516 if (chan->rx_credits >= return_credits) in l2cap_chan_le_send_credits()
6519 return_credits -= chan->rx_credits; in l2cap_chan_le_send_credits()
6521 BT_DBG("chan %p returning %u credits to sender", chan, return_credits); in l2cap_chan_le_send_credits()
6523 chan->rx_credits += return_credits; in l2cap_chan_le_send_credits()
6525 pkt.cid = cpu_to_le16(chan->scid); in l2cap_chan_le_send_credits()
6528 chan->ident = l2cap_get_ident(conn); in l2cap_chan_le_send_credits()
6530 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt); in l2cap_chan_le_send_credits()
6533 void l2cap_chan_rx_avail(struct l2cap_chan *chan, ssize_t rx_avail) in l2cap_chan_rx_avail() argument
6535 if (chan->rx_avail == rx_avail) in l2cap_chan_rx_avail()
6538 BT_DBG("chan %p has %zd bytes avail for rx", chan, rx_avail); in l2cap_chan_rx_avail()
6540 chan->rx_avail = rx_avail; in l2cap_chan_rx_avail()
6542 if (chan->state == BT_CONNECTED) in l2cap_chan_rx_avail()
6543 l2cap_chan_le_send_credits(chan); in l2cap_chan_rx_avail()
6546 static int l2cap_ecred_recv(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_ecred_recv() argument
6550 BT_DBG("SDU reassemble complete: chan %p skb->len %u", chan, skb->len); in l2cap_ecred_recv()
6553 err = chan->ops->recv(chan, skb); in l2cap_ecred_recv()
6555 if (err < 0 && chan->rx_avail != -1) { in l2cap_ecred_recv()
6557 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_ecred_recv()
6562 l2cap_chan_le_send_credits(chan); in l2cap_ecred_recv()
6567 static int l2cap_ecred_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) in l2cap_ecred_data_rcv() argument
6571 if (!chan->rx_credits) { in l2cap_ecred_data_rcv()
6573 l2cap_send_disconn_req(chan, ECONNRESET); in l2cap_ecred_data_rcv()
6577 if (chan->imtu < skb->len) { in l2cap_ecred_data_rcv()
6582 chan->rx_credits--; in l2cap_ecred_data_rcv()
6584 chan, chan->rx_credits + 1, chan->rx_credits); in l2cap_ecred_data_rcv()
6589 if (!chan->rx_credits) in l2cap_ecred_data_rcv()
6590 l2cap_chan_le_send_credits(chan); in l2cap_ecred_data_rcv()
6594 if (!chan->sdu) { in l2cap_ecred_data_rcv()
6601 sdu_len, skb->len, chan->imtu); in l2cap_ecred_data_rcv()
6603 if (sdu_len > chan->imtu) { in l2cap_ecred_data_rcv()
6616 return l2cap_ecred_recv(chan, skb); in l2cap_ecred_data_rcv()
6618 chan->sdu = skb; in l2cap_ecred_data_rcv()
6619 chan->sdu_len = sdu_len; in l2cap_ecred_data_rcv()
6620 chan->sdu_last_frag = skb; in l2cap_ecred_data_rcv()
6623 if (skb->len + L2CAP_SDULEN_SIZE < chan->mps) { in l2cap_ecred_data_rcv()
6627 BT_DBG("chan->mps %u -> %u", chan->mps, mps_len); in l2cap_ecred_data_rcv()
6628 chan->mps = mps_len; in l2cap_ecred_data_rcv()
6629 l2cap_chan_le_send_credits(chan); in l2cap_ecred_data_rcv()
6636 chan->sdu->len, skb->len, chan->sdu_len); in l2cap_ecred_data_rcv()
6638 if (chan->sdu->len + skb->len > chan->sdu_len) { in l2cap_ecred_data_rcv()
6644 append_skb_frag(chan->sdu, skb, &chan->sdu_last_frag); in l2cap_ecred_data_rcv()
6647 if (chan->sdu->len == chan->sdu_len) { in l2cap_ecred_data_rcv()
6648 err = l2cap_ecred_recv(chan, chan->sdu); in l2cap_ecred_data_rcv()
6650 chan->sdu = NULL; in l2cap_ecred_data_rcv()
6651 chan->sdu_last_frag = NULL; in l2cap_ecred_data_rcv()
6652 chan->sdu_len = 0; in l2cap_ecred_data_rcv()
6659 kfree_skb(chan->sdu); in l2cap_ecred_data_rcv()
6660 chan->sdu = NULL; in l2cap_ecred_data_rcv()
6661 chan->sdu_last_frag = NULL; in l2cap_ecred_data_rcv()
6662 chan->sdu_len = 0; in l2cap_ecred_data_rcv()
6675 struct l2cap_chan *chan; in l2cap_data_channel() local
6677 chan = l2cap_get_chan_by_scid(conn, cid); in l2cap_data_channel()
6678 if (!chan) { in l2cap_data_channel()
6685 BT_DBG("chan %p, len %d", chan, skb->len); in l2cap_data_channel()
6691 if (chan->chan_type == L2CAP_CHAN_FIXED) in l2cap_data_channel()
6692 l2cap_chan_ready(chan); in l2cap_data_channel()
6694 if (chan->state != BT_CONNECTED) in l2cap_data_channel()
6697 switch (chan->mode) { in l2cap_data_channel()
6700 if (l2cap_ecred_data_rcv(chan, skb) < 0) in l2cap_data_channel()
6711 if (chan->imtu < skb->len) { in l2cap_data_channel()
6716 if (!chan->ops->recv(chan, skb)) in l2cap_data_channel()
6722 l2cap_data_rcv(chan, skb); in l2cap_data_channel()
6726 BT_DBG("chan %p: bad mode 0x%2.2x", chan, chan->mode); in l2cap_data_channel()
6734 l2cap_chan_unlock(chan); in l2cap_data_channel()
6735 l2cap_chan_put(chan); in l2cap_data_channel()
6742 struct l2cap_chan *chan; in l2cap_conless_channel() local
6747 chan = l2cap_global_chan_by_psm(0, psm, &hcon->src, &hcon->dst, in l2cap_conless_channel()
6749 if (!chan) in l2cap_conless_channel()
6752 BT_DBG("chan %p, len %d", chan, skb->len); in l2cap_conless_channel()
6754 l2cap_chan_lock(chan); in l2cap_conless_channel()
6756 if (chan->state != BT_BOUND && chan->state != BT_CONNECTED) in l2cap_conless_channel()
6759 if (chan->imtu < skb->len) in l2cap_conless_channel()
6766 if (!chan->ops->recv(chan, skb)) { in l2cap_conless_channel()
6767 l2cap_chan_unlock(chan); in l2cap_conless_channel()
6768 l2cap_chan_put(chan); in l2cap_conless_channel()
6773 l2cap_chan_unlock(chan); in l2cap_conless_channel()
6774 l2cap_chan_put(chan); in l2cap_conless_channel()
6915 struct l2cap_chan *chan; member
6920 static void l2cap_chan_by_pid(struct l2cap_chan *chan, void *data) in l2cap_chan_by_pid() argument
6925 if (chan == d->chan) in l2cap_chan_by_pid()
6928 if (!test_bit(FLAG_DEFER_SETUP, &chan->flags)) in l2cap_chan_by_pid()
6931 pid = chan->ops->get_peer_pid(chan); in l2cap_chan_by_pid()
6934 if (d->pid != pid || chan->psm != d->chan->psm || chan->ident || in l2cap_chan_by_pid()
6935 chan->mode != L2CAP_MODE_EXT_FLOWCTL || chan->state != BT_CONNECT) in l2cap_chan_by_pid()
6941 int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, in l2cap_chan_connect() argument
6949 BT_DBG("%pMR -> %pMR (type %u) psm 0x%4.4x mode 0x%2.2x", &chan->src, in l2cap_chan_connect()
6950 dst, dst_type, __le16_to_cpu(psm), chan->mode); in l2cap_chan_connect()
6952 hdev = hci_get_route(dst, &chan->src, chan->src_type); in l2cap_chan_connect()
6959 chan->chan_type != L2CAP_CHAN_RAW) { in l2cap_chan_connect()
6964 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) { in l2cap_chan_connect()
6969 if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) { in l2cap_chan_connect()
6974 switch (chan->mode) { in l2cap_chan_connect()
6995 switch (chan->state) { in l2cap_chan_connect()
7019 bacpy(&chan->dst, dst); in l2cap_chan_connect()
7020 chan->dst_type = dst_type; in l2cap_chan_connect()
7022 chan->psm = psm; in l2cap_chan_connect()
7023 chan->dcid = cid; in l2cap_chan_connect()
7035 chan->sec_level, timeout, in l2cap_chan_connect()
7039 chan->sec_level, timeout, in l2cap_chan_connect()
7043 u8 auth_type = l2cap_get_auth_type(chan); in l2cap_chan_connect()
7044 hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type, in l2cap_chan_connect()
7060 if (chan->mode == L2CAP_MODE_EXT_FLOWCTL) { in l2cap_chan_connect()
7063 data.chan = chan; in l2cap_chan_connect()
7064 data.pid = chan->ops->get_peer_pid(chan); in l2cap_chan_connect()
7078 l2cap_chan_lock(chan); in l2cap_chan_connect()
7087 bacpy(&chan->src, &hcon->src); in l2cap_chan_connect()
7088 chan->src_type = bdaddr_src_type(hcon); in l2cap_chan_connect()
7090 __l2cap_chan_add(conn, chan); in l2cap_chan_connect()
7095 l2cap_state_change(chan, BT_CONNECT); in l2cap_chan_connect()
7096 __set_chan_timer(chan, chan->ops->get_sndtimeo(chan)); in l2cap_chan_connect()
7102 chan->sport = 0; in l2cap_chan_connect()
7106 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_chan_connect()
7107 __clear_chan_timer(chan); in l2cap_chan_connect()
7108 if (l2cap_chan_check_security(chan, true)) in l2cap_chan_connect()
7109 l2cap_state_change(chan, BT_CONNECTED); in l2cap_chan_connect()
7111 l2cap_do_start(chan); in l2cap_chan_connect()
7117 l2cap_chan_unlock(chan); in l2cap_chan_connect()
7126 static void l2cap_ecred_reconfigure(struct l2cap_chan *chan) in l2cap_ecred_reconfigure() argument
7128 struct l2cap_conn *conn = chan->conn; in l2cap_ecred_reconfigure()
7131 pdu->mtu = cpu_to_le16(chan->imtu); in l2cap_ecred_reconfigure()
7132 pdu->mps = cpu_to_le16(chan->mps); in l2cap_ecred_reconfigure()
7133 pdu->scid[0] = cpu_to_le16(chan->scid); in l2cap_ecred_reconfigure()
7135 chan->ident = l2cap_get_ident(conn); in l2cap_ecred_reconfigure()
7137 l2cap_send_cmd(conn, chan->ident, L2CAP_ECRED_RECONF_REQ, in l2cap_ecred_reconfigure()
7141 int l2cap_chan_reconfigure(struct l2cap_chan *chan, __u16 mtu) in l2cap_chan_reconfigure() argument
7143 if (chan->imtu > mtu) in l2cap_chan_reconfigure()
7146 BT_DBG("chan %p mtu 0x%4.4x", chan, mtu); in l2cap_chan_reconfigure()
7148 chan->imtu = mtu; in l2cap_chan_reconfigure()
7150 l2cap_ecred_reconfigure(chan); in l2cap_chan_reconfigure()
7256 struct l2cap_chan *chan, *next; in l2cap_connect_cfm() local
7263 chan = pchan->ops->new_connection(pchan); in l2cap_connect_cfm()
7264 if (chan) { in l2cap_connect_cfm()
7265 bacpy(&chan->src, &hcon->src); in l2cap_connect_cfm()
7266 bacpy(&chan->dst, &hcon->dst); in l2cap_connect_cfm()
7267 chan->src_type = bdaddr_src_type(hcon); in l2cap_connect_cfm()
7268 chan->dst_type = dst_type; in l2cap_connect_cfm()
7270 __l2cap_chan_add(conn, chan); in l2cap_connect_cfm()
7304 static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt) in l2cap_check_encryption() argument
7306 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) in l2cap_check_encryption()
7310 if (chan->sec_level == BT_SECURITY_MEDIUM) { in l2cap_check_encryption()
7311 __set_chan_timer(chan, L2CAP_ENC_TIMEOUT); in l2cap_check_encryption()
7312 } else if (chan->sec_level == BT_SECURITY_HIGH || in l2cap_check_encryption()
7313 chan->sec_level == BT_SECURITY_FIPS) in l2cap_check_encryption()
7314 l2cap_chan_close(chan, ECONNREFUSED); in l2cap_check_encryption()
7316 if (chan->sec_level == BT_SECURITY_MEDIUM) in l2cap_check_encryption()
7317 __clear_chan_timer(chan); in l2cap_check_encryption()
7324 struct l2cap_chan *chan; in l2cap_security_cfm() local
7333 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_security_cfm()
7334 l2cap_chan_lock(chan); in l2cap_security_cfm()
7336 BT_DBG("chan %p scid 0x%4.4x state %s", chan, chan->scid, in l2cap_security_cfm()
7337 state_to_string(chan->state)); in l2cap_security_cfm()
7340 chan->sec_level = hcon->sec_level; in l2cap_security_cfm()
7342 if (!__l2cap_no_conn_pending(chan)) { in l2cap_security_cfm()
7343 l2cap_chan_unlock(chan); in l2cap_security_cfm()
7347 if (!status && (chan->state == BT_CONNECTED || in l2cap_security_cfm()
7348 chan->state == BT_CONFIG)) { in l2cap_security_cfm()
7349 chan->ops->resume(chan); in l2cap_security_cfm()
7350 l2cap_check_encryption(chan, encrypt); in l2cap_security_cfm()
7351 l2cap_chan_unlock(chan); in l2cap_security_cfm()
7355 if (chan->state == BT_CONNECT) { in l2cap_security_cfm()
7356 if (!status && l2cap_check_enc_key_size(hcon, chan)) in l2cap_security_cfm()
7357 l2cap_start_connection(chan); in l2cap_security_cfm()
7359 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); in l2cap_security_cfm()
7360 } else if (chan->state == BT_CONNECT2 && in l2cap_security_cfm()
7361 !(chan->mode == L2CAP_MODE_EXT_FLOWCTL || in l2cap_security_cfm()
7362 chan->mode == L2CAP_MODE_LE_FLOWCTL)) { in l2cap_security_cfm()
7366 if (!status && l2cap_check_enc_key_size(hcon, chan)) { in l2cap_security_cfm()
7367 if (test_bit(FLAG_DEFER_SETUP, &chan->flags)) { in l2cap_security_cfm()
7370 chan->ops->defer(chan); in l2cap_security_cfm()
7372 l2cap_state_change(chan, BT_CONFIG); in l2cap_security_cfm()
7377 l2cap_state_change(chan, BT_DISCONN); in l2cap_security_cfm()
7378 __set_chan_timer(chan, L2CAP_DISC_TIMEOUT); in l2cap_security_cfm()
7383 rsp.scid = cpu_to_le16(chan->dcid); in l2cap_security_cfm()
7384 rsp.dcid = cpu_to_le16(chan->scid); in l2cap_security_cfm()
7387 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, in l2cap_security_cfm()
7390 if (!test_bit(CONF_REQ_SENT, &chan->conf_state) && in l2cap_security_cfm()
7393 set_bit(CONF_REQ_SENT, &chan->conf_state); in l2cap_security_cfm()
7396 l2cap_build_conf_req(chan, buf, sizeof(buf)), in l2cap_security_cfm()
7398 chan->num_conf_req++; in l2cap_security_cfm()
7402 l2cap_chan_unlock(chan); in l2cap_security_cfm()