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()
1640 user->remove(conn, user); in l2cap_unregister_user()
1647 static void l2cap_unregister_all_users(struct l2cap_conn *conn) in l2cap_unregister_all_users() argument
1651 while (!list_empty(&conn->users)) { in l2cap_unregister_all_users()
1652 user = list_first_entry(&conn->users, struct l2cap_user, list); in l2cap_unregister_all_users()
1656 user->remove(conn, user); in l2cap_unregister_all_users()
1662 struct l2cap_conn *conn = hcon->l2cap_data; in l2cap_conn_del() local
1665 if (!conn) in l2cap_conn_del()
1668 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err); in l2cap_conn_del()
1670 kfree_skb(conn->rx_skb); in l2cap_conn_del()
1672 skb_queue_purge(&conn->pending_rx); in l2cap_conn_del()
1678 if (work_pending(&conn->pending_rx_work)) in l2cap_conn_del()
1679 cancel_work_sync(&conn->pending_rx_work); in l2cap_conn_del()
1681 if (work_pending(&conn->id_addr_update_work)) in l2cap_conn_del()
1682 cancel_work_sync(&conn->id_addr_update_work); in l2cap_conn_del()
1684 l2cap_unregister_all_users(conn); in l2cap_conn_del()
1689 mutex_lock(&conn->chan_lock); in l2cap_conn_del()
1692 list_for_each_entry_safe(chan, l, &conn->chan_l, list) { in l2cap_conn_del()
1704 mutex_unlock(&conn->chan_lock); in l2cap_conn_del()
1706 hci_chan_del(conn->hchan); in l2cap_conn_del()
1708 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) in l2cap_conn_del()
1709 cancel_delayed_work_sync(&conn->info_timer); in l2cap_conn_del()
1712 conn->hchan = NULL; in l2cap_conn_del()
1713 l2cap_conn_put(conn); in l2cap_conn_del()
1718 struct l2cap_conn *conn = container_of(ref, struct l2cap_conn, ref); in l2cap_conn_free() local
1720 hci_conn_put(conn->hcon); in l2cap_conn_free()
1721 kfree(conn); in l2cap_conn_free()
1724 struct l2cap_conn *l2cap_conn_get(struct l2cap_conn *conn) in l2cap_conn_get() argument
1726 kref_get(&conn->ref); in l2cap_conn_get()
1727 return conn; in l2cap_conn_get()
1731 void l2cap_conn_put(struct l2cap_conn *conn) in l2cap_conn_put() argument
1733 kref_put(&conn->ref, l2cap_conn_free); in l2cap_conn_put()
1800 if (!chan->conn) { in l2cap_monitor_timeout()
1821 if (!chan->conn) { in l2cap_retrans_timeout()
2119 struct l2cap_conn *conn = chan->conn; in l2cap_skbuff_fromiovec() local
2134 count = min_t(unsigned int, conn->mtu, len); in l2cap_skbuff_fromiovec()
2162 struct l2cap_conn *conn = chan->conn; in l2cap_create_connless_pdu() local
2170 count = min_t(unsigned int, (conn->mtu - hlen), len); in l2cap_create_connless_pdu()
2194 struct l2cap_conn *conn = chan->conn; in l2cap_create_basic_pdu() local
2201 count = min_t(unsigned int, (conn->mtu - L2CAP_HDR_SIZE), len); in l2cap_create_basic_pdu()
2225 struct l2cap_conn *conn = chan->conn; in l2cap_create_iframe_pdu() local
2232 if (!conn) in l2cap_create_iframe_pdu()
2243 count = min_t(unsigned int, (conn->mtu - hlen), len); in l2cap_create_iframe_pdu()
2292 pdu_len = chan->conn->mtu; in l2cap_segment_sdu()
2346 struct l2cap_conn *conn = chan->conn; in l2cap_create_le_flowctl_pdu() local
2353 if (!conn) in l2cap_create_le_flowctl_pdu()
2361 count = min_t(unsigned int, (conn->mtu - hlen), len); in l2cap_create_le_flowctl_pdu()
2427 if (!chan->conn) in l2cap_chan_send()
2845 static void l2cap_raw_recv(struct l2cap_conn *conn, struct sk_buff *skb) in l2cap_raw_recv() argument
2850 BT_DBG("conn %p", conn); in l2cap_raw_recv()
2852 mutex_lock(&conn->chan_lock); in l2cap_raw_recv()
2854 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_raw_recv()
2869 mutex_unlock(&conn->chan_lock); in l2cap_raw_recv()
2873 static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code, in l2cap_build_cmd() argument
2882 conn, code, ident, dlen); in l2cap_build_cmd()
2884 if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE) in l2cap_build_cmd()
2888 count = min_t(unsigned int, conn->mtu, len); in l2cap_build_cmd()
2897 if (conn->hcon->type == LE_LINK) in l2cap_build_cmd()
2918 count = min_t(unsigned int, conn->mtu, len); in l2cap_build_cmd()
3112 static inline bool __l2cap_ews_supported(struct l2cap_conn *conn) in __l2cap_ews_supported() argument
3114 return ((conn->local_fixed_chan & L2CAP_FC_A2MP) && in __l2cap_ews_supported()
3115 (conn->feat_mask & L2CAP_FEAT_EXT_WINDOW)); in __l2cap_ews_supported()
3118 static inline bool __l2cap_efs_supported(struct l2cap_conn *conn) in __l2cap_efs_supported() argument
3120 return ((conn->local_fixed_chan & L2CAP_FC_A2MP) && in __l2cap_efs_supported()
3121 (conn->feat_mask & L2CAP_FEAT_EXT_FLOW)); in __l2cap_efs_supported()
3165 __l2cap_ews_supported(chan->conn)) { in l2cap_txwin_setup()
3195 if (__l2cap_efs_supported(chan->conn)) in l2cap_build_conf_req()
3200 chan->mode = l2cap_select_mode(rfc.mode, chan->conn->feat_mask); in l2cap_build_conf_req()
3213 if (!(chan->conn->feat_mask & L2CAP_FEAT_ERTM) && in l2cap_build_conf_req()
3214 !(chan->conn->feat_mask & L2CAP_FEAT_STREAMING)) in l2cap_build_conf_req()
3234 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu - in l2cap_build_conf_req()
3254 if (chan->conn->feat_mask & L2CAP_FEAT_FCS) in l2cap_build_conf_req()
3271 size = min_t(u16, L2CAP_DEFAULT_MAX_PDU_SIZE, chan->conn->mtu - in l2cap_build_conf_req()
3282 if (chan->conn->feat_mask & L2CAP_FEAT_FCS) in l2cap_build_conf_req()
3350 if (!(chan->conn->local_fixed_chan & L2CAP_FC_A2MP)) in l2cap_parse_conf_req()
3377 chan->conn->feat_mask); in l2cap_parse_conf_req()
3382 if (__l2cap_efs_supported(chan->conn)) in l2cap_parse_conf_req()
3453 chan->conn->mtu - L2CAP_EXT_HDR_SIZE - in l2cap_parse_conf_req()
3483 chan->conn->mtu - L2CAP_EXT_HDR_SIZE - in l2cap_parse_conf_req()
3639 struct l2cap_conn *conn = chan->conn; in __l2cap_le_connect_rsp_defer() local
3649 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), in __l2cap_le_connect_rsp_defer()
3656 struct l2cap_conn *conn = chan->conn; in __l2cap_connect_rsp_defer() local
3672 l2cap_send_cmd(conn, chan->ident, rsp_code, sizeof(rsp), &rsp); in __l2cap_connect_rsp_defer()
3677 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, in __l2cap_connect_rsp_defer()
3733 static inline int l2cap_command_rej(struct l2cap_conn *conn, in l2cap_command_rej() argument
3745 if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) && in l2cap_command_rej()
3746 cmd->ident == conn->info_ident) { in l2cap_command_rej()
3747 cancel_delayed_work(&conn->info_timer); in l2cap_command_rej()
3749 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; in l2cap_command_rej()
3750 conn->info_ident = 0; in l2cap_command_rej()
3752 l2cap_conn_start(conn); in l2cap_command_rej()
3758 static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn, in l2cap_connect() argument
3773 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src, in l2cap_connect()
3774 &conn->hcon->dst, ACL_LINK); in l2cap_connect()
3780 mutex_lock(&conn->chan_lock); in l2cap_connect()
3785 !hci_conn_check_link_mode(conn->hcon)) { in l2cap_connect()
3786 conn->disc_reason = HCI_ERROR_AUTH_FAILURE; in l2cap_connect()
3794 if (__l2cap_get_chan_by_dcid(conn, scid)) in l2cap_connect()
3806 conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT; in l2cap_connect()
3808 bacpy(&chan->src, &conn->hcon->src); in l2cap_connect()
3809 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_connect()
3810 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_connect()
3811 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_connect()
3816 __l2cap_chan_add(conn, chan); in l2cap_connect()
3824 if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) { in l2cap_connect()
3858 mutex_unlock(&conn->chan_lock); in l2cap_connect()
3866 l2cap_send_cmd(conn, cmd->ident, rsp_code, sizeof(rsp), &rsp); in l2cap_connect()
3872 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT; in l2cap_connect()
3873 conn->info_ident = l2cap_get_ident(conn); in l2cap_connect()
3875 schedule_delayed_work(&conn->info_timer, L2CAP_INFO_TIMEOUT); in l2cap_connect()
3877 l2cap_send_cmd(conn, conn->info_ident, L2CAP_INFO_REQ, in l2cap_connect()
3885 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, in l2cap_connect()
3893 static int l2cap_connect_req(struct l2cap_conn *conn, in l2cap_connect_req() argument
3896 struct hci_dev *hdev = conn->hcon->hdev; in l2cap_connect_req()
3897 struct hci_conn *hcon = conn->hcon; in l2cap_connect_req()
3908 l2cap_connect(conn, cmd, data, L2CAP_CONN_RSP, 0); in l2cap_connect_req()
3912 static int l2cap_connect_create_rsp(struct l2cap_conn *conn, in l2cap_connect_create_rsp() argument
3933 mutex_lock(&conn->chan_lock); in l2cap_connect_create_rsp()
3936 chan = __l2cap_get_chan_by_scid(conn, scid); in l2cap_connect_create_rsp()
3942 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_connect_create_rsp()
3963 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, in l2cap_connect_create_rsp()
3980 mutex_unlock(&conn->chan_lock); in l2cap_connect_create_rsp()
3999 struct l2cap_conn *conn = chan->conn; in l2cap_send_efs_conf_rsp() local
4001 BT_DBG("conn %p chan %p ident %d flags 0x%4.4x", conn, chan, ident, in l2cap_send_efs_conf_rsp()
4007 l2cap_send_cmd(conn, ident, L2CAP_CONF_RSP, in l2cap_send_efs_conf_rsp()
4012 static void cmd_reject_invalid_cid(struct l2cap_conn *conn, u8 ident, in cmd_reject_invalid_cid() argument
4021 l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej); in cmd_reject_invalid_cid()
4024 static inline int l2cap_config_req(struct l2cap_conn *conn, in l2cap_config_req() argument
4042 chan = l2cap_get_chan_by_scid(conn, dcid); in l2cap_config_req()
4044 cmd_reject_invalid_cid(conn, cmd->ident, dcid, 0); in l2cap_config_req()
4049 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid, in l2cap_config_req()
4057 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, in l2cap_config_req()
4069 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, in l2cap_config_req()
4083 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp); in l2cap_config_req()
4109 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, in l2cap_config_req()
4133 static inline int l2cap_config_rsp(struct l2cap_conn *conn, in l2cap_config_rsp() argument
4153 chan = l2cap_get_chan_by_scid(conn, scid); in l2cap_config_rsp()
4206 l2cap_send_cmd(conn, l2cap_get_ident(conn), in l2cap_config_rsp()
4245 static inline int l2cap_disconnect_req(struct l2cap_conn *conn, in l2cap_disconnect_req() argument
4262 mutex_lock(&conn->chan_lock); in l2cap_disconnect_req()
4264 chan = __l2cap_get_chan_by_scid(conn, dcid); in l2cap_disconnect_req()
4266 mutex_unlock(&conn->chan_lock); in l2cap_disconnect_req()
4267 cmd_reject_invalid_cid(conn, cmd->ident, dcid, scid); in l2cap_disconnect_req()
4275 l2cap_send_cmd(conn, cmd->ident, L2CAP_DISCONN_RSP, sizeof(rsp), &rsp); in l2cap_disconnect_req()
4287 mutex_unlock(&conn->chan_lock); in l2cap_disconnect_req()
4292 static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, in l2cap_disconnect_rsp() argument
4308 mutex_lock(&conn->chan_lock); in l2cap_disconnect_rsp()
4310 chan = __l2cap_get_chan_by_scid(conn, scid); in l2cap_disconnect_rsp()
4312 mutex_unlock(&conn->chan_lock); in l2cap_disconnect_rsp()
4326 mutex_unlock(&conn->chan_lock); in l2cap_disconnect_rsp()
4331 static inline int l2cap_information_req(struct l2cap_conn *conn, in l2cap_information_req() argument
4354 if (conn->local_fixed_chan & L2CAP_FC_A2MP) in l2cap_information_req()
4359 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf), in l2cap_information_req()
4367 rsp->data[0] = conn->local_fixed_chan; in l2cap_information_req()
4369 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(buf), in l2cap_information_req()
4375 l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp), in l2cap_information_req()
4382 static inline int l2cap_information_rsp(struct l2cap_conn *conn, in l2cap_information_rsp() argument
4398 if (cmd->ident != conn->info_ident || in l2cap_information_rsp()
4399 conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) in l2cap_information_rsp()
4402 cancel_delayed_work(&conn->info_timer); in l2cap_information_rsp()
4405 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; in l2cap_information_rsp()
4406 conn->info_ident = 0; in l2cap_information_rsp()
4408 l2cap_conn_start(conn); in l2cap_information_rsp()
4415 conn->feat_mask = get_unaligned_le32(rsp->data); in l2cap_information_rsp()
4417 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) { in l2cap_information_rsp()
4421 conn->info_ident = l2cap_get_ident(conn); in l2cap_information_rsp()
4423 l2cap_send_cmd(conn, conn->info_ident, in l2cap_information_rsp()
4426 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; in l2cap_information_rsp()
4427 conn->info_ident = 0; in l2cap_information_rsp()
4429 l2cap_conn_start(conn); in l2cap_information_rsp()
4434 conn->remote_fixed_chan = rsp->data[0]; in l2cap_information_rsp()
4435 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE; in l2cap_information_rsp()
4436 conn->info_ident = 0; in l2cap_information_rsp()
4438 l2cap_conn_start(conn); in l2cap_information_rsp()
4445 static int l2cap_create_channel_req(struct l2cap_conn *conn, in l2cap_create_channel_req() argument
4458 if (!(conn->local_fixed_chan & L2CAP_FC_A2MP)) in l2cap_create_channel_req()
4468 l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP, in l2cap_create_channel_req()
4483 chan = l2cap_connect(conn, cmd, data, L2CAP_CREATE_CHAN_RSP, in l2cap_create_channel_req()
4486 struct amp_mgr *mgr = conn->hcon->amp_mgr; in l2cap_create_channel_req()
4490 &conn->hcon->dst); in l2cap_create_channel_req()
4493 cmd_reject_invalid_cid(conn, cmd->ident, chan->scid, in l2cap_create_channel_req()
4503 conn->mtu = hdev->block_mtu; in l2cap_create_channel_req()
4516 l2cap_send_cmd(conn, cmd->ident, L2CAP_CREATE_CHAN_RSP, in l2cap_create_channel_req()
4529 ident = l2cap_get_ident(chan->conn); in l2cap_send_move_chan_req()
4535 l2cap_send_cmd(chan->conn, ident, L2CAP_MOVE_CHAN_REQ, sizeof(req), in l2cap_send_move_chan_req()
4550 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_RSP, in l2cap_send_move_chan_rsp()
4560 chan->ident = l2cap_get_ident(chan->conn); in l2cap_send_move_chan_cfm()
4565 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_MOVE_CHAN_CFM, in l2cap_send_move_chan_cfm()
4571 static void l2cap_send_move_chan_cfm_icid(struct l2cap_conn *conn, u16 icid) in l2cap_send_move_chan_cfm_icid() argument
4575 BT_DBG("conn %p, icid 0x%4.4x", conn, icid); in l2cap_send_move_chan_cfm_icid()
4580 l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_MOVE_CHAN_CFM, in l2cap_send_move_chan_cfm_icid()
4584 static void l2cap_send_move_chan_cfm_rsp(struct l2cap_conn *conn, u8 ident, in l2cap_send_move_chan_cfm_rsp() argument
4592 l2cap_send_cmd(conn, ident, L2CAP_MOVE_CHAN_CFM_RSP, sizeof(rsp), &rsp); in l2cap_send_move_chan_cfm_rsp()
4640 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_logical_finish_create()
4660 chan->hs_hcon = hchan->conn; in l2cap_logical_finish_move()
4661 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_logical_finish_move()
4769 l2cap_send_cmd(chan->conn, chan->ident, L2CAP_CREATE_CHAN_RSP, in l2cap_do_create()
4775 l2cap_send_cmd(chan->conn, l2cap_get_ident(chan->conn), in l2cap_do_create()
4802 chan->hs_hcon = hchan->conn; in l2cap_do_move_respond()
4803 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_do_move_respond()
4871 static inline int l2cap_move_channel_req(struct l2cap_conn *conn, in l2cap_move_channel_req() argument
4888 if (!(conn->local_fixed_chan & L2CAP_FC_A2MP)) in l2cap_move_channel_req()
4891 chan = l2cap_get_chan_by_dcid(conn, icid); in l2cap_move_channel_req()
4895 l2cap_send_cmd(conn, cmd->ident, L2CAP_MOVE_CHAN_RSP, in l2cap_move_channel_req()
4935 bacmp(&conn->hcon->src, &conn->hcon->dst) > 0) { in l2cap_move_channel_req()
4969 static void l2cap_move_continue(struct l2cap_conn *conn, u16 icid, u16 result) in l2cap_move_continue() argument
4974 chan = l2cap_get_chan_by_scid(conn, icid); in l2cap_move_continue()
4976 l2cap_send_move_chan_cfm_icid(conn, icid); in l2cap_move_continue()
5034 chan->hs_hcon = hchan->conn; in l2cap_move_continue()
5035 chan->hs_hcon->l2cap_data = chan->conn; in l2cap_move_continue()
5059 static void l2cap_move_fail(struct l2cap_conn *conn, u8 ident, u16 icid, in l2cap_move_fail() argument
5064 chan = l2cap_get_chan_by_ident(conn, ident); in l2cap_move_fail()
5067 l2cap_send_move_chan_cfm_icid(conn, icid); in l2cap_move_fail()
5088 static int l2cap_move_channel_rsp(struct l2cap_conn *conn, in l2cap_move_channel_rsp() argument
5104 l2cap_move_continue(conn, icid, result); in l2cap_move_channel_rsp()
5106 l2cap_move_fail(conn, cmd->ident, icid, result); in l2cap_move_channel_rsp()
5111 static int l2cap_move_channel_confirm(struct l2cap_conn *conn, in l2cap_move_channel_confirm() argument
5127 chan = l2cap_get_chan_by_dcid(conn, icid); in l2cap_move_channel_confirm()
5130 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid); in l2cap_move_channel_confirm()
5146 l2cap_send_move_chan_cfm_rsp(conn, cmd->ident, icid); in l2cap_move_channel_confirm()
5153 static inline int l2cap_move_channel_confirm_rsp(struct l2cap_conn *conn, in l2cap_move_channel_confirm_rsp() argument
5168 chan = l2cap_get_chan_by_scid(conn, icid); in l2cap_move_channel_confirm_rsp()
5188 static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn, in l2cap_conn_param_update_req() argument
5192 struct hci_conn *hcon = conn->hcon; in l2cap_conn_param_update_req()
5221 l2cap_send_cmd(conn, cmd->ident, L2CAP_CONN_PARAM_UPDATE_RSP, in l2cap_conn_param_update_req()
5238 static int l2cap_le_connect_rsp(struct l2cap_conn *conn, in l2cap_le_connect_rsp() argument
5243 struct hci_conn *hcon = conn->hcon; in l2cap_le_connect_rsp()
5263 mutex_lock(&conn->chan_lock); in l2cap_le_connect_rsp()
5265 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_le_connect_rsp()
5313 mutex_unlock(&conn->chan_lock); in l2cap_le_connect_rsp()
5318 static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn, in l2cap_bredr_sig_cmd() argument
5326 l2cap_command_rej(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5330 err = l2cap_connect_req(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5335 l2cap_connect_create_rsp(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5339 err = l2cap_config_req(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5343 l2cap_config_rsp(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5347 err = l2cap_disconnect_req(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5351 l2cap_disconnect_rsp(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5355 l2cap_send_cmd(conn, cmd->ident, L2CAP_ECHO_RSP, cmd_len, data); in l2cap_bredr_sig_cmd()
5362 err = l2cap_information_req(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5366 l2cap_information_rsp(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5370 err = l2cap_create_channel_req(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5374 err = l2cap_move_channel_req(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5378 l2cap_move_channel_rsp(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5382 err = l2cap_move_channel_confirm(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5386 l2cap_move_channel_confirm_rsp(conn, cmd, cmd_len, data); in l2cap_bredr_sig_cmd()
5398 static int l2cap_le_connect_req(struct l2cap_conn *conn, in l2cap_le_connect_req() argument
5426 pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src, in l2cap_le_connect_req()
5427 &conn->hcon->dst, LE_LINK); in l2cap_le_connect_req()
5434 mutex_lock(&conn->chan_lock); in l2cap_le_connect_req()
5437 if (!smp_sufficient_security(conn->hcon, pchan->sec_level, in l2cap_le_connect_req()
5445 if (__l2cap_get_chan_by_dcid(conn, scid)) { in l2cap_le_connect_req()
5459 bacpy(&chan->src, &conn->hcon->src); in l2cap_le_connect_req()
5460 bacpy(&chan->dst, &conn->hcon->dst); in l2cap_le_connect_req()
5461 chan->src_type = bdaddr_src_type(conn->hcon); in l2cap_le_connect_req()
5462 chan->dst_type = bdaddr_dst_type(conn->hcon); in l2cap_le_connect_req()
5469 __l2cap_chan_add(conn, chan); in l2cap_le_connect_req()
5493 mutex_unlock(&conn->chan_lock); in l2cap_le_connect_req()
5512 l2cap_send_cmd(conn, cmd->ident, L2CAP_LE_CONN_RSP, sizeof(rsp), &rsp); in l2cap_le_connect_req()
5517 static inline int l2cap_le_credits(struct l2cap_conn *conn, in l2cap_le_credits() argument
5534 chan = l2cap_get_chan_by_dcid(conn, cid); in l2cap_le_credits()
5565 static inline int l2cap_le_command_rej(struct l2cap_conn *conn, in l2cap_le_command_rej() argument
5575 mutex_lock(&conn->chan_lock); in l2cap_le_command_rej()
5577 chan = __l2cap_get_chan_by_ident(conn, cmd->ident); in l2cap_le_command_rej()
5586 mutex_unlock(&conn->chan_lock); in l2cap_le_command_rej()
5590 static inline int l2cap_le_sig_cmd(struct l2cap_conn *conn, in l2cap_le_sig_cmd() argument
5598 l2cap_le_command_rej(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5602 err = l2cap_conn_param_update_req(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5609 l2cap_le_connect_rsp(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5613 err = l2cap_le_connect_req(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5617 err = l2cap_le_credits(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5621 err = l2cap_disconnect_req(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5625 l2cap_disconnect_rsp(conn, cmd, cmd_len, data); in l2cap_le_sig_cmd()
5637 static inline void l2cap_le_sig_channel(struct l2cap_conn *conn, in l2cap_le_sig_channel() argument
5640 struct hci_conn *hcon = conn->hcon; in l2cap_le_sig_channel()
5663 err = l2cap_le_sig_cmd(conn, cmd, len, skb->data); in l2cap_le_sig_channel()
5670 l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ, in l2cap_le_sig_channel()
5678 static inline void l2cap_sig_channel(struct l2cap_conn *conn, in l2cap_sig_channel() argument
5681 struct hci_conn *hcon = conn->hcon; in l2cap_sig_channel()
5687 l2cap_raw_recv(conn, skb); in l2cap_sig_channel()
5708 err = l2cap_bredr_sig_cmd(conn, &cmd, cmd_len, data); in l2cap_sig_channel()
5715 l2cap_send_cmd(conn, cmd.ident, L2CAP_COMMAND_REJ, in l2cap_sig_channel()
6399 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu; in l2cap_finish_move()
6401 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu; in l2cap_finish_move()
6470 chan->conn->mtu = chan->hs_hcon->hdev->block_mtu; in l2cap_rx_state_wait_f()
6472 chan->conn->mtu = chan->conn->hcon->hdev->acl_mtu; in l2cap_rx_state_wait_f()
6656 struct l2cap_conn *conn = chan->conn; in l2cap_chan_le_send_credits() local
6675 chan->ident = l2cap_get_ident(conn); in l2cap_chan_le_send_credits()
6677 l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CREDITS, sizeof(pkt), &pkt); in l2cap_chan_le_send_credits()
6770 static void l2cap_data_channel(struct l2cap_conn *conn, u16 cid, in l2cap_data_channel() argument
6775 chan = l2cap_get_chan_by_scid(conn, cid); in l2cap_data_channel()
6778 chan = a2mp_channel_create(conn, skb); in l2cap_data_channel()
6844 static void l2cap_conless_channel(struct l2cap_conn *conn, __le16 psm, in l2cap_conless_channel() argument
6847 struct hci_conn *hcon = conn->hcon; in l2cap_conless_channel()
6881 static void l2cap_recv_frame(struct l2cap_conn *conn, struct sk_buff *skb) in l2cap_recv_frame() argument
6884 struct hci_conn *hcon = conn->hcon; in l2cap_recv_frame()
6890 skb_queue_tail(&conn->pending_rx, skb); in l2cap_recv_frame()
6917 l2cap_sig_channel(conn, skb); in l2cap_recv_frame()
6923 l2cap_conless_channel(conn, psm, skb); in l2cap_recv_frame()
6927 l2cap_le_sig_channel(conn, skb); in l2cap_recv_frame()
6931 l2cap_data_channel(conn, cid, skb); in l2cap_recv_frame()
6938 struct l2cap_conn *conn = container_of(work, struct l2cap_conn, in process_pending_rx() local
6944 while ((skb = skb_dequeue(&conn->pending_rx))) in process_pending_rx()
6945 l2cap_recv_frame(conn, skb); in process_pending_rx()
6950 struct l2cap_conn *conn = hcon->l2cap_data; in l2cap_conn_add() local
6953 if (conn) in l2cap_conn_add()
6954 return conn; in l2cap_conn_add()
6960 conn = kzalloc(sizeof(*conn), GFP_KERNEL); in l2cap_conn_add()
6961 if (!conn) { in l2cap_conn_add()
6966 kref_init(&conn->ref); in l2cap_conn_add()
6967 hcon->l2cap_data = conn; in l2cap_conn_add()
6968 conn->hcon = hci_conn_get(hcon); in l2cap_conn_add()
6969 conn->hchan = hchan; in l2cap_conn_add()
6971 BT_DBG("hcon %p conn %p hchan %p", hcon, conn, hchan); in l2cap_conn_add()
6976 conn->mtu = hcon->hdev->le_mtu; in l2cap_conn_add()
6981 conn->mtu = hcon->hdev->acl_mtu; in l2cap_conn_add()
6985 conn->feat_mask = 0; in l2cap_conn_add()
6987 conn->local_fixed_chan = L2CAP_FC_SIG_BREDR | L2CAP_FC_CONNLESS; in l2cap_conn_add()
6991 conn->local_fixed_chan |= L2CAP_FC_A2MP; in l2cap_conn_add()
6996 conn->local_fixed_chan |= L2CAP_FC_SMP_BREDR; in l2cap_conn_add()
6998 mutex_init(&conn->ident_lock); in l2cap_conn_add()
6999 mutex_init(&conn->chan_lock); in l2cap_conn_add()
7001 INIT_LIST_HEAD(&conn->chan_l); in l2cap_conn_add()
7002 INIT_LIST_HEAD(&conn->users); in l2cap_conn_add()
7004 INIT_DELAYED_WORK(&conn->info_timer, l2cap_info_timeout); in l2cap_conn_add()
7006 skb_queue_head_init(&conn->pending_rx); in l2cap_conn_add()
7007 INIT_WORK(&conn->pending_rx_work, process_pending_rx); in l2cap_conn_add()
7008 INIT_WORK(&conn->id_addr_update_work, l2cap_conn_update_id_addr); in l2cap_conn_add()
7010 conn->disc_reason = HCI_ERROR_REMOTE_USER_TERM; in l2cap_conn_add()
7012 return conn; in l2cap_conn_add()
7029 struct l2cap_conn *conn; in l2cap_chan_connect() local
7132 conn = l2cap_conn_add(hcon); in l2cap_chan_connect()
7133 if (!conn) { in l2cap_chan_connect()
7139 mutex_lock(&conn->chan_lock); in l2cap_chan_connect()
7142 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) { in l2cap_chan_connect()
7152 __l2cap_chan_add(conn, chan); in l2cap_chan_connect()
7180 mutex_unlock(&conn->chan_lock); in l2cap_chan_connect()
7258 struct l2cap_conn *conn; in l2cap_connect_cfm() local
7272 conn = l2cap_conn_add(hcon); in l2cap_connect_cfm()
7273 if (!conn) in l2cap_connect_cfm()
7292 if (__l2cap_get_chan_by_dcid(conn, pchan->scid)) in l2cap_connect_cfm()
7303 __l2cap_chan_add(conn, chan); in l2cap_connect_cfm()
7313 l2cap_conn_ready(conn); in l2cap_connect_cfm()
7318 struct l2cap_conn *conn = hcon->l2cap_data; in l2cap_disconn_ind() local
7322 if (!conn) in l2cap_disconn_ind()
7324 return conn->disc_reason; in l2cap_disconn_ind()
7356 struct l2cap_conn *conn = hcon->l2cap_data; in l2cap_security_cfm() local
7359 if (!conn) in l2cap_security_cfm()
7362 BT_DBG("conn %p status 0x%2.2x encrypt %u", conn, status, encrypt); in l2cap_security_cfm()
7364 mutex_lock(&conn->chan_lock); in l2cap_security_cfm()
7366 list_for_each_entry(chan, &conn->chan_l, list) { in l2cap_security_cfm()
7424 l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP, in l2cap_security_cfm()
7431 l2cap_send_cmd(conn, l2cap_get_ident(conn), in l2cap_security_cfm()
7442 mutex_unlock(&conn->chan_lock); in l2cap_security_cfm()
7447 struct l2cap_conn *conn = hcon->l2cap_data; in l2cap_recv_acldata() local
7452 if (!conn && hcon->hdev->dev_type != HCI_BREDR) in l2cap_recv_acldata()
7455 if (!conn) in l2cap_recv_acldata()
7456 conn = l2cap_conn_add(hcon); in l2cap_recv_acldata()
7458 if (!conn) in l2cap_recv_acldata()
7461 BT_DBG("conn %p len %d flags 0x%x", conn, skb->len, flags); in l2cap_recv_acldata()
7467 if (conn->rx_len) { in l2cap_recv_acldata()
7469 kfree_skb(conn->rx_skb); in l2cap_recv_acldata()
7470 conn->rx_skb = NULL; in l2cap_recv_acldata()
7471 conn->rx_len = 0; in l2cap_recv_acldata()
7472 l2cap_conn_unreliable(conn, ECOMM); in l2cap_recv_acldata()
7478 l2cap_conn_unreliable(conn, ECOMM); in l2cap_recv_acldata()
7487 l2cap_recv_frame(conn, skb); in l2cap_recv_acldata()
7496 l2cap_conn_unreliable(conn, ECOMM); in l2cap_recv_acldata()
7501 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL); in l2cap_recv_acldata()
7502 if (!conn->rx_skb) in l2cap_recv_acldata()
7505 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len), in l2cap_recv_acldata()
7507 conn->rx_len = len - skb->len; in l2cap_recv_acldata()
7511 BT_DBG("Cont: frag len %d (expecting %d)", skb->len, conn->rx_len); in l2cap_recv_acldata()
7513 if (!conn->rx_len) { in l2cap_recv_acldata()
7515 l2cap_conn_unreliable(conn, ECOMM); in l2cap_recv_acldata()
7519 if (skb->len > conn->rx_len) { in l2cap_recv_acldata()
7521 skb->len, conn->rx_len); in l2cap_recv_acldata()
7522 kfree_skb(conn->rx_skb); in l2cap_recv_acldata()
7523 conn->rx_skb = NULL; in l2cap_recv_acldata()
7524 conn->rx_len = 0; in l2cap_recv_acldata()
7525 l2cap_conn_unreliable(conn, ECOMM); in l2cap_recv_acldata()
7529 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len), in l2cap_recv_acldata()
7531 conn->rx_len -= skb->len; in l2cap_recv_acldata()
7533 if (!conn->rx_len) { in l2cap_recv_acldata()
7538 struct sk_buff *rx_skb = conn->rx_skb; in l2cap_recv_acldata()
7539 conn->rx_skb = NULL; in l2cap_recv_acldata()
7540 l2cap_recv_frame(conn, rx_skb); in l2cap_recv_acldata()