1 /*
2 * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <string.h>
8
9 #include "esp_bt_main.h"
10 #include "btc/btc_manage.h"
11
12 #include "btc_sdp.h"
13 #include "esp_sdp_api.h"
14 #include "common/bt_target.h"
15
16 #if (defined BTC_SDP_INCLUDED && BTC_SDP_INCLUDED == TRUE)
17
esp_sdp_record_integrity_check(esp_bluetooth_sdp_record_t * record)18 static bool esp_sdp_record_integrity_check(esp_bluetooth_sdp_record_t *record)
19 {
20 bool ret = true;
21
22 if (record != NULL) {
23 if (record->hdr.service_name_length > ESP_SDP_SERVER_NAME_MAX ||
24 strlen(record->hdr.service_name) + 1 != record->hdr.service_name_length) {
25 LOG_ERROR("Invalid server name!\n");
26 ret = false;
27 }
28 } else {
29 LOG_ERROR("record is NULL!\n");
30 ret = false;
31 }
32
33 return ret;
34 }
35
esp_sdp_register_callback(esp_sdp_cb_t callback)36 esp_err_t esp_sdp_register_callback(esp_sdp_cb_t callback)
37 {
38 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
39
40 if (callback == NULL) {
41 return ESP_FAIL;
42 }
43
44 btc_profile_cb_set(BTC_PID_SDP, callback);
45 return ESP_OK;
46 }
47
esp_sdp_init(void)48 esp_err_t esp_sdp_init(void)
49 {
50 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
51
52 btc_msg_t msg;
53 bt_status_t stat;
54
55 msg.sig = BTC_SIG_API_CALL;
56 msg.pid = BTC_PID_SDP;
57 msg.act = BTC_SDP_ACT_INIT;
58
59 /* Switch to BTC context */
60 stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
61 return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
62 }
63
esp_sdp_deinit(void)64 esp_err_t esp_sdp_deinit(void)
65 {
66 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
67
68 btc_msg_t msg;
69 bt_status_t stat;
70
71 msg.sig = BTC_SIG_API_CALL;
72 msg.pid = BTC_PID_SDP;
73 msg.act = BTC_SDP_ACT_DEINIT;
74
75 /* Switch to BTC context */
76 stat = btc_transfer_context(&msg, NULL, 0, NULL, NULL);
77 return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
78 }
79
esp_sdp_search_record(esp_bd_addr_t bd_addr,esp_bt_uuid_t uuid)80 esp_err_t esp_sdp_search_record(esp_bd_addr_t bd_addr, esp_bt_uuid_t uuid)
81 {
82 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
83
84 btc_msg_t msg;
85 bt_status_t stat;
86 btc_sdp_args_t arg;
87
88 msg.sig = BTC_SIG_API_CALL;
89 msg.pid = BTC_PID_SDP;
90 msg.act = BTC_SDP_ACT_SEARCH;
91
92 memset(&arg, 0, sizeof(btc_sdp_args_t));
93 memcpy(arg.search.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
94 arg.search.sdp_uuid.len = uuid.len;
95 memcpy(&arg.search.sdp_uuid.uu, &uuid.uuid, sizeof(uuid.uuid));
96
97 /* Switch to BTC context */
98 stat = btc_transfer_context(&msg, &arg, sizeof(btc_sdp_args_t), NULL, NULL);
99 return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
100 }
101
esp_sdp_create_record(esp_bluetooth_sdp_record_t * record)102 esp_err_t esp_sdp_create_record(esp_bluetooth_sdp_record_t *record)
103 {
104 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
105
106 if (!esp_sdp_record_integrity_check(record)) {
107 return ESP_ERR_INVALID_ARG;
108 }
109
110 btc_msg_t msg;
111 bt_status_t stat;
112 btc_sdp_args_t arg;
113
114 msg.sig = BTC_SIG_API_CALL;
115 msg.pid = BTC_PID_SDP;
116 msg.act = BTC_SDP_ACT_CREATE_RECORD;
117
118 memset(&arg, 0, sizeof(btc_sdp_args_t));
119 arg.create_record.record = (bluetooth_sdp_record *)record;
120
121 /* Switch to BTC context */
122 stat = btc_transfer_context(&msg, &arg, sizeof(btc_sdp_args_t),
123 btc_sdp_arg_deep_copy, btc_sdp_arg_deep_free);
124 return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
125 }
126
esp_sdp_remove_record(int record_handle)127 esp_err_t esp_sdp_remove_record(int record_handle)
128 {
129 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
130
131 btc_msg_t msg;
132 bt_status_t stat;
133 btc_sdp_args_t arg;
134
135 msg.sig = BTC_SIG_API_CALL;
136 msg.pid = BTC_PID_SDP;
137 msg.act = BTC_SDP_ACT_REMOVE_RECORD;
138
139 arg.remove_record.record_handle = record_handle;
140
141 /* Switch to BTC context */
142 stat = btc_transfer_context(&msg, &arg, sizeof(btc_sdp_args_t), NULL, NULL);
143 return (stat == BT_STATUS_SUCCESS) ? ESP_OK : ESP_FAIL;
144 }
145
146 #endif ///defined BTC_SDP_INCLUDED && BTC_SDP_INCLUDED == TRUE
147