Lines Matching +full:support +full:- +full:nesting
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4 Copyright (C) 2009-2010 Gustavo F. Padovan <gustavo@padovan.org>
53 return sock && sock->ops == &l2cap_sock_ops; in l2cap_is_socket()
61 return -EINVAL; in l2cap_validate_bredr_psm()
63 /* Restrict usage of well-known PSMs */ in l2cap_validate_bredr_psm()
65 return -EACCES; in l2cap_validate_bredr_psm()
74 return -EINVAL; in l2cap_validate_le_psm()
78 return -EACCES; in l2cap_validate_le_psm()
85 struct sock *sk = sock->sk; in l2cap_sock_bind()
86 struct l2cap_chan *chan = l2cap_pi(sk)->chan; in l2cap_sock_bind()
93 addr->sa_family != AF_BLUETOOTH) in l2cap_sock_bind()
94 return -EINVAL; in l2cap_sock_bind()
101 return -EINVAL; in l2cap_sock_bind()
104 return -EINVAL; in l2cap_sock_bind()
110 return -EINVAL; in l2cap_sock_bind()
115 if (sk->sk_state != BT_OPEN) { in l2cap_sock_bind()
116 err = -EBADFD; in l2cap_sock_bind()
132 bacpy(&chan->src, &la.l2_bdaddr); in l2cap_sock_bind()
133 chan->src_type = la.l2_bdaddr_type; in l2cap_sock_bind()
143 switch (chan->chan_type) { in l2cap_sock_bind()
146 chan->sec_level = BT_SECURITY_SDP; in l2cap_sock_bind()
151 chan->sec_level = BT_SECURITY_SDP; in l2cap_sock_bind()
154 chan->sec_level = BT_SECURITY_SDP; in l2cap_sock_bind()
162 set_bit(FLAG_HOLD_HCI_CONN, &chan->flags); in l2cap_sock_bind()
169 if (chan->psm && bdaddr_type_is_le(chan->src_type) && in l2cap_sock_bind()
170 chan->mode != L2CAP_MODE_EXT_FLOWCTL) in l2cap_sock_bind()
171 chan->mode = L2CAP_MODE_LE_FLOWCTL; in l2cap_sock_bind()
173 chan->state = BT_BOUND; in l2cap_sock_bind()
174 sk->sk_state = BT_BOUND; in l2cap_sock_bind()
184 struct sock *sk = sock->sk; in l2cap_sock_connect()
185 struct l2cap_chan *chan = l2cap_pi(sk)->chan; in l2cap_sock_connect()
197 return -EINVAL; in l2cap_sock_connect()
200 addr->sa_family != AF_BLUETOOTH) in l2cap_sock_connect()
201 return -EINVAL; in l2cap_sock_connect()
208 return -EINVAL; in l2cap_sock_connect()
211 return -EINVAL; in l2cap_sock_connect()
214 * conflicts with the address given to connect(). If chan->src in l2cap_sock_connect()
216 * chan->src_type and la.l2_bdaddr_type do not need to match. in l2cap_sock_connect()
218 if (chan->src_type == BDADDR_BREDR && bacmp(&chan->src, BDADDR_ANY) && in l2cap_sock_connect()
226 if (chan->scid != L2CAP_CID_ATT || in l2cap_sock_connect()
228 return -EINVAL; in l2cap_sock_connect()
233 * not support random local addresses assuming public in l2cap_sock_connect()
236 chan->src_type = BDADDR_LE_PUBLIC; in l2cap_sock_connect()
239 if (chan->src_type != BDADDR_BREDR && la.l2_bdaddr_type == BDADDR_BREDR) in l2cap_sock_connect()
240 return -EINVAL; in l2cap_sock_connect()
246 return -EINVAL; in l2cap_sock_connect()
252 if (chan->psm && bdaddr_type_is_le(chan->src_type) && in l2cap_sock_connect()
253 chan->mode != L2CAP_MODE_EXT_FLOWCTL) in l2cap_sock_connect()
254 chan->mode = L2CAP_MODE_LE_FLOWCTL; in l2cap_sock_connect()
258 sk->sk_sndtimeo); in l2cap_sock_connect()
274 struct sock *sk = sock->sk; in l2cap_sock_listen()
275 struct l2cap_chan *chan = l2cap_pi(sk)->chan; in l2cap_sock_listen()
282 if (sk->sk_state != BT_BOUND) { in l2cap_sock_listen()
283 err = -EBADFD; in l2cap_sock_listen()
287 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM) { in l2cap_sock_listen()
288 err = -EINVAL; in l2cap_sock_listen()
292 switch (chan->mode) { in l2cap_sock_listen()
298 err = -EOPNOTSUPP; in l2cap_sock_listen()
308 err = -EOPNOTSUPP; in l2cap_sock_listen()
312 sk->sk_max_ack_backlog = backlog; in l2cap_sock_listen()
313 sk->sk_ack_backlog = 0; in l2cap_sock_listen()
319 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT); in l2cap_sock_listen()
321 chan->state = BT_LISTEN; in l2cap_sock_listen()
322 sk->sk_state = BT_LISTEN; in l2cap_sock_listen()
333 struct sock *sk = sock->sk, *nsk; in l2cap_sock_accept()
339 timeo = sock_rcvtimeo(sk, arg->flags & O_NONBLOCK); in l2cap_sock_accept()
343 /* Wait for an incoming connection. (wake-one). */ in l2cap_sock_accept()
346 if (sk->sk_state != BT_LISTEN) { in l2cap_sock_accept()
347 err = -EBADFD; in l2cap_sock_accept()
356 err = -EAGAIN; in l2cap_sock_accept()
376 newsock->state = SS_CONNECTED; in l2cap_sock_accept()
389 struct sock *sk = sock->sk; in l2cap_sock_getname()
390 struct l2cap_chan *chan = l2cap_pi(sk)->chan; in l2cap_sock_getname()
394 if (peer && sk->sk_state != BT_CONNECTED && in l2cap_sock_getname()
395 sk->sk_state != BT_CONNECT && sk->sk_state != BT_CONNECT2 && in l2cap_sock_getname()
396 sk->sk_state != BT_CONFIG) in l2cap_sock_getname()
397 return -ENOTCONN; in l2cap_sock_getname()
400 addr->sa_family = AF_BLUETOOTH; in l2cap_sock_getname()
402 la->l2_psm = chan->psm; in l2cap_sock_getname()
405 bacpy(&la->l2_bdaddr, &chan->dst); in l2cap_sock_getname()
406 la->l2_cid = cpu_to_le16(chan->dcid); in l2cap_sock_getname()
407 la->l2_bdaddr_type = chan->dst_type; in l2cap_sock_getname()
409 bacpy(&la->l2_bdaddr, &chan->src); in l2cap_sock_getname()
410 la->l2_cid = cpu_to_le16(chan->scid); in l2cap_sock_getname()
411 la->l2_bdaddr_type = chan->src_type; in l2cap_sock_getname()
419 switch (chan->mode) { in l2cap_get_mode()
432 return -EINVAL; in l2cap_get_mode()
438 struct sock *sk = sock->sk; in l2cap_sock_getsockopt_old()
439 struct l2cap_chan *chan = l2cap_pi(sk)->chan; in l2cap_sock_getsockopt_old()
449 return -EFAULT; in l2cap_sock_getsockopt_old()
459 if (bdaddr_type_is_le(chan->src_type) && in l2cap_sock_getsockopt_old()
460 chan->scid != L2CAP_CID_ATT) { in l2cap_sock_getsockopt_old()
461 err = -EINVAL; in l2cap_sock_getsockopt_old()
466 switch (chan->mode) { in l2cap_sock_getsockopt_old()
472 err = -EINVAL; in l2cap_sock_getsockopt_old()
480 opts.imtu = chan->imtu; in l2cap_sock_getsockopt_old()
481 opts.omtu = chan->omtu; in l2cap_sock_getsockopt_old()
482 opts.flush_to = chan->flush_to; in l2cap_sock_getsockopt_old()
483 opts.mode = chan->mode; in l2cap_sock_getsockopt_old()
484 opts.fcs = chan->fcs; in l2cap_sock_getsockopt_old()
485 opts.max_tx = chan->max_tx; in l2cap_sock_getsockopt_old()
486 opts.txwin_size = chan->tx_win; in l2cap_sock_getsockopt_old()
488 BT_DBG("mode 0x%2.2x", chan->mode); in l2cap_sock_getsockopt_old()
492 err = -EFAULT; in l2cap_sock_getsockopt_old()
497 switch (chan->sec_level) { in l2cap_sock_getsockopt_old()
517 if (test_bit(FLAG_ROLE_SWITCH, &chan->flags)) in l2cap_sock_getsockopt_old()
520 if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags)) in l2cap_sock_getsockopt_old()
524 err = -EFAULT; in l2cap_sock_getsockopt_old()
529 if (sk->sk_state != BT_CONNECTED && in l2cap_sock_getsockopt_old()
530 !(sk->sk_state == BT_CONNECT2 && in l2cap_sock_getsockopt_old()
531 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags))) { in l2cap_sock_getsockopt_old()
532 err = -ENOTCONN; in l2cap_sock_getsockopt_old()
537 cinfo.hci_handle = chan->conn->hcon->handle; in l2cap_sock_getsockopt_old()
538 memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3); in l2cap_sock_getsockopt_old()
542 err = -EFAULT; in l2cap_sock_getsockopt_old()
547 err = -ENOPROTOOPT; in l2cap_sock_getsockopt_old()
558 struct sock *sk = sock->sk; in l2cap_sock_getsockopt()
559 struct l2cap_chan *chan = l2cap_pi(sk)->chan; in l2cap_sock_getsockopt()
571 return -ENOPROTOOPT; in l2cap_sock_getsockopt()
574 return -EFAULT; in l2cap_sock_getsockopt()
580 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED && in l2cap_sock_getsockopt()
581 chan->chan_type != L2CAP_CHAN_FIXED && in l2cap_sock_getsockopt()
582 chan->chan_type != L2CAP_CHAN_RAW) { in l2cap_sock_getsockopt()
583 err = -EINVAL; in l2cap_sock_getsockopt()
588 if (chan->conn) { in l2cap_sock_getsockopt()
589 sec.level = chan->conn->hcon->sec_level; in l2cap_sock_getsockopt()
591 if (sk->sk_state == BT_CONNECTED) in l2cap_sock_getsockopt()
592 sec.key_size = chan->conn->hcon->enc_key_size; in l2cap_sock_getsockopt()
594 sec.level = chan->sec_level; in l2cap_sock_getsockopt()
599 err = -EFAULT; in l2cap_sock_getsockopt()
604 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in l2cap_sock_getsockopt()
605 err = -EINVAL; in l2cap_sock_getsockopt()
609 if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), in l2cap_sock_getsockopt()
611 err = -EFAULT; in l2cap_sock_getsockopt()
616 if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags), in l2cap_sock_getsockopt()
618 err = -EFAULT; in l2cap_sock_getsockopt()
623 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM in l2cap_sock_getsockopt()
624 && sk->sk_type != SOCK_RAW) { in l2cap_sock_getsockopt()
625 err = -EINVAL; in l2cap_sock_getsockopt()
629 pwr.force_active = test_bit(FLAG_FORCE_ACTIVE, &chan->flags); in l2cap_sock_getsockopt()
633 err = -EFAULT; in l2cap_sock_getsockopt()
638 if (put_user(chan->chan_policy, (u32 __user *) optval)) in l2cap_sock_getsockopt()
639 err = -EFAULT; in l2cap_sock_getsockopt()
643 if (!bdaddr_type_is_le(chan->src_type)) { in l2cap_sock_getsockopt()
644 err = -EINVAL; in l2cap_sock_getsockopt()
648 if (sk->sk_state != BT_CONNECTED) { in l2cap_sock_getsockopt()
649 err = -ENOTCONN; in l2cap_sock_getsockopt()
653 if (put_user(chan->omtu, (u16 __user *) optval)) in l2cap_sock_getsockopt()
654 err = -EFAULT; in l2cap_sock_getsockopt()
658 if (!bdaddr_type_is_le(chan->src_type)) { in l2cap_sock_getsockopt()
659 err = -EINVAL; in l2cap_sock_getsockopt()
663 if (put_user(chan->imtu, (u16 __user *) optval)) in l2cap_sock_getsockopt()
664 err = -EFAULT; in l2cap_sock_getsockopt()
668 if (sk->sk_state != BT_CONNECTED) { in l2cap_sock_getsockopt()
669 err = -ENOTCONN; in l2cap_sock_getsockopt()
673 phys = hci_conn_get_phy(chan->conn->hcon); in l2cap_sock_getsockopt()
676 err = -EFAULT; in l2cap_sock_getsockopt()
681 err = -ENOPROTOOPT; in l2cap_sock_getsockopt()
685 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_sock_getsockopt()
686 err = -EINVAL; in l2cap_sock_getsockopt()
697 err = -EFAULT; in l2cap_sock_getsockopt()
701 err = -ENOPROTOOPT; in l2cap_sock_getsockopt()
711 switch (chan->scid) { in l2cap_valid_mtu()
728 struct sock *sk = sock->sk; in l2cap_sock_setsockopt_old()
729 struct l2cap_chan *chan = l2cap_pi(sk)->chan; in l2cap_sock_setsockopt_old()
740 if (bdaddr_type_is_le(chan->src_type)) { in l2cap_sock_setsockopt_old()
741 err = -EINVAL; in l2cap_sock_setsockopt_old()
745 if (sk->sk_state == BT_CONNECTED) { in l2cap_sock_setsockopt_old()
746 err = -EINVAL; in l2cap_sock_setsockopt_old()
750 opts.imtu = chan->imtu; in l2cap_sock_setsockopt_old()
751 opts.omtu = chan->omtu; in l2cap_sock_setsockopt_old()
752 opts.flush_to = chan->flush_to; in l2cap_sock_setsockopt_old()
753 opts.mode = chan->mode; in l2cap_sock_setsockopt_old()
754 opts.fcs = chan->fcs; in l2cap_sock_setsockopt_old()
755 opts.max_tx = chan->max_tx; in l2cap_sock_setsockopt_old()
756 opts.txwin_size = chan->tx_win; in l2cap_sock_setsockopt_old()
764 err = -EINVAL; in l2cap_sock_setsockopt_old()
769 err = -EINVAL; in l2cap_sock_setsockopt_old()
776 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state); in l2cap_sock_setsockopt_old()
784 err = -EINVAL; in l2cap_sock_setsockopt_old()
791 chan->mode = opts.mode; in l2cap_sock_setsockopt_old()
793 BT_DBG("mode 0x%2.2x", chan->mode); in l2cap_sock_setsockopt_old()
795 chan->imtu = opts.imtu; in l2cap_sock_setsockopt_old()
796 chan->omtu = opts.omtu; in l2cap_sock_setsockopt_old()
797 chan->fcs = opts.fcs; in l2cap_sock_setsockopt_old()
798 chan->max_tx = opts.max_tx; in l2cap_sock_setsockopt_old()
799 chan->tx_win = opts.txwin_size; in l2cap_sock_setsockopt_old()
800 chan->flush_to = opts.flush_to; in l2cap_sock_setsockopt_old()
809 err = -EINVAL; in l2cap_sock_setsockopt_old()
814 chan->sec_level = BT_SECURITY_LOW; in l2cap_sock_setsockopt_old()
816 chan->sec_level = BT_SECURITY_MEDIUM; in l2cap_sock_setsockopt_old()
818 chan->sec_level = BT_SECURITY_HIGH; in l2cap_sock_setsockopt_old()
821 set_bit(FLAG_ROLE_SWITCH, &chan->flags); in l2cap_sock_setsockopt_old()
823 clear_bit(FLAG_ROLE_SWITCH, &chan->flags); in l2cap_sock_setsockopt_old()
826 set_bit(FLAG_FORCE_RELIABLE, &chan->flags); in l2cap_sock_setsockopt_old()
828 clear_bit(FLAG_FORCE_RELIABLE, &chan->flags); in l2cap_sock_setsockopt_old()
832 err = -ENOPROTOOPT; in l2cap_sock_setsockopt_old()
844 if (bdaddr_type_is_le(chan->src_type)) in l2cap_set_mode()
845 return -EINVAL; in l2cap_set_mode()
847 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state); in l2cap_set_mode()
850 if (!disable_ertm || bdaddr_type_is_le(chan->src_type)) in l2cap_set_mode()
851 return -EINVAL; in l2cap_set_mode()
855 if (!disable_ertm || bdaddr_type_is_le(chan->src_type)) in l2cap_set_mode()
856 return -EINVAL; in l2cap_set_mode()
860 if (!bdaddr_type_is_le(chan->src_type)) in l2cap_set_mode()
861 return -EINVAL; in l2cap_set_mode()
865 /* TODO: Add support for ECRED PDUs to BR/EDR */ in l2cap_set_mode()
866 if (!bdaddr_type_is_le(chan->src_type)) in l2cap_set_mode()
867 return -EINVAL; in l2cap_set_mode()
871 return -EINVAL; in l2cap_set_mode()
874 chan->mode = mode; in l2cap_set_mode()
882 struct sock *sk = sock->sk; in l2cap_sock_setsockopt()
883 struct l2cap_chan *chan = l2cap_pi(sk)->chan; in l2cap_sock_setsockopt()
898 return -ENOPROTOOPT; in l2cap_sock_setsockopt()
904 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED && in l2cap_sock_setsockopt()
905 chan->chan_type != L2CAP_CHAN_FIXED && in l2cap_sock_setsockopt()
906 chan->chan_type != L2CAP_CHAN_RAW) { in l2cap_sock_setsockopt()
907 err = -EINVAL; in l2cap_sock_setsockopt()
919 err = -EINVAL; in l2cap_sock_setsockopt()
923 chan->sec_level = sec.level; in l2cap_sock_setsockopt()
925 if (!chan->conn) in l2cap_sock_setsockopt()
928 conn = chan->conn; in l2cap_sock_setsockopt()
931 if (chan->scid == L2CAP_CID_ATT) { in l2cap_sock_setsockopt()
932 if (smp_conn_security(conn->hcon, sec.level)) { in l2cap_sock_setsockopt()
933 err = -EINVAL; in l2cap_sock_setsockopt()
937 set_bit(FLAG_PENDING_SECURITY, &chan->flags); in l2cap_sock_setsockopt()
938 sk->sk_state = BT_CONFIG; in l2cap_sock_setsockopt()
939 chan->state = BT_CONFIG; in l2cap_sock_setsockopt()
942 } else if ((sk->sk_state == BT_CONNECT2 && in l2cap_sock_setsockopt()
943 test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) || in l2cap_sock_setsockopt()
944 sk->sk_state == BT_CONNECTED) { in l2cap_sock_setsockopt()
946 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags); in l2cap_sock_setsockopt()
948 sk->sk_state_change(sk); in l2cap_sock_setsockopt()
950 err = -EINVAL; in l2cap_sock_setsockopt()
955 if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { in l2cap_sock_setsockopt()
956 err = -EINVAL; in l2cap_sock_setsockopt()
965 set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in l2cap_sock_setsockopt()
966 set_bit(FLAG_DEFER_SETUP, &chan->flags); in l2cap_sock_setsockopt()
968 clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); in l2cap_sock_setsockopt()
969 clear_bit(FLAG_DEFER_SETUP, &chan->flags); in l2cap_sock_setsockopt()
979 err = -EINVAL; in l2cap_sock_setsockopt()
984 conn = chan->conn; in l2cap_sock_setsockopt()
986 No Flush support in the LM */ in l2cap_sock_setsockopt()
987 if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) { in l2cap_sock_setsockopt()
988 err = -EINVAL; in l2cap_sock_setsockopt()
994 set_bit(FLAG_FLUSHABLE, &chan->flags); in l2cap_sock_setsockopt()
996 clear_bit(FLAG_FLUSHABLE, &chan->flags); in l2cap_sock_setsockopt()
1000 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED && in l2cap_sock_setsockopt()
1001 chan->chan_type != L2CAP_CHAN_RAW) { in l2cap_sock_setsockopt()
1002 err = -EINVAL; in l2cap_sock_setsockopt()
1013 set_bit(FLAG_FORCE_ACTIVE, &chan->flags); in l2cap_sock_setsockopt()
1015 clear_bit(FLAG_FORCE_ACTIVE, &chan->flags); in l2cap_sock_setsockopt()
1023 err = -EOPNOTSUPP; in l2cap_sock_setsockopt()
1027 if (!bdaddr_type_is_le(chan->src_type)) { in l2cap_sock_setsockopt()
1028 err = -EINVAL; in l2cap_sock_setsockopt()
1035 err = -EPERM; in l2cap_sock_setsockopt()
1039 if (!bdaddr_type_is_le(chan->src_type)) { in l2cap_sock_setsockopt()
1040 err = -EINVAL; in l2cap_sock_setsockopt()
1044 if (chan->mode == L2CAP_MODE_LE_FLOWCTL && in l2cap_sock_setsockopt()
1045 sk->sk_state == BT_CONNECTED) { in l2cap_sock_setsockopt()
1046 err = -EISCONN; in l2cap_sock_setsockopt()
1054 if (chan->mode == L2CAP_MODE_EXT_FLOWCTL && in l2cap_sock_setsockopt()
1055 sk->sk_state == BT_CONNECTED) in l2cap_sock_setsockopt()
1058 chan->imtu = mtu; in l2cap_sock_setsockopt()
1064 err = -ENOPROTOOPT; in l2cap_sock_setsockopt()
1068 BT_DBG("sk->sk_state %u", sk->sk_state); in l2cap_sock_setsockopt()
1070 if (sk->sk_state != BT_BOUND) { in l2cap_sock_setsockopt()
1071 err = -EINVAL; in l2cap_sock_setsockopt()
1075 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { in l2cap_sock_setsockopt()
1076 err = -EINVAL; in l2cap_sock_setsockopt()
1091 BT_DBG("mode 0x%2.2x", chan->mode); in l2cap_sock_setsockopt()
1096 err = -ENOPROTOOPT; in l2cap_sock_setsockopt()
1107 struct sock *sk = sock->sk; in l2cap_sock_sendmsg()
1108 struct l2cap_chan *chan = l2cap_pi(sk)->chan; in l2cap_sock_sendmsg()
1117 if (msg->msg_flags & MSG_OOB) in l2cap_sock_sendmsg()
1118 return -EOPNOTSUPP; in l2cap_sock_sendmsg()
1120 if (sk->sk_state != BT_CONNECTED) in l2cap_sock_sendmsg()
1121 return -ENOTCONN; in l2cap_sock_sendmsg()
1124 err = bt_sock_wait_ready(sk, msg->msg_flags); in l2cap_sock_sendmsg()
1138 struct sock *sk = chan->data; in l2cap_publish_rx_avail()
1139 ssize_t avail = sk->sk_rcvbuf - atomic_read(&sk->sk_rmem_alloc); in l2cap_publish_rx_avail()
1147 if (!chan->mps) { in l2cap_publish_rx_avail()
1148 l2cap_chan_rx_avail(chan, -1); in l2cap_publish_rx_avail()
1154 * at least one full packet if receive space is non-zero. in l2cap_publish_rx_avail()
1156 expected_skbs = DIV_ROUND_UP(avail, chan->mps); in l2cap_publish_rx_avail()
1159 l2cap_chan_rx_avail(chan, avail - skb_overhead); in l2cap_publish_rx_avail()
1161 l2cap_chan_rx_avail(chan, -1); in l2cap_publish_rx_avail()
1167 struct sock *sk = sock->sk; in l2cap_sock_recvmsg()
1173 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP, in l2cap_sock_recvmsg()
1174 &bt_sk(sk)->flags)) { in l2cap_sock_recvmsg()
1175 if (pi->chan->mode == L2CAP_MODE_EXT_FLOWCTL) { in l2cap_sock_recvmsg()
1176 sk->sk_state = BT_CONNECTED; in l2cap_sock_recvmsg()
1177 pi->chan->state = BT_CONNECTED; in l2cap_sock_recvmsg()
1178 __l2cap_ecred_conn_rsp_defer(pi->chan); in l2cap_sock_recvmsg()
1179 } else if (bdaddr_type_is_le(pi->chan->src_type)) { in l2cap_sock_recvmsg()
1180 sk->sk_state = BT_CONNECTED; in l2cap_sock_recvmsg()
1181 pi->chan->state = BT_CONNECTED; in l2cap_sock_recvmsg()
1182 __l2cap_le_connect_rsp_defer(pi->chan); in l2cap_sock_recvmsg()
1184 sk->sk_state = BT_CONFIG; in l2cap_sock_recvmsg()
1185 pi->chan->state = BT_CONFIG; in l2cap_sock_recvmsg()
1186 __l2cap_connect_rsp_defer(pi->chan); in l2cap_sock_recvmsg()
1195 if (sock->type == SOCK_STREAM) in l2cap_sock_recvmsg()
1200 if (pi->chan->mode != L2CAP_MODE_ERTM && in l2cap_sock_recvmsg()
1201 pi->chan->mode != L2CAP_MODE_LE_FLOWCTL && in l2cap_sock_recvmsg()
1202 pi->chan->mode != L2CAP_MODE_EXT_FLOWCTL) in l2cap_sock_recvmsg()
1207 l2cap_publish_rx_avail(pi->chan); in l2cap_sock_recvmsg()
1210 while (!list_empty(&pi->rx_busy)) { in l2cap_sock_recvmsg()
1212 list_first_entry(&pi->rx_busy, in l2cap_sock_recvmsg()
1215 if (__sock_queue_rcv_skb(sk, rx_busy->skb) < 0) in l2cap_sock_recvmsg()
1217 list_del(&rx_busy->list); in l2cap_sock_recvmsg()
1225 if (test_bit(CONN_LOCAL_BUSY, &pi->chan->conn_state) && in l2cap_sock_recvmsg()
1226 atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf >> 1) in l2cap_sock_recvmsg()
1227 l2cap_chan_busy(pi->chan, 0); in l2cap_sock_recvmsg()
1239 if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket) in l2cap_sock_kill()
1242 BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state)); in l2cap_sock_kill()
1247 l2cap_pi(sk)->chan->data = NULL; in l2cap_sock_kill()
1250 l2cap_chan_put(l2cap_pi(sk)->chan); in l2cap_sock_kill()
1267 chan->unacked_frames, time_after(jiffies, timeout) ? 0 : in __l2cap_wait_ack()
1268 jiffies_to_msecs(timeout - jiffies)); in __l2cap_wait_ack()
1288 err = -ENOLINK; in __l2cap_wait_ack()
1292 } while (chan->unacked_frames > 0 && in __l2cap_wait_ack()
1293 chan->state == BT_CONNECTED); in __l2cap_wait_ack()
1302 struct sock *sk = sock->sk; in l2cap_sock_shutdown()
1310 * SHUT_RD (0) --> RCV_SHUTDOWN (1) in l2cap_sock_shutdown()
1311 * SHUT_WR (1) --> SEND_SHUTDOWN (2) in l2cap_sock_shutdown()
1312 * SHUT_RDWR (2) --> SHUTDOWN_MASK (3) in l2cap_sock_shutdown()
1321 if ((sk->sk_shutdown & how) == how) in l2cap_sock_shutdown()
1329 chan = l2cap_pi(sk)->chan; in l2cap_sock_shutdown()
1333 BT_DBG("chan %p state %s", chan, state_to_string(chan->state)); in l2cap_sock_shutdown()
1335 if (chan->mode == L2CAP_MODE_ERTM && in l2cap_sock_shutdown()
1336 chan->unacked_frames > 0 && in l2cap_sock_shutdown()
1337 chan->state == BT_CONNECTED) { in l2cap_sock_shutdown()
1344 if ((sk->sk_shutdown & how) == how) in l2cap_sock_shutdown()
1351 if ((how & RCV_SHUTDOWN) && !(sk->sk_shutdown & RCV_SHUTDOWN)) { in l2cap_sock_shutdown()
1352 sk->sk_shutdown |= RCV_SHUTDOWN; in l2cap_sock_shutdown()
1353 if ((sk->sk_shutdown & how) == how) in l2cap_sock_shutdown()
1357 sk->sk_shutdown |= SEND_SHUTDOWN; in l2cap_sock_shutdown()
1361 conn = chan->conn; in l2cap_sock_shutdown()
1369 mutex_lock(&conn->chan_lock); in l2cap_sock_shutdown()
1376 mutex_unlock(&conn->chan_lock); in l2cap_sock_shutdown()
1382 if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime && in l2cap_sock_shutdown()
1383 !(current->flags & PF_EXITING)) in l2cap_sock_shutdown()
1385 sk->sk_lingertime); in l2cap_sock_shutdown()
1392 if (!err && sk->sk_err) in l2cap_sock_shutdown()
1393 err = -sk->sk_err; in l2cap_sock_shutdown()
1404 struct sock *sk = sock->sk; in l2cap_sock_release()
1417 chan = l2cap_pi(sk)->chan; in l2cap_sock_release()
1436 state_to_string(parent->sk_state)); in l2cap_sock_cleanup_listen()
1440 struct l2cap_chan *chan = l2cap_pi(sk)->chan; in l2cap_sock_cleanup_listen()
1443 state_to_string(chan->state)); in l2cap_sock_cleanup_listen()
1459 struct sock *sk, *parent = chan->data; in l2cap_sock_new_connection_cb()
1465 BT_DBG("backlog full %d", parent->sk_ack_backlog); in l2cap_sock_new_connection_cb()
1485 return l2cap_pi(sk)->chan; in l2cap_sock_new_connection_cb()
1494 sk = chan->data; in l2cap_sock_recv_cb()
1496 return -ENXIO; in l2cap_sock_recv_cb()
1500 if (chan->mode == L2CAP_MODE_ERTM && !list_empty(&pi->rx_busy)) { in l2cap_sock_recv_cb()
1501 err = -ENOMEM; in l2cap_sock_recv_cb()
1505 if (chan->mode != L2CAP_MODE_ERTM && in l2cap_sock_recv_cb()
1506 chan->mode != L2CAP_MODE_STREAMING && in l2cap_sock_recv_cb()
1507 chan->mode != L2CAP_MODE_LE_FLOWCTL && in l2cap_sock_recv_cb()
1508 chan->mode != L2CAP_MODE_EXT_FLOWCTL) { in l2cap_sock_recv_cb()
1531 (chan->mode == L2CAP_MODE_ERTM || in l2cap_sock_recv_cb()
1532 chan->mode == L2CAP_MODE_LE_FLOWCTL || in l2cap_sock_recv_cb()
1533 chan->mode == L2CAP_MODE_EXT_FLOWCTL)) { in l2cap_sock_recv_cb()
1537 err = -ENOMEM; in l2cap_sock_recv_cb()
1540 rx_busy->skb = skb; in l2cap_sock_recv_cb()
1541 list_add_tail(&rx_busy->list, &pi->rx_busy); in l2cap_sock_recv_cb()
1554 struct sock *sk = chan->data; in l2cap_sock_close_cb()
1564 struct sock *sk = chan->data; in l2cap_sock_teardown_cb()
1570 BT_DBG("chan %p state %s", chan, state_to_string(chan->state)); in l2cap_sock_teardown_cb()
1575 * we need separation into separate nesting levels. The simplest in l2cap_sock_teardown_cb()
1576 * way to accomplish this is to inherit the nesting level used in l2cap_sock_teardown_cb()
1579 lock_sock_nested(sk, atomic_read(&chan->nesting)); in l2cap_sock_teardown_cb()
1581 parent = bt_sk(sk)->parent; in l2cap_sock_teardown_cb()
1583 switch (chan->state) { in l2cap_sock_teardown_cb()
1590 sk->sk_state = BT_CLOSED; in l2cap_sock_teardown_cb()
1591 chan->state = BT_CLOSED; in l2cap_sock_teardown_cb()
1595 sk->sk_state = BT_CLOSED; in l2cap_sock_teardown_cb()
1596 chan->state = BT_CLOSED; in l2cap_sock_teardown_cb()
1598 sk->sk_err = err; in l2cap_sock_teardown_cb()
1602 parent->sk_data_ready(parent); in l2cap_sock_teardown_cb()
1604 sk->sk_state_change(sk); in l2cap_sock_teardown_cb()
1619 struct sock *sk = chan->data; in l2cap_sock_state_change_cb()
1621 sk->sk_state = state; in l2cap_sock_state_change_cb()
1624 sk->sk_err = err; in l2cap_sock_state_change_cb()
1631 struct sock *sk = chan->data; in l2cap_sock_alloc_skb_cb()
1645 if (chan->state != BT_CONNECTED) { in l2cap_sock_alloc_skb_cb()
1647 return ERR_PTR(-ENOTCONN); in l2cap_sock_alloc_skb_cb()
1650 skb->priority = READ_ONCE(sk->sk_priority); in l2cap_sock_alloc_skb_cb()
1652 bt_cb(skb)->l2cap.chan = chan; in l2cap_sock_alloc_skb_cb()
1659 struct sock *sk = chan->data; in l2cap_sock_ready_cb()
1664 parent = bt_sk(sk)->parent; in l2cap_sock_ready_cb()
1668 sk->sk_state = BT_CONNECTED; in l2cap_sock_ready_cb()
1669 sk->sk_state_change(sk); in l2cap_sock_ready_cb()
1672 parent->sk_data_ready(parent); in l2cap_sock_ready_cb()
1679 struct sock *parent, *sk = chan->data; in l2cap_sock_defer_cb()
1683 parent = bt_sk(sk)->parent; in l2cap_sock_defer_cb()
1685 parent->sk_data_ready(parent); in l2cap_sock_defer_cb()
1692 struct sock *sk = chan->data; in l2cap_sock_resume_cb()
1694 if (test_and_clear_bit(FLAG_PENDING_SECURITY, &chan->flags)) { in l2cap_sock_resume_cb()
1695 sk->sk_state = BT_CONNECTED; in l2cap_sock_resume_cb()
1696 chan->state = BT_CONNECTED; in l2cap_sock_resume_cb()
1699 clear_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags); in l2cap_sock_resume_cb()
1700 sk->sk_state_change(sk); in l2cap_sock_resume_cb()
1705 struct sock *sk = chan->data; in l2cap_sock_set_shutdown_cb()
1708 sk->sk_shutdown = SHUTDOWN_MASK; in l2cap_sock_set_shutdown_cb()
1714 struct sock *sk = chan->data; in l2cap_sock_get_sndtimeo_cb()
1716 return sk->sk_sndtimeo; in l2cap_sock_get_sndtimeo_cb()
1721 struct sock *sk = chan->data; in l2cap_sock_get_peer_pid_cb()
1723 return sk->sk_peer_pid; in l2cap_sock_get_peer_pid_cb()
1728 struct sock *sk = chan->data; in l2cap_sock_suspend_cb()
1730 set_bit(BT_SK_SUSPEND, &bt_sk(sk)->flags); in l2cap_sock_suspend_cb()
1731 sk->sk_state_change(sk); in l2cap_sock_suspend_cb()
1736 struct sock *sk = chan->data; in l2cap_sock_filter()
1738 switch (chan->mode) { in l2cap_sock_filter()
1771 if (l2cap_pi(sk)->chan) { in l2cap_sock_destruct()
1772 l2cap_pi(sk)->chan->data = NULL; in l2cap_sock_destruct()
1773 l2cap_chan_put(l2cap_pi(sk)->chan); in l2cap_sock_destruct()
1776 list_for_each_entry_safe(rx_busy, next, &l2cap_pi(sk)->rx_busy, list) { in l2cap_sock_destruct()
1777 kfree_skb(rx_busy->skb); in l2cap_sock_destruct()
1778 list_del(&rx_busy->list); in l2cap_sock_destruct()
1782 skb_queue_purge(&sk->sk_receive_queue); in l2cap_sock_destruct()
1783 skb_queue_purge(&sk->sk_write_queue); in l2cap_sock_destruct()
1792 la->l2_family = AF_BLUETOOTH; in l2cap_skb_msg_name()
1793 la->l2_psm = bt_cb(skb)->l2cap.psm; in l2cap_skb_msg_name()
1794 bacpy(&la->l2_bdaddr, &bt_cb(skb)->l2cap.bdaddr); in l2cap_skb_msg_name()
1801 struct l2cap_chan *chan = l2cap_pi(sk)->chan; in l2cap_sock_init()
1806 struct l2cap_chan *pchan = l2cap_pi(parent)->chan; in l2cap_sock_init()
1808 sk->sk_type = parent->sk_type; in l2cap_sock_init()
1809 bt_sk(sk)->flags = bt_sk(parent)->flags; in l2cap_sock_init()
1811 chan->chan_type = pchan->chan_type; in l2cap_sock_init()
1812 chan->imtu = pchan->imtu; in l2cap_sock_init()
1813 chan->omtu = pchan->omtu; in l2cap_sock_init()
1814 chan->conf_state = pchan->conf_state; in l2cap_sock_init()
1815 chan->mode = pchan->mode; in l2cap_sock_init()
1816 chan->fcs = pchan->fcs; in l2cap_sock_init()
1817 chan->max_tx = pchan->max_tx; in l2cap_sock_init()
1818 chan->tx_win = pchan->tx_win; in l2cap_sock_init()
1819 chan->tx_win_max = pchan->tx_win_max; in l2cap_sock_init()
1820 chan->sec_level = pchan->sec_level; in l2cap_sock_init()
1821 chan->flags = pchan->flags; in l2cap_sock_init()
1822 chan->tx_credits = pchan->tx_credits; in l2cap_sock_init()
1823 chan->rx_credits = pchan->rx_credits; in l2cap_sock_init()
1825 if (chan->chan_type == L2CAP_CHAN_FIXED) { in l2cap_sock_init()
1826 chan->scid = pchan->scid; in l2cap_sock_init()
1827 chan->dcid = pchan->scid; in l2cap_sock_init()
1832 switch (sk->sk_type) { in l2cap_sock_init()
1834 chan->chan_type = L2CAP_CHAN_RAW; in l2cap_sock_init()
1837 chan->chan_type = L2CAP_CHAN_CONN_LESS; in l2cap_sock_init()
1838 bt_sk(sk)->skb_msg_name = l2cap_skb_msg_name; in l2cap_sock_init()
1842 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED; in l2cap_sock_init()
1846 chan->imtu = L2CAP_DEFAULT_MTU; in l2cap_sock_init()
1847 chan->omtu = 0; in l2cap_sock_init()
1848 if (!disable_ertm && sk->sk_type == SOCK_STREAM) { in l2cap_sock_init()
1849 chan->mode = L2CAP_MODE_ERTM; in l2cap_sock_init()
1850 set_bit(CONF_STATE2_DEVICE, &chan->conf_state); in l2cap_sock_init()
1852 chan->mode = L2CAP_MODE_BASIC; in l2cap_sock_init()
1859 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO; in l2cap_sock_init()
1861 chan->data = sk; in l2cap_sock_init()
1862 chan->ops = &l2cap_chan_ops; in l2cap_sock_init()
1883 sk->sk_destruct = l2cap_sock_destruct; in l2cap_sock_alloc()
1884 sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT; in l2cap_sock_alloc()
1886 INIT_LIST_HEAD(&l2cap_pi(sk)->rx_busy); in l2cap_sock_alloc()
1892 sock->sk = NULL; in l2cap_sock_alloc()
1898 l2cap_pi(sk)->chan = chan; in l2cap_sock_alloc()
1910 sock->state = SS_UNCONNECTED; in l2cap_sock_create()
1912 if (sock->type != SOCK_SEQPACKET && sock->type != SOCK_STREAM && in l2cap_sock_create()
1913 sock->type != SOCK_DGRAM && sock->type != SOCK_RAW) in l2cap_sock_create()
1914 return -ESOCKTNOSUPPORT; in l2cap_sock_create()
1916 if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW)) in l2cap_sock_create()
1917 return -EPERM; in l2cap_sock_create()
1919 sock->ops = &l2cap_sock_ops; in l2cap_sock_create()
1923 return -ENOMEM; in l2cap_sock_create()