l2cap_sock.c (9a91a04a95d30a18909e2aec9d7b17b4c86088a7) l2cap_sock.c (715ec005cd10c5d53109ffe513e4d403644e3e48)
1/*
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>
5 Copyright (C) 2010 Google Inc.
6
7 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
8

--- 148 unchanged lines hidden (view full) ---

157 len = min_t(unsigned int, sizeof(la), alen);
158 memcpy(&la, addr, len);
159
160 if (la.l2_cid && la.l2_psm)
161 return -EINVAL;
162
163 lock_sock(sk);
164
1/*
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>
5 Copyright (C) 2010 Google Inc.
6
7 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
8

--- 148 unchanged lines hidden (view full) ---

157 len = min_t(unsigned int, sizeof(la), alen);
158 memcpy(&la, addr, len);
159
160 if (la.l2_cid && la.l2_psm)
161 return -EINVAL;
162
163 lock_sock(sk);
164
165 if ((sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM)
165 if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED
166 && !(la.l2_psm || la.l2_cid)) {
167 err = -EINVAL;
168 goto done;
169 }
170
171 switch (chan->mode) {
172 case L2CAP_MODE_BASIC:
173 break;

--- 25 unchanged lines hidden (view full) ---

199 break;
200
201 default:
202 err = -EBADFD;
203 goto done;
204 }
205
206 /* PSM must be odd and lsb of upper byte must be 0 */
166 && !(la.l2_psm || la.l2_cid)) {
167 err = -EINVAL;
168 goto done;
169 }
170
171 switch (chan->mode) {
172 case L2CAP_MODE_BASIC:
173 break;

--- 25 unchanged lines hidden (view full) ---

199 break;
200
201 default:
202 err = -EBADFD;
203 goto done;
204 }
205
206 /* PSM must be odd and lsb of upper byte must be 0 */
207 if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 &&
208 sk->sk_type != SOCK_RAW && !la.l2_cid) {
207 if ((__le16_to_cpu(la.l2_psm) & 0x0101) != 0x0001 && !la.l2_cid &&
208 chan->chan_type != L2CAP_CHAN_RAW) {
209 err = -EINVAL;
210 goto done;
211 }
212
213 /* Set destination address and psm */
214 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
215 chan->psm = la.l2_psm;
216 chan->dcid = la.l2_cid;

--- 231 unchanged lines hidden (view full) ---

448
449 if (get_user(len, optlen))
450 return -EFAULT;
451
452 lock_sock(sk);
453
454 switch (optname) {
455 case BT_SECURITY:
209 err = -EINVAL;
210 goto done;
211 }
212
213 /* Set destination address and psm */
214 bacpy(&bt_sk(sk)->dst, &la.l2_bdaddr);
215 chan->psm = la.l2_psm;
216 chan->dcid = la.l2_cid;

--- 231 unchanged lines hidden (view full) ---

448
449 if (get_user(len, optlen))
450 return -EFAULT;
451
452 lock_sock(sk);
453
454 switch (optname) {
455 case BT_SECURITY:
456 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
457 && sk->sk_type != SOCK_RAW) {
456 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
457 chan->chan_type != L2CAP_CHAN_RAW) {
458 err = -EINVAL;
459 break;
460 }
461
462 sec.level = chan->sec_level;
463
464 len = min_t(unsigned int, len, sizeof(sec));
465 if (copy_to_user(optval, (char *) &sec, len))

--- 128 unchanged lines hidden (view full) ---

594
595 if (level != SOL_BLUETOOTH)
596 return -ENOPROTOOPT;
597
598 lock_sock(sk);
599
600 switch (optname) {
601 case BT_SECURITY:
458 err = -EINVAL;
459 break;
460 }
461
462 sec.level = chan->sec_level;
463
464 len = min_t(unsigned int, len, sizeof(sec));
465 if (copy_to_user(optval, (char *) &sec, len))

--- 128 unchanged lines hidden (view full) ---

594
595 if (level != SOL_BLUETOOTH)
596 return -ENOPROTOOPT;
597
598 lock_sock(sk);
599
600 switch (optname) {
601 case BT_SECURITY:
602 if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
603 && sk->sk_type != SOCK_RAW) {
602 if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED &&
603 chan->chan_type != L2CAP_CHAN_RAW) {
604 err = -EINVAL;
605 break;
606 }
607
608 sec.level = BT_SECURITY_LOW;
609
610 len = min_t(unsigned int, sizeof(sec), optlen);
611 if (copy_from_user((char *) &sec, optval, len)) {

--- 189 unchanged lines hidden (view full) ---

801 BT_DBG("sk %p", sk);
802
803 if (parent) {
804 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
805
806 sk->sk_type = parent->sk_type;
807 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
808
604 err = -EINVAL;
605 break;
606 }
607
608 sec.level = BT_SECURITY_LOW;
609
610 len = min_t(unsigned int, sizeof(sec), optlen);
611 if (copy_from_user((char *) &sec, optval, len)) {

--- 189 unchanged lines hidden (view full) ---

801 BT_DBG("sk %p", sk);
802
803 if (parent) {
804 struct l2cap_chan *pchan = l2cap_pi(parent)->chan;
805
806 sk->sk_type = parent->sk_type;
807 bt_sk(sk)->defer_setup = bt_sk(parent)->defer_setup;
808
809 chan->chan_type = pchan->chan_type;
809 chan->imtu = pchan->imtu;
810 chan->omtu = pchan->omtu;
811 chan->conf_state = pchan->conf_state;
812 chan->mode = pchan->mode;
813 chan->fcs = pchan->fcs;
814 chan->max_tx = pchan->max_tx;
815 chan->tx_win = pchan->tx_win;
816 chan->sec_level = pchan->sec_level;
817 chan->role_switch = pchan->role_switch;
818 chan->force_reliable = pchan->force_reliable;
819 chan->flushable = pchan->flushable;
820 } else {
810 chan->imtu = pchan->imtu;
811 chan->omtu = pchan->omtu;
812 chan->conf_state = pchan->conf_state;
813 chan->mode = pchan->mode;
814 chan->fcs = pchan->fcs;
815 chan->max_tx = pchan->max_tx;
816 chan->tx_win = pchan->tx_win;
817 chan->sec_level = pchan->sec_level;
818 chan->role_switch = pchan->role_switch;
819 chan->force_reliable = pchan->force_reliable;
820 chan->flushable = pchan->flushable;
821 } else {
822
823 switch (sk->sk_type) {
824 case SOCK_RAW:
825 chan->chan_type = L2CAP_CHAN_RAW;
826 break;
827 case SOCK_DGRAM:
828 chan->chan_type = L2CAP_CHAN_CONN_LESS;
829 break;
830 case SOCK_SEQPACKET:
831 case SOCK_STREAM:
832 chan->chan_type = L2CAP_CHAN_CONN_ORIENTED;
833 break;
834 }
835
821 chan->imtu = L2CAP_DEFAULT_MTU;
822 chan->omtu = 0;
823 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
824 chan->mode = L2CAP_MODE_ERTM;
825 chan->conf_state |= L2CAP_CONF_STATE2_DEVICE;
826 } else {
827 chan->mode = L2CAP_MODE_BASIC;
828 }

--- 133 unchanged lines hidden ---
836 chan->imtu = L2CAP_DEFAULT_MTU;
837 chan->omtu = 0;
838 if (!disable_ertm && sk->sk_type == SOCK_STREAM) {
839 chan->mode = L2CAP_MODE_ERTM;
840 chan->conf_state |= L2CAP_CONF_STATE2_DEVICE;
841 } else {
842 chan->mode = L2CAP_MODE_BASIC;
843 }

--- 133 unchanged lines hidden ---