1 /* 2 * Copyright (C) 2014 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of the copyright holders nor the names of 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 4. Any redistribution, use, or modification is done solely for 17 * personal benefit and not for any commercial purpose or for 18 * monetary gain. 19 * 20 * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 24 * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * Please inquire about commercial licensing options at 34 * [email protected] 35 * 36 */ 37 38 /** 39 * @title ATT Server 40 * 41 */ 42 43 #ifndef ATT_SERVER_H 44 #define ATT_SERVER_H 45 46 #include <stdint.h> 47 #include "hci.h" 48 #include "ble/att_db.h" 49 #include "btstack_defines.h" 50 #include "btstack_config.h" 51 52 #if defined __cplusplus 53 extern "C" { 54 #endif 55 56 #ifdef ENABLE_GATT_OVER_EATT 57 typedef struct { 58 btstack_linked_item_t item; 59 att_server_t att_server; 60 att_connection_t att_connection; 61 uint8_t * receive_buffer; 62 uint8_t * send_buffer; 63 } att_server_eatt_bearer_t; 64 #endif 65 66 /* API_START */ 67 /* 68 * @brief setup ATT server 69 * @param db attribute database created by compile-gatt.py 70 * @param read_callback, see att_db.h, can be NULL 71 * @param write_callback, see attl.h, can be NULL 72 */ 73 void att_server_init(uint8_t const * db, att_read_callback_t read_callback, att_write_callback_t write_callback); 74 75 /** 76 * @brief Enable support for Enhanced ATT bearer 77 * @note Requires ENABLE_GATT_OVER_EATT 78 * @param num_eatt_bearers 79 * @param storage_buffer 80 * @param storage_size must be >= num_eatt_bearers * sizeof(att_server_eatt_bearer_t) 81 * @return status ERROR_CODE_SUCCESS 82 * ERROR_CODE_MEMORY_CAPACITY_EXCEEDED if buffer too small or no entry in l2cap service pool 83 * L2CAP_SERVICE_ALREADY_REGISTERED if called twice 84 */ 85 uint8_t att_server_eatt_init(uint8_t num_eatt_bearers, uint8_t * storage_buffer, uint16_t storage_size); 86 87 /* 88 * @brief register packet handler for ATT server events: 89 * - ATT_EVENT_CAN_SEND_NOW 90 * - ATT_EVENT_HANDLE_VALUE_INDICATION_COMPLETE 91 * - ATT_EVENT_MTU_EXCHANGE_COMPLETE 92 * @param handler 93 */ 94 void att_server_register_packet_handler(btstack_packet_handler_t handler); 95 96 /** 97 * @brief register read/write callbacks for specific handle range 98 * @param att_service_handler_t 99 */ 100 void att_server_register_service_handler(att_service_handler_t * handler); 101 102 /** 103 * @brief Request callback when sending is possible 104 * @note callback might happend during call to this function 105 * @param callback_registration to point to callback function and context information 106 * @param con_handle 107 * @return 0 if ok, error otherwise 108 */ 109 uint8_t att_server_register_can_send_now_callback(btstack_context_callback_registration_t * callback_registration, hci_con_handle_t con_handle); 110 111 /** 112 * @brief Return ATT MTU 113 * @param con_handle 114 * @return mtu if ok, 0 otherwise 115 */ 116 uint16_t att_server_get_mtu(hci_con_handle_t con_handle); 117 118 /** 119 * @brief Request callback when sending notifcation is possible 120 * @note callback might happend during call to this function 121 * @param callback_registration to point to callback function and context information 122 * @param con_handle 123 * @return ERROR_CODE_SUCCESS if ok, ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER if handle unknown, and ERROR_CODE_COMMAND_DISALLOWED if callback already registered 124 */ 125 uint8_t att_server_request_to_send_notification(btstack_context_callback_registration_t * callback_registration, hci_con_handle_t con_handle); 126 127 /** 128 * @brief Request callback when sending indication is possible 129 * @note callback might happend during call to this function 130 * @param callback_registration to point to callback function and context information 131 * @param con_handle 132 * @return ERROR_CODE_SUCCESS if ok, ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER if handle unknown, and ERROR_CODE_COMMAND_DISALLOWED if callback already registered 133 */ 134 uint8_t att_server_request_to_send_indication(btstack_context_callback_registration_t * callback_registration, hci_con_handle_t con_handle); 135 136 /** 137 * @brief notify client about attribute value change 138 * @param con_handle 139 * @param attribute_handle 140 * @param value 141 * @param value_len 142 * @return 0 if ok, error otherwise 143 */ 144 uint8_t att_server_notify(hci_con_handle_t con_handle, uint16_t attribute_handle, const uint8_t *value, uint16_t value_len); 145 146 /** 147 * @brief notify client about multiple attribute value changes 148 * @param con_handle 149 * @param num_attributes 150 * @param attribute_handles[] 151 * @param values_data[] 152 * @param values_len[] 153 * @return 0 if ok, error otherwise 154 */ 155 uint8_t att_server_multiple_notify(hci_con_handle_t con_handle, uint8_t num_attributes, 156 const uint16_t * attribute_handles, const uint8_t ** values_data, const uint16_t * values_len); 157 158 /** 159 * @brief indicate value change to client. client is supposed to reply with an indication_response 160 * @param con_handle 161 * @param attribute_handle 162 * @param value 163 * @param value_len 164 * @return 0 if ok, error otherwise 165 */ 166 uint8_t att_server_indicate(hci_con_handle_t con_handle, uint16_t attribute_handle, const uint8_t *value, uint16_t value_len); 167 168 #ifdef ENABLE_ATT_DELAYED_RESPONSE 169 /** 170 * @brief response ready - called after returning ATT_READ__RESPONSE_PENDING in an att_read_callback or 171 * ATT_ERROR_WRITE_REQUEST_PENDING IN att_write_callback before to trigger callback again and complete the transaction 172 * @nore The ATT Server will retry handling the current ATT request 173 * @param con_handle 174 * @return 0 if ok, error otherwise 175 */ 176 uint8_t att_server_response_ready(hci_con_handle_t con_handle); 177 #endif 178 179 /** 180 * De-Init ATT Server 181 */ 182 void att_server_deinit(void); 183 184 // the following functions will be removed soon 185 186 /** 187 * @brief tests if a notification or indication can be send right now 188 * @param con_handle 189 * @return 1, if packet can be sent 190 */ 191 int att_server_can_send_packet_now(hci_con_handle_t con_handle); 192 193 /** 194 * @brief Request emission of ATT_EVENT_CAN_SEND_NOW as soon as possible 195 * @note ATT_EVENT_CAN_SEND_NOW might be emitted during call to this function 196 * so packet handler should be ready to handle it 197 * @param con_handle 198 */ 199 void att_server_request_can_send_now_event(hci_con_handle_t con_handle); 200 // end of deprecated functions 201 202 /* API_END */ 203 204 #if defined __cplusplus 205 } 206 #endif 207 208 #endif // ATT_SERVER_H 209