Bluetooth: Add SMP Pairing Request skeleton
Add handling of SMP Pairing Request for Pairing Feature Exchange. In the beginning support Just Works pairing method. Change-Id: I8aab10683e9f26db4e0e9cb1bb9a8dc8940f0ab0 Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
This commit is contained in:
parent
d780f70339
commit
b7dddcff00
2 changed files with 64 additions and 1 deletions
|
@ -74,9 +74,42 @@ static void send_err_rsp(struct bt_conn *conn, uint8_t reason)
|
|||
bt_conn_send(conn, buf);
|
||||
}
|
||||
|
||||
static int smp_pairing_req(struct bt_conn *conn, struct bt_buf *buf)
|
||||
{
|
||||
struct bt_smp_pairing *req = (void *)buf->data;
|
||||
struct bt_smp_pairing *rsp;
|
||||
struct bt_buf *rsp_buf;
|
||||
|
||||
BT_DBG("\n");
|
||||
|
||||
if (buf->len != sizeof(*req))
|
||||
return BT_SMP_ERR_INVALID_PARAMS;
|
||||
|
||||
rsp_buf = bt_smp_create_pdu(conn, BT_SMP_CMD_PAIRING_RSP, sizeof(*rsp));
|
||||
if (!rsp_buf)
|
||||
return BT_SMP_ERR_UNSPECIFIED;
|
||||
|
||||
rsp = (void *)bt_buf_add(rsp_buf, sizeof(*rsp));
|
||||
|
||||
/* For JustWorks pairing simplify rsp parameters.
|
||||
* TODO: needs to be reworked later on
|
||||
*/
|
||||
rsp->auth_req = req->auth_req;
|
||||
rsp->io_capability = BT_SMP_IO_NO_INPUT_OUTPUT;
|
||||
rsp->oob_flag = BT_SMP_OOB_NOT_PRESENT;
|
||||
rsp->max_key_size = BT_SMP_MAX_ENC_KEY_SIZE;
|
||||
rsp->init_key_dist = 0;
|
||||
rsp->resp_key_dist = 0;
|
||||
|
||||
bt_conn_send(conn, rsp_buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void bt_smp_recv(struct bt_conn *conn, struct bt_buf *buf)
|
||||
{
|
||||
struct bt_smp_hdr *hdr = (void *)buf->data;
|
||||
int err;
|
||||
|
||||
if (buf->len < sizeof(*hdr)) {
|
||||
BT_ERR("Too small SMP PDU received\n");
|
||||
|
@ -88,12 +121,19 @@ void bt_smp_recv(struct bt_conn *conn, struct bt_buf *buf)
|
|||
bt_buf_pull(buf, sizeof(*hdr));
|
||||
|
||||
switch (hdr->code) {
|
||||
case BT_SMP_CMD_PAIRING_REQ:
|
||||
err = smp_pairing_req(conn, buf);
|
||||
break;
|
||||
default:
|
||||
BT_DBG("Unhandled SMP code %u\n", hdr->code);
|
||||
send_err_rsp(conn, BT_SMP_ERR_CMD_NOTSUPP);
|
||||
err = BT_SMP_ERR_CMD_NOTSUPP;
|
||||
break;
|
||||
}
|
||||
|
||||
if (err) {
|
||||
send_err_rsp(conn, err);
|
||||
}
|
||||
|
||||
done:
|
||||
bt_buf_put(buf);
|
||||
}
|
||||
|
|
|
@ -52,6 +52,29 @@ struct bt_smp_hdr {
|
|||
#define BT_SMP_ERR_BREDR_PAIRING_IN_PROGRESS 0x0d
|
||||
#define BT_SMP_ERR_CROSS_TRANSP_NOT_ALLOWED 0x0e
|
||||
|
||||
#define BT_SMP_IO_DISPLAY_ONLY 0x00
|
||||
#define BT_SMP_IO_DISPLAY_YESNO 0x01
|
||||
#define BT_SMP_IO_KEYBOARD_ONLY 0x02
|
||||
#define BT_SMP_IO_NO_INPUT_OUTPUT 0x03
|
||||
#define BT_SMP_IO_KEYBOARD_DISPLAY 0x04
|
||||
|
||||
#define BT_SMP_OOB_NOT_PRESENT 0x00
|
||||
#define BT_SMP_OOB_PRESENT 0x01
|
||||
|
||||
#define BT_SMP_MIN_ENC_KEY_SIZE 7
|
||||
#define BT_SMP_MAX_ENC_KEY_SIZE 16
|
||||
|
||||
#define BT_SMP_CMD_PAIRING_REQ 0x01
|
||||
#define BT_SMP_CMD_PAIRING_RSP 0x02
|
||||
struct bt_smp_pairing {
|
||||
uint8_t io_capability;
|
||||
uint8_t oob_flag;
|
||||
uint8_t auth_req;
|
||||
uint8_t max_key_size;
|
||||
uint8_t init_key_dist;
|
||||
uint8_t resp_key_dist;
|
||||
} PACK_STRUCT;
|
||||
|
||||
#define BT_SMP_CMD_PAIRING_FAIL 0x05
|
||||
struct bt_smp_pairing_fail {
|
||||
uint8_t reason;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue