Lines Matching refs:conn

75 	struct iso_conn		*conn;  member
99 struct iso_conn *conn = container_of(ref, struct iso_conn, ref); in iso_conn_free() local
101 BT_DBG("conn %p", conn); in iso_conn_free()
103 if (conn->sk) in iso_conn_free()
104 iso_pi(conn->sk)->conn = NULL; in iso_conn_free()
106 if (conn->hcon) { in iso_conn_free()
107 conn->hcon->iso_data = NULL; in iso_conn_free()
108 hci_conn_drop(conn->hcon); in iso_conn_free()
112 disable_delayed_work_sync(&conn->timeout_work); in iso_conn_free()
114 kfree(conn); in iso_conn_free()
117 static void iso_conn_put(struct iso_conn *conn) in iso_conn_put() argument
119 if (!conn) in iso_conn_put()
122 BT_DBG("conn %p refcnt %d", conn, kref_read(&conn->ref)); in iso_conn_put()
124 kref_put(&conn->ref, iso_conn_free); in iso_conn_put()
127 static struct iso_conn *iso_conn_hold_unless_zero(struct iso_conn *conn) in iso_conn_hold_unless_zero() argument
129 if (!conn) in iso_conn_hold_unless_zero()
132 BT_DBG("conn %p refcnt %u", conn, kref_read(&conn->ref)); in iso_conn_hold_unless_zero()
134 if (!kref_get_unless_zero(&conn->ref)) in iso_conn_hold_unless_zero()
137 return conn; in iso_conn_hold_unless_zero()
140 static struct sock *iso_sock_hold(struct iso_conn *conn) in iso_sock_hold() argument
142 if (!conn || !bt_sock_linked(&iso_sk_list, conn->sk)) in iso_sock_hold()
145 sock_hold(conn->sk); in iso_sock_hold()
147 return conn->sk; in iso_sock_hold()
152 struct iso_conn *conn = container_of(work, struct iso_conn, in iso_sock_timeout() local
156 conn = iso_conn_hold_unless_zero(conn); in iso_sock_timeout()
157 if (!conn) in iso_sock_timeout()
160 iso_conn_lock(conn); in iso_sock_timeout()
161 sk = iso_sock_hold(conn); in iso_sock_timeout()
162 iso_conn_unlock(conn); in iso_sock_timeout()
163 iso_conn_put(conn); in iso_sock_timeout()
179 if (!iso_pi(sk)->conn) in iso_sock_set_timer()
183 cancel_delayed_work(&iso_pi(sk)->conn->timeout_work); in iso_sock_set_timer()
184 schedule_delayed_work(&iso_pi(sk)->conn->timeout_work, timeout); in iso_sock_set_timer()
189 if (!iso_pi(sk)->conn) in iso_sock_clear_timer()
193 cancel_delayed_work(&iso_pi(sk)->conn->timeout_work); in iso_sock_clear_timer()
199 struct iso_conn *conn = hcon->iso_data; in iso_conn_add() local
201 conn = iso_conn_hold_unless_zero(conn); in iso_conn_add()
202 if (conn) { in iso_conn_add()
203 if (!conn->hcon) { in iso_conn_add()
204 iso_conn_lock(conn); in iso_conn_add()
205 conn->hcon = hcon; in iso_conn_add()
206 iso_conn_unlock(conn); in iso_conn_add()
208 iso_conn_put(conn); in iso_conn_add()
209 return conn; in iso_conn_add()
212 conn = kzalloc(sizeof(*conn), GFP_KERNEL); in iso_conn_add()
213 if (!conn) in iso_conn_add()
216 kref_init(&conn->ref); in iso_conn_add()
217 spin_lock_init(&conn->lock); in iso_conn_add()
218 INIT_DELAYED_WORK(&conn->timeout_work, iso_sock_timeout); in iso_conn_add()
220 hcon->iso_data = conn; in iso_conn_add()
221 conn->hcon = hcon; in iso_conn_add()
222 conn->tx_sn = 0; in iso_conn_add()
224 BT_DBG("hcon %p conn %p", hcon, conn); in iso_conn_add()
226 return conn; in iso_conn_add()
232 struct iso_conn *conn; in iso_chan_del() local
235 conn = iso_pi(sk)->conn; in iso_chan_del()
236 iso_pi(sk)->conn = NULL; in iso_chan_del()
238 BT_DBG("sk %p, conn %p, err %d", sk, conn, err); in iso_chan_del()
240 if (conn) { in iso_chan_del()
241 iso_conn_lock(conn); in iso_chan_del()
242 conn->sk = NULL; in iso_chan_del()
243 iso_conn_unlock(conn); in iso_chan_del()
244 iso_conn_put(conn); in iso_chan_del()
263 struct iso_conn *conn = hcon->iso_data; in iso_conn_del() local
266 conn = iso_conn_hold_unless_zero(conn); in iso_conn_del()
267 if (!conn) in iso_conn_del()
270 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err); in iso_conn_del()
273 iso_conn_lock(conn); in iso_conn_del()
274 sk = iso_sock_hold(conn); in iso_conn_del()
275 iso_conn_unlock(conn); in iso_conn_del()
276 iso_conn_put(conn); in iso_conn_del()
279 iso_conn_put(conn); in iso_conn_del()
290 static int __iso_chan_add(struct iso_conn *conn, struct sock *sk, in __iso_chan_add() argument
293 BT_DBG("conn %p", conn); in __iso_chan_add()
295 if (iso_pi(sk)->conn == conn && conn->sk == sk) in __iso_chan_add()
298 if (conn->sk) { in __iso_chan_add()
303 iso_pi(sk)->conn = conn; in __iso_chan_add()
304 conn->sk = sk; in __iso_chan_add()
312 static int iso_chan_add(struct iso_conn *conn, struct sock *sk, in iso_chan_add() argument
317 iso_conn_lock(conn); in iso_chan_add()
318 err = __iso_chan_add(conn, sk, parent); in iso_chan_add()
319 iso_conn_unlock(conn); in iso_chan_add()
334 struct iso_conn *conn; in iso_connect_bis() local
390 conn = iso_conn_add(hcon); in iso_connect_bis()
391 if (!conn) { in iso_connect_bis()
399 err = iso_chan_add(conn, sk, NULL); in iso_connect_bis()
429 struct iso_conn *conn; in iso_connect_cis() local
480 conn = iso_conn_add(hcon); in iso_connect_cis()
481 if (!conn) { in iso_connect_cis()
489 err = iso_chan_add(conn, sk, NULL); in iso_connect_cis()
520 return &iso_pi(sk)->conn->hcon->iso_qos; in iso_sock_get_qos()
528 struct iso_conn *conn = iso_pi(sk)->conn; in iso_send_frame() local
542 hdr->sn = cpu_to_le16(conn->tx_sn++); in iso_send_frame()
548 hci_send_iso(conn->hcon, skb); in iso_send_frame()
556 static void iso_recv_frame(struct iso_conn *conn, struct sk_buff *skb) in iso_recv_frame() argument
560 iso_conn_lock(conn); in iso_recv_frame()
561 sk = conn->sk; in iso_recv_frame()
562 iso_conn_unlock(conn); in iso_recv_frame()
714 iso_conn_put(iso_pi(sk)->conn); in iso_sock_destruct()
733 if (iso_pi(parent)->conn && iso_pi(parent)->conn->hcon) { in iso_sock_cleanup_listen()
762 struct hci_conn *hcon = iso_pi(sk)->conn->hcon; in iso_sock_disconn()
776 iso_pi(sk)->conn->hcon = NULL; in iso_sock_disconn()
785 iso_conn_lock(iso_pi(sk)->conn); in iso_sock_disconn()
786 hci_conn_drop(iso_pi(sk)->conn->hcon); in iso_sock_disconn()
787 iso_pi(sk)->conn->hcon = NULL; in iso_sock_disconn()
788 iso_conn_unlock(iso_pi(sk)->conn); in iso_sock_disconn()
803 if (iso_pi(sk)->conn->hcon) in __iso_sock_close()
810 if (iso_pi(sk)->conn->hcon && in __iso_sock_close()
811 (test_bit(HCI_CONN_PA_SYNC, &iso_pi(sk)->conn->hcon->flags) || in __iso_sock_close()
812 test_bit(HCI_CONN_PA_SYNC_FAILED, &iso_pi(sk)->conn->hcon->flags))) in __iso_sock_close()
1116 struct iso_conn *conn; in iso_listen_bis() local
1156 conn = iso_conn_add(hcon); in iso_listen_bis()
1157 if (!conn) { in iso_listen_bis()
1163 err = iso_chan_add(conn, sk, NULL); in iso_listen_bis()
1344 struct hci_conn *hcon = iso_pi(sk)->conn ? in iso_sock_getname()
1345 iso_pi(sk)->conn->hcon : NULL; in iso_sock_getname()
1398 mtu = iso_pi(sk)->conn->hcon->mtu; in iso_sock_sendmsg()
1447 static void iso_conn_defer_accept(struct hci_conn *conn) in iso_conn_defer_accept() argument
1450 struct hci_dev *hdev = conn->hdev; in iso_conn_defer_accept()
1452 BT_DBG("conn %p", conn); in iso_conn_defer_accept()
1454 conn->state = BT_CONFIG; in iso_conn_defer_accept()
1456 cp.handle = cpu_to_le16(conn->handle); in iso_conn_defer_accept()
1481 err = hci_conn_big_create_sync(hdev, iso_pi(sk)->conn->hcon, in iso_conn_big_sync()
1521 iso_conn_defer_accept(pi->conn->hcon); in iso_sock_recvmsg()
1796 base_len = iso_pi(sk)->conn->hcon->le_per_adv_data_len; in iso_sock_getsockopt()
1797 base = iso_pi(sk)->conn->hcon->le_per_adv_data; in iso_sock_getsockopt()
1922 static void iso_conn_ready(struct iso_conn *conn) in iso_conn_ready() argument
1925 struct sock *sk = conn->sk; in iso_conn_ready()
1931 BT_DBG("conn %p", conn); in iso_conn_ready()
1934 iso_sock_ready(conn->sk); in iso_conn_ready()
1936 hcon = conn->hcon; in iso_conn_ready()
2035 iso_chan_add(conn, sk, parent); in iso_conn_ready()
2140 struct hci_conn *hcon = iso_pi(sk)->conn->hcon; in iso_connect_ind()
2177 hcon = iso_pi(sk)->conn->hcon; in iso_connect_ind()
2251 iso_conn_del(link->conn, bt_to_errno(status)); in iso_connect_cfm()
2270 struct iso_conn *conn; in iso_connect_cfm() local
2272 conn = iso_conn_add(hcon); in iso_connect_cfm()
2273 if (conn) in iso_connect_cfm()
2274 iso_conn_ready(conn); in iso_connect_cfm()
2293 struct iso_conn *conn = hcon->iso_data; in iso_recv() local
2297 if (!conn) in iso_recv()
2303 BT_DBG("conn %p len %d pb 0x%x ts 0x%x", conn, skb->len, pb, ts); in iso_recv()
2308 if (conn->rx_len) { in iso_recv()
2310 kfree_skb(conn->rx_skb); in iso_recv()
2311 conn->rx_skb = NULL; in iso_recv()
2312 conn->rx_len = 0; in iso_recv()
2353 iso_recv_frame(conn, skb); in iso_recv()
2370 conn->rx_skb = bt_skb_alloc(len, GFP_KERNEL); in iso_recv()
2371 if (!conn->rx_skb) in iso_recv()
2374 hci_skb_pkt_status(conn->rx_skb) = flags & 0x03; in iso_recv()
2375 hci_skb_pkt_seqnum(conn->rx_skb) = sn; in iso_recv()
2376 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len), in iso_recv()
2378 conn->rx_len = len - skb->len; in iso_recv()
2382 hwts = skb_hwtstamps(conn->rx_skb); in iso_recv()
2390 conn->rx_len); in iso_recv()
2392 if (!conn->rx_len) { in iso_recv()
2398 if (skb->len > conn->rx_len) { in iso_recv()
2400 skb->len, conn->rx_len); in iso_recv()
2401 kfree_skb(conn->rx_skb); in iso_recv()
2402 conn->rx_skb = NULL; in iso_recv()
2403 conn->rx_len = 0; in iso_recv()
2407 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len), in iso_recv()
2409 conn->rx_len -= skb->len; in iso_recv()
2413 skb_copy_from_linear_data(skb, skb_put(conn->rx_skb, skb->len), in iso_recv()
2415 conn->rx_len -= skb->len; in iso_recv()
2417 if (!conn->rx_len) { in iso_recv()
2418 struct sk_buff *rx_skb = conn->rx_skb; in iso_recv()
2424 conn->rx_skb = NULL; in iso_recv()
2425 iso_recv_frame(conn, rx_skb); in iso_recv()