xref: /btstack/src/classic/goep_server.h (revision 335549393173250c8cced9c08514d60b1955350b)
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