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