Hi Grzegorz, > 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: Grzegorz Kolodziejczyk <grzegorz.kolodziejczyk@xxxxxxxxx> > --- > net/bluetooth/bnep/bnep.h | 3 +++ > net/bluetooth/bnep/core.c | 10 +++++++++- > net/bluetooth/bnep/sock.c | 2 +- > 3 files changed, 13 insertions(+), 2 deletions(-) > > diff --git a/net/bluetooth/bnep/bnep.h b/net/bluetooth/bnep/bnep.h > index 8709733..40854c9 100644 > --- a/net/bluetooth/bnep/bnep.h > +++ b/net/bluetooth/bnep/bnep.h > @@ -113,6 +113,9 @@ struct bnep_ext_hdr { > #define BNEPGETCONNINFO _IOR('B', 211, int) > #define BNEPGETSUPPFEAT _IOR('B', 212, int) > > +#define BNEP_SETUP_RESPONSE 0 > +#define BNEP_SETUP_RSP_SENT 10 > + > struct bnep_connadd_req { > int sock; /* Connected socket */ > __u32 flags; > diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c > index 77ae725..2135b89 100644 > --- a/net/bluetooth/bnep/core.c > +++ b/net/bluetooth/bnep/core.c > @@ -231,7 +231,14 @@ static int bnep_rx_control(struct bnep_session *s, void *data, int len) > break; > > 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; > > default: { > @@ -592,6 +599,7 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) > s->sock = sock; > s->role = req->role; > s->state = BT_CONNECTED; > + s->flags = req->flags & (1 << BNEP_SETUP_RESPONSE); Use BIT() here as well. However this is not really what I asked for. What I asked for was to actually reject any flags that do not have 0 or BIT(0) set. I mean you would just create a mask for this. > s->msg.msg_flags = MSG_NOSIGNAL; > > diff --git a/net/bluetooth/bnep/sock.c b/net/bluetooth/bnep/sock.c > index f18b6bd..116e7d3 100644 > --- a/net/bluetooth/bnep/sock.c > +++ b/net/bluetooth/bnep/sock.c > @@ -58,7 +58,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long > struct socket *nsock; > void __user *argp = (void __user *)arg; > int err; > - const __u32 supp_feat = 0; > + const __u32 supp_feat = BIT(BNEP_SETUP_RESPONSE); > > > BT_DBG("cmd %x arg %lx", cmd, arg); Regards Marcel -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html