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