| /* att.h - Attribute protocol handling */ |
| |
| /* |
| * Copyright (c) 2015 Intel Corporation |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * 1) Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * 2) Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * 3) Neither the name of Intel Corporation nor the names of its contributors |
| * may be used to endorse or promote products derived from this software without |
| * specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #define BT_ATT_DEFAULT_LE_MTU 23 |
| #define BT_ATT_MAX_LE_MTU 517 |
| |
| struct bt_att_hdr { |
| uint8_t code; |
| } PACK_STRUCT; |
| |
| /* Error codes for Error response PDU */ |
| #define BT_ATT_ERR_INVALID_HANDLE 0x01 |
| #define BT_ATT_ERR_READ_NOT_PERMITTED 0x02 |
| #define BT_ATT_ERR_WRITE_NOT_PERMITTED 0x03 |
| #define BT_ATT_ERR_INVALID_PDU 0x04 |
| #define BT_ATT_ERR_AUTHENTICATION 0x05 |
| #define BT_ATT_ERR_NOT_SUPPORTED 0x06 |
| #define BT_ATT_ERR_INVALID_OFFSET 0x07 |
| #define BT_ATT_ERR_AUTHORIZATION 0x08 |
| #define BT_ATT_ERR_PREPARE_QUEUE_FULL 0x09 |
| #define BT_ATT_ERR_ATTRIBUTE_NOT_FOUND 0x0a |
| #define BT_ATT_ERR_ATTRIBUTE_NOT_LONG 0x0b |
| #define BT_ATT_ERR_ENCRYPTION_KEY_SIZE 0x0c |
| #define BT_ATT_ERR_INVALID_ATTRIBUTE_LEN 0x0d |
| #define BT_ATT_ERR_UNLIKELY 0x0e |
| #define BT_ATT_ERR_INSUFFICIENT_ENCRYPTION 0x0f |
| #define BT_ATT_ERR_UNSUPPORTED_GROUP_TYPE 0x10 |
| #define BT_ATT_ERR_INSUFFICIENT_RESOURCES 0x11 |
| |
| #define BT_ATT_OP_ERROR_RSP 0x01 |
| struct bt_att_error_rsp { |
| uint8_t request; |
| uint16_t handle; |
| uint8_t error; |
| } PACK_STRUCT; |
| |
| #define BT_ATT_OP_MTU_REQ 0x02 |
| struct bt_att_exchange_mtu_req { |
| uint16_t mtu; |
| } PACK_STRUCT; |
| |
| #define BT_ATT_OP_MTU_RSP 0x03 |
| struct bt_att_exchange_mtu_rsp { |
| uint16_t mtu; |
| } PACK_STRUCT; |
| |
| /* Find Information Request */ |
| #define BT_ATT_OP_FIND_INFO_REQ 0x04 |
| struct bt_att_find_info_req { |
| uint16_t start_handle; |
| uint16_t end_handle; |
| } PACK_STRUCT; |
| |
| /* Format field values for BT_ATT_OP_FIND_INFO_RSP */ |
| #define BT_ATT_INFO_16 0x01 |
| #define BT_ATT_INFO_128 0x02 |
| |
| struct bt_att_info_16 { |
| uint16_t handle; |
| uint16_t uuid; |
| } PACK_STRUCT; |
| |
| struct bt_att_info_128 { |
| uint16_t handle; |
| uint8_t uuid[16]; |
| } PACK_STRUCT; |
| |
| /* Find Information Response */ |
| #define BT_ATT_OP_FIND_INFO_RSP 0x05 |
| struct bt_att_find_info_rsp { |
| uint8_t format; |
| uint8_t info[0]; |
| } PACK_STRUCT; |
| |
| /* Find By Type Value Request */ |
| #define BT_ATT_OP_FIND_TYPE_REQ 0x06 |
| struct bt_att_find_type_req { |
| uint16_t start_handle; |
| uint16_t end_handle; |
| uint16_t type; |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| struct bt_att_handle_group { |
| uint16_t start_handle; |
| uint16_t end_handle; |
| } PACK_STRUCT; |
| |
| /* Find By Type Value Response */ |
| #define BT_ATT_OP_FIND_TYPE_RSP 0x07 |
| struct bt_att_find_type_rsp { |
| struct bt_att_handle_group list[0]; |
| } PACK_STRUCT; |
| |
| #define BT_UUID_16 0x00 |
| #define BT_UUID_128 0x01 |
| |
| /* TODO: Move UUID to its own file */ |
| struct bt_uuid { |
| uint8_t type; |
| union { |
| uint16_t u16; |
| uint8_t u128[16]; |
| }; |
| }; |
| |
| /* Read By Type Request */ |
| #define BT_ATT_OP_READ_TYPE_REQ 0x08 |
| struct bt_att_read_type_req { |
| uint16_t start_handle; |
| uint16_t end_handle; |
| uint8_t uuid[0]; |
| } PACK_STRUCT; |
| |
| struct bt_att_data { |
| uint16_t handle; |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| /* Read By Type Response */ |
| #define BT_ATT_OP_READ_TYPE_RSP 0x09 |
| struct bt_att_read_type_rsp { |
| uint8_t len; |
| struct bt_att_data data[0]; |
| } PACK_STRUCT; |
| |
| /* Read Request */ |
| #define BT_ATT_OP_READ_REQ 0x0a |
| struct bt_att_read_req { |
| uint16_t handle; |
| } PACK_STRUCT; |
| |
| /* Read Response */ |
| #define BT_ATT_OP_READ_RSP 0x0b |
| struct bt_att_read_rsp { |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| /* Read Blob Request */ |
| #define BT_ATT_OP_READ_BLOB_REQ 0x0c |
| struct bt_att_read_blob_req { |
| uint16_t handle; |
| uint16_t offset; |
| } PACK_STRUCT; |
| |
| /* Read Blob Response */ |
| #define BT_ATT_OP_READ_BLOB_RSP 0x0d |
| struct bt_att_read_blob_rsp { |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| /* Read Multiple Request */ |
| #define BT_ATT_OP_READ_MULT_REQ 0x0e |
| struct bt_att_read_mult_req { |
| uint16_t handle1; |
| uint16_t handle2; |
| uint16_t handles[0]; |
| } PACK_STRUCT; |
| |
| /* Read Multiple Respose */ |
| #define BT_ATT_OP_READ_MULT_RSP 0x0f |
| struct bt_att_read_mult_rsp { |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| /* Read by Group Type Request */ |
| #define BT_ATT_OP_READ_GROUP_REQ 0x10 |
| struct bt_att_read_group_req { |
| uint16_t start_handle; |
| uint16_t end_handle; |
| uint8_t uuid[0]; |
| } PACK_STRUCT; |
| |
| struct bt_att_group_data { |
| uint16_t start_handle; |
| uint16_t end_handle; |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| /* Read by Group Type Response */ |
| #define BT_ATT_OP_READ_GROUP_RSP 0x11 |
| struct bt_att_read_group_rsp { |
| uint8_t len; |
| struct bt_att_group_data data[0]; |
| } PACK_STRUCT; |
| |
| /* Write Request */ |
| #define BT_ATT_OP_WRITE_REQ 0x12 |
| struct bt_att_write_req { |
| uint16_t handle; |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| /* Write Response */ |
| #define BT_ATT_OP_WRITE_RSP 0x13 |
| |
| /* Prepare Write Request */ |
| #define BT_ATT_OP_PREPARE_WRITE_REQ 0x16 |
| struct bt_att_prepare_write_req { |
| uint16_t handle; |
| uint16_t offset; |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| /* Prepare Write Respond */ |
| #define BT_ATT_OP_PREPARE_WRITE_RSP 0x17 |
| struct bt_att_prepare_write_rsp { |
| uint16_t handle; |
| uint16_t offset; |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| /* Execute Write Request */ |
| #define BT_ATT_FLAG_CANCEL 0x00 |
| #define BT_ATT_FLAG_EXEC 0x01 |
| |
| #define BT_ATT_OP_EXEC_WRITE_REQ 0x18 |
| struct bt_att_exec_write_req { |
| uint8_t flags; |
| } PACK_STRUCT; |
| |
| /* Execute Write Response */ |
| #define BT_ATT_OP_EXEC_WRITE_RSP 0x19 |
| |
| /* Handle Value Notification */ |
| #define BT_ATT_OP_NOTIFY 0x1b |
| struct bt_att_notify { |
| uint16_t handle; |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| /* Handle Value Indication */ |
| #define BT_ATT_OP_INDICATE 0x1d |
| struct bt_att_indicate { |
| uint16_t handle; |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| /* Handle Value Confirm */ |
| #define BT_ATT_OP_CONFIRM 0x1f |
| |
| struct bt_att_signature { |
| uint8_t value[12]; |
| } PACK_STRUCT; |
| |
| /* Write Command */ |
| #define BT_ATT_OP_WRITE_CMD 0x52 |
| struct bt_att_write_cmd { |
| uint16_t handle; |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| /* Signed Write Command */ |
| #define BT_ATT_OP_SIGNED_WRITE_CMD 0xd2 |
| struct bt_att_signed_write_req { |
| uint16_t handle; |
| uint8_t value[0]; |
| } PACK_STRUCT; |
| |
| void bt_att_recv(struct bt_conn *conn, struct bt_buf *buf); |
| struct bt_buf *bt_att_create_pdu(struct bt_conn *conn, uint8_t op, size_t len); |