|
|
@@ -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: {
|
|
|
@@ -551,7 +558,7 @@ static struct device_type bnep_type = {
|
|
|
|
|
|
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 bnep_session *s, *ss;
|
|
|
u8 dst[ETH_ALEN], src[ETH_ALEN];
|
|
|
@@ -596,6 +603,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;
|
|
|
|
|
|
s->msg.msg_flags = MSG_NOSIGNAL;
|
|
|
|
|
|
@@ -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)
|
|
|
{
|
|
|
- u32 valid_flags = 0;
|
|
|
+ u32 valid_flags = BIT(BNEP_SETUP_RESPONSE);
|
|
|
|
|
|
memset(ci, 0, sizeof(*ci));
|
|
|
memcpy(ci->dst, s->eh.h_source, ETH_ALEN);
|