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 48*3a22aa81SMatthias Ringwald #ifdef ENABLE_GOEP_L2CAP 49*3a22aa81SMatthias Ringwald #ifndef GOEP_SERVER_ERTM_BUFFER 50*3a22aa81SMatthias Ringwald #define GOEP_SERVER_ERTM_BUFFER 1000 51*3a22aa81SMatthias Ringwald #endif 52*3a22aa81SMatthias Ringwald #endif 53*3a22aa81SMatthias Ringwald 54b3911ea7SMilanka Ringwald /* API_START */ 55b3911ea7SMilanka Ringwald 56b3911ea7SMilanka Ringwald typedef enum { 57b3911ea7SMilanka Ringwald GOEP_SERVER_IDLE, 58*3a22aa81SMatthias Ringwald GOEP_SERVER_W4_CONNECTED, 59*3a22aa81SMatthias Ringwald GOEP_SERVER_CONNECTED 60b3911ea7SMilanka Ringwald } goep_server_state_t; 61b3911ea7SMilanka Ringwald 62b3911ea7SMilanka Ringwald typedef enum { 63*3a22aa81SMatthias Ringwald GOEP_CONNECTION_RFCOMM = 0, 64*3a22aa81SMatthias Ringwald GOEP_CONNECTION_L2CAP, 65b3911ea7SMilanka Ringwald } goep_connection_type_t; 66b3911ea7SMilanka Ringwald 67b3911ea7SMilanka Ringwald typedef struct { 68b3911ea7SMilanka Ringwald // linked list - assert: first field 69b3911ea7SMilanka Ringwald btstack_linked_item_t item; 70b3911ea7SMilanka Ringwald 71b3911ea7SMilanka Ringwald btstack_packet_handler_t callback; 72b3911ea7SMilanka Ringwald uint8_t rfcomm_channel; 73b3911ea7SMilanka Ringwald uint16_t l2cap_psm; 74b3911ea7SMilanka Ringwald } goep_server_service_t; 75b3911ea7SMilanka Ringwald 76b3911ea7SMilanka Ringwald // type 77b3911ea7SMilanka Ringwald typedef struct { 78b3911ea7SMilanka Ringwald // linked list - assert: first field 79b3911ea7SMilanka Ringwald btstack_linked_item_t item; 80*3a22aa81SMatthias Ringwald 81b3911ea7SMilanka Ringwald uint16_t goep_cid; 82b3911ea7SMilanka Ringwald goep_server_state_t state; 83*3a22aa81SMatthias Ringwald goep_connection_type_t type; 84*3a22aa81SMatthias Ringwald uint16_t bearer_cid; 85*3a22aa81SMatthias Ringwald uint16_t bearer_mtu; 86*3a22aa81SMatthias Ringwald btstack_packet_handler_t callback; 87*3a22aa81SMatthias Ringwald uint32_t obex_connection_id; 88*3a22aa81SMatthias Ringwald 89*3a22aa81SMatthias Ringwald #ifdef ENABLE_GOEP_L2CAP 90*3a22aa81SMatthias Ringwald uint8_t ertm_buffer[GOEP_SERVER_ERTM_BUFFER]; 91*3a22aa81SMatthias Ringwald #endif 92*3a22aa81SMatthias Ringwald 93b3911ea7SMilanka Ringwald } goep_server_connection_t; 94*3a22aa81SMatthias Ringwald 95*3a22aa81SMatthias Ringwald /** 96*3a22aa81SMatthias Ringwald * Init GOEP Server 97*3a22aa81SMatthias Ringwald */ 98*3a22aa81SMatthias Ringwald void goep_server_init(void); 99*3a22aa81SMatthias Ringwald 100*3a22aa81SMatthias Ringwald 101*3a22aa81SMatthias Ringwald /** 102*3a22aa81SMatthias Ringwald * Register OBEX Service 103*3a22aa81SMatthias Ringwald * @param packet_handler 104*3a22aa81SMatthias Ringwald * @param rfcomm_channel 105*3a22aa81SMatthias Ringwald * @param rfcomm_max_frame_size 106*3a22aa81SMatthias Ringwald * @param l2cap_psm 107*3a22aa81SMatthias Ringwald * @param l2cap_mtu 108*3a22aa81SMatthias Ringwald * @param security_level 109*3a22aa81SMatthias Ringwald * @return status 110*3a22aa81SMatthias Ringwald */ 111*3a22aa81SMatthias Ringwald uint8_t goep_server_register_service(btstack_packet_handler_t packet_handler, uint8_t rfcomm_channel, uint16_t rfcomm_max_frame_size, 112*3a22aa81SMatthias Ringwald uint16_t l2cap_psm, uint16_t l2cap_mtu, gap_security_level_t security_level); 113*3a22aa81SMatthias Ringwald 114*3a22aa81SMatthias Ringwald /** 115*3a22aa81SMatthias Ringwald * Request GOEP_SUBEVENT_CAN_SEND_NOW 116*3a22aa81SMatthias Ringwald * @param goep_cid 117*3a22aa81SMatthias Ringwald * @return status 118*3a22aa81SMatthias Ringwald */ 119*3a22aa81SMatthias Ringwald uint8_t goep_server_request_can_send_now(uint16_t goep_cid); 120*3a22aa81SMatthias Ringwald 121*3a22aa81SMatthias Ringwald /** 122*3a22aa81SMatthias Ringwald * @brief Set Connection ID used for newly created requests 123*3a22aa81SMatthias Ringwald * @param goep_cid 124*3a22aa81SMatthias Ringwald * @return status 125*3a22aa81SMatthias Ringwald */ 126*3a22aa81SMatthias Ringwald uint8_t goep_server_set_connection_id(uint16_t goep_cid, uint32_t connection_id); 127*3a22aa81SMatthias Ringwald 128*3a22aa81SMatthias Ringwald /** 129*3a22aa81SMatthias Ringwald * @brief Start Connect response 130*3a22aa81SMatthias Ringwald * @param goep_cid 131*3a22aa81SMatthias Ringwald * @param obex_version_number 132*3a22aa81SMatthias Ringwald * @param flags 133*3a22aa81SMatthias Ringwald * @param maximum_obex_packet_length 134*3a22aa81SMatthias Ringwald * @return status 135*3a22aa81SMatthias Ringwald */ 136*3a22aa81SMatthias 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); 137*3a22aa81SMatthias Ringwald 138*3a22aa81SMatthias Ringwald /** 139*3a22aa81SMatthias Ringwald * @brief Start General response with opcode 140*3a22aa81SMatthias Ringwald * @param goep_cid 141*3a22aa81SMatthias Ringwald * @param opcode 142*3a22aa81SMatthias Ringwald * @return status 143*3a22aa81SMatthias Ringwald */ 144*3a22aa81SMatthias Ringwald uint8_t goep_server_response_create_general(uint16_t goep_cid, uint8_t opcode); 145*3a22aa81SMatthias Ringwald 146*3a22aa81SMatthias Ringwald /** 147*3a22aa81SMatthias Ringwald * @brief Add who header to current response 148*3a22aa81SMatthias Ringwald * @param goep_cid 149*3a22aa81SMatthias Ringwald * @param who - 16 bytes 150*3a22aa81SMatthias Ringwald * @return status 151*3a22aa81SMatthias Ringwald */ 152*3a22aa81SMatthias Ringwald uint8_t goep_server_header_add_who(uint16_t goep_cid, const uint8_t * who); 153*3a22aa81SMatthias Ringwald 154*3a22aa81SMatthias Ringwald /** 155*3a22aa81SMatthias Ringwald * @brief Add end_of_body header to current response 156*3a22aa81SMatthias Ringwald * @param goep_cid 157*3a22aa81SMatthias Ringwald * @param end_of_body 158*3a22aa81SMatthias Ringwald * @param length 159*3a22aa81SMatthias Ringwald * @return status 160*3a22aa81SMatthias Ringwald */ 161*3a22aa81SMatthias Ringwald uint8_t goep_server_header_add_end_of_body(uint16_t goep_cid, const uint8_t * end_of_body, uint16_t length); 162*3a22aa81SMatthias Ringwald 163*3a22aa81SMatthias Ringwald /** 164*3a22aa81SMatthias Ringwald * @brief Execute prepared request 165*3a22aa81SMatthias Ringwald * @param goep_cid 166*3a22aa81SMatthias Ringwald * @return status 167*3a22aa81SMatthias Ringwald */ 168*3a22aa81SMatthias Ringwald uint8_t goep_server_execute(uint16_t goep_cid); 169*3a22aa81SMatthias Ringwald 170*3a22aa81SMatthias Ringwald /** 171*3a22aa81SMatthias Ringwald * De-Init 172*3a22aa81SMatthias Ringwald */ 173*3a22aa81SMatthias Ringwald void geop_server_deinit(void); 174*3a22aa81SMatthias Ringwald 175b3911ea7SMilanka Ringwald /* API_END */ 176b3911ea7SMilanka Ringwald 177b3911ea7SMilanka Ringwald #if defined __cplusplus 178b3911ea7SMilanka Ringwald } 179b3911ea7SMilanka Ringwald #endif 180b3911ea7SMilanka Ringwald #endif 181