diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2004-12-26 21:15:16 +0100 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2004-12-26 21:15:16 +0100 |
commit | 9363d05dbe08f542892dd90d42f524c97097c922 (patch) | |
tree | e27b4345d9d678410b933a5d002634fd067944c0 /net | |
parent | 133ffc83209fcefb8fd9916865d638fc834d54fa (diff) | |
download | history-9363d05dbe08f542892dd90d42f524c97097c922.tar.gz |
[Bluetooth] Update socket option handling
This patch unifies the socket option handling across the L2CAP,
SCO and RFCOMM socket layers.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net')
-rw-r--r-- | net/bluetooth/l2cap.c | 18 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/core.c | 2 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/sock.c | 50 | ||||
-rw-r--r-- | net/bluetooth/sco.c | 5 |
4 files changed, 62 insertions, 13 deletions
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 6d133e55c0f4ad..3969c7ce67aaa8 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c @@ -57,7 +57,7 @@ #define BT_DBG(D...) #endif -#define VERSION "2.6" +#define VERSION "2.7" static struct proto_ops l2cap_sock_ops; @@ -798,7 +798,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch switch (optname) { case L2CAP_OPTIONS: len = min_t(unsigned int, sizeof(opts), optlen); - if (copy_from_user((char *)&opts, optval, len)) { + if (copy_from_user((char *) &opts, optval, len)) { err = -EFAULT; break; } @@ -807,7 +807,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch break; case L2CAP_LM: - if (get_user(opt, (u32 __user *)optval)) { + if (get_user(opt, (u32 __user *) optval)) { err = -EFAULT; break; } @@ -829,7 +829,9 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch struct sock *sk = sock->sk; struct l2cap_options opts; struct l2cap_conninfo cinfo; - int len, err = 0; + int len, err = 0; + + BT_DBG("sk %p", sk); if (get_user(len, optlen)) return -EFAULT; @@ -841,15 +843,16 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch opts.imtu = l2cap_pi(sk)->imtu; opts.omtu = l2cap_pi(sk)->omtu; opts.flush_to = l2cap_pi(sk)->flush_to; + opts.mode = 0x00; len = min_t(unsigned int, len, sizeof(opts)); - if (copy_to_user(optval, (char *)&opts, len)) + if (copy_to_user(optval, (char *) &opts, len)) err = -EFAULT; break; case L2CAP_LM: - if (put_user(l2cap_pi(sk)->link_mode, (u32 __user *)optval)) + if (put_user(l2cap_pi(sk)->link_mode, (u32 __user *) optval)) err = -EFAULT; break; @@ -860,9 +863,10 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch } cinfo.hci_handle = l2cap_pi(sk)->conn->hcon->handle; + memcpy(cinfo.dev_class, l2cap_pi(sk)->conn->hcon->dev_class, 3); len = min_t(unsigned int, len, sizeof(cinfo)); - if (copy_to_user(optval, (char *)&cinfo, len)) + if (copy_to_user(optval, (char *) &cinfo, len)) err = -EFAULT; break; diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 927a765d08a123..99d708cb26fdac 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c @@ -50,7 +50,7 @@ #include <net/bluetooth/l2cap.h> #include <net/bluetooth/rfcomm.h> -#define VERSION "1.3" +#define VERSION "1.4" #ifndef CONFIG_BT_RFCOMM_DEBUG #undef BT_DBG diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index a210d92853bf2f..3d3580b2accb24 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c @@ -51,6 +51,8 @@ #include <asm/uaccess.h> #include <net/bluetooth/bluetooth.h> +#include <net/bluetooth/hci_core.h> +#include <net/bluetooth/l2cap.h> #include <net/bluetooth/rfcomm.h> #ifndef CONFIG_BT_RFCOMM_DEBUG @@ -261,10 +263,18 @@ static void rfcomm_sock_close(struct sock *sk) static void rfcomm_sock_init(struct sock *sk, struct sock *parent) { + struct rfcomm_pinfo *pi = rfcomm_pi(sk); + BT_DBG("sk %p", sk); - if (parent) + if (parent) { sk->sk_type = parent->sk_type; + pi->link_mode = rfcomm_pi(parent)->link_mode; + } else { + pi->link_mode = 0; + } + + pi->dlc->link_mode = pi->link_mode; } static struct sock *rfcomm_sock_alloc(struct socket *sock, int proto, int prio) @@ -671,12 +681,22 @@ static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, c { struct sock *sk = sock->sk; int err = 0; + u32 opt; BT_DBG("sk %p", sk); lock_sock(sk); switch (optname) { + case RFCOMM_LM: + if (get_user(opt, (u32 __user *) optval)) { + err = -EFAULT; + break; + } + + rfcomm_pi(sk)->link_mode = opt; + break; + default: err = -ENOPROTOOPT; break; @@ -689,7 +709,9 @@ static int rfcomm_sock_setsockopt(struct socket *sock, int level, int optname, c static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen) { struct sock *sk = sock->sk; - int len, err = 0; + struct sock *l2cap_sk; + struct rfcomm_conninfo cinfo; + int len, err = 0; BT_DBG("sk %p", sk); @@ -699,10 +721,32 @@ static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optname, c lock_sock(sk); switch (optname) { + case RFCOMM_LM: + if (put_user(rfcomm_pi(sk)->link_mode, (u32 __user *) optval)) + err = -EFAULT; + break; + + case RFCOMM_CONNINFO: + if (sk->sk_state != BT_CONNECTED) { + err = -ENOTCONN; + break; + } + + l2cap_sk = rfcomm_pi(sk)->dlc->session->sock->sk; + + cinfo.hci_handle = l2cap_pi(l2cap_sk)->conn->hcon->handle; + memcpy(cinfo.dev_class, l2cap_pi(l2cap_sk)->conn->hcon->dev_class, 3); + + len = min_t(unsigned int, len, sizeof(cinfo)); + if (copy_to_user(optval, (char *) &cinfo, len)) + err = -EFAULT; + + break; + default: err = -ENOPROTOOPT; break; - }; + } release_sock(sk); return err; diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 55a26670578863..ac01c408238e59 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -56,7 +56,7 @@ #define BT_DBG(D...) #endif -#define VERSION "0.3" +#define VERSION "0.4" static struct proto_ops sco_sock_ops; @@ -705,6 +705,7 @@ static int sco_sock_getsockopt(struct socket *sock, int level, int optname, char } cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle; + memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3); len = min_t(unsigned int, len, sizeof(cinfo)); if (copy_to_user(optval, (char *)&cinfo, len)) @@ -1045,7 +1046,7 @@ static void __exit sco_exit(void) module_init(sco_init); module_exit(sco_exit); -MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>"); +MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); MODULE_DESCRIPTION("Bluetooth SCO ver " VERSION); MODULE_VERSION(VERSION); MODULE_LICENSE("GPL"); |