zephyr/include/bluetooth/bluetooth.h
Szymon Janc 48249bf34a Bluetooth: Add public API for passkey confirmation
This allows to request user to confirm displayed passkey with remote
device. This allows to have authenticated LE SC link resulting in FIPS
security level.

Change-Id: I5b6c1666e3d1687cc04c5d66529372db090dd000
Signed-off-by: Szymon Janc <ext.szymon.janc@tieto.com>
2016-02-05 20:24:51 -05:00

244 lines
7.4 KiB
C

/** @file
* @brief Bluetooth subsystem core APIs.
*/
/*
* Copyright (c) 2015 Intel Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __BT_BLUETOOTH_H
#define __BT_BLUETOOTH_H
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <bluetooth/hci.h>
#include <bluetooth/conn.h>
/** @brief Callback for notifying that Bluetooth has been enabled.
*
* @param err zero on success or (negative) error code otherwise.
*/
typedef void (*bt_ready_cb_t)(int err);
/** @brief Enable Bluetooth
*
* Enable Bluetooth. Must be the called before any calls that
* require communication with the local Bluetooth hardware.
*
* @param cb Callback to notify completion or NULL to perform the
* enabling synchronously.
*
* @return Zero on success or (negative) error code otherwise.
*/
int bt_enable(bt_ready_cb_t cb);
/* Advertising API */
struct bt_eir {
uint8_t len;
uint8_t type;
uint8_t data[29];
} __packed;
/** @brief Define a type allowing user to implement a function that can
* be used to get back active LE scan results.
*
* A function of this type will be called back when user application
* triggers active LE scan. The caller will populate all needed
* parameters based on data coming from scan result.
* Such function can be set by user when LE active scan API is used.
*
* @param addr Advertiser LE address and type.
* @param rssi Strength of advertiser signal.
* @param adv_type Type of advertising response from advertiser.
* @param adv_data Address of buffer containig advertiser data.
* @param len Length of advertiser data contained in buffer.
*/
typedef void bt_le_scan_cb_t(const bt_addr_le_t *addr, int8_t rssi,
uint8_t adv_type, const uint8_t *adv_data,
uint8_t len);
/** @brief Start advertising
*
* Set advertisement data, scan response data, advertisement parameters
* and start advertising.
*
* @param type Advertising type.
* @param ad Data to be used in advertisement packets.
* @param sd Data to be used in scan response packets.
*
* @return Zero on success or (negative) error code otherwise.
*/
int bt_start_advertising(uint8_t type, const struct bt_eir *ad,
const struct bt_eir *sd);
/** @brief Stop advertising
*
* Stops ongoing advertising.
*
* @return Zero on success or (negative) error code otherwise.
*/
int bt_stop_advertising(void);
/** Filter out duplicate scanning results. **/
typedef enum {
BT_SCAN_FILTER_DUP_DISABLE,
BT_SCAN_FILTER_DUP_ENABLE,
} bt_scan_filter_dup_t;
/** @brief Start (LE) scanning
*
* Start LE scanning with and provide results through the specified
* callback.
*
* @param filter_dups Enable duplicate filtering (or not).
* @param cb Callback to notify scan results.
*
* @return Zero on success or error code otherwise, positive in case
* of protocol error or negative (POSIX) in case of stack internal error
*/
int bt_start_scanning(bt_scan_filter_dup_t filter, bt_le_scan_cb_t cb);
/** @brief Stop (LE) scanning.
*
* Stops ongoing LE scanning.
*
* @return Zero on success or error code otherwise, positive in case
* of protocol error or negative (POSIX) in case of stack internal error
*/
int bt_stop_scanning(void);
#if defined(CONFIG_BLUETOOTH_SMP)
/** Authenticated pairing callback structure */
struct bt_auth_cb {
void (*passkey_display)(struct bt_conn *conn, unsigned int passkey);
void (*passkey_entry)(struct bt_conn *conn);
void (*passkey_confirm)(struct bt_conn *conn, unsigned int passkey);
void (*cancel)(struct bt_conn *conn);
};
/** @brief Register authentication callbacks.
*
* Register callbacks to handle authenticated pairing. Passing NULL unregisters
* previous callbacks structure.
*
* @param cb Callback struct.
*
* @return Zero on success or negative error code otherwise
*/
int bt_auth_cb_register(const struct bt_auth_cb *cb);
/** @brief Reply with entered passkey.
*
* This function should be called only after passkey_entry callback from
* bt_auth_cb structure was called.
*
* @param conn Connection object.
* @param passkey Entered passkey.
*/
void bt_auth_passkey_entry(struct bt_conn *conn, unsigned int passkey);
/** @brief Cancel ongoing authenticated pairing.
*
* This function allows to cancel ongoing authenticated pairing.
*
* @param conn Connection object.
*/
void bt_auth_cancel(struct bt_conn *conn);
/** @brief Reply if passkey was confirmed by user.
*
* This function should be called only after passkey_confirm callback from
* bt_auth_cb structure was called. If passkey is confirmed to match then match
* should be true. Otherwise match should be false.
*
* @param conn Connection object.
* @param match True if passkey was confirmed to match, false otherwise.
*/
void bt_auth_passkey_confirm(struct bt_conn *conn, bool match);
#endif /* CONFIG_BLUETOOTH_SMP */
/** @def BT_ADDR_STR_LEN
*
* @brief Recommended length of user string buffer for Bluetooth address
*
* @details The recommended length guarantee the output of address
* conversion will not lose valuable information about address being
* processed.
*/
#define BT_ADDR_STR_LEN 18
/** @def BT_ADDR_LE_STR_LEN
*
* @brief Recommended length of user string buffer for Bluetooth LE address
*
* @details The recommended length guarantee the output of address
* conversion will not lose valuable information about address being
* processed.
*/
#define BT_ADDR_LE_STR_LEN 27
/** @brief Converts binary Bluetooth address to string.
*
* @param addr Address of buffer containing binary Bluetooth address.
* @param str Address of user buffer with enough room to store formatted
* string containing binary address.
* @param len Length of data to be copied to user string buffer. Refer to
* BT_ADDR_STR_LEN about recommended value.
*
* @return Number of successfully formatted bytes from binary address.
*/
static inline int bt_addr_to_str(const bt_addr_t *addr, char *str, size_t len)
{
return snprintf(str, len, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
addr->val[5], addr->val[4], addr->val[3],
addr->val[2], addr->val[1], addr->val[0]);
}
/** @brief Converts binary LE Bluetooth address to string.
*
* @param addr Address of buffer containing binary LE Bluetooth address.
* @param user_buf Address of user buffer with enough room to store
* formatted string containing binary LE address.
* @param len Length of data to be copied to user string buffer. Refer to
* BT_ADDR_LE_STR_LEN about recommended value.
*
* @return Number of successfully formatted bytes from binary address.
*/
static inline int bt_addr_le_to_str(const bt_addr_le_t *addr, char *str,
size_t len)
{
char type[7];
switch (addr->type) {
case BT_ADDR_LE_PUBLIC:
strcpy(type, "public");
break;
case BT_ADDR_LE_RANDOM:
strcpy(type, "random");
break;
default:
sprintf(type, "0x%02x", addr->type);
break;
}
return snprintf(str, len, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X (%s)",
addr->val[5], addr->val[4], addr->val[3],
addr->val[2], addr->val[1], addr->val[0], type);
}
#endif /* __BT_BLUETOOTH_H */