diff options
Diffstat (limited to 'src/shared/gatt-server.c')
-rwxr-xr-x | src/shared/gatt-server.c | 75 |
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 |