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:
Andrei Emeltchenko 2015-05-07 14:53:02 +03:00 committed by Anas Nashif
commit b7dddcff00
2 changed files with 64 additions and 1 deletions

View file

@ -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);
}

View file

@ -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;