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" 4622e80accSMatthias Ringwald #include "gap.h" 47b3911ea7SMilanka Ringwald #include <stdint.h> 48b3911ea7SMilanka Ringwald 493a22aa81SMatthias Ringwald #ifdef ENABLE_GOEP_L2CAP 503a22aa81SMatthias Ringwald #ifndef GOEP_SERVER_ERTM_BUFFER 5103ebb521SMatthias Ringwald #define GOEP_SERVER_ERTM_BUFFER 2000 523a22aa81SMatthias Ringwald #endif 533a22aa81SMatthias Ringwald #endif 543a22aa81SMatthias Ringwald 55b3911ea7SMilanka Ringwald /* API_START */ 56b3911ea7SMilanka Ringwald 57b3911ea7SMilanka Ringwald typedef enum { 58b3911ea7SMilanka Ringwald GOEP_SERVER_IDLE, 5996cdeffcSMatthias Ringwald GOEP_SERVER_W4_ACCEPT_REJECT, 603a22aa81SMatthias Ringwald GOEP_SERVER_W4_CONNECTED, 610bbed0feSMatthias Ringwald GOEP_SERVER_CONNECTED, 620bbed0feSMatthias Ringwald GOEP_SERVER_OUTGOING_BUFFER_RESERVED, 63b3911ea7SMilanka Ringwald } goep_server_state_t; 64b3911ea7SMilanka Ringwald 65b3911ea7SMilanka Ringwald typedef enum { 663a22aa81SMatthias Ringwald GOEP_CONNECTION_RFCOMM = 0, 673a22aa81SMatthias Ringwald GOEP_CONNECTION_L2CAP, 68b3911ea7SMilanka Ringwald } goep_connection_type_t; 69b3911ea7SMilanka Ringwald 70b3911ea7SMilanka Ringwald typedef struct { 71b3911ea7SMilanka Ringwald // linked list - assert: first field 72b3911ea7SMilanka Ringwald btstack_linked_item_t item; 73b3911ea7SMilanka Ringwald 74b3911ea7SMilanka Ringwald btstack_packet_handler_t callback; 75b3911ea7SMilanka Ringwald uint8_t rfcomm_channel; 76b3911ea7SMilanka Ringwald uint16_t l2cap_psm; 77b3911ea7SMilanka Ringwald } goep_server_service_t; 78b3911ea7SMilanka Ringwald 79b3911ea7SMilanka Ringwald // type 80b3911ea7SMilanka Ringwald typedef struct { 81b3911ea7SMilanka Ringwald // linked list - assert: first field 82b3911ea7SMilanka Ringwald btstack_linked_item_t item; 833a22aa81SMatthias Ringwald 84b3911ea7SMilanka Ringwald uint16_t goep_cid; 85b3911ea7SMilanka Ringwald goep_server_state_t state; 863a22aa81SMatthias Ringwald goep_connection_type_t type; 873a22aa81SMatthias Ringwald uint16_t bearer_cid; 883a22aa81SMatthias Ringwald uint16_t bearer_mtu; 893a22aa81SMatthias Ringwald btstack_packet_handler_t callback; 903a22aa81SMatthias Ringwald uint32_t obex_connection_id; 913a22aa81SMatthias Ringwald 923a22aa81SMatthias Ringwald #ifdef ENABLE_GOEP_L2CAP 933a22aa81SMatthias Ringwald uint8_t ertm_buffer[GOEP_SERVER_ERTM_BUFFER]; 943a22aa81SMatthias Ringwald #endif 953a22aa81SMatthias Ringwald 96b3911ea7SMilanka Ringwald } goep_server_connection_t; 973a22aa81SMatthias Ringwald 983a22aa81SMatthias Ringwald /** 993a22aa81SMatthias Ringwald * Init GOEP Server 1003a22aa81SMatthias Ringwald */ 1013a22aa81SMatthias Ringwald void goep_server_init(void); 1023a22aa81SMatthias Ringwald 1033a22aa81SMatthias Ringwald 1043a22aa81SMatthias Ringwald /** 1053a22aa81SMatthias Ringwald * Register OBEX Service 1063a22aa81SMatthias Ringwald * @param packet_handler 1073a22aa81SMatthias Ringwald * @param rfcomm_channel 1083a22aa81SMatthias Ringwald * @param rfcomm_max_frame_size 1093a22aa81SMatthias Ringwald * @param l2cap_psm 1103a22aa81SMatthias Ringwald * @param l2cap_mtu 1113a22aa81SMatthias Ringwald * @param security_level 1123a22aa81SMatthias Ringwald * @return status 1133a22aa81SMatthias Ringwald */ 1143a22aa81SMatthias Ringwald uint8_t goep_server_register_service(btstack_packet_handler_t packet_handler, uint8_t rfcomm_channel, uint16_t rfcomm_max_frame_size, 1153a22aa81SMatthias Ringwald uint16_t l2cap_psm, uint16_t l2cap_mtu, gap_security_level_t security_level); 1163a22aa81SMatthias Ringwald 1173a22aa81SMatthias Ringwald /** 11896cdeffcSMatthias Ringwald * @brief Accepts incoming GOEP connection. 11996cdeffcSMatthias Ringwald * @param goep_cid 12096cdeffcSMatthias Ringwald * @return status 12196cdeffcSMatthias Ringwald */ 12296cdeffcSMatthias Ringwald uint8_t goep_server_accept_connection(uint16_t goep_cid); 12396cdeffcSMatthias Ringwald 12496cdeffcSMatthias Ringwald /** 12596cdeffcSMatthias Ringwald * @brief Deny incoming GOEP connection. 12696cdeffcSMatthias Ringwald * @param goep_cid 12796cdeffcSMatthias Ringwald * @return status 12896cdeffcSMatthias Ringwald */ 12996cdeffcSMatthias Ringwald uint8_t goep_server_decline_connection(uint16_t goep_cid); 13096cdeffcSMatthias Ringwald 13196cdeffcSMatthias Ringwald /** 132223b1d64SMatthias Ringwald * @brief Get max size of GOEP message 133223b1d64SMatthias Ringwald * @param goep_cid 134223b1d64SMatthias Ringwald * @return size in bytes or 0 135223b1d64SMatthias Ringwald */ 136223b1d64SMatthias Ringwald uint16_t goep_server_response_get_max_message_size(uint16_t goep_cid); 137223b1d64SMatthias Ringwald 138223b1d64SMatthias Ringwald /** 1393a22aa81SMatthias Ringwald * Request GOEP_SUBEVENT_CAN_SEND_NOW 1403a22aa81SMatthias Ringwald * @param goep_cid 1413a22aa81SMatthias Ringwald * @return status 1423a22aa81SMatthias Ringwald */ 1433a22aa81SMatthias Ringwald uint8_t goep_server_request_can_send_now(uint16_t goep_cid); 1443a22aa81SMatthias Ringwald 1453a22aa81SMatthias Ringwald /** 1463a22aa81SMatthias Ringwald * @brief Start Connect response 1478f4649e3SMatthias Ringwald * @note Reserves outgoing packet buffer 1488f4649e3SMatthias Ringwald * @note Must only be called after a 'can send now' check or event 1498f4649e3SMatthias Ringwald * @note Asserts if packet buffer is already reserved 1503a22aa81SMatthias Ringwald * @param goep_cid 1513a22aa81SMatthias Ringwald * @param obex_version_number 1523a22aa81SMatthias Ringwald * @param flags 1533a22aa81SMatthias Ringwald * @param maximum_obex_packet_length 1543a22aa81SMatthias Ringwald * @return status 1553a22aa81SMatthias Ringwald */ 1563a22aa81SMatthias 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); 1573a22aa81SMatthias Ringwald 1583a22aa81SMatthias Ringwald /** 159c8e39cadSMatthias Ringwald * @brief Start General response 1608f4649e3SMatthias Ringwald * @note Reserves outgoing packet buffer 1618f4649e3SMatthias Ringwald * @note Must only be called after a 'can send now' check or event 1628f4649e3SMatthias Ringwald * @note Asserts if packet buffer is already reserved 163c8e39cadSMatthias Ringwald * @note response code is set by goep_server_execute 1643a22aa81SMatthias Ringwald * @param goep_cid 1653a22aa81SMatthias Ringwald * @param opcode 1663a22aa81SMatthias Ringwald * @return status 1673a22aa81SMatthias Ringwald */ 168c8e39cadSMatthias Ringwald uint8_t goep_server_response_create_general(uint16_t goep_cid); 1693a22aa81SMatthias Ringwald 1703a22aa81SMatthias Ringwald /** 1713a22aa81SMatthias Ringwald * @brief Add who header to current response 1723a22aa81SMatthias Ringwald * @param goep_cid 173223b1d64SMatthias Ringwald * @param who 16 bytes 1743a22aa81SMatthias Ringwald * @return status 1753a22aa81SMatthias Ringwald */ 1763a22aa81SMatthias Ringwald uint8_t goep_server_header_add_who(uint16_t goep_cid, const uint8_t * who); 1773a22aa81SMatthias Ringwald 1783a22aa81SMatthias Ringwald /** 1793a22aa81SMatthias Ringwald * @brief Add end_of_body header to current response 1803a22aa81SMatthias Ringwald * @param goep_cid 1813a22aa81SMatthias Ringwald * @param end_of_body 1823a22aa81SMatthias Ringwald * @param length 1833a22aa81SMatthias Ringwald * @return status 1843a22aa81SMatthias Ringwald */ 1853a22aa81SMatthias Ringwald uint8_t goep_server_header_add_end_of_body(uint16_t goep_cid, const uint8_t * end_of_body, uint16_t length); 1863a22aa81SMatthias Ringwald 1873a22aa81SMatthias Ringwald /** 188b79730d6SMatthias Ringwald * @brief Add SRM ENABLE header to current response 189b79730d6SMatthias Ringwald * @param goep_cid 190b79730d6SMatthias Ringwald * @return 191b79730d6SMatthias Ringwald */ 192b79730d6SMatthias Ringwald uint8_t goep_server_header_add_srm_enable(uint16_t goep_cid); 193b79730d6SMatthias Ringwald 194*33554939SMatthias Ringwald /** 195*33554939SMatthias Ringwald * @brief Add SRM ENABLE_WAIT header to current response 196*33554939SMatthias Ringwald * @param goep_cid 197*33554939SMatthias Ringwald * @return 198*33554939SMatthias Ringwald */ 199*33554939SMatthias Ringwald uint8_t goep_server_header_add_srm_enable_wait(uint16_t goep_cid); 200*33554939SMatthias Ringwald 201*33554939SMatthias Ringwald /** 202*33554939SMatthias Ringwald * @brief Add name header to current response 203*33554939SMatthias Ringwald * @param goep_cid 204*33554939SMatthias Ringwald * @param name \0 terminated string 205*33554939SMatthias Ringwald * @return 206*33554939SMatthias Ringwald */ 207*33554939SMatthias Ringwald uint8_t goep_server_header_add_name(uint16_t goep_cid, const char *name); 208*33554939SMatthias Ringwald 209*33554939SMatthias Ringwald /** 210*33554939SMatthias Ringwald * @brief Add type header to current response 211*33554939SMatthias Ringwald * @param goep_cid 212*33554939SMatthias Ringwald * @param name \0 terminated string 213*33554939SMatthias Ringwald * @return 214*33554939SMatthias Ringwald */ 215*33554939SMatthias Ringwald uint8_t goep_server_header_add_type(uint16_t goep_cid, const char *type); 2162a4ebdf6SMatthias Ringwald 2172a4ebdf6SMatthias Ringwald /** 2182a4ebdf6SMatthias Ringwald * @brief Add application parameters header to current request 2192a4ebdf6SMatthias Ringwald * @param goep_cid 2202a4ebdf6SMatthias Ringwald * @param data 2212a4ebdf6SMatthias Ringwald * @param length 2222a4ebdf6SMatthias Ringwald * @return 2232a4ebdf6SMatthias Ringwald */ 2242a4ebdf6SMatthias Ringwald uint8_t goep_server_header_add_application_parameters(uint16_t goep_cid, const uint8_t * data, uint16_t length); 2252a4ebdf6SMatthias Ringwald 226b79730d6SMatthias Ringwald /** 227c8e39cadSMatthias Ringwald * @brief Send prepared response 2283a22aa81SMatthias Ringwald * @param goep_cid 229c8e39cadSMatthias Ringwald * @param response_code 2303a22aa81SMatthias Ringwald * @return status 2313a22aa81SMatthias Ringwald */ 232c8e39cadSMatthias Ringwald uint8_t goep_server_execute(uint16_t goep_cid, uint8_t response_code); 2333a22aa81SMatthias Ringwald 2343a22aa81SMatthias Ringwald /** 23503ebb521SMatthias Ringwald * @brief Disconnect client 23603ebb521SMatthias Ringwald * @param goep_cid 23703ebb521SMatthias Ringwald * @return status 23803ebb521SMatthias Ringwald */ 23903ebb521SMatthias Ringwald uint8_t goep_server_disconnect(uint16_t goep_cid); 24003ebb521SMatthias Ringwald 24103ebb521SMatthias Ringwald /** 2423a22aa81SMatthias Ringwald * De-Init 2433a22aa81SMatthias Ringwald */ 2443a22aa81SMatthias Ringwald void geop_server_deinit(void); 2453a22aa81SMatthias Ringwald 246b3911ea7SMilanka Ringwald /* API_END */ 247b3911ea7SMilanka Ringwald 248b3911ea7SMilanka Ringwald #if defined __cplusplus 249b3911ea7SMilanka Ringwald } 250b3911ea7SMilanka Ringwald #endif 251b3911ea7SMilanka Ringwald #endif 252