#include "smp.h"
#define SMP_ALLOW_CMD(smp, code) set_bit(code, &smp->allow_cmd)
-#define SMP_DISALLOW_CMD(smp, code) clear_bit(code, &smp->allow_cmd)
#define SMP_TIMEOUT msecs_to_jiffies(30000)
(auth & SMP_AUTH_BONDING))
return SMP_PAIRING_NOTSUPP;
- SMP_DISALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
-
smp->preq[0] = SMP_CMD_PAIRING_REQ;
memcpy(&smp->preq[1], req, sizeof(*req));
skb_pull(skb, sizeof(*req));
if (conn->hcon->role != HCI_ROLE_MASTER)
return SMP_CMD_NOTSUPP;
- SMP_DISALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
-
skb_pull(skb, sizeof(*rsp));
req = (void *) &smp->preq[1];
if (skb->len < sizeof(smp->pcnf))
return SMP_INVALID_PARAMS;
- SMP_DISALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
-
memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
skb_pull(skb, sizeof(smp->pcnf));
if (skb->len < sizeof(smp->rrnd))
return SMP_INVALID_PARAMS;
- SMP_DISALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
-
memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
skb_pull(skb, sizeof(smp->rrnd));
if (skb->len < sizeof(*rp))
return SMP_INVALID_PARAMS;
- SMP_DISALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
skb_pull(skb, sizeof(*rp));
/* Mark the information as received */
smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
- SMP_DISALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
if (smp->remote_key_dist & SMP_DIST_ID_KEY)
SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
else if (smp->remote_key_dist & SMP_DIST_SIGN)
if (skb->len < sizeof(*info))
return SMP_INVALID_PARAMS;
- SMP_DISALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
skb_pull(skb, sizeof(*info));
/* Mark the information as received */
smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
- SMP_DISALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
if (smp->remote_key_dist & SMP_DIST_SIGN)
SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
/* Mark the information as received */
smp->remote_key_dist &= ~SMP_DIST_SIGN;
- SMP_DISALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
-
skb_pull(skb, sizeof(*rp));
hci_dev_lock(hdev);
if (code > SMP_CMD_MAX)
goto drop;
- if (smp && !test_bit(code, &smp->allow_cmd))
+ if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
goto drop;
/* If we don't have a context the only allowed commands are