Skip to content

Commit 33575df

Browse files
author
Gustavo F. Padovan
committed
Bluetooth: move l2cap_sock_setsockopt() to l2cap_sock.c
Signed-off-by: Gustavo F. Padovan <[email protected]>
1 parent d7175d5 commit 33575df

File tree

3 files changed

+175
-175
lines changed

3 files changed

+175
-175
lines changed

include/net/bluetooth/l2cap.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,6 @@ int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int alen, int
442442
int l2cap_sock_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len);
443443
int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t len, int flags);
444444
int l2cap_sock_shutdown(struct socket *sock, int how);
445-
int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen);
446445
int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen);
447446

448447

net/bluetooth/l2cap_core.c

Lines changed: 0 additions & 174 deletions
Original file line numberDiff line numberDiff line change
@@ -1596,180 +1596,6 @@ int l2cap_sock_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m
15961596
return bt_sock_recvmsg(iocb, sock, msg, len, flags);
15971597
}
15981598

1599-
static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
1600-
{
1601-
struct sock *sk = sock->sk;
1602-
struct l2cap_options opts;
1603-
int len, err = 0;
1604-
u32 opt;
1605-
1606-
BT_DBG("sk %p", sk);
1607-
1608-
lock_sock(sk);
1609-
1610-
switch (optname) {
1611-
case L2CAP_OPTIONS:
1612-
if (sk->sk_state == BT_CONNECTED) {
1613-
err = -EINVAL;
1614-
break;
1615-
}
1616-
1617-
opts.imtu = l2cap_pi(sk)->imtu;
1618-
opts.omtu = l2cap_pi(sk)->omtu;
1619-
opts.flush_to = l2cap_pi(sk)->flush_to;
1620-
opts.mode = l2cap_pi(sk)->mode;
1621-
opts.fcs = l2cap_pi(sk)->fcs;
1622-
opts.max_tx = l2cap_pi(sk)->max_tx;
1623-
opts.txwin_size = (__u16)l2cap_pi(sk)->tx_win;
1624-
1625-
len = min_t(unsigned int, sizeof(opts), optlen);
1626-
if (copy_from_user((char *) &opts, optval, len)) {
1627-
err = -EFAULT;
1628-
break;
1629-
}
1630-
1631-
if (opts.txwin_size > L2CAP_DEFAULT_TX_WINDOW) {
1632-
err = -EINVAL;
1633-
break;
1634-
}
1635-
1636-
l2cap_pi(sk)->mode = opts.mode;
1637-
switch (l2cap_pi(sk)->mode) {
1638-
case L2CAP_MODE_BASIC:
1639-
l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_STATE2_DEVICE;
1640-
break;
1641-
case L2CAP_MODE_ERTM:
1642-
case L2CAP_MODE_STREAMING:
1643-
if (!disable_ertm)
1644-
break;
1645-
/* fall through */
1646-
default:
1647-
err = -EINVAL;
1648-
break;
1649-
}
1650-
1651-
l2cap_pi(sk)->imtu = opts.imtu;
1652-
l2cap_pi(sk)->omtu = opts.omtu;
1653-
l2cap_pi(sk)->fcs = opts.fcs;
1654-
l2cap_pi(sk)->max_tx = opts.max_tx;
1655-
l2cap_pi(sk)->tx_win = (__u8)opts.txwin_size;
1656-
break;
1657-
1658-
case L2CAP_LM:
1659-
if (get_user(opt, (u32 __user *) optval)) {
1660-
err = -EFAULT;
1661-
break;
1662-
}
1663-
1664-
if (opt & L2CAP_LM_AUTH)
1665-
l2cap_pi(sk)->sec_level = BT_SECURITY_LOW;
1666-
if (opt & L2CAP_LM_ENCRYPT)
1667-
l2cap_pi(sk)->sec_level = BT_SECURITY_MEDIUM;
1668-
if (opt & L2CAP_LM_SECURE)
1669-
l2cap_pi(sk)->sec_level = BT_SECURITY_HIGH;
1670-
1671-
l2cap_pi(sk)->role_switch = (opt & L2CAP_LM_MASTER);
1672-
l2cap_pi(sk)->force_reliable = (opt & L2CAP_LM_RELIABLE);
1673-
break;
1674-
1675-
default:
1676-
err = -ENOPROTOOPT;
1677-
break;
1678-
}
1679-
1680-
release_sock(sk);
1681-
return err;
1682-
}
1683-
1684-
int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
1685-
{
1686-
struct sock *sk = sock->sk;
1687-
struct bt_security sec;
1688-
int len, err = 0;
1689-
u32 opt;
1690-
1691-
BT_DBG("sk %p", sk);
1692-
1693-
if (level == SOL_L2CAP)
1694-
return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
1695-
1696-
if (level != SOL_BLUETOOTH)
1697-
return -ENOPROTOOPT;
1698-
1699-
lock_sock(sk);
1700-
1701-
switch (optname) {
1702-
case BT_SECURITY:
1703-
if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
1704-
&& sk->sk_type != SOCK_RAW) {
1705-
err = -EINVAL;
1706-
break;
1707-
}
1708-
1709-
sec.level = BT_SECURITY_LOW;
1710-
1711-
len = min_t(unsigned int, sizeof(sec), optlen);
1712-
if (copy_from_user((char *) &sec, optval, len)) {
1713-
err = -EFAULT;
1714-
break;
1715-
}
1716-
1717-
if (sec.level < BT_SECURITY_LOW ||
1718-
sec.level > BT_SECURITY_HIGH) {
1719-
err = -EINVAL;
1720-
break;
1721-
}
1722-
1723-
l2cap_pi(sk)->sec_level = sec.level;
1724-
break;
1725-
1726-
case BT_DEFER_SETUP:
1727-
if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
1728-
err = -EINVAL;
1729-
break;
1730-
}
1731-
1732-
if (get_user(opt, (u32 __user *) optval)) {
1733-
err = -EFAULT;
1734-
break;
1735-
}
1736-
1737-
bt_sk(sk)->defer_setup = opt;
1738-
break;
1739-
1740-
case BT_FLUSHABLE:
1741-
if (get_user(opt, (u32 __user *) optval)) {
1742-
err = -EFAULT;
1743-
break;
1744-
}
1745-
1746-
if (opt > BT_FLUSHABLE_ON) {
1747-
err = -EINVAL;
1748-
break;
1749-
}
1750-
1751-
if (opt == BT_FLUSHABLE_OFF) {
1752-
struct l2cap_conn *conn = l2cap_pi(sk)->conn;
1753-
/* proceed futher only when we have l2cap_conn and
1754-
No Flush support in the LM */
1755-
if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
1756-
err = -EINVAL;
1757-
break;
1758-
}
1759-
}
1760-
1761-
l2cap_pi(sk)->flushable = opt;
1762-
break;
1763-
1764-
default:
1765-
err = -ENOPROTOOPT;
1766-
break;
1767-
}
1768-
1769-
release_sock(sk);
1770-
return err;
1771-
}
1772-
17731599
static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, char __user *optval, int __user *optlen)
17741600
{
17751601
struct sock *sk = sock->sk;

net/bluetooth/l2cap_sock.c

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
/* Bluetooth L2CAP sockets. */
2828

2929
#include <net/bluetooth/bluetooth.h>
30+
#include <net/bluetooth/hci_core.h>
3031
#include <net/bluetooth/l2cap.h>
3132

3233
static void l2cap_sock_timeout(unsigned long arg)
@@ -276,6 +277,180 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *l
276277
return 0;
277278
}
278279

280+
static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __user *optval, unsigned int optlen)
281+
{
282+
struct sock *sk = sock->sk;
283+
struct l2cap_options opts;
284+
int len, err = 0;
285+
u32 opt;
286+
287+
BT_DBG("sk %p", sk);
288+
289+
lock_sock(sk);
290+
291+
switch (optname) {
292+
case L2CAP_OPTIONS:
293+
if (sk->sk_state == BT_CONNECTED) {
294+
err = -EINVAL;
295+
break;
296+
}
297+
298+
opts.imtu = l2cap_pi(sk)->imtu;
299+
opts.omtu = l2cap_pi(sk)->omtu;
300+
opts.flush_to = l2cap_pi(sk)->flush_to;
301+
opts.mode = l2cap_pi(sk)->mode;
302+
opts.fcs = l2cap_pi(sk)->fcs;
303+
opts.max_tx = l2cap_pi(sk)->max_tx;
304+
opts.txwin_size = (__u16)l2cap_pi(sk)->tx_win;
305+
306+
len = min_t(unsigned int, sizeof(opts), optlen);
307+
if (copy_from_user((char *) &opts, optval, len)) {
308+
err = -EFAULT;
309+
break;
310+
}
311+
312+
if (opts.txwin_size > L2CAP_DEFAULT_TX_WINDOW) {
313+
err = -EINVAL;
314+
break;
315+
}
316+
317+
l2cap_pi(sk)->mode = opts.mode;
318+
switch (l2cap_pi(sk)->mode) {
319+
case L2CAP_MODE_BASIC:
320+
l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_STATE2_DEVICE;
321+
break;
322+
case L2CAP_MODE_ERTM:
323+
case L2CAP_MODE_STREAMING:
324+
if (!disable_ertm)
325+
break;
326+
/* fall through */
327+
default:
328+
err = -EINVAL;
329+
break;
330+
}
331+
332+
l2cap_pi(sk)->imtu = opts.imtu;
333+
l2cap_pi(sk)->omtu = opts.omtu;
334+
l2cap_pi(sk)->fcs = opts.fcs;
335+
l2cap_pi(sk)->max_tx = opts.max_tx;
336+
l2cap_pi(sk)->tx_win = (__u8)opts.txwin_size;
337+
break;
338+
339+
case L2CAP_LM:
340+
if (get_user(opt, (u32 __user *) optval)) {
341+
err = -EFAULT;
342+
break;
343+
}
344+
345+
if (opt & L2CAP_LM_AUTH)
346+
l2cap_pi(sk)->sec_level = BT_SECURITY_LOW;
347+
if (opt & L2CAP_LM_ENCRYPT)
348+
l2cap_pi(sk)->sec_level = BT_SECURITY_MEDIUM;
349+
if (opt & L2CAP_LM_SECURE)
350+
l2cap_pi(sk)->sec_level = BT_SECURITY_HIGH;
351+
352+
l2cap_pi(sk)->role_switch = (opt & L2CAP_LM_MASTER);
353+
l2cap_pi(sk)->force_reliable = (opt & L2CAP_LM_RELIABLE);
354+
break;
355+
356+
default:
357+
err = -ENOPROTOOPT;
358+
break;
359+
}
360+
361+
release_sock(sk);
362+
return err;
363+
}
364+
365+
static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen)
366+
{
367+
struct sock *sk = sock->sk;
368+
struct bt_security sec;
369+
int len, err = 0;
370+
u32 opt;
371+
372+
BT_DBG("sk %p", sk);
373+
374+
if (level == SOL_L2CAP)
375+
return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
376+
377+
if (level != SOL_BLUETOOTH)
378+
return -ENOPROTOOPT;
379+
380+
lock_sock(sk);
381+
382+
switch (optname) {
383+
case BT_SECURITY:
384+
if (sk->sk_type != SOCK_SEQPACKET && sk->sk_type != SOCK_STREAM
385+
&& sk->sk_type != SOCK_RAW) {
386+
err = -EINVAL;
387+
break;
388+
}
389+
390+
sec.level = BT_SECURITY_LOW;
391+
392+
len = min_t(unsigned int, sizeof(sec), optlen);
393+
if (copy_from_user((char *) &sec, optval, len)) {
394+
err = -EFAULT;
395+
break;
396+
}
397+
398+
if (sec.level < BT_SECURITY_LOW ||
399+
sec.level > BT_SECURITY_HIGH) {
400+
err = -EINVAL;
401+
break;
402+
}
403+
404+
l2cap_pi(sk)->sec_level = sec.level;
405+
break;
406+
407+
case BT_DEFER_SETUP:
408+
if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) {
409+
err = -EINVAL;
410+
break;
411+
}
412+
413+
if (get_user(opt, (u32 __user *) optval)) {
414+
err = -EFAULT;
415+
break;
416+
}
417+
418+
bt_sk(sk)->defer_setup = opt;
419+
break;
420+
421+
case BT_FLUSHABLE:
422+
if (get_user(opt, (u32 __user *) optval)) {
423+
err = -EFAULT;
424+
break;
425+
}
426+
427+
if (opt > BT_FLUSHABLE_ON) {
428+
err = -EINVAL;
429+
break;
430+
}
431+
432+
if (opt == BT_FLUSHABLE_OFF) {
433+
struct l2cap_conn *conn = l2cap_pi(sk)->conn;
434+
/* proceed futher only when we have l2cap_conn and
435+
No Flush support in the LM */
436+
if (!conn || !lmp_no_flush_capable(conn->hcon->hdev)) {
437+
err = -EINVAL;
438+
break;
439+
}
440+
}
441+
442+
l2cap_pi(sk)->flushable = opt;
443+
break;
444+
445+
default:
446+
err = -ENOPROTOOPT;
447+
break;
448+
}
449+
450+
release_sock(sk);
451+
return err;
452+
}
453+
279454
static int l2cap_sock_release(struct socket *sock)
280455
{
281456
struct sock *sk = sock->sk;

0 commit comments

Comments
 (0)