Commit 836a061b authored by Grzegorz Kolodziejczyk's avatar Grzegorz Kolodziejczyk Committed by Marcel Holtmann

Bluetooth: bnep: Handle BNEP connection setup request

With this patch kernel will be able to handle setup request. This is
needed if we would like to handle control mesages with extension
headers. User space will be only resposible for reading setup data and
checking if scenario is conformance to specification (dst and src device
bnep role). In case of new user space, setup data must be leaved(peek
msg) on queue. New bnep session will be responsible for handling this
data.
Signed-off-by: default avatarGrzegorz Kolodziejczyk <grzegorz.kolodziejczyk@tieto.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent bf8b9a9c
...@@ -113,6 +113,9 @@ struct bnep_ext_hdr { ...@@ -113,6 +113,9 @@ struct bnep_ext_hdr {
#define BNEPGETCONNINFO _IOR('B', 211, int) #define BNEPGETCONNINFO _IOR('B', 211, int)
#define BNEPGETSUPPFEAT _IOR('B', 212, int) #define BNEPGETSUPPFEAT _IOR('B', 212, int)
#define BNEP_SETUP_RESPONSE 0
#define BNEP_SETUP_RSP_SENT 10
struct bnep_connadd_req { struct bnep_connadd_req {
int sock; /* Connected socket */ int sock; /* Connected socket */
__u32 flags; __u32 flags;
......
...@@ -231,7 +231,14 @@ static int bnep_rx_control(struct bnep_session *s, void *data, int len) ...@@ -231,7 +231,14 @@ static int bnep_rx_control(struct bnep_session *s, void *data, int len)
break; break;
case BNEP_SETUP_CONN_REQ: case BNEP_SETUP_CONN_REQ:
err = bnep_send_rsp(s, BNEP_SETUP_CONN_RSP, BNEP_CONN_NOT_ALLOWED); /* Successful response should be sent only once */
if (test_bit(BNEP_SETUP_RESPONSE, &s->flags) &&
!test_and_set_bit(BNEP_SETUP_RSP_SENT, &s->flags))
err = bnep_send_rsp(s, BNEP_SETUP_CONN_RSP,
BNEP_SUCCESS);
else
err = bnep_send_rsp(s, BNEP_SETUP_CONN_RSP,
BNEP_CONN_NOT_ALLOWED);
break; break;
default: { default: {
...@@ -551,7 +558,7 @@ static struct device_type bnep_type = { ...@@ -551,7 +558,7 @@ static struct device_type bnep_type = {
int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
{ {
u32 valid_flags = 0; u32 valid_flags = BIT(BNEP_SETUP_RESPONSE);
struct net_device *dev; struct net_device *dev;
struct bnep_session *s, *ss; struct bnep_session *s, *ss;
u8 dst[ETH_ALEN], src[ETH_ALEN]; u8 dst[ETH_ALEN], src[ETH_ALEN];
...@@ -596,6 +603,7 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) ...@@ -596,6 +603,7 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
s->sock = sock; s->sock = sock;
s->role = req->role; s->role = req->role;
s->state = BT_CONNECTED; s->state = BT_CONNECTED;
s->flags = req->flags;
s->msg.msg_flags = MSG_NOSIGNAL; s->msg.msg_flags = MSG_NOSIGNAL;
...@@ -665,7 +673,7 @@ int bnep_del_connection(struct bnep_conndel_req *req) ...@@ -665,7 +673,7 @@ int bnep_del_connection(struct bnep_conndel_req *req)
static void __bnep_copy_ci(struct bnep_conninfo *ci, struct bnep_session *s) static void __bnep_copy_ci(struct bnep_conninfo *ci, struct bnep_session *s)
{ {
u32 valid_flags = 0; u32 valid_flags = BIT(BNEP_SETUP_RESPONSE);
memset(ci, 0, sizeof(*ci)); memset(ci, 0, sizeof(*ci));
memcpy(ci->dst, s->eh.h_source, ETH_ALEN); memcpy(ci->dst, s->eh.h_source, ETH_ALEN);
......
...@@ -57,7 +57,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long ...@@ -57,7 +57,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
struct bnep_conninfo ci; struct bnep_conninfo ci;
struct socket *nsock; struct socket *nsock;
void __user *argp = (void __user *)arg; void __user *argp = (void __user *)arg;
__u32 supp_feat = 0; __u32 supp_feat = BIT(BNEP_SETUP_RESPONSE);
int err; int err;
BT_DBG("cmd %x arg %lx", cmd, arg); BT_DBG("cmd %x arg %lx", cmd, arg);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment