forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/net/bluetooth/l2cap_sock.c
....@@ -161,7 +161,11 @@
161161 break;
162162 }
163163
164
- if (chan->psm && bdaddr_type_is_le(chan->src_type))
164
+ /* Use L2CAP_MODE_LE_FLOWCTL (CoC) in case of LE address and
165
+ * L2CAP_MODE_EXT_FLOWCTL (ECRED) has not been set.
166
+ */
167
+ if (chan->psm && bdaddr_type_is_le(chan->src_type) &&
168
+ chan->mode != L2CAP_MODE_EXT_FLOWCTL)
165169 chan->mode = L2CAP_MODE_LE_FLOWCTL;
166170
167171 chan->state = BT_BOUND;
....@@ -170,6 +174,21 @@
170174 done:
171175 release_sock(sk);
172176 return err;
177
+}
178
+
179
+static void l2cap_sock_init_pid(struct sock *sk)
180
+{
181
+ struct l2cap_chan *chan = l2cap_pi(sk)->chan;
182
+
183
+ /* Only L2CAP_MODE_EXT_FLOWCTL ever need to access the PID in order to
184
+ * group the channels being requested.
185
+ */
186
+ if (chan->mode != L2CAP_MODE_EXT_FLOWCTL)
187
+ return;
188
+
189
+ spin_lock(&sk->sk_peer_lock);
190
+ sk->sk_peer_pid = get_pid(task_tgid(current));
191
+ spin_unlock(&sk->sk_peer_lock);
173192 }
174193
175194 static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr,
....@@ -240,8 +259,14 @@
240259 return -EINVAL;
241260 }
242261
243
- if (chan->psm && bdaddr_type_is_le(chan->src_type))
262
+ /* Use L2CAP_MODE_LE_FLOWCTL (CoC) in case of LE address and
263
+ * L2CAP_MODE_EXT_FLOWCTL (ECRED) has not been set.
264
+ */
265
+ if (chan->psm && bdaddr_type_is_le(chan->src_type) &&
266
+ chan->mode != L2CAP_MODE_EXT_FLOWCTL)
244267 chan->mode = L2CAP_MODE_LE_FLOWCTL;
268
+
269
+ l2cap_sock_init_pid(sk);
245270
246271 err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid),
247272 &la.l2_bdaddr, la.l2_bdaddr_type);
....@@ -282,15 +307,23 @@
282307 case L2CAP_MODE_BASIC:
283308 case L2CAP_MODE_LE_FLOWCTL:
284309 break;
310
+ case L2CAP_MODE_EXT_FLOWCTL:
311
+ if (!enable_ecred) {
312
+ err = -EOPNOTSUPP;
313
+ goto done;
314
+ }
315
+ break;
285316 case L2CAP_MODE_ERTM:
286317 case L2CAP_MODE_STREAMING:
287318 if (!disable_ertm)
288319 break;
289
- /* fall through */
320
+ fallthrough;
290321 default:
291322 err = -EOPNOTSUPP;
292323 goto done;
293324 }
325
+
326
+ l2cap_sock_init_pid(sk);
294327
295328 sk->sk_max_ack_backlog = backlog;
296329 sk->sk_ack_backlog = 0;
....@@ -397,6 +430,24 @@
397430 return sizeof(struct sockaddr_l2);
398431 }
399432
433
+static int l2cap_get_mode(struct l2cap_chan *chan)
434
+{
435
+ switch (chan->mode) {
436
+ case L2CAP_MODE_BASIC:
437
+ return BT_MODE_BASIC;
438
+ case L2CAP_MODE_ERTM:
439
+ return BT_MODE_ERTM;
440
+ case L2CAP_MODE_STREAMING:
441
+ return BT_MODE_STREAMING;
442
+ case L2CAP_MODE_LE_FLOWCTL:
443
+ return BT_MODE_LE_FLOWCTL;
444
+ case L2CAP_MODE_EXT_FLOWCTL:
445
+ return BT_MODE_EXT_FLOWCTL;
446
+ }
447
+
448
+ return -EINVAL;
449
+}
450
+
400451 static int l2cap_sock_getsockopt_old(struct socket *sock, int optname,
401452 char __user *optval, int __user *optlen)
402453 {
....@@ -426,6 +477,20 @@
426477 break;
427478 }
428479
480
+ /* Only BR/EDR modes are supported here */
481
+ switch (chan->mode) {
482
+ case L2CAP_MODE_BASIC:
483
+ case L2CAP_MODE_ERTM:
484
+ case L2CAP_MODE_STREAMING:
485
+ break;
486
+ default:
487
+ err = -EINVAL;
488
+ break;
489
+ }
490
+
491
+ if (err < 0)
492
+ break;
493
+
429494 memset(&opts, 0, sizeof(opts));
430495 opts.imtu = chan->imtu;
431496 opts.omtu = chan->omtu;
....@@ -434,6 +499,8 @@
434499 opts.fcs = chan->fcs;
435500 opts.max_tx = chan->max_tx;
436501 opts.txwin_size = chan->tx_win;
502
+
503
+ BT_DBG("mode 0x%2.2x", chan->mode);
437504
438505 len = min_t(unsigned int, len, sizeof(opts));
439506 if (copy_to_user(optval, (char *) &opts, len))
....@@ -507,7 +574,8 @@
507574 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
508575 struct bt_security sec;
509576 struct bt_power pwr;
510
- int len, err = 0;
577
+ u32 phys;
578
+ int len, mode, err = 0;
511579
512580 BT_DBG("sk %p", sk);
513581
....@@ -611,6 +679,39 @@
611679 err = -EFAULT;
612680 break;
613681
682
+ case BT_PHY:
683
+ if (sk->sk_state != BT_CONNECTED) {
684
+ err = -ENOTCONN;
685
+ break;
686
+ }
687
+
688
+ phys = hci_conn_get_phy(chan->conn->hcon);
689
+
690
+ if (put_user(phys, (u32 __user *) optval))
691
+ err = -EFAULT;
692
+ break;
693
+
694
+ case BT_MODE:
695
+ if (!enable_ecred) {
696
+ err = -ENOPROTOOPT;
697
+ break;
698
+ }
699
+
700
+ if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
701
+ err = -EINVAL;
702
+ break;
703
+ }
704
+
705
+ mode = l2cap_get_mode(chan);
706
+ if (mode < 0) {
707
+ err = mode;
708
+ break;
709
+ }
710
+
711
+ if (put_user(mode, (u8 __user *) optval))
712
+ err = -EFAULT;
713
+ break;
714
+
614715 default:
615716 err = -ENOPROTOOPT;
616717 break;
....@@ -637,7 +738,7 @@
637738 }
638739
639740 static int l2cap_sock_setsockopt_old(struct socket *sock, int optname,
640
- char __user *optval, unsigned int optlen)
741
+ sockptr_t optval, unsigned int optlen)
641742 {
642743 struct sock *sk = sock->sk;
643744 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
....@@ -670,7 +771,7 @@
670771 opts.txwin_size = chan->tx_win;
671772
672773 len = min_t(unsigned int, sizeof(opts), optlen);
673
- if (copy_from_user((char *) &opts, optval, len)) {
774
+ if (copy_from_sockptr(&opts, optval, len)) {
674775 err = -EFAULT;
675776 break;
676777 }
....@@ -685,10 +786,8 @@
685786 break;
686787 }
687788
688
- chan->mode = opts.mode;
689
- switch (chan->mode) {
690
- case L2CAP_MODE_LE_FLOWCTL:
691
- break;
789
+ /* Only BR/EDR modes are supported here */
790
+ switch (opts.mode) {
692791 case L2CAP_MODE_BASIC:
693792 clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
694793 break;
....@@ -696,11 +795,18 @@
696795 case L2CAP_MODE_STREAMING:
697796 if (!disable_ertm)
698797 break;
699
- /* fall through */
798
+ fallthrough;
700799 default:
701800 err = -EINVAL;
702801 break;
703802 }
803
+
804
+ if (err < 0)
805
+ break;
806
+
807
+ chan->mode = opts.mode;
808
+
809
+ BT_DBG("mode 0x%2.2x", chan->mode);
704810
705811 chan->imtu = opts.imtu;
706812 chan->omtu = opts.omtu;
....@@ -711,7 +817,7 @@
711817 break;
712818
713819 case L2CAP_LM:
714
- if (get_user(opt, (u32 __user *) optval)) {
820
+ if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
715821 err = -EFAULT;
716822 break;
717823 }
....@@ -748,8 +854,47 @@
748854 return err;
749855 }
750856
857
+static int l2cap_set_mode(struct l2cap_chan *chan, u8 mode)
858
+{
859
+ switch (mode) {
860
+ case BT_MODE_BASIC:
861
+ if (bdaddr_type_is_le(chan->src_type))
862
+ return -EINVAL;
863
+ mode = L2CAP_MODE_BASIC;
864
+ clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
865
+ break;
866
+ case BT_MODE_ERTM:
867
+ if (!disable_ertm || bdaddr_type_is_le(chan->src_type))
868
+ return -EINVAL;
869
+ mode = L2CAP_MODE_ERTM;
870
+ break;
871
+ case BT_MODE_STREAMING:
872
+ if (!disable_ertm || bdaddr_type_is_le(chan->src_type))
873
+ return -EINVAL;
874
+ mode = L2CAP_MODE_STREAMING;
875
+ break;
876
+ case BT_MODE_LE_FLOWCTL:
877
+ if (!bdaddr_type_is_le(chan->src_type))
878
+ return -EINVAL;
879
+ mode = L2CAP_MODE_LE_FLOWCTL;
880
+ break;
881
+ case BT_MODE_EXT_FLOWCTL:
882
+ /* TODO: Add support for ECRED PDUs to BR/EDR */
883
+ if (!bdaddr_type_is_le(chan->src_type))
884
+ return -EINVAL;
885
+ mode = L2CAP_MODE_EXT_FLOWCTL;
886
+ break;
887
+ default:
888
+ return -EINVAL;
889
+ }
890
+
891
+ chan->mode = mode;
892
+
893
+ return 0;
894
+}
895
+
751896 static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
752
- char __user *optval, unsigned int optlen)
897
+ sockptr_t optval, unsigned int optlen)
753898 {
754899 struct sock *sk = sock->sk;
755900 struct l2cap_chan *chan = l2cap_pi(sk)->chan;
....@@ -758,6 +903,8 @@
758903 struct l2cap_conn *conn;
759904 int len, err = 0;
760905 u32 opt;
906
+ u16 mtu;
907
+ u8 mode;
761908
762909 BT_DBG("sk %p", sk);
763910
....@@ -781,7 +928,7 @@
781928 sec.level = BT_SECURITY_LOW;
782929
783930 len = min_t(unsigned int, sizeof(sec), optlen);
784
- if (copy_from_user((char *) &sec, optval, len)) {
931
+ if (copy_from_sockptr(&sec, optval, len)) {
785932 err = -EFAULT;
786933 break;
787934 }
....@@ -799,10 +946,13 @@
799946
800947 conn = chan->conn;
801948
802
- /*change security for LE channels */
949
+ /* change security for LE channels */
803950 if (chan->scid == L2CAP_CID_ATT) {
804
- if (smp_conn_security(conn->hcon, sec.level))
951
+ if (smp_conn_security(conn->hcon, sec.level)) {
952
+ err = -EINVAL;
805953 break;
954
+ }
955
+
806956 set_bit(FLAG_PENDING_SECURITY, &chan->flags);
807957 sk->sk_state = BT_CONFIG;
808958 chan->state = BT_CONFIG;
....@@ -826,7 +976,7 @@
826976 break;
827977 }
828978
829
- if (get_user(opt, (u32 __user *) optval)) {
979
+ if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
830980 err = -EFAULT;
831981 break;
832982 }
....@@ -841,7 +991,7 @@
841991 break;
842992
843993 case BT_FLUSHABLE:
844
- if (get_user(opt, (u32 __user *) optval)) {
994
+ if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
845995 err = -EFAULT;
846996 break;
847997 }
....@@ -877,7 +1027,7 @@
8771027 pwr.force_active = BT_POWER_FORCE_ACTIVE_ON;
8781028
8791029 len = min_t(unsigned int, sizeof(pwr), optlen);
880
- if (copy_from_user((char *) &pwr, optval, len)) {
1030
+ if (copy_from_sockptr(&pwr, optval, len)) {
8811031 err = -EFAULT;
8821032 break;
8831033 }
....@@ -889,7 +1039,7 @@
8891039 break;
8901040
8911041 case BT_CHANNEL_POLICY:
892
- if (get_user(opt, (u32 __user *) optval)) {
1042
+ if (copy_from_sockptr(&opt, optval, sizeof(u32))) {
8931043 err = -EFAULT;
8941044 break;
8951045 }
....@@ -931,17 +1081,56 @@
9311081 break;
9321082 }
9331083
934
- if (sk->sk_state == BT_CONNECTED) {
1084
+ if (chan->mode == L2CAP_MODE_LE_FLOWCTL &&
1085
+ sk->sk_state == BT_CONNECTED) {
9351086 err = -EISCONN;
9361087 break;
9371088 }
9381089
939
- if (get_user(opt, (u16 __user *) optval)) {
1090
+ if (copy_from_sockptr(&mtu, optval, sizeof(u16))) {
9401091 err = -EFAULT;
9411092 break;
9421093 }
9431094
944
- chan->imtu = opt;
1095
+ if (chan->mode == L2CAP_MODE_EXT_FLOWCTL &&
1096
+ sk->sk_state == BT_CONNECTED)
1097
+ err = l2cap_chan_reconfigure(chan, mtu);
1098
+ else
1099
+ chan->imtu = mtu;
1100
+
1101
+ break;
1102
+
1103
+ case BT_MODE:
1104
+ if (!enable_ecred) {
1105
+ err = -ENOPROTOOPT;
1106
+ break;
1107
+ }
1108
+
1109
+ BT_DBG("sk->sk_state %u", sk->sk_state);
1110
+
1111
+ if (sk->sk_state != BT_BOUND) {
1112
+ err = -EINVAL;
1113
+ break;
1114
+ }
1115
+
1116
+ if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
1117
+ err = -EINVAL;
1118
+ break;
1119
+ }
1120
+
1121
+ if (copy_from_sockptr(&mode, optval, sizeof(u8))) {
1122
+ err = -EFAULT;
1123
+ break;
1124
+ }
1125
+
1126
+ BT_DBG("mode %u", mode);
1127
+
1128
+ err = l2cap_set_mode(chan, mode);
1129
+ if (err)
1130
+ break;
1131
+
1132
+ BT_DBG("mode 0x%2.2x", chan->mode);
1133
+
9451134 break;
9461135
9471136 default:
....@@ -996,7 +1185,11 @@
9961185
9971186 if (sk->sk_state == BT_CONNECT2 && test_bit(BT_SK_DEFER_SETUP,
9981187 &bt_sk(sk)->flags)) {
999
- if (bdaddr_type_is_le(pi->chan->src_type)) {
1188
+ if (pi->chan->mode == L2CAP_MODE_EXT_FLOWCTL) {
1189
+ sk->sk_state = BT_CONNECTED;
1190
+ pi->chan->state = BT_CONNECTED;
1191
+ __l2cap_ecred_conn_rsp_defer(pi->chan);
1192
+ } else if (bdaddr_type_is_le(pi->chan->src_type)) {
10001193 sk->sk_state = BT_CONNECTED;
10011194 pi->chan->state = BT_CONNECTED;
10021195 __l2cap_le_connect_rsp_defer(pi->chan);
....@@ -1115,14 +1308,21 @@
11151308 struct l2cap_conn *conn;
11161309 int err = 0;
11171310
1118
- BT_DBG("sock %p, sk %p", sock, sk);
1311
+ BT_DBG("sock %p, sk %p, how %d", sock, sk, how);
1312
+
1313
+ /* 'how' parameter is mapped to sk_shutdown as follows:
1314
+ * SHUT_RD (0) --> RCV_SHUTDOWN (1)
1315
+ * SHUT_WR (1) --> SEND_SHUTDOWN (2)
1316
+ * SHUT_RDWR (2) --> SHUTDOWN_MASK (3)
1317
+ */
1318
+ how++;
11191319
11201320 if (!sk)
11211321 return 0;
11221322
11231323 lock_sock(sk);
11241324
1125
- if (sk->sk_shutdown)
1325
+ if ((sk->sk_shutdown & how) == how)
11261326 goto shutdown_already;
11271327
11281328 BT_DBG("Handling sock shutdown");
....@@ -1145,11 +1345,20 @@
11451345 * has already been actioned to close the L2CAP
11461346 * link such as by l2cap_disconnection_req().
11471347 */
1148
- if (sk->sk_shutdown)
1149
- goto has_shutdown;
1348
+ if ((sk->sk_shutdown & how) == how)
1349
+ goto shutdown_matched;
11501350 }
11511351
1152
- sk->sk_shutdown = SHUTDOWN_MASK;
1352
+ /* Try setting the RCV_SHUTDOWN bit, return early if SEND_SHUTDOWN
1353
+ * is already set
1354
+ */
1355
+ if ((how & RCV_SHUTDOWN) && !(sk->sk_shutdown & RCV_SHUTDOWN)) {
1356
+ sk->sk_shutdown |= RCV_SHUTDOWN;
1357
+ if ((sk->sk_shutdown & how) == how)
1358
+ goto shutdown_matched;
1359
+ }
1360
+
1361
+ sk->sk_shutdown |= SEND_SHUTDOWN;
11531362 release_sock(sk);
11541363
11551364 l2cap_chan_lock(chan);
....@@ -1179,7 +1388,7 @@
11791388 err = bt_sock_wait_state(sk, BT_CLOSED,
11801389 sk->sk_lingertime);
11811390
1182
-has_shutdown:
1391
+shutdown_matched:
11831392 l2cap_chan_put(chan);
11841393 sock_put(sk);
11851394
....@@ -1207,7 +1416,7 @@
12071416
12081417 bt_sock_unlink(&l2cap_sk_list, sk);
12091418
1210
- err = l2cap_sock_shutdown(sock, 2);
1419
+ err = l2cap_sock_shutdown(sock, SHUT_RDWR);
12111420 chan = l2cap_pi(sk)->chan;
12121421
12131422 l2cap_chan_hold(chan);
....@@ -1483,6 +1692,13 @@
14831692 return sk->sk_sndtimeo;
14841693 }
14851694
1695
+static struct pid *l2cap_sock_get_peer_pid_cb(struct l2cap_chan *chan)
1696
+{
1697
+ struct sock *sk = chan->data;
1698
+
1699
+ return sk->sk_peer_pid;
1700
+}
1701
+
14861702 static void l2cap_sock_suspend_cb(struct l2cap_chan *chan)
14871703 {
14881704 struct sock *sk = chan->data;
....@@ -1517,6 +1733,7 @@
15171733 .suspend = l2cap_sock_suspend_cb,
15181734 .set_shutdown = l2cap_sock_set_shutdown_cb,
15191735 .get_sndtimeo = l2cap_sock_get_sndtimeo_cb,
1736
+ .get_peer_pid = l2cap_sock_get_peer_pid_cb,
15201737 .alloc_skb = l2cap_sock_alloc_skb_cb,
15211738 .filter = l2cap_sock_filter,
15221739 };
....@@ -1698,6 +1915,7 @@
16981915 .recvmsg = l2cap_sock_recvmsg,
16991916 .poll = bt_sock_poll,
17001917 .ioctl = bt_sock_ioctl,
1918
+ .gettstamp = sock_gettstamp,
17011919 .mmap = sock_no_mmap,
17021920 .socketpair = sock_no_socketpair,
17031921 .shutdown = l2cap_sock_shutdown,