Bluetooth: bnep: Add support for get bnep features via ioctl
authorGrzegorz Kolodziejczyk <grzegorz.kolodziejczyk@tieto.com>
Fri, 3 Apr 2015 10:14:53 +0000 (12:14 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 3 Apr 2015 21:21:34 +0000 (23:21 +0200)
This is needed if user space wants to know supported bnep features
by kernel, e.g. if kernel supports sending response to bnep setup
control message. By now there is no possibility to know supported
features by kernel in case of bnep. Ioctls allows only to add connection,
delete connection, get connection list, get connection info. Adding
connection if it's possible (establishing network device connection) is
equivalent to starting bnep session. Bnep session handles data queue of
transmit, receive messages over bnep channel. It means that if we add
connection the received/transmitted data will be parsed immediately. In
case of get bnep features we want to know before session start, if we
should leave setup data on socket queue and let kernel to handle with it,
or in case of no setup handling support, if we should pull this message
and handle setup response within user space.

Signed-off-by: Grzegorz Kolodziejczyk <grzegorz.kolodziejczyk@tieto.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
fs/compat_ioctl.c
net/bluetooth/bnep/bnep.h
net/bluetooth/bnep/sock.c

index afec6450450ff08e6be4c1cd7a05dbc293ef0a76..6b8e2f091f5b8fd71d63d545ea5fe9ae593d7688 100644 (file)
@@ -570,6 +570,7 @@ static int mt_ioctl_trans(unsigned int fd, unsigned int cmd, void __user *argp)
 #define BNEPCONNDEL    _IOW('B', 201, int)
 #define BNEPGETCONNLIST        _IOR('B', 210, int)
 #define BNEPGETCONNINFO        _IOR('B', 211, int)
+#define BNEPGETSUPPFEAT        _IOR('B', 212, int)
 
 #define CMTPCONNADD    _IOW('C', 200, int)
 #define CMTPCONNDEL    _IOW('C', 201, int)
@@ -1247,6 +1248,7 @@ COMPATIBLE_IOCTL(BNEPCONNADD)
 COMPATIBLE_IOCTL(BNEPCONNDEL)
 COMPATIBLE_IOCTL(BNEPGETCONNLIST)
 COMPATIBLE_IOCTL(BNEPGETCONNINFO)
+COMPATIBLE_IOCTL(BNEPGETSUPPFEAT)
 COMPATIBLE_IOCTL(CMTPCONNADD)
 COMPATIBLE_IOCTL(CMTPCONNDEL)
 COMPATIBLE_IOCTL(CMTPGETCONNLIST)
index 5a5b16f365e9baae89f345b22930f1109e5f0b4c..8709733c12a7d492301119e9ff2ced80da153f6c 100644 (file)
@@ -111,6 +111,7 @@ struct bnep_ext_hdr {
 #define BNEPCONNDEL    _IOW('B', 201, int)
 #define BNEPGETCONNLIST        _IOR('B', 210, int)
 #define BNEPGETCONNINFO        _IOR('B', 211, int)
+#define BNEPGETSUPPFEAT        _IOR('B', 212, int)
 
 struct bnep_connadd_req {
        int   sock;             /* Connected socket */
index 5f051290dabab83ec76422dbb7cd44732b22eb6e..5766e6b66dbbe238767510edb2d27d2fd1784ec2 100644 (file)
@@ -57,6 +57,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
        struct bnep_conninfo ci;
        struct socket *nsock;
        void __user *argp = (void __user *)arg;
+       __u32 supp_feat = 0;
        int err;
 
        BT_DBG("cmd %x arg %lx", cmd, arg);
@@ -120,6 +121,12 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
 
                return err;
 
+       case BNEPGETSUPPFEAT:
+               if (copy_to_user(argp, &supp_feat, sizeof(supp_feat)))
+                       return -EFAULT;
+
+               return 0;
+
        default:
                return -EINVAL;
        }