@@ -57,6 +57,7 @@ struct hci_pinfo {
57
57
unsigned long flags ;
58
58
__u32 cookie ;
59
59
char comm [TASK_COMM_LEN ];
60
+ __u16 mtu ;
60
61
};
61
62
62
63
static struct hci_dev * hci_hdev_from_sock (struct sock * sk )
@@ -1374,6 +1375,10 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
1374
1375
break ;
1375
1376
}
1376
1377
1378
+ /* Default MTU to HCI_MAX_FRAME_SIZE if not set */
1379
+ if (!hci_pi (sk )-> mtu )
1380
+ hci_pi (sk )-> mtu = HCI_MAX_FRAME_SIZE ;
1381
+
1377
1382
sk -> sk_state = BT_BOUND ;
1378
1383
1379
1384
done :
@@ -1719,7 +1724,7 @@ static int hci_sock_sendmsg(struct socket *sock, struct msghdr *msg,
1719
1724
if (flags & ~(MSG_DONTWAIT | MSG_NOSIGNAL | MSG_ERRQUEUE | MSG_CMSG_COMPAT ))
1720
1725
return - EINVAL ;
1721
1726
1722
- if (len < 4 || len > HCI_MAX_FRAME_SIZE )
1727
+ if (len < 4 || len > hci_pi ( sk ) -> mtu )
1723
1728
return - EINVAL ;
1724
1729
1725
1730
buf = kmalloc (len , GFP_KERNEL );
@@ -1849,18 +1854,15 @@ static int hci_sock_sendmsg(struct socket *sock, struct msghdr *msg,
1849
1854
goto done ;
1850
1855
}
1851
1856
1852
- static int hci_sock_setsockopt (struct socket * sock , int level , int optname ,
1853
- sockptr_t optval , unsigned int len )
1857
+ static int hci_sock_setsockopt_old (struct socket * sock , int level , int optname ,
1858
+ sockptr_t optval , unsigned int len )
1854
1859
{
1855
1860
struct hci_ufilter uf = { .opcode = 0 };
1856
1861
struct sock * sk = sock -> sk ;
1857
1862
int err = 0 , opt = 0 ;
1858
1863
1859
1864
BT_DBG ("sk %p, opt %d" , sk , optname );
1860
1865
1861
- if (level != SOL_HCI )
1862
- return - ENOPROTOOPT ;
1863
-
1864
1866
lock_sock (sk );
1865
1867
1866
1868
if (hci_pi (sk )-> channel != HCI_CHANNEL_RAW ) {
@@ -1935,18 +1937,63 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname,
1935
1937
return err ;
1936
1938
}
1937
1939
1938
- static int hci_sock_getsockopt (struct socket * sock , int level , int optname ,
1939
- char __user * optval , int __user * optlen )
1940
+ static int hci_sock_setsockopt (struct socket * sock , int level , int optname ,
1941
+ sockptr_t optval , unsigned int len )
1940
1942
{
1941
- struct hci_ufilter uf ;
1942
1943
struct sock * sk = sock -> sk ;
1943
- int len , opt , err = 0 ;
1944
+ int err = 0 , opt = 0 ;
1944
1945
1945
1946
BT_DBG ("sk %p, opt %d" , sk , optname );
1946
1947
1947
- if (level != SOL_HCI )
1948
+ if (level == SOL_HCI )
1949
+ return hci_sock_setsockopt_old (sock , level , optname , optval ,
1950
+ len );
1951
+
1952
+ if (level != SOL_BLUETOOTH )
1948
1953
return - ENOPROTOOPT ;
1949
1954
1955
+ lock_sock (sk );
1956
+
1957
+ switch (optname ) {
1958
+ case BT_SNDMTU :
1959
+ case BT_RCVMTU :
1960
+ switch (hci_pi (sk )-> channel ) {
1961
+ /* Don't allow changing MTU for channels that are meant for HCI
1962
+ * traffic only.
1963
+ */
1964
+ case HCI_CHANNEL_RAW :
1965
+ case HCI_CHANNEL_USER :
1966
+ err = - ENOPROTOOPT ;
1967
+ goto done ;
1968
+ }
1969
+
1970
+ if (copy_from_sockptr (& opt , optval , sizeof (u16 ))) {
1971
+ err = - EFAULT ;
1972
+ break ;
1973
+ }
1974
+
1975
+ hci_pi (sk )-> mtu = opt ;
1976
+ break ;
1977
+
1978
+ default :
1979
+ err = - ENOPROTOOPT ;
1980
+ break ;
1981
+ }
1982
+
1983
+ done :
1984
+ release_sock (sk );
1985
+ return err ;
1986
+ }
1987
+
1988
+ static int hci_sock_getsockopt_old (struct socket * sock , int level , int optname ,
1989
+ char __user * optval , int __user * optlen )
1990
+ {
1991
+ struct hci_ufilter uf ;
1992
+ struct sock * sk = sock -> sk ;
1993
+ int len , opt , err = 0 ;
1994
+
1995
+ BT_DBG ("sk %p, opt %d" , sk , optname );
1996
+
1950
1997
if (get_user (len , optlen ))
1951
1998
return - EFAULT ;
1952
1999
@@ -2004,6 +2051,39 @@ static int hci_sock_getsockopt(struct socket *sock, int level, int optname,
2004
2051
return err ;
2005
2052
}
2006
2053
2054
+ static int hci_sock_getsockopt (struct socket * sock , int level , int optname ,
2055
+ char __user * optval , int __user * optlen )
2056
+ {
2057
+ struct sock * sk = sock -> sk ;
2058
+ int err = 0 ;
2059
+
2060
+ BT_DBG ("sk %p, opt %d" , sk , optname );
2061
+
2062
+ if (level == SOL_HCI )
2063
+ return hci_sock_getsockopt_old (sock , level , optname , optval ,
2064
+ optlen );
2065
+
2066
+ if (level != SOL_BLUETOOTH )
2067
+ return - ENOPROTOOPT ;
2068
+
2069
+ lock_sock (sk );
2070
+
2071
+ switch (optname ) {
2072
+ case BT_SNDMTU :
2073
+ case BT_RCVMTU :
2074
+ if (put_user (hci_pi (sk )-> mtu , (u16 __user * )optval ))
2075
+ err = - EFAULT ;
2076
+ break ;
2077
+
2078
+ default :
2079
+ err = - ENOPROTOOPT ;
2080
+ break ;
2081
+ }
2082
+
2083
+ release_sock (sk );
2084
+ return err ;
2085
+ }
2086
+
2007
2087
static const struct proto_ops hci_sock_ops = {
2008
2088
.family = PF_BLUETOOTH ,
2009
2089
.owner = THIS_MODULE ,
0 commit comments