Lines Matching refs:conn

56 static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn,
58 static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
90 static struct l2cap_chan *__l2cap_get_chan_by_dcid(struct l2cap_conn *conn, in __l2cap_get_chan_by_dcid() argument
95 list_for_each_entry(c, &conn->chan_l, list) { in __l2cap_get_chan_by_dcid()
102 static struct l2cap_chan *__l2cap_get_chan_by_scid(struct l2cap_conn *conn, in __l2cap_get_chan_by_scid() argument
107 list_for_each_entry(c, &conn->chan_l, list) { in __l2cap_get_chan_by_scid()
116 static struct l2cap_chan *l2cap_get_chan_by_scid(struct l2cap_conn *conn, in l2cap_get_chan_by_scid() argument
121 mutex_lock(&conn->chan_lock); in l2cap_get_chan_by_scid()
122 c = __l2cap_get_chan_by_scid(conn, cid); in l2cap_get_chan_by_scid()
125 mutex_unlock(&conn->chan_lock); in l2cap_get_chan_by_scid()
133 static struct l2cap_chan *l2cap_get_chan_by_dcid(struct l2cap_conn *conn, in l2cap_get_chan_by_dcid() argument
138 mutex_lock(&conn->chan_lock); in l2cap_get_chan_by_dcid()
139 c = __l2cap_get_chan_by_dcid(conn, cid); in l2cap_get_chan_by_dcid()
142 mutex_unlock(&conn->chan_lock); in l2cap_get_chan_by_dcid()
147 static struct l2cap_chan *__l2cap_get_chan_by_ident(struct l2cap_conn *conn, in __l2cap_get_chan_by_ident() argument
152 list_for_each_entry(c, &conn->chan_l, list) { in __l2cap_get_chan_by_ident()
159 static struct l2cap_chan *l2cap_get_chan_by_ident(struct l2cap_conn *conn, in l2cap_get_chan_by_ident() argument
164 mutex_lock(&conn->chan_lock); in l2cap_get_chan_by_ident()
165 c = __l2cap_get_chan_by_ident(conn, ident); in l2cap_get_chan_by_ident()
168 mutex_unlock(&conn->chan_lock); in l2cap_get_chan_by_ident()
233 static u16 l2cap_alloc_cid(struct l2cap_conn *conn) in l2cap_alloc_cid() argument
237 if (conn->hcon->type == LE_LINK) in l2cap_alloc_cid()
243 if (!__l2cap_get_chan_by_scid(conn, cid)) in l2cap_alloc_cid()
400 struct l2cap_conn *conn = chan->conn; in l2cap_chan_timeout() local
405 mutex_lock(&conn->chan_lock); in l2cap_chan_timeout()
421 mutex_unlock(&conn->chan_lock); in l2cap_chan_timeout()
517 void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) in __l2cap_chan_add() argument
519 BT_DBG("conn %p, psm 0x%2.2x, dcid 0x%4.4x", conn, in __l2cap_chan_add()
522 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM; in __l2cap_chan_add()
524 chan->conn = conn; in __l2cap_chan_add()
529 chan->scid = l2cap_alloc_cid(conn); in __l2cap_chan_add()
530 if (conn->hcon->type == ACL_LINK) in __l2cap_chan_add()
564 hci_conn_hold(conn->hcon); in __l2cap_chan_add()
566 list_add(&chan->list, &conn->chan_l); in __l2cap_chan_add()
569 void l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan) in l2cap_chan_add() argument
571 mutex_lock(&conn->chan_lock); in l2cap_chan_add()
572 __l2cap_chan_add(conn, chan); in l2cap_chan_add()
573 mutex_unlock(&conn->chan_lock); in l2cap_chan_add()
578 struct l2cap_conn *conn = chan->conn; in l2cap_chan_del() local
582 BT_DBG("chan %p, conn %p, err %d, state %s", chan, conn, err, in l2cap_chan_del()
587 if (conn) { in l2cap_chan_del()
588 struct amp_mgr *mgr = conn->hcon->amp_mgr; in l2cap_chan_del()
594 chan->conn = NULL; in l2cap_chan_del()
602 hci_conn_drop(conn->hcon); in l2cap_chan_del()
649 struct l2cap_conn *conn = container_of(work, struct l2cap_conn, in l2cap_conn_update_id_addr() local
651 struct hci_conn *hcon = conn->hcon; in l2cap_conn_update_id_addr()
654 mutex_lock(&conn->chan_lock); in l2cap_conn_update_id_addr()
656 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_update_id_addr()
663 mutex_unlock(&conn->chan_lock); in l2cap_conn_update_id_addr()
668 struct l2cap_conn *conn = chan->conn; in l2cap_chan_le_connect_reject() local
685 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in l2cap_chan_le_connect_reject()
691 struct l2cap_conn *conn = chan->conn; in l2cap_chan_connect_reject() local
707 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, sizeof(rsp), &rsp); in l2cap_chan_connect_reject()
712 struct l2cap_conn *conn = chan->conn; in l2cap_chan_close() local
732 if (conn->hcon->type == ACL_LINK) in l2cap_chan_close()
734 else if (conn->hcon->type == LE_LINK) in l2cap_chan_close()
807 struct l2cap_conn *conn = chan->conn; in l2cap_chan_check_security() local
810 if (conn->hcon->type == LE_LINK) in l2cap_chan_check_security()
811 return smp_conn_security(conn->hcon, chan->sec_level); in l2cap_chan_check_security()
815 return hci_conn_security(conn->hcon, chan->sec_level, auth_type, in l2cap_chan_check_security()
819 static u8 l2cap_get_ident(struct l2cap_conn *conn) in l2cap_get_ident() argument
829 mutex_lock(&conn->ident_lock); in l2cap_get_ident()
831 if (++conn->tx_ident > 128) in l2cap_get_ident()
832 conn->tx_ident = 1; in l2cap_get_ident()
834 id = conn->tx_ident; in l2cap_get_ident()
836 mutex_unlock(&conn->ident_lock); in l2cap_get_ident()
841 static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, in l2cap_send_cmd() argument
844 struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data); in l2cap_send_cmd()
854 if (lmp_no_flush_capable(conn->hcon->hdev) || in l2cap_send_cmd()
855 conn->hcon->type == LE_LINK) in l2cap_send_cmd()
863 hci_send_acl(conn->hchan, skb, flags); in l2cap_send_cmd()
874 struct hci_conn *hcon = chan->conn->hcon; in l2cap_do_send()
901 hci_send_acl(chan->conn->hchan, skb, flags); in l2cap_do_send()
1128 struct l2cap_conn *conn = chan->conn; in __amp_capable() local
1132 if (!(conn->local_fixed_chan & L2CAP_FC_A2MP)) in __amp_capable()
1135 if (!(conn->remote_fixed_chan & L2CAP_FC_A2MP)) in __amp_capable()
1162 struct l2cap_conn *conn = chan->conn; in l2cap_send_conn_req() local
1168 chan->ident = l2cap_get_ident(conn); in l2cap_send_conn_req()
1172 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_REQ, sizeof(req), &req); in l2cap_send_conn_req()
1182 chan->ident = l2cap_get_ident(chan->conn); in l2cap_send_create_chan_req()
1184 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_REQ, in l2cap_send_create_chan_req()
1268 struct l2cap_conn *conn = chan->conn; in l2cap_le_connect() local
1280 chan->ident = l2cap_get_ident(conn); in l2cap_le_connect()
1282 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_REQ, in l2cap_le_connect()
1288 struct l2cap_conn *conn = chan->conn; in l2cap_le_start() local
1290 if (!smp_conn_security(conn->hcon, chan->sec_level)) in l2cap_le_start()
1307 } else if (chan->conn->hcon->type == LE_LINK) { in l2cap_start_connection()
1314 static void l2cap_request_info(struct l2cap_conn *conn) in l2cap_request_info() argument
1318 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) in l2cap_request_info()
1323 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT; in l2cap_request_info()
1324 conn->info_ident = l2cap_get_ident(conn); in l2cap_request_info()
1326 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT); in l2cap_request_info()
1328 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ, in l2cap_request_info()
1334 struct l2cap_conn *conn = chan->conn; in l2cap_do_start() local
1336 if (conn->hcon->type == LE_LINK) { in l2cap_do_start()
1341 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)) { in l2cap_do_start()
1342 l2cap_request_info(conn); in l2cap_do_start()
1346 if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)) in l2cap_do_start()
1372 struct l2cap_conn *conn = chan->conn; in l2cap_send_disconn_req() local
1375 if (!conn) in l2cap_send_disconn_req()
1391 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_DISCONN_REQ, in l2cap_send_disconn_req()
1398 static void l2cap_conn_start(struct l2cap_conn *conn) in l2cap_conn_start() argument
1402 BT_DBG("conn %p", conn); in l2cap_conn_start()
1404 mutex_lock(&conn->chan_lock); in l2cap_conn_start()
1406 list_for_each_entry_safe(chan, tmp, &conn->chan_l, list) { in l2cap_conn_start()
1422 if (!l2cap_mode_supported(chan->mode, conn->feat_mask) in l2cap_conn_start()
1454 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, in l2cap_conn_start()
1464 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, in l2cap_conn_start()
1472 mutex_unlock(&conn->chan_lock); in l2cap_conn_start()
1475 static void l2cap_le_conn_ready(struct l2cap_conn *conn) in l2cap_le_conn_ready() argument
1477 struct hci_conn *hcon = conn->hcon; in l2cap_le_conn_ready()
1480 BT_DBG("%s conn %p", hdev->name, conn); in l2cap_le_conn_ready()
1503 l2cap_send_cmd(conn, l2cap_get_ident(conn), in l2cap_le_conn_ready()
1508 static void l2cap_conn_ready(struct l2cap_conn *conn) in l2cap_conn_ready() argument
1511 struct hci_conn *hcon = conn->hcon; in l2cap_conn_ready()
1513 BT_DBG("conn %p", conn); in l2cap_conn_ready()
1516 l2cap_request_info(conn); in l2cap_conn_ready()
1518 mutex_lock(&conn->chan_lock); in l2cap_conn_ready()
1520 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_ready()
1532 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) in l2cap_conn_ready()
1541 mutex_unlock(&conn->chan_lock); in l2cap_conn_ready()
1544 l2cap_le_conn_ready(conn); in l2cap_conn_ready()
1546 queue_work(hcon->hdev->workqueue, &conn->pending_rx_work); in l2cap_conn_ready()
1550 static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err) in l2cap_conn_unreliable() argument
1554 BT_DBG("conn %p", conn); in l2cap_conn_unreliable()
1556 mutex_lock(&conn->chan_lock); in l2cap_conn_unreliable()
1558 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_conn_unreliable()
1563 mutex_unlock(&conn->chan_lock); in l2cap_conn_unreliable()
1568 struct l2cap_conn *conn = container_of(work, struct l2cap_conn, in l2cap_info_timeout() local
1571 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; in l2cap_info_timeout()
1572 conn->info_ident = 0; in l2cap_info_timeout()
1574 l2cap_conn_start(conn); in l2cap_info_timeout()
1590 int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user) in l2cap_register_user() argument
1592 struct hci_dev *hdev = conn->hcon->hdev; in l2cap_register_user()
1610 if (!conn->hchan) { in l2cap_register_user()
1615 ret = user->probe(conn, user); in l2cap_register_user()
1619 list_add(&user->list, &conn->users); in l2cap_register_user()
1628 void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user) in l2cap_unregister_user() argument
1630 struct hci_dev *hdev = conn->hcon->hdev; in l2cap_unregister_user()
1638 user->remove(conn, user); in l2cap_unregister_user()
1645 static void l2cap_unregister_all_users(struct l2cap_conn *conn) in l2cap_unregister_all_users() argument
1649 while (!list_empty(&conn->users)) { in l2cap_unregister_all_users()
1650 user = list_first_entry(&conn->users, struct l2cap_user, list); in l2cap_unregister_all_users()
1652 user->remove(conn, user); in l2cap_unregister_all_users()
1658 struct l2cap_conn *conn = hcon->l2cap_data; in l2cap_conn_del() local
1661 if (!conn) in l2cap_conn_del()
1664 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err); in l2cap_conn_del()
1666 kfree_skb(conn->rx_skb); in l2cap_conn_del()
1668 skb_queue_purge(&conn->pending_rx); in l2cap_conn_del()
1674 if (work_pending(&conn->pending_rx_work)) in l2cap_conn_del()
1675 cancel_work_sync(&conn->pending_rx_work); in l2cap_conn_del()
1677 if (work_pending(&conn->id_addr_update_work)) in l2cap_conn_del()
1678 cancel_work_sync(&conn->id_addr_update_work); in l2cap_conn_del()
1680 l2cap_unregister_all_users(conn); in l2cap_conn_del()
1685 mutex_lock(&conn->chan_lock); in l2cap_conn_del()
1688 list_for_each_entry_safe(chan, l, &conn->chan_l, list) { in l2cap_conn_del()
1700 mutex_unlock(&conn->chan_lock); in l2cap_conn_del()
1702 hci_chan_del(conn->hchan); in l2cap_conn_del()
1704 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) in l2cap_conn_del()
1705 cancel_delayed_work_sync(&conn->info_timer); in l2cap_conn_del()
1708 conn->hchan = NULL; in l2cap_conn_del()
1709 l2cap_conn_put(conn); in l2cap_conn_del()
1714 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref); in l2cap_conn_free() local
1716 hci_conn_put(conn->hcon); in l2cap_conn_free()
1717 kfree(conn); in l2cap_conn_free()
1720 struct l2cap_conn *l2cap_conn_get(struct l2cap_conn *conn) in l2cap_conn_get() argument
1722 kref_get(&conn->ref); in l2cap_conn_get()
1723 return conn; in l2cap_conn_get()
1727 void l2cap_conn_put(struct l2cap_conn *conn) in l2cap_conn_put() argument
1729 kref_put(&conn->ref, l2cap_conn_free); in l2cap_conn_put()
1796 if (!chan->conn) { in l2cap_monitor_timeout()
1817 if (!chan->conn) { in l2cap_retrans_timeout()
2115 struct l2cap_conn *conn = chan->conn; in l2cap_skbuff_fromiovec() local
2130 count = min_t(unsigned int, conn->mtu, len); in l2cap_skbuff_fromiovec()
2158 struct l2cap_conn *conn = chan->conn; in l2cap_create_connless_pdu() local
2166 count = min_t(unsigned int, (conn->mtu - hlen), len); in l2cap_create_connless_pdu()
2190 struct l2cap_conn *conn = chan->conn; in l2cap_create_basic_pdu() local
2197 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len); in l2cap_create_basic_pdu()
2221 struct l2cap_conn *conn = chan->conn; in l2cap_create_iframe_pdu() local
2228 if (!conn) in l2cap_create_iframe_pdu()
2239 count = min_t(unsigned int, (conn->mtu - hlen), len); in l2cap_create_iframe_pdu()
2288 pdu_len = chan->conn->mtu; in l2cap_segment_sdu()
2342 struct l2cap_conn *conn = chan->conn; in l2cap_create_le_flowctl_pdu() local
2349 if (!conn) in l2cap_create_le_flowctl_pdu()
2357 count = min_t(unsigned int, (conn->mtu - hlen), len); in l2cap_create_le_flowctl_pdu()
2423 if (!chan->conn) in l2cap_chan_send()
2841 static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb) in l2cap_raw_recv() argument
2846 BT_DBG("conn %p", conn); in l2cap_raw_recv()
2848 mutex_lock(&conn->chan_lock); in l2cap_raw_recv()
2850 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_raw_recv()
2865 mutex_unlock(&conn->chan_lock); in l2cap_raw_recv()
2869 static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code, in l2cap_build_cmd() argument
2878 conn, code, ident, dlen); in l2cap_build_cmd()
2880 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE) in l2cap_build_cmd()
2884 count = min_t(unsigned int, conn->mtu, len); in l2cap_build_cmd()
2893 if (conn->hcon->type == LE_LINK) in l2cap_build_cmd()
2914 count = min_t(unsigned int, conn->mtu, len); in l2cap_build_cmd()
3108 static inline bool __l2cap_ews_supported(struct l2cap_conn *conn) in __l2cap_ews_supported() argument
3110 return ((conn->local_fixed_chan & L2CAP_FC_A2MP) && in __l2cap_ews_supported()
3111 (conn->feat_mask & L2CAP_FEAT_EXT_WINDOW)); in __l2cap_ews_supported()
3114 static inline bool __l2cap_efs_supported(struct l2cap_conn *conn) in __l2cap_efs_supported() argument
3116 return ((conn->local_fixed_chan & L2CAP_FC_A2MP) && in __l2cap_efs_supported()
3117 (conn->feat_mask & L2CAP_FEAT_EXT_FLOW)); in __l2cap_efs_supported()
3161 __l2cap_ews_supported(chan->conn)) { in l2cap_txwin_setup()
3191 if (__l2cap_efs_supported(chan->conn)) in l2cap_build_conf_req()
3196 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask); in l2cap_build_conf_req()
3209 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) && in l2cap_build_conf_req()
3210 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING)) in l2cap_build_conf_req()
3230 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu - in l2cap_build_conf_req()
3250 if (chan->conn->feat_mask & L2CAP_FEAT_FCS) in l2cap_build_conf_req()
3267 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu - in l2cap_build_conf_req()
3278 if (chan->conn->feat_mask & L2CAP_FEAT_FCS) in l2cap_build_conf_req()
3346 if (!(chan->conn->local_fixed_chan & L2CAP_FC_A2MP)) in l2cap_parse_conf_req()
3373 chan->conn->feat_mask); in l2cap_parse_conf_req()
3378 if (__l2cap_efs_supported(chan->conn)) in l2cap_parse_conf_req()
3449 chan->conn->mtu - L2CAP_EXT_HDR_SIZE - in l2cap_parse_conf_req()
3479 chan->conn->mtu - L2CAP_EXT_HDR_SIZE - in l2cap_parse_conf_req()
3635 struct l2cap_conn *conn = chan->conn; in __l2cap_le_connect_rsp_defer() local
3645 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in __l2cap_le_connect_rsp_defer()
3652 struct l2cap_conn *conn = chan->conn; in __l2cap_connect_rsp_defer() local
3668 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp); in __l2cap_connect_rsp_defer()
3673 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, in __l2cap_connect_rsp_defer()
3729 static inline int l2cap_command_rej(struct l2cap_conn *conn, in l2cap_command_rej() argument
3741 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) && in l2cap_command_rej()
3742 cmd->ident == conn->info_ident) { in l2cap_command_rej()
3743 cancel_delayed_work(&conn->info_timer); in l2cap_command_rej()
3745 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; in l2cap_command_rej()
3746 conn->info_ident = 0; in l2cap_command_rej()
3748 l2cap_conn_start(conn); in l2cap_command_rej()
3754 static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn, in l2cap_connect() argument
3769 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src, in l2cap_connect()
3770 &conn->hcon->dst, ACL_LINK); in l2cap_connect()
3776 mutex_lock(&conn->chan_lock); in l2cap_connect()
3781 !hci_conn_check_link_mode(conn->hcon)) { in l2cap_connect()
3782 conn->disc_reason = HCI_ERROR_AUTH_FAILURE; in l2cap_connect()
3790 if (__l2cap_get_chan_by_dcid(conn, scid)) in l2cap_connect()
3802 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT; in l2cap_connect()
3804 bacpy(&chan->src, &conn->hcon->src); in l2cap_connect()
3805 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_connect()
3806 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_connect()
3807 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_connect()
3812 __l2cap_chan_add(conn, chan); in l2cap_connect()
3820 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) { in l2cap_connect()
3854 mutex_unlock(&conn->chan_lock); in l2cap_connect()
3862 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp); in l2cap_connect()
3868 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT; in l2cap_connect()
3869 conn->info_ident = l2cap_get_ident(conn); in l2cap_connect()
3871 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT); in l2cap_connect()
3873 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ, in l2cap_connect()
3881 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, in l2cap_connect()
3889 static int l2cap_connect_req(struct l2cap_conn *conn, in l2cap_connect_req() argument
3892 struct hci_dev *hdev = conn->hcon->hdev; in l2cap_connect_req()
3893 struct hci_conn *hcon = conn->hcon; in l2cap_connect_req()
3904 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0); in l2cap_connect_req()
3908 static int l2cap_connect_create_rsp(struct l2cap_conn *conn, in l2cap_connect_create_rsp() argument
3929 mutex_lock(&conn->chan_lock); in l2cap_connect_create_rsp()
3932 chan = __l2cap_get_chan_by_scid(conn, scid); in l2cap_connect_create_rsp()
3938 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_connect_create_rsp()
3959 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, in l2cap_connect_create_rsp()
3976 mutex_unlock(&conn->chan_lock); in l2cap_connect_create_rsp()
3995 struct l2cap_conn *conn = chan->conn; in l2cap_send_efs_conf_rsp() local
3997 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident, in l2cap_send_efs_conf_rsp()
4003 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP, in l2cap_send_efs_conf_rsp()
4008 static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident, in cmd_reject_invalid_cid() argument
4017 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej); in cmd_reject_invalid_cid()
4020 static inline int l2cap_config_req(struct l2cap_conn *conn, in l2cap_config_req() argument
4038 chan = l2cap_get_chan_by_scid(conn, dcid); in l2cap_config_req()
4040 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0); in l2cap_config_req()
4045 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid, in l2cap_config_req()
4053 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, in l2cap_config_req()
4065 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, in l2cap_config_req()
4079 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp); in l2cap_config_req()
4105 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, in l2cap_config_req()
4129 static inline int l2cap_config_rsp(struct l2cap_conn *conn, in l2cap_config_rsp() argument
4149 chan = l2cap_get_chan_by_scid(conn, scid); in l2cap_config_rsp()
4202 l2cap_send_cmd(conn, l2cap_get_ident(conn), in l2cap_config_rsp()
4241 static inline int l2cap_disconnect_req(struct l2cap_conn *conn, in l2cap_disconnect_req() argument
4258 mutex_lock(&conn->chan_lock); in l2cap_disconnect_req()
4260 chan = __l2cap_get_chan_by_scid(conn, dcid); in l2cap_disconnect_req()
4262 mutex_unlock(&conn->chan_lock); in l2cap_disconnect_req()
4263 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid); in l2cap_disconnect_req()
4271 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp); in l2cap_disconnect_req()
4283 mutex_unlock(&conn->chan_lock); in l2cap_disconnect_req()
4288 static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, in l2cap_disconnect_rsp() argument
4304 mutex_lock(&conn->chan_lock); in l2cap_disconnect_rsp()
4306 chan = __l2cap_get_chan_by_scid(conn, scid); in l2cap_disconnect_rsp()
4308 mutex_unlock(&conn->chan_lock); in l2cap_disconnect_rsp()
4322 mutex_unlock(&conn->chan_lock); in l2cap_disconnect_rsp()
4327 static inline int l2cap_information_req(struct l2cap_conn *conn, in l2cap_information_req() argument
4350 if (conn->local_fixed_chan & L2CAP_FC_A2MP) in l2cap_information_req()
4355 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf), in l2cap_information_req()
4363 rsp->data[0] = conn->local_fixed_chan; in l2cap_information_req()
4365 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf), in l2cap_information_req()
4371 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp), in l2cap_information_req()
4378 static inline int l2cap_information_rsp(struct l2cap_conn *conn, in l2cap_information_rsp() argument
4394 if (cmd->ident != conn->info_ident || in l2cap_information_rsp()
4395 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) in l2cap_information_rsp()
4398 cancel_delayed_work(&conn->info_timer); in l2cap_information_rsp()
4401 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; in l2cap_information_rsp()
4402 conn->info_ident = 0; in l2cap_information_rsp()
4404 l2cap_conn_start(conn); in l2cap_information_rsp()
4411 conn->feat_mask = get_unaligned_le32(rsp->data); in l2cap_information_rsp()
4413 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) { in l2cap_information_rsp()
4417 conn->info_ident = l2cap_get_ident(conn); in l2cap_information_rsp()
4419 l2cap_send_cmd(conn, conn->info_ident, in l2cap_information_rsp()
4422 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; in l2cap_information_rsp()
4423 conn->info_ident = 0; in l2cap_information_rsp()
4425 l2cap_conn_start(conn); in l2cap_information_rsp()
4430 conn->remote_fixed_chan = rsp->data[0]; in l2cap_information_rsp()
4431 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; in l2cap_information_rsp()
4432 conn->info_ident = 0; in l2cap_information_rsp()
4434 l2cap_conn_start(conn); in l2cap_information_rsp()
4441 static int l2cap_create_channel_req(struct l2cap_conn *conn, in l2cap_create_channel_req() argument
4454 if (!(conn->local_fixed_chan & L2CAP_FC_A2MP)) in l2cap_create_channel_req()
4464 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP, in l2cap_create_channel_req()
4479 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP, in l2cap_create_channel_req()
4482 struct amp_mgr *mgr = conn->hcon->amp_mgr; in l2cap_create_channel_req()
4486 &conn->hcon->dst); in l2cap_create_channel_req()
4489 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid, in l2cap_create_channel_req()
4499 conn->mtu = hdev->block_mtu; in l2cap_create_channel_req()
4512 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP, in l2cap_create_channel_req()
4525 ident = l2cap_get_ident(chan->conn); in l2cap_send_move_chan_req()
4531 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req), in l2cap_send_move_chan_req()
4546 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP, in l2cap_send_move_chan_rsp()
4556 chan->ident = l2cap_get_ident(chan->conn); in l2cap_send_move_chan_cfm()
4561 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM, in l2cap_send_move_chan_cfm()
4567 static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid) in l2cap_send_move_chan_cfm_icid() argument
4571 BT_DBG("conn %p, icid 0x%4.4x", conn, icid); in l2cap_send_move_chan_cfm_icid()
4576 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM, in l2cap_send_move_chan_cfm_icid()
4580 static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident, in l2cap_send_move_chan_cfm_rsp() argument
4588 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp); in l2cap_send_move_chan_cfm_rsp()
4636 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_logical_finish_create()
4656 chan->hs_hcon = hchan->conn; in l2cap_logical_finish_move()
4657 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_logical_finish_move()
4765 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP, in l2cap_do_create()
4771 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn), in l2cap_do_create()
4798 chan->hs_hcon = hchan->conn; in l2cap_do_move_respond()
4799 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_do_move_respond()
4867 static inline int l2cap_move_channel_req(struct l2cap_conn *conn, in l2cap_move_channel_req() argument
4884 if (!(conn->local_fixed_chan & L2CAP_FC_A2MP)) in l2cap_move_channel_req()
4887 chan = l2cap_get_chan_by_dcid(conn, icid); in l2cap_move_channel_req()
4891 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP, in l2cap_move_channel_req()
4931 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) { in l2cap_move_channel_req()
4965 static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result) in l2cap_move_continue() argument
4970 chan = l2cap_get_chan_by_scid(conn, icid); in l2cap_move_continue()
4972 l2cap_send_move_chan_cfm_icid(conn, icid); in l2cap_move_continue()
5030 chan->hs_hcon = hchan->conn; in l2cap_move_continue()
5031 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_move_continue()
5055 static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid, in l2cap_move_fail() argument
5060 chan = l2cap_get_chan_by_ident(conn, ident); in l2cap_move_fail()
5063 l2cap_send_move_chan_cfm_icid(conn, icid); in l2cap_move_fail()
5084 static int l2cap_move_channel_rsp(struct l2cap_conn *conn, in l2cap_move_channel_rsp() argument
5100 l2cap_move_continue(conn, icid, result); in l2cap_move_channel_rsp()
5102 l2cap_move_fail(conn, cmd->ident, icid, result); in l2cap_move_channel_rsp()
5107 static int l2cap_move_channel_confirm(struct l2cap_conn *conn, in l2cap_move_channel_confirm() argument
5123 chan = l2cap_get_chan_by_dcid(conn, icid); in l2cap_move_channel_confirm()
5126 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid); in l2cap_move_channel_confirm()
5142 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid); in l2cap_move_channel_confirm()
5149 static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn, in l2cap_move_channel_confirm_rsp() argument
5164 chan = l2cap_get_chan_by_scid(conn, icid); in l2cap_move_channel_confirm_rsp()
5184 static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn, in l2cap_conn_param_update_req() argument
5188 struct hci_conn *hcon = conn->hcon; in l2cap_conn_param_update_req()
5217 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP, in l2cap_conn_param_update_req()
5234 static int l2cap_le_connect_rsp(struct l2cap_conn *conn, in l2cap_le_connect_rsp() argument
5239 struct hci_conn *hcon = conn->hcon; in l2cap_le_connect_rsp()
5261 mutex_lock(&conn->chan_lock); in l2cap_le_connect_rsp()
5263 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_le_connect_rsp()
5275 if (__l2cap_get_chan_by_dcid(conn, dcid)) { in l2cap_le_connect_rsp()
5316 mutex_unlock(&conn->chan_lock); in l2cap_le_connect_rsp()
5321 static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn, in l2cap_bredr_sig_cmd() argument
5329 l2cap_command_rej(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5333 err = l2cap_connect_req(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5338 l2cap_connect_create_rsp(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5342 err = l2cap_config_req(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5346 l2cap_config_rsp(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5350 err = l2cap_disconnect_req(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5354 l2cap_disconnect_rsp(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5358 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data); in l2cap_bredr_sig_cmd()
5365 err = l2cap_information_req(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5369 l2cap_information_rsp(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5373 err = l2cap_create_channel_req(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5377 err = l2cap_move_channel_req(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5381 l2cap_move_channel_rsp(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5385 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5389 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5401 static int l2cap_le_connect_req(struct l2cap_conn *conn, in l2cap_le_connect_req() argument
5429 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src, in l2cap_le_connect_req()
5430 &conn->hcon->dst, LE_LINK); in l2cap_le_connect_req()
5437 mutex_lock(&conn->chan_lock); in l2cap_le_connect_req()
5440 if (!smp_sufficient_security(conn->hcon, pchan->sec_level, in l2cap_le_connect_req()
5455 if (__l2cap_get_chan_by_dcid(conn, scid)) { in l2cap_le_connect_req()
5469 bacpy(&chan->src, &conn->hcon->src); in l2cap_le_connect_req()
5470 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_le_connect_req()
5471 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_le_connect_req()
5472 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_le_connect_req()
5479 __l2cap_chan_add(conn, chan); in l2cap_le_connect_req()
5503 mutex_unlock(&conn->chan_lock); in l2cap_le_connect_req()
5522 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp); in l2cap_le_connect_req()
5527 static inline int l2cap_le_credits(struct l2cap_conn *conn, in l2cap_le_credits() argument
5544 chan = l2cap_get_chan_by_dcid(conn, cid); in l2cap_le_credits()
5575 static inline int l2cap_le_command_rej(struct l2cap_conn *conn, in l2cap_le_command_rej() argument
5585 mutex_lock(&conn->chan_lock); in l2cap_le_command_rej()
5587 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_le_command_rej()
5596 mutex_unlock(&conn->chan_lock); in l2cap_le_command_rej()
5600 static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn, in l2cap_le_sig_cmd() argument
5608 l2cap_le_command_rej(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5612 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5619 l2cap_le_connect_rsp(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5623 err = l2cap_le_connect_req(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5627 err = l2cap_le_credits(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5631 err = l2cap_disconnect_req(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5635 l2cap_disconnect_rsp(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5647 static inline void l2cap_le_sig_channel(struct l2cap_conn *conn, in l2cap_le_sig_channel() argument
5650 struct hci_conn *hcon = conn->hcon; in l2cap_le_sig_channel()
5673 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data); in l2cap_le_sig_channel()
5680 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ, in l2cap_le_sig_channel()
5688 static inline void l2cap_sig_channel(struct l2cap_conn *conn, in l2cap_sig_channel() argument
5691 struct hci_conn *hcon = conn->hcon; in l2cap_sig_channel()
5697 l2cap_raw_recv(conn, skb); in l2cap_sig_channel()
5718 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data); in l2cap_sig_channel()
5725 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ, in l2cap_sig_channel()
6409 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu; in l2cap_finish_move()
6411 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu; in l2cap_finish_move()
6480 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu; in l2cap_rx_state_wait_f()
6482 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu; in l2cap_rx_state_wait_f()
6666 struct l2cap_conn *conn = chan->conn; in l2cap_chan_le_send_credits() local
6685 chan->ident = l2cap_get_ident(conn); in l2cap_chan_le_send_credits()
6687 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt); in l2cap_chan_le_send_credits()
6780 static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid, in l2cap_data_channel() argument
6785 chan = l2cap_get_chan_by_scid(conn, cid); in l2cap_data_channel()
6788 chan = a2mp_channel_create(conn, skb); in l2cap_data_channel()
6854 static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, in l2cap_conless_channel() argument
6857 struct hci_conn *hcon = conn->hcon; in l2cap_conless_channel()
6891 static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb) in l2cap_recv_frame() argument
6894 struct hci_conn *hcon = conn->hcon; in l2cap_recv_frame()
6900 skb_queue_tail(&conn->pending_rx, skb); in l2cap_recv_frame()
6927 l2cap_sig_channel(conn, skb); in l2cap_recv_frame()
6933 l2cap_conless_channel(conn, psm, skb); in l2cap_recv_frame()
6937 l2cap_le_sig_channel(conn, skb); in l2cap_recv_frame()
6941 l2cap_data_channel(conn, cid, skb); in l2cap_recv_frame()
6948 struct l2cap_conn *conn = container_of(work, struct l2cap_conn, in process_pending_rx() local
6954 while ((skb = skb_dequeue(&conn->pending_rx))) in process_pending_rx()
6955 l2cap_recv_frame(conn, skb); in process_pending_rx()
6960 struct l2cap_conn *conn = hcon->l2cap_data; in l2cap_conn_add() local
6963 if (conn) in l2cap_conn_add()
6964 return conn; in l2cap_conn_add()
6970 conn = kzalloc(sizeof(*conn), GFP_KERNEL); in l2cap_conn_add()
6971 if (!conn) { in l2cap_conn_add()
6976 kref_init(&conn->ref); in l2cap_conn_add()
6977 hcon->l2cap_data = conn; in l2cap_conn_add()
6978 conn->hcon = hci_conn_get(hcon); in l2cap_conn_add()
6979 conn->hchan = hchan; in l2cap_conn_add()
6981 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan); in l2cap_conn_add()
6986 conn->mtu = hcon->hdev->le_mtu; in l2cap_conn_add()
6991 conn->mtu = hcon->hdev->acl_mtu; in l2cap_conn_add()
6995 conn->feat_mask = 0; in l2cap_conn_add()
6997 conn->local_fixed_chan = L2CAP_FC_SIG_BREDR | L2CAP_FC_CONNLESS; in l2cap_conn_add()
7001 conn->local_fixed_chan |= L2CAP_FC_A2MP; in l2cap_conn_add()
7006 conn->local_fixed_chan |= L2CAP_FC_SMP_BREDR; in l2cap_conn_add()
7008 mutex_init(&conn->ident_lock); in l2cap_conn_add()
7009 mutex_init(&conn->chan_lock); in l2cap_conn_add()
7011 INIT_LIST_HEAD(&conn->chan_l); in l2cap_conn_add()
7012 INIT_LIST_HEAD(&conn->users); in l2cap_conn_add()
7014 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout); in l2cap_conn_add()
7016 skb_queue_head_init(&conn->pending_rx); in l2cap_conn_add()
7017 INIT_WORK(&conn->pending_rx_work, process_pending_rx); in l2cap_conn_add()
7018 INIT_WORK(&conn->id_addr_update_work, l2cap_conn_update_id_addr); in l2cap_conn_add()
7020 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM; in l2cap_conn_add()
7022 return conn; in l2cap_conn_add()
7039 struct l2cap_conn *conn; in l2cap_chan_connect() local
7144 conn = l2cap_conn_add(hcon); in l2cap_chan_connect()
7145 if (!conn) { in l2cap_chan_connect()
7151 mutex_lock(&conn->chan_lock); in l2cap_chan_connect()
7154 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) { in l2cap_chan_connect()
7164 __l2cap_chan_add(conn, chan); in l2cap_chan_connect()
7192 mutex_unlock(&conn->chan_lock); in l2cap_chan_connect()
7270 struct l2cap_conn *conn; in l2cap_connect_cfm() local
7284 conn = l2cap_conn_add(hcon); in l2cap_connect_cfm()
7285 if (!conn) in l2cap_connect_cfm()
7304 if (__l2cap_get_chan_by_dcid(conn, pchan->scid)) in l2cap_connect_cfm()
7315 __l2cap_chan_add(conn, chan); in l2cap_connect_cfm()
7325 l2cap_conn_ready(conn); in l2cap_connect_cfm()
7330 struct l2cap_conn *conn = hcon->l2cap_data; in l2cap_disconn_ind() local
7334 if (!conn) in l2cap_disconn_ind()
7336 return conn->disc_reason; in l2cap_disconn_ind()
7368 struct l2cap_conn *conn = hcon->l2cap_data; in l2cap_security_cfm() local
7371 if (!conn) in l2cap_security_cfm()
7374 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt); in l2cap_security_cfm()
7376 mutex_lock(&conn->chan_lock); in l2cap_security_cfm()
7378 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_security_cfm()
7436 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, in l2cap_security_cfm()
7443 l2cap_send_cmd(conn, l2cap_get_ident(conn), in l2cap_security_cfm()
7454 mutex_unlock(&conn->chan_lock); in l2cap_security_cfm()
7459 struct l2cap_conn *conn = hcon->l2cap_data; in l2cap_recv_acldata() local
7464 if (!conn && hcon->hdev->dev_type != HCI_BREDR) in l2cap_recv_acldata()
7467 if (!conn) in l2cap_recv_acldata()
7468 conn = l2cap_conn_add(hcon); in l2cap_recv_acldata()
7470 if (!conn) in l2cap_recv_acldata()
7473 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags); in l2cap_recv_acldata()
7479 if (conn->rx_len) { in l2cap_recv_acldata()
7481 kfree_skb(conn->rx_skb); in l2cap_recv_acldata()
7482 conn->rx_skb = NULL; in l2cap_recv_acldata()
7483 conn->rx_len = 0; in l2cap_recv_acldata()
7484 l2cap_conn_unreliable(conn, ECOMM); in l2cap_recv_acldata()
7490 l2cap_conn_unreliable(conn, ECOMM); in l2cap_recv_acldata()
7499 l2cap_recv_frame(conn, skb); in l2cap_recv_acldata()
7508 l2cap_conn_unreliable(conn, ECOMM); in l2cap_recv_acldata()
7513 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL); in l2cap_recv_acldata()
7514 if (!conn->rx_skb) in l2cap_recv_acldata()
7517 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len), in l2cap_recv_acldata()
7519 conn->rx_len = len - skb->len; in l2cap_recv_acldata()
7523 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len); in l2cap_recv_acldata()
7525 if (!conn->rx_len) { in l2cap_recv_acldata()
7527 l2cap_conn_unreliable(conn, ECOMM); in l2cap_recv_acldata()
7531 if (skb->len > conn->rx_len) { in l2cap_recv_acldata()
7533 skb->len, conn->rx_len); in l2cap_recv_acldata()
7534 kfree_skb(conn->rx_skb); in l2cap_recv_acldata()
7535 conn->rx_skb = NULL; in l2cap_recv_acldata()
7536 conn->rx_len = 0; in l2cap_recv_acldata()
7537 l2cap_conn_unreliable(conn, ECOMM); in l2cap_recv_acldata()
7541 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len), in l2cap_recv_acldata()
7543 conn->rx_len -= skb->len; in l2cap_recv_acldata()
7545 if (!conn->rx_len) { in l2cap_recv_acldata()
7550 struct sk_buff *rx_skb = conn->rx_skb; in l2cap_recv_acldata()
7551 conn->rx_skb = NULL; in l2cap_recv_acldata()
7552 l2cap_recv_frame(conn, rx_skb); in l2cap_recv_acldata()