forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/net/bluetooth/hci_sock.c
....@@ -23,7 +23,7 @@
2323 */
2424
2525 /* Bluetooth HCI sockets. */
26
-
26
+#include <linux/compat.h>
2727 #include <linux/export.h>
2828 #include <linux/utsname.h>
2929 #include <linux/sched.h>
....@@ -52,7 +52,7 @@
5252 struct bt_sock bt;
5353 struct hci_dev *hdev;
5454 struct hci_filter filter;
55
- __u32 cmsg_mask;
55
+ __u8 cmsg_mask;
5656 unsigned short channel;
5757 unsigned long flags;
5858 __u32 cookie;
....@@ -222,7 +222,8 @@
222222 if (hci_skb_pkt_type(skb) != HCI_COMMAND_PKT &&
223223 hci_skb_pkt_type(skb) != HCI_EVENT_PKT &&
224224 hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT &&
225
- hci_skb_pkt_type(skb) != HCI_SCODATA_PKT)
225
+ hci_skb_pkt_type(skb) != HCI_SCODATA_PKT &&
226
+ hci_skb_pkt_type(skb) != HCI_ISODATA_PKT)
226227 continue;
227228 if (is_filtered_packet(sk, skb))
228229 continue;
....@@ -231,7 +232,8 @@
231232 continue;
232233 if (hci_skb_pkt_type(skb) != HCI_EVENT_PKT &&
233234 hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT &&
234
- hci_skb_pkt_type(skb) != HCI_SCODATA_PKT)
235
+ hci_skb_pkt_type(skb) != HCI_SCODATA_PKT &&
236
+ hci_skb_pkt_type(skb) != HCI_ISODATA_PKT)
235237 continue;
236238 } else {
237239 /* Don't send frame to other channel types */
....@@ -334,6 +336,12 @@
334336 opcode = cpu_to_le16(HCI_MON_SCO_RX_PKT);
335337 else
336338 opcode = cpu_to_le16(HCI_MON_SCO_TX_PKT);
339
+ break;
340
+ case HCI_ISODATA_PKT:
341
+ if (bt_cb(skb)->incoming)
342
+ opcode = cpu_to_le16(HCI_MON_ISO_RX_PKT);
343
+ else
344
+ opcode = cpu_to_le16(HCI_MON_ISO_TX_PKT);
337345 break;
338346 case HCI_DIAG_PKT:
339347 opcode = cpu_to_le16(HCI_MON_VENDOR_DIAG);
....@@ -446,8 +454,7 @@
446454 case HCI_DEV_SETUP:
447455 if (hdev->manufacturer == 0xffff)
448456 return NULL;
449
-
450
- /* fall through */
457
+ fallthrough;
451458
452459 case HCI_DEV_UP:
453460 skb = bt_skb_alloc(HCI_MON_INDEX_INFO_SIZE, GFP_ATOMIC);
....@@ -1062,6 +1069,22 @@
10621069 return err;
10631070 }
10641071
1072
+#ifdef CONFIG_COMPAT
1073
+static int hci_sock_compat_ioctl(struct socket *sock, unsigned int cmd,
1074
+ unsigned long arg)
1075
+{
1076
+ switch (cmd) {
1077
+ case HCIDEVUP:
1078
+ case HCIDEVDOWN:
1079
+ case HCIDEVRESET:
1080
+ case HCIDEVRESTAT:
1081
+ return hci_sock_ioctl(sock, cmd, arg);
1082
+ }
1083
+
1084
+ return hci_sock_ioctl(sock, cmd, (unsigned long)compat_ptr(arg));
1085
+}
1086
+#endif
1087
+
10651088 static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
10661089 int addr_len)
10671090 {
....@@ -1392,7 +1415,7 @@
13921415 static void hci_sock_cmsg(struct sock *sk, struct msghdr *msg,
13931416 struct sk_buff *skb)
13941417 {
1395
- __u32 mask = hci_pi(sk)->cmsg_mask;
1418
+ __u8 mask = hci_pi(sk)->cmsg_mask;
13961419
13971420 if (mask & HCI_CMSG_DIR) {
13981421 int incoming = bt_cb(skb)->incoming;
....@@ -1402,9 +1425,9 @@
14021425
14031426 if (mask & HCI_CMSG_TSTAMP) {
14041427 #ifdef CONFIG_COMPAT
1405
- struct compat_timeval ctv;
1428
+ struct old_timeval32 ctv;
14061429 #endif
1407
- struct timeval tv;
1430
+ struct __kernel_old_timeval tv;
14081431 void *data;
14091432 int len;
14101433
....@@ -1572,11 +1595,13 @@
15721595 }
15731596 }
15741597
1575
- no_hdev = (handler->flags & HCI_MGMT_NO_HDEV);
1576
- if (no_hdev != !hdev) {
1577
- err = mgmt_cmd_status(sk, index, opcode,
1578
- MGMT_STATUS_INVALID_INDEX);
1579
- goto done;
1598
+ if (!(handler->flags & HCI_MGMT_HDEV_OPTIONAL)) {
1599
+ no_hdev = (handler->flags & HCI_MGMT_NO_HDEV);
1600
+ if (no_hdev != !hdev) {
1601
+ err = mgmt_cmd_status(sk, index, opcode,
1602
+ MGMT_STATUS_INVALID_INDEX);
1603
+ goto done;
1604
+ }
15801605 }
15811606
15821607 var_len = (handler->flags & HCI_MGMT_VAR_LEN);
....@@ -1766,7 +1791,8 @@
17661791 */
17671792 if (hci_skb_pkt_type(skb) != HCI_COMMAND_PKT &&
17681793 hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT &&
1769
- hci_skb_pkt_type(skb) != HCI_SCODATA_PKT) {
1794
+ hci_skb_pkt_type(skb) != HCI_SCODATA_PKT &&
1795
+ hci_skb_pkt_type(skb) != HCI_ISODATA_PKT) {
17701796 err = -EINVAL;
17711797 goto drop;
17721798 }
....@@ -1810,7 +1836,8 @@
18101836 }
18111837
18121838 if (hci_skb_pkt_type(skb) != HCI_ACLDATA_PKT &&
1813
- hci_skb_pkt_type(skb) != HCI_SCODATA_PKT) {
1839
+ hci_skb_pkt_type(skb) != HCI_SCODATA_PKT &&
1840
+ hci_skb_pkt_type(skb) != HCI_ISODATA_PKT) {
18141841 err = -EINVAL;
18151842 goto drop;
18161843 }
....@@ -1831,7 +1858,7 @@
18311858 }
18321859
18331860 static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
1834
- char __user *optval, unsigned int len)
1861
+ sockptr_t optval, unsigned int len)
18351862 {
18361863 struct hci_ufilter uf = { .opcode = 0 };
18371864 struct sock *sk = sock->sk;
....@@ -1851,7 +1878,7 @@
18511878
18521879 switch (optname) {
18531880 case HCI_DATA_DIR:
1854
- if (get_user(opt, (int __user *)optval)) {
1881
+ if (copy_from_sockptr(&opt, optval, sizeof(opt))) {
18551882 err = -EFAULT;
18561883 break;
18571884 }
....@@ -1863,7 +1890,7 @@
18631890 break;
18641891
18651892 case HCI_TIME_STAMP:
1866
- if (get_user(opt, (int __user *)optval)) {
1893
+ if (copy_from_sockptr(&opt, optval, sizeof(opt))) {
18671894 err = -EFAULT;
18681895 break;
18691896 }
....@@ -1885,7 +1912,7 @@
18851912 }
18861913
18871914 len = min_t(unsigned int, len, sizeof(uf));
1888
- if (copy_from_user(&uf, optval, len)) {
1915
+ if (copy_from_sockptr(&uf, optval, len)) {
18891916 err = -EFAULT;
18901917 break;
18911918 }
....@@ -1994,6 +2021,9 @@
19942021 .sendmsg = hci_sock_sendmsg,
19952022 .recvmsg = hci_sock_recvmsg,
19962023 .ioctl = hci_sock_ioctl,
2024
+#ifdef CONFIG_COMPAT
2025
+ .compat_ioctl = hci_sock_compat_ioctl,
2026
+#endif
19972027 .poll = datagram_poll,
19982028 .listen = sock_no_listen,
19992029 .shutdown = sock_no_shutdown,