| /** @file |
| * @brief Internal API for Generic Attribute Profile handling. |
| */ |
| |
| /* |
| * Copyright (c) 2016 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. |
| */ |
| |
| #include <stdint.h> |
| |
| #include <bluetooth/gatt.h> |
| |
| /* Forward declarations */ |
| struct nble_core_response; |
| |
| /* Max number of service supported, if changed update BLE core needs to be |
| * updated too! |
| */ |
| #define BLE_GATTS_MAX_SERVICES 10 |
| |
| /* |
| * Internal APIs used between host and BLE controller |
| * Typically they are required if gatt.h APIs can not be mapped 1:1 onto |
| * controller API |
| */ |
| |
| /** |
| * GATT indication types. |
| */ |
| enum BLE_GATT_IND_TYPES { |
| BLE_GATT_IND_TYPE_NONE = 0, |
| BLE_GATT_IND_TYPE_NOTIFICATION, |
| BLE_GATT_IND_TYPE_INDICATION, |
| }; |
| |
| /** GATT Register structure for one service */ |
| struct nble_gatt_register_req { |
| /**< Base address of the attribute table in the Quark mem space */ |
| struct bt_gatt_attr *attr_base; |
| uint8_t attr_count; /**< Number of of attributes in this service */ |
| }; |
| |
| /** GATT Register structure for one service */ |
| struct nble_gatt_register_rsp { |
| int status; /**< Status of the registration op */ |
| struct bt_gatt_attr *attr_base; /**< Pointer to the registered table */ |
| uint8_t attr_count; /**< Number of attributes added */ |
| }; |
| |
| /** Service index and Attribute index mapping structure. |
| * |
| * Mapping index into attribute tables as registered with bt_gatt_register/ |
| * nble_gatt_register. |
| */ |
| struct nble_gatt_attr_handle_mapping { |
| uint8_t svc_idx; /**< Service index */ |
| uint8_t attr_idx; /**< Attribute index into service attribute table */ |
| }; |
| |
| enum BLE_GATTS_WR_OPS { |
| BLE_GATTS_OP_NONE = 0, |
| /**< 3.4.5.1 Write Request (Attribute), expects write response */ |
| BLE_GATTS_OP_WR, |
| /**< 3.4.5.3 Write Command (Attribute) NO response sent */ |
| BLE_GATTS_OP_WR_CMD, |
| /**< 3.4.5.4 Write Command Signed (Attribute), NO response sent */ |
| BLE_GATTS_OP_WR_CMD_SIGNED, |
| /**< 3.4.6.1 Write Prepare Request, expects a prepare write request |
| * response |
| */ |
| BLE_GATTS_OP_WR_PREP_REQ, |
| /**< 3.4.6.3 Cancel Executed Write Request, cancel and clear queue |
| * (flags = 0) |
| */ |
| BLE_GATTS_OP_WR_EXE_REQ_CANCEL, |
| /**< 3.4.6.3 Immediately Execute Write Request */ |
| BLE_GATTS_OP_WR_EXE_REQ_IMM |
| }; |
| |
| /** |
| * Write event context data structure. |
| */ |
| struct nble_gatt_wr_evt { |
| struct bt_gatt_attr *attr; /**< GATT Attribute */ |
| uint16_t conn_handle; /**< Connection handle */ |
| uint16_t attr_handle; /**< handle of attribute to write */ |
| uint16_t offset; /**< offset in attribute buffer */ |
| uint8_t reply; /**< 1 if reply required, 0 otherwise */ |
| }; |
| |
| /** |
| * Read event context data structure. |
| */ |
| struct nble_gatt_rd_evt { |
| struct bt_gatt_attr *attr; /**< GATT Attribute */ |
| uint16_t conn_handle; /**< Connection handle */ |
| uint16_t attr_handle; /**< handle of attribute to write */ |
| uint16_t offset; /**< offset in attribute buffer */ |
| }; |
| |
| struct nble_gatts_rw_reply_params { |
| int status; /**< Reply status, from errno */ |
| uint16_t conn_handle; /**< Connection handle */ |
| uint16_t offset; /**< Offset in attribute buffer */ |
| uint8_t write_reply; /**< 0 if read reply, otherwise rsp */ |
| }; |
| |
| /** |
| * Notification/Indication parameters |
| */ |
| struct nble_gatt_notif_ind_params { |
| struct bt_gatt_attr *attr; |
| uint16_t offset; |
| }; |
| |
| /** |
| * Indication or notification. |
| */ |
| |
| struct nble_gatt_send_notif_ind_params { |
| void *cback; |
| uint16_t conn_handle; |
| struct nble_gatt_notif_ind_params params; |
| }; |
| |
| enum nble_gatts_notif_ind_type { |
| MSG_ID_BLE_GATTS_SEND_NOTIF_RSP, /**< Notification type */ |
| MSG_ID_BLE_GATTS_SEND_IND_RSP, /**< Indication type */ |
| }; |
| |
| struct nble_gatt_notif_ind_rsp { |
| bt_gatt_notify_func_t cback; |
| int status; |
| uint16_t conn_handle; |
| struct bt_gatt_attr *attr; |
| }; |
| |
| /** |
| * Attribute handle range definition. |
| */ |
| struct nble_gatt_handle_range { |
| uint16_t start_handle; |
| uint16_t end_handle; |
| }; |
| |
| /** |
| * Primary service |
| */ |
| struct nble_gattc_prim_svc { |
| uint16_t handle; /**< Attribute handle */ |
| struct nble_gatt_handle_range handle_range; /**< handle range */ |
| struct bt_uuid_128 uuid; /**< Attribute's UUID */ |
| }; |
| |
| /** |
| * Generic GATTC response message. |
| */ |
| struct nble_gattc_rsp { |
| int status; |
| uint16_t conn_handle; /**< GAP connection handle */ |
| }; |
| |
| struct nble_gattc_disc_rsp { |
| int status; |
| uint16_t conn_handle; |
| uint8_t type; /**< @ref BLE_GATT_DISC_TYPES */ |
| }; |
| |
| struct nble_gattc_evt { |
| uint16_t conn_handle; |
| int status; |
| }; |
| |
| /** |
| * Included service. |
| */ |
| struct nble_gattc_incl_svc { |
| uint16_t handle; /**< Handle of included svc */ |
| struct nble_gatt_handle_range handle_range; /**< handle range */ |
| struct bt_uuid_128 uuid; /**< Service UUID */ |
| }; |
| |
| /* GATTC characteristic */ |
| struct nble_gattc_characteristic { |
| uint16_t handle; /**< Characteristic Definition handle */ |
| uint8_t prop; /**< Characteristic property */ |
| uint16_t value_handle; /**< Characteristic value handle */ |
| struct bt_uuid_128 uuid; /**< Characteristic UUID */ |
| }; |
| |
| |
| /** |
| * GATTC descriptor. |
| */ |
| struct nble_gattc_descriptor { |
| uint16_t handle; /**< descriptor handle */ |
| struct bt_uuid_128 uuid; /**< uuid of the descriptor */ |
| }; |
| |
| struct nble_gattc_attr { |
| uint8_t type; /**< @ref BLE_GATT_DISC_TYPES */ |
| union { |
| struct nble_gattc_prim_svc prim; |
| struct nble_gattc_incl_svc incls; |
| struct nble_gattc_characteristic chars; |
| struct nble_gattc_descriptor desc; |
| }; |
| }; |
| |
| struct nble_gatts_set_attribute_params { |
| uint16_t value_handle; /* mandatory */ |
| uint16_t offset; /* by default 0 */ |
| }; |
| |
| struct nble_gatts_get_attribute_params { |
| uint16_t value_handle; /* mandatory */ |
| }; |
| |
| struct nble_gatts_attribute_rsp { |
| int status; /**< Status of the operation. */ |
| uint16_t value_handle; /* mandatory */ |
| void *priv; |
| }; |
| |
| /** |
| * Set an attribute value. |
| * |
| * The response to this request is received through @ref |
| * on_ble_gatts_send_svc_changed_rsp |
| * |
| * @param par Attribute parameters |
| * @param data Attribute value data to write |
| * @param len Length of attribute value to write |
| * @param priv Pointer to private data |
| */ |
| void nble_gatts_set_attribute_value_req(const struct nble_gatts_set_attribute_params *par, |
| uint8_t *data, uint8_t len, void *priv); |
| |
| /** |
| * Response to @ref nble_gatts_send_svc_changed_req. |
| * |
| * @param rsp Response |
| */ |
| void on_ble_gatts_set_attribute_value_rsp(const struct nble_gatts_attribute_rsp *rsp); |
| |
| /** |
| * Get an attribute value. |
| * |
| * The response to this request is received through @ref |
| * on_ble_gatts_get_attribute_value_rsp |
| * |
| * @param par Getting attribute parameters |
| * @param priv Pointer to private data |
| */ |
| void nble_gatts_get_attribute_value_req(const struct nble_gatts_get_attribute_params *par, |
| void *priv); |
| |
| /** |
| * Response to @ref nble_gatts_get_attribute_value_req. |
| * |
| * @param rsp Response |
| * @param data Attribute value |
| * @param length Length of attribute value |
| */ |
| void on_ble_gatts_get_attribute_value_rsp(const struct nble_gatts_attribute_rsp *rsp, |
| uint8_t *data, uint8_t length); |
| |
| struct nble_gatts_svc_changed_params { |
| uint16_t conn_handle; |
| uint16_t start_handle; |
| uint16_t end_handle; |
| }; |
| |
| /** |
| * Send a service change indication. |
| * |
| * The response to this request is received through @ref |
| * on_ble_gatts_send_svc_changed_rsp |
| * |
| * @note Not yet supported |
| * |
| * @param par Service parameters |
| * @param priv Pointer to private data |
| */ |
| void nble_gatts_send_svc_changed_req(const struct nble_gatts_svc_changed_params *par, |
| void *priv); |
| |
| /** |
| * Response to @ref nble_gatts_send_svc_changed_req. |
| * |
| * @param par Response |
| */ |
| void on_ble_gatts_send_svc_changed_rsp(const struct nble_core_response *par); |
| |
| /** Register a BLE GATT Service. |
| * |
| * @param par Parameters of attribute data base |
| * @param attr Serialized attribute buffer |
| * @param attr_len Length of buffer |
| */ |
| void nble_gatt_register_req(const struct nble_gatt_register_req *par, |
| uint8_t *buf, uint16_t len); |
| |
| /** |
| * Reply to an authorize request. |
| * |
| * @param par parameters for the reply |
| * @param buf read value of the attribute |
| * @param len length of buf |
| */ |
| void nble_gatts_authorize_reply_req(const struct nble_gatts_rw_reply_params *par, |
| uint8_t *buf, uint16_t len); |
| |
| /** |
| * Conversion table entry nble_core to host attr index |
| * |
| * This is returned as a table on registering. |
| */ |
| struct nble_gatt_attr_handles { |
| uint16_t handle; /* handle from ble controller should be sufficient */ |
| }; |
| |
| /** Response to registering a BLE GATT Service. |
| * |
| * The returned buffer contains an array (@ref nble_gatt_attr_idx_entry)with the |
| * corresponding handles. |
| * |
| * @param par Parameters of attribute data base |
| * @param attr Returned attributes index list |
| * @param len Length of buffer |
| */ |
| void on_nble_gatt_register_rsp(const struct nble_gatt_register_rsp *par, |
| const struct nble_gatt_attr_handles *attr, |
| uint8_t len); |
| |
| /** |
| * Function invoked by the BLE core when a write occurs. |
| * |
| * @param ev Pointer to the event structure |
| * @param buf Pointer to data buffer |
| * @param len Buffer length |
| */ |
| void on_ble_gatts_write_evt(const struct nble_gatt_wr_evt *ev, |
| const uint8_t *buf, uint8_t len); |
| |
| /** |
| * Retrieves handle based on attribute array and index of attribute |
| * |
| * @param attrs Attribute array |
| * @param index Index of attribute |
| * |
| * @return Handle of attribute or 0 if not found |
| */ |
| uint16_t nble_attr_idx_to_handle(const struct bt_gatt_attr *attrs, |
| uint8_t index); |
| |
| /** |
| * Send notification. |
| * |
| * The response to this request is received through @ref |
| * on_ble_gatts_send_notif_ind_rsp |
| * |
| * @param par Notification parameters |
| * @param data Indication data to write |
| * @param length Length of indication - may be 0, in this case already |
| * stored data is sent |
| */ |
| void nble_gatt_send_notif_req(const struct nble_gatt_send_notif_ind_params *par, |
| uint8_t *data, uint16_t length); |
| |
| /** |
| * Send indication. |
| * |
| * The response to this request is received through @ref |
| * on_ble_gatts_send_notif_ind_rsp |
| * |
| * @param par Indication parameters |
| * @param data Indication data to write |
| * @param length Length of indication - may be 0, in this case already |
| * stored data is sent |
| */ |
| void nble_gatt_send_ind_req(const struct nble_gatt_send_notif_ind_params *par, |
| uint8_t *data, uint8_t length); |
| |
| /** |
| * Response to @ref nble_gatts_send_ind_req and @ref nble_gatts_send_notif_req |
| * |
| * @param par Response |
| */ |
| void on_ble_gatts_send_notif_ind_rsp(const struct nble_gatt_notif_ind_rsp *par); |
| |
| /** Discover parameters. */ |
| struct nble_discover_params { |
| struct bt_uuid_128 uuid; /**< Attribute UUID */ |
| struct nble_gatt_handle_range handle_range; /**< Discover range */ |
| uint16_t conn_handle; /**< Connection handl */ |
| /**< Discover type @ref BLE_GATT_DISC_TYPES */ |
| uint8_t type; |
| }; |
| |
| /** |
| * Discover service. |
| * |
| * @param req Request structure. |
| * @param user_data Pointer to private data. |
| */ |
| void nble_gattc_discover_req(const struct nble_discover_params *req, |
| void *user_data); |
| |
| /** |
| * Response to @ref nble_gattc_discover_req. |
| * |
| * @param rsp Response |
| * @param data Pointer to the data |
| * @param len Length of the data |
| */ |
| void on_ble_gattc_discover_rsp(const struct nble_gattc_disc_rsp *rsp, |
| const uint8_t *data, uint8_t len); |
| |
| |
| /** GATT Attribute stream structure. |
| * |
| * This structure is a "compressed" copy of @ref bt_gatt_attr. |
| * UUID pointer and user_data pointer are used as offset into buffer itself. |
| * The offset is from the beginning of the buffer. therefore a value of 0 |
| * means that UUID or user_data is not present. */ |
| struct nble_gatt_attr { |
| /** Attribute permissions */ |
| uint16_t perm; |
| /** Attribute variable data size */ |
| uint16_t data_size; |
| /** |
| * Attribute variable data: always starts with the UUID and |
| * data follows |
| */ |
| uint8_t data[0]; |
| }; |
| |
| struct nble_gattc_read_params { |
| uint16_t conn_handle; /**< Connection handle*/ |
| uint16_t char_handle; /**< Handle of the attribute to be read */ |
| uint16_t offset; /**< Offset into the attr value to be read */ |
| }; |
| |
| struct nble_gattc_read_rsp { |
| uint16_t conn_handle; |
| int status; |
| uint16_t handle; /**< handle of char attr read */ |
| uint16_t offset; /**< offset of data returned */ |
| }; |
| |
| struct nble_gattc_write_params { |
| uint16_t conn_handle; /**< Connection handle*/ |
| uint16_t char_handle; /**< Handle of the attribute to be read */ |
| uint16_t offset; /**< Offset into the attr value to be write */ |
| bool with_resp; /**< Equal to true is response is needed */ |
| }; |
| |
| struct nble_gattc_write_rsp { |
| uint16_t conn_handle; |
| int status; |
| uint16_t char_handle; |
| uint16_t len; |
| }; |
| |
| |
| /** |
| * Read characteristic on remote server. |
| * |
| * @param params Request structure. |
| * @param priv Pointer to private data. |
| */ |
| void nble_gattc_read_req(const struct nble_gattc_read_params *params, |
| void *priv); |
| |
| /** |
| * Response to @ref nble_gattc_read_req. |
| * |
| * @param ev Pointer to the event structure |
| * @param data Pointer to the data byte stream |
| * @param data_len Length of the data byte stream |
| * @param priv Pointer to private data. |
| */ |
| void on_ble_gattc_read_rsp(const struct nble_gattc_read_rsp *ev, |
| uint8_t *data, uint8_t data_len, void *priv); |
| |
| /** |
| * Write characteristic on server. |
| * |
| * @param params Write parameters |
| * @param buf Characteristic value to write. |
| * @param len Characteristic value length. If length is bigger then ATT MTU |
| * size, the controller fragment buffer itself. |
| * @param priv Pointer to private data. |
| */ |
| void nble_gattc_write_req(const struct nble_gattc_write_params *params, |
| const uint8_t *buf, uint8_t len, void *priv); |
| |
| /** |
| * Response to @ref nble_gattc_write_req. |
| * |
| * @param ev Pointer to the event structure |
| * @param priv Pointer to private data. |
| */ |
| void on_ble_gattc_write_rsp(const struct nble_gattc_write_rsp *ev, |
| void *priv); |
| |
| #if defined(CONFIG_BLUETOOTH_GATT_CLIENT) |
| void bt_gatt_connected(struct bt_conn *conn); |
| void bt_gatt_disconnected(struct bt_conn *conn); |
| #endif |
| |
| struct nble_gattc_value_evt { |
| uint16_t conn_handle; |
| int status; |
| /**< handle of characteristic being notified/indicated */ |
| uint16_t handle; |
| /**< notification versus indication, @ref BLE_GATT_IND_TYPES */ |
| uint8_t type; |
| }; |
| |
| /** |
| * Function invoked by BLE service for value event |
| * |
| * @param ev Pointer to the event structure |
| * @param buf Pointer to the data byte stream |
| * @param len Length of the data byte stream |
| */ |
| void on_ble_gattc_value_evt(const struct nble_gattc_value_evt *ev, |
| uint8_t *buf, uint8_t len); |
| |
| struct nble_gattc_to_evt { |
| uint16_t conn_handle; |
| uint16_t reason; /**< GATT timeout reason */ |
| }; |
| |
| /** |
| * Function invoked by BLE service for gattc timeout protocol error |
| * |
| * @param ev Pointer to the event structure |
| */ |
| void on_ble_gattc_to_evt(const struct nble_gattc_to_evt *ev); |