1b3911ea7SMilanka Ringwald /* 2b3911ea7SMilanka Ringwald * Copyright (C) 2022 BlueKitchen GmbH 3b3911ea7SMilanka Ringwald * 4b3911ea7SMilanka Ringwald * Redistribution and use in source and binary forms, with or without 5b3911ea7SMilanka Ringwald * modification, are permitted provided that the following conditions 6b3911ea7SMilanka Ringwald * are met: 7b3911ea7SMilanka Ringwald * 8b3911ea7SMilanka Ringwald * 1. Redistributions of source code must retain the above copyright 9b3911ea7SMilanka Ringwald * notice, this list of conditions and the following disclaimer. 10b3911ea7SMilanka Ringwald * 2. Redistributions in binary form must reproduce the above copyright 11b3911ea7SMilanka Ringwald * notice, this list of conditions and the following disclaimer in the 12b3911ea7SMilanka Ringwald * documentation and/or other materials provided with the distribution. 13b3911ea7SMilanka Ringwald * 3. Neither the name of the copyright holders nor the names of 14b3911ea7SMilanka Ringwald * contributors may be used to endorse or promote products derived 15b3911ea7SMilanka Ringwald * from this software without specific prior written permission. 16b3911ea7SMilanka Ringwald * 4. Any redistribution, use, or modification is done solely for 17b3911ea7SMilanka Ringwald * personal benefit and not for any commercial purpose or for 18b3911ea7SMilanka Ringwald * monetary gain. 19b3911ea7SMilanka Ringwald * 20b3911ea7SMilanka Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21b3911ea7SMilanka Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22b3911ea7SMilanka Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23b3911ea7SMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 24b3911ea7SMilanka Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25b3911ea7SMilanka Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26b3911ea7SMilanka Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27b3911ea7SMilanka Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28b3911ea7SMilanka Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29b3911ea7SMilanka Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30b3911ea7SMilanka Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31b3911ea7SMilanka Ringwald * SUCH DAMAGE. 32b3911ea7SMilanka Ringwald * 33b3911ea7SMilanka Ringwald * Please inquire about commercial licensing options at 34b3911ea7SMilanka Ringwald * [email protected] 35b3911ea7SMilanka Ringwald * 36b3911ea7SMilanka Ringwald */ 37b3911ea7SMilanka Ringwald 38b3911ea7SMilanka Ringwald #ifndef GOEP_SERVER_H 39b3911ea7SMilanka Ringwald #define GOEP_SERVER_H 40b3911ea7SMilanka Ringwald 41b3911ea7SMilanka Ringwald #if defined __cplusplus 42b3911ea7SMilanka Ringwald extern "C" { 43b3911ea7SMilanka Ringwald #endif 44b3911ea7SMilanka Ringwald 45b3911ea7SMilanka Ringwald #include "btstack_config.h" 46b3911ea7SMilanka Ringwald #include <stdint.h> 47b3911ea7SMilanka Ringwald 483a22aa81SMatthias Ringwald #ifdef ENABLE_GOEP_L2CAP 493a22aa81SMatthias Ringwald #ifndef GOEP_SERVER_ERTM_BUFFER 503a22aa81SMatthias Ringwald #define GOEP_SERVER_ERTM_BUFFER 1000 513a22aa81SMatthias Ringwald #endif 523a22aa81SMatthias Ringwald #endif 533a22aa81SMatthias Ringwald 54b3911ea7SMilanka Ringwald /* API_START */ 55b3911ea7SMilanka Ringwald 56b3911ea7SMilanka Ringwald typedef enum { 57b3911ea7SMilanka Ringwald GOEP_SERVER_IDLE, 5896cdeffcSMatthias Ringwald GOEP_SERVER_W4_ACCEPT_REJECT, 593a22aa81SMatthias Ringwald GOEP_SERVER_W4_CONNECTED, 603a22aa81SMatthias Ringwald GOEP_SERVER_CONNECTED 61b3911ea7SMilanka Ringwald } goep_server_state_t; 62b3911ea7SMilanka Ringwald 63b3911ea7SMilanka Ringwald typedef enum { 643a22aa81SMatthias Ringwald GOEP_CONNECTION_RFCOMM = 0, 653a22aa81SMatthias Ringwald GOEP_CONNECTION_L2CAP, 66b3911ea7SMilanka Ringwald } goep_connection_type_t; 67b3911ea7SMilanka Ringwald 68b3911ea7SMilanka Ringwald typedef struct { 69b3911ea7SMilanka Ringwald // linked list - assert: first field 70b3911ea7SMilanka Ringwald btstack_linked_item_t item; 71b3911ea7SMilanka Ringwald 72b3911ea7SMilanka Ringwald btstack_packet_handler_t callback; 73b3911ea7SMilanka Ringwald uint8_t rfcomm_channel; 74b3911ea7SMilanka Ringwald uint16_t l2cap_psm; 75b3911ea7SMilanka Ringwald } goep_server_service_t; 76b3911ea7SMilanka Ringwald 77b3911ea7SMilanka Ringwald // type 78b3911ea7SMilanka Ringwald typedef struct { 79b3911ea7SMilanka Ringwald // linked list - assert: first field 80b3911ea7SMilanka Ringwald btstack_linked_item_t item; 813a22aa81SMatthias Ringwald 82b3911ea7SMilanka Ringwald uint16_t goep_cid; 83b3911ea7SMilanka Ringwald goep_server_state_t state; 843a22aa81SMatthias Ringwald goep_connection_type_t type; 853a22aa81SMatthias Ringwald uint16_t bearer_cid; 863a22aa81SMatthias Ringwald uint16_t bearer_mtu; 873a22aa81SMatthias Ringwald btstack_packet_handler_t callback; 883a22aa81SMatthias Ringwald uint32_t obex_connection_id; 893a22aa81SMatthias Ringwald 903a22aa81SMatthias Ringwald #ifdef ENABLE_GOEP_L2CAP 913a22aa81SMatthias Ringwald uint8_t ertm_buffer[GOEP_SERVER_ERTM_BUFFER]; 923a22aa81SMatthias Ringwald #endif 933a22aa81SMatthias Ringwald 94b3911ea7SMilanka Ringwald } goep_server_connection_t; 953a22aa81SMatthias Ringwald 963a22aa81SMatthias Ringwald /** 973a22aa81SMatthias Ringwald * Init GOEP Server 983a22aa81SMatthias Ringwald */ 993a22aa81SMatthias Ringwald void goep_server_init(void); 1003a22aa81SMatthias Ringwald 1013a22aa81SMatthias Ringwald 1023a22aa81SMatthias Ringwald /** 1033a22aa81SMatthias Ringwald * Register OBEX Service 1043a22aa81SMatthias Ringwald * @param packet_handler 1053a22aa81SMatthias Ringwald * @param rfcomm_channel 1063a22aa81SMatthias Ringwald * @param rfcomm_max_frame_size 1073a22aa81SMatthias Ringwald * @param l2cap_psm 1083a22aa81SMatthias Ringwald * @param l2cap_mtu 1093a22aa81SMatthias Ringwald * @param security_level 1103a22aa81SMatthias Ringwald * @return status 1113a22aa81SMatthias Ringwald */ 1123a22aa81SMatthias Ringwald uint8_t goep_server_register_service(btstack_packet_handler_t packet_handler, uint8_t rfcomm_channel, uint16_t rfcomm_max_frame_size, 1133a22aa81SMatthias Ringwald uint16_t l2cap_psm, uint16_t l2cap_mtu, gap_security_level_t security_level); 1143a22aa81SMatthias Ringwald 1153a22aa81SMatthias Ringwald /** 11696cdeffcSMatthias Ringwald * @brief Accepts incoming GOEP connection. 11796cdeffcSMatthias Ringwald * @param goep_cid 11896cdeffcSMatthias Ringwald * @return status 11996cdeffcSMatthias Ringwald */ 12096cdeffcSMatthias Ringwald uint8_t goep_server_accept_connection(uint16_t goep_cid); 12196cdeffcSMatthias Ringwald 12296cdeffcSMatthias Ringwald /** 12396cdeffcSMatthias Ringwald * @brief Deny incoming GOEP connection. 12496cdeffcSMatthias Ringwald * @param goep_cid 12596cdeffcSMatthias Ringwald * @return status 12696cdeffcSMatthias Ringwald */ 12796cdeffcSMatthias Ringwald uint8_t goep_server_decline_connection(uint16_t goep_cid); 12896cdeffcSMatthias Ringwald 12996cdeffcSMatthias Ringwald /** 1303a22aa81SMatthias Ringwald * Request GOEP_SUBEVENT_CAN_SEND_NOW 1313a22aa81SMatthias Ringwald * @param goep_cid 1323a22aa81SMatthias Ringwald * @return status 1333a22aa81SMatthias Ringwald */ 1343a22aa81SMatthias Ringwald uint8_t goep_server_request_can_send_now(uint16_t goep_cid); 1353a22aa81SMatthias Ringwald 1363a22aa81SMatthias Ringwald /** 1373a22aa81SMatthias Ringwald * @brief Start Connect response 1383a22aa81SMatthias Ringwald * @param goep_cid 1393a22aa81SMatthias Ringwald * @param obex_version_number 1403a22aa81SMatthias Ringwald * @param flags 1413a22aa81SMatthias Ringwald * @param maximum_obex_packet_length 1423a22aa81SMatthias Ringwald * @return status 1433a22aa81SMatthias Ringwald */ 1443a22aa81SMatthias Ringwald uint8_t goep_server_response_create_connect(uint16_t goep_cid, uint8_t obex_version_number, uint8_t flags, uint16_t maximum_obex_packet_length); 1453a22aa81SMatthias Ringwald 1463a22aa81SMatthias Ringwald /** 147*c8e39cadSMatthias Ringwald * @brief Start General response 148*c8e39cadSMatthias Ringwald * @note response code is set by goep_server_execute 1493a22aa81SMatthias Ringwald * @param goep_cid 1503a22aa81SMatthias Ringwald * @param opcode 1513a22aa81SMatthias Ringwald * @return status 1523a22aa81SMatthias Ringwald */ 153*c8e39cadSMatthias Ringwald uint8_t goep_server_response_create_general(uint16_t goep_cid); 1543a22aa81SMatthias Ringwald 1553a22aa81SMatthias Ringwald /** 1561a9eef62SMatthias Ringwald * @brief Get max size of body data that can be added to current response with goep_server_header_add_end_of_body 1571a9eef62SMatthias Ringwald * @param goep_cid 1581a9eef62SMatthias Ringwald * @param data 1591a9eef62SMatthias Ringwald * @param length 1601a9eef62SMatthias Ringwald * @return size in bytes or 0 1611a9eef62SMatthias Ringwald */ 1621a9eef62SMatthias Ringwald uint16_t goep_server_response_get_max_body_size(uint16_t goep_cid); 1631a9eef62SMatthias Ringwald 1641a9eef62SMatthias Ringwald /** 1653a22aa81SMatthias Ringwald * @brief Add who header to current response 1663a22aa81SMatthias Ringwald * @param goep_cid 1673a22aa81SMatthias Ringwald * @param who - 16 bytes 1683a22aa81SMatthias Ringwald * @return status 1693a22aa81SMatthias Ringwald */ 1703a22aa81SMatthias Ringwald uint8_t goep_server_header_add_who(uint16_t goep_cid, const uint8_t * who); 1713a22aa81SMatthias Ringwald 1723a22aa81SMatthias Ringwald /** 1733a22aa81SMatthias Ringwald * @brief Add end_of_body header to current response 1743a22aa81SMatthias Ringwald * @param goep_cid 1753a22aa81SMatthias Ringwald * @param end_of_body 1763a22aa81SMatthias Ringwald * @param length 1773a22aa81SMatthias Ringwald * @return status 1783a22aa81SMatthias Ringwald */ 1793a22aa81SMatthias Ringwald uint8_t goep_server_header_add_end_of_body(uint16_t goep_cid, const uint8_t * end_of_body, uint16_t length); 1803a22aa81SMatthias Ringwald 1813a22aa81SMatthias Ringwald /** 182b79730d6SMatthias Ringwald * @brief Add SRM ENABLE header to current response 183b79730d6SMatthias Ringwald * @param goep_cid 184b79730d6SMatthias Ringwald * @return 185b79730d6SMatthias Ringwald */ 186b79730d6SMatthias Ringwald uint8_t goep_server_header_add_srm_enable(uint16_t goep_cid); 187b79730d6SMatthias Ringwald 1882a4ebdf6SMatthias Ringwald 1892a4ebdf6SMatthias Ringwald /** 1902a4ebdf6SMatthias Ringwald * @brief Add application parameters header to current request 1912a4ebdf6SMatthias Ringwald * @param goep_cid 1922a4ebdf6SMatthias Ringwald * @param data 1932a4ebdf6SMatthias Ringwald * @param length 1942a4ebdf6SMatthias Ringwald * @return 1952a4ebdf6SMatthias Ringwald */ 1962a4ebdf6SMatthias Ringwald uint8_t goep_server_header_add_application_parameters(uint16_t goep_cid, const uint8_t * data, uint16_t length); 1972a4ebdf6SMatthias Ringwald 198b79730d6SMatthias Ringwald /** 199*c8e39cadSMatthias Ringwald * @brief Send prepared response 2003a22aa81SMatthias Ringwald * @param goep_cid 201*c8e39cadSMatthias Ringwald * @param response_code 2023a22aa81SMatthias Ringwald * @return status 2033a22aa81SMatthias Ringwald */ 204*c8e39cadSMatthias Ringwald uint8_t goep_server_execute(uint16_t goep_cid, uint8_t response_code); 2053a22aa81SMatthias Ringwald 2063a22aa81SMatthias Ringwald /** 2073a22aa81SMatthias Ringwald * De-Init 2083a22aa81SMatthias Ringwald */ 2093a22aa81SMatthias Ringwald void geop_server_deinit(void); 2103a22aa81SMatthias Ringwald 211b3911ea7SMilanka Ringwald /* API_END */ 212b3911ea7SMilanka Ringwald 213b3911ea7SMilanka Ringwald #if defined __cplusplus 214b3911ea7SMilanka Ringwald } 215b3911ea7SMilanka Ringwald #endif 216b3911ea7SMilanka Ringwald #endif 217