summaryrefslogtreecommitdiff
path: root/src/shared/gatt-server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/gatt-server.c')
-rwxr-xr-xsrc/shared/gatt-server.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/shared/gatt-server.c b/src/shared/gatt-server.c
index 79e01c8d..f89ae01a 100755
--- a/src/shared/gatt-server.c
+++ b/src/shared/gatt-server.c
@@ -112,6 +112,12 @@ struct bt_gatt_server {
bt_gatt_server_debug_func_t debug_callback;
bt_gatt_server_destroy_func_t debug_destroy;
void *debug_data;
+
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+ bt_gatt_server_mtu_changed_callback_t mtu_chngd_callback;
+ bt_gatt_server_destroy_func_t mtu_chngd_destroy;
+ void *mtu_chngd_data;
+#endif
};
static void bt_gatt_server_free(struct bt_gatt_server *server)
@@ -182,7 +188,11 @@ static bool encode_read_by_grp_type_rsp(struct gatt_db *db, struct queue *q,
int iter = 0;
uint16_t start_handle, end_handle;
struct iovec value;
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+ uint8_t data_val_len = 0;
+#else
uint8_t data_val_len;
+#endif
*len = 0;
@@ -524,7 +534,11 @@ static bool encode_find_info_rsp(struct gatt_db *db, struct queue *q,
uint16_t handle;
struct gatt_db_attribute *attr;
const bt_uuid_t *type;
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+ int uuid_len = 0, cur_uuid_len;
+#else
int uuid_len, cur_uuid_len;
+#endif
int iter = 0;
*len = 0;
@@ -789,14 +803,26 @@ static void write_cb(uint8_t opcode, const void *pdu,
goto error;
if (server->pending_write_op) {
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+ if (opcode != BT_ATT_OP_WRITE_CMD) {
+#endif
ecode = BT_ATT_ERROR_UNLIKELY;
goto error;
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+ }
+#endif
}
op = new0(struct async_write_op, 1);
op->server = server;
op->opcode = opcode;
+
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+ if (opcode != BT_ATT_OP_WRITE_CMD)
+ server->pending_write_op = op;
+#else
server->pending_write_op = op;
+#endif
if (gatt_db_attribute_write(attr, 0, pdu + 2, length - 2, opcode,
server->att,
@@ -809,6 +835,13 @@ static void write_cb(uint8_t opcode, const void *pdu,
ecode = BT_ATT_ERROR_UNLIKELY;
error:
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+ util_debug(server->debug_callback, server->debug_data,
+ "Handling \"Write %s\" is failed : %d",
+ (opcode == BT_ATT_OP_WRITE_REQ) ? "Req" : "Cmd",
+ ecode);
+#endif
+
if (opcode == BT_ATT_OP_WRITE_CMD)
return;
@@ -912,6 +945,12 @@ static void handle_read_req(struct bt_gatt_server *server, uint8_t opcode,
ecode = BT_ATT_ERROR_UNLIKELY;
error:
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+ util_debug(server->debug_callback, server->debug_data,
+ "Handling \"Read %sReq\" is failed : %d",
+ (opcode == BT_ATT_OP_READ_BLOB_REQ) ? "Blob" : "",
+ ecode);
+#endif
if (op)
async_read_op_destroy(op);
@@ -1369,6 +1408,7 @@ static void exchange_mtu_cb(uint8_t opcode, const void *pdu,
}
client_rx_mtu = get_le16(pdu);
+#ifndef TIZEN_FEATURE_BLUEZ_MODIFY
final_mtu = MAX(MIN(client_rx_mtu, server->mtu), BT_ATT_DEFAULT_LE_MTU);
/* Respond with the server MTU */
@@ -1379,6 +1419,21 @@ static void exchange_mtu_cb(uint8_t opcode, const void *pdu,
/* Set MTU to be the minimum */
server->mtu = final_mtu;
bt_att_set_mtu(server->att, final_mtu);
+#else
+ final_mtu = MAX(MIN(client_rx_mtu, BT_ATT_MAX_LE_MTU), BT_ATT_DEFAULT_LE_MTU);
+
+ /* Set MTU to be the minimum */
+ server->mtu = final_mtu;
+ bt_att_set_mtu(server->att, final_mtu);
+
+ /* Respond with the server MTU */
+ put_le16(server->mtu, rsp_pdu);
+ bt_att_send(server->att, BT_ATT_OP_MTU_RSP, rsp_pdu, 2, NULL, NULL,
+ NULL);
+
+ if (server->mtu_chngd_callback)
+ server->mtu_chngd_callback(final_mtu, server->mtu_chngd_data);
+#endif
util_debug(server->debug_callback, server->debug_data,
"MTU exchange complete, with MTU: %u", final_mtu);
@@ -1633,3 +1688,23 @@ bool bt_gatt_server_send_indication(struct bt_gatt_server *server,
return result;
}
+
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+bool bt_gatt_server_set_mtu_changed(struct bt_gatt_server *server,
+ bt_gatt_server_mtu_changed_callback_t callback,
+ void *user_data,
+ bt_gatt_server_destroy_func_t destroy)
+{
+ if (!server)
+ return false;
+
+ if (server->mtu_chngd_destroy)
+ server->mtu_chngd_destroy(server->mtu_chngd_data);
+
+ server->mtu_chngd_callback = callback;
+ server->mtu_chngd_destroy = destroy;
+ server->mtu_chngd_data = user_data;
+
+ return true;
+}
+#endif