attrib: Remove gatt-service.{c,h} and attrib-server.{c,h}

These files are not longer needed since this functionality has been
moved to gatt-db.{c,h}.
This commit is contained in:
Luiz Augusto von Dentz 2022-01-06 11:29:55 -08:00
parent 710220f861
commit 3a53b27e4d
7 changed files with 1 additions and 2100 deletions

View File

@ -267,8 +267,7 @@ endif
attrib_sources = attrib/att.h attrib/att-database.h attrib/att.c \
attrib/gatt.h attrib/gatt.c \
attrib/gattrib.h attrib/gattrib.c \
attrib/gatt-service.h attrib/gatt-service.c
attrib/gattrib.h attrib/gattrib.c
btio_sources = btio/btio.h btio/btio.c
@ -305,7 +304,6 @@ src_bluetoothd_SOURCES = $(builtin_sources) \
src/rfkill.c src/btd.h src/sdpd.h \
src/sdpd-server.c src/sdpd-request.c \
src/sdpd-service.c src/sdpd-database.c \
src/attrib-server.h src/attrib-server.c \
src/gatt-database.h src/gatt-database.c \
src/sdp-xml.h src/sdp-xml.c \
src/sdp-client.h src/sdp-client.c \

View File

@ -1,362 +0,0 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
*
* BlueZ - Bluetooth protocol stack for Linux
*
* Copyright (C) 2011 Nokia Corporation
* Copyright (C) 2011 Marcel Holtmann <marcel@holtmann.org>
*
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <glib.h>
#include "lib/bluetooth.h"
#include "lib/sdp.h"
#include "lib/uuid.h"
#include "src/adapter.h"
#include "src/shared/util.h"
#include "attrib/gattrib.h"
#include "attrib/att.h"
#include "attrib/gatt.h"
#include "attrib/att-database.h"
#include "src/attrib-server.h"
#include "attrib/gatt-service.h"
#include "src/log.h"
struct gatt_info {
bt_uuid_t uuid;
uint8_t props;
int authentication;
int authorization;
GSList *callbacks;
unsigned int num_attrs;
uint16_t *value_handle;
uint16_t *ccc_handle;
};
struct attrib_cb {
attrib_event_t event;
void *fn;
void *user_data;
};
static inline void put_uuid_le(const bt_uuid_t *src, void *dst)
{
if (src->type == BT_UUID16)
put_le16(src->value.u16, dst);
else
/* Convert from 128-bit BE to LE */
bswap_128(&src->value.u128, dst);
}
static GSList *parse_opts(gatt_option opt1, va_list args)
{
gatt_option opt = opt1;
struct gatt_info *info;
struct attrib_cb *cb;
GSList *l = NULL;
info = g_new0(struct gatt_info, 1);
l = g_slist_append(l, info);
while (opt != GATT_OPT_INVALID) {
switch (opt) {
case GATT_OPT_CHR_UUID16:
bt_uuid16_create(&info->uuid, va_arg(args, int));
/* characteristic declaration and value */
info->num_attrs += 2;
break;
case GATT_OPT_CHR_UUID:
memcpy(&info->uuid, va_arg(args, bt_uuid_t *),
sizeof(bt_uuid_t));
/* characteristic declaration and value */
info->num_attrs += 2;
break;
case GATT_OPT_CHR_PROPS:
info->props = va_arg(args, int);
if (info->props & (GATT_CHR_PROP_NOTIFY |
GATT_CHR_PROP_INDICATE))
/* client characteristic configuration */
info->num_attrs += 1;
/* TODO: "Extended Properties" property requires a
* descriptor, but it is not supported yet. */
break;
case GATT_OPT_CHR_VALUE_CB:
cb = g_new0(struct attrib_cb, 1);
cb->event = va_arg(args, attrib_event_t);
cb->fn = va_arg(args, void *);
cb->user_data = va_arg(args, void *);
info->callbacks = g_slist_append(info->callbacks, cb);
break;
case GATT_OPT_CHR_VALUE_GET_HANDLE:
info->value_handle = va_arg(args, void *);
break;
case GATT_OPT_CCC_GET_HANDLE:
info->ccc_handle = va_arg(args, void *);
break;
case GATT_OPT_CHR_AUTHENTICATION:
info->authentication = va_arg(args, gatt_option);
break;
case GATT_OPT_CHR_AUTHORIZATION:
info->authorization = va_arg(args, gatt_option);
break;
case GATT_CHR_VALUE_READ:
case GATT_CHR_VALUE_WRITE:
case GATT_CHR_VALUE_BOTH:
case GATT_OPT_INVALID:
default:
error("Invalid option: %d", opt);
}
opt = va_arg(args, gatt_option);
if (opt == GATT_OPT_CHR_UUID16 || opt == GATT_OPT_CHR_UUID) {
info = g_new0(struct gatt_info, 1);
l = g_slist_append(l, info);
}
}
return l;
}
static struct attribute *add_service_declaration(struct btd_adapter *adapter,
uint16_t handle, uint16_t svc, bt_uuid_t *uuid)
{
bt_uuid_t bt_uuid;
uint8_t atval[16];
int len;
put_uuid_le(uuid, &atval[0]);
len = bt_uuid_len(uuid);
bt_uuid16_create(&bt_uuid, svc);
return attrib_db_add(adapter, handle, &bt_uuid, ATT_NONE,
ATT_NOT_PERMITTED, atval, len);
}
static int att_read_req(int authorization, int authentication, uint8_t props)
{
if (authorization == GATT_CHR_VALUE_READ ||
authorization == GATT_CHR_VALUE_BOTH)
return ATT_AUTHORIZATION;
else if (authentication == GATT_CHR_VALUE_READ ||
authentication == GATT_CHR_VALUE_BOTH)
return ATT_AUTHENTICATION;
else if (!(props & GATT_CHR_PROP_READ))
return ATT_NOT_PERMITTED;
return ATT_NONE;
}
static int att_write_req(int authorization, int authentication, uint8_t props)
{
if (authorization == GATT_CHR_VALUE_WRITE ||
authorization == GATT_CHR_VALUE_BOTH)
return ATT_AUTHORIZATION;
else if (authentication == GATT_CHR_VALUE_WRITE ||
authentication == GATT_CHR_VALUE_BOTH)
return ATT_AUTHENTICATION;
else if (!(props & (GATT_CHR_PROP_WRITE |
GATT_CHR_PROP_WRITE_WITHOUT_RESP)))
return ATT_NOT_PERMITTED;
return ATT_NONE;
}
static int find_callback(gconstpointer a, gconstpointer b)
{
const struct attrib_cb *cb = a;
unsigned int event = GPOINTER_TO_UINT(b);
return cb->event - event;
}
static gboolean add_characteristic(struct btd_adapter *adapter,
uint16_t *handle, struct gatt_info *info)
{
int read_req, write_req;
uint16_t h = *handle;
struct attribute *a;
bt_uuid_t bt_uuid;
uint8_t atval[ATT_MAX_VALUE_LEN];
GSList *l;
if ((info->uuid.type != BT_UUID16 && info->uuid.type != BT_UUID128) ||
!info->props) {
error("Characteristic UUID or properties are missing");
return FALSE;
}
read_req = att_read_req(info->authorization, info->authentication,
info->props);
write_req = att_write_req(info->authorization, info->authentication,
info->props);
/* TODO: static characteristic values are not supported, therefore a
* callback must be always provided if a read/write property is set */
if (read_req != ATT_NOT_PERMITTED) {
gpointer reqs = GUINT_TO_POINTER(ATTRIB_READ);
if (!g_slist_find_custom(info->callbacks, reqs,
find_callback)) {
error("Callback for read required");
return FALSE;
}
}
if (write_req != ATT_NOT_PERMITTED) {
gpointer reqs = GUINT_TO_POINTER(ATTRIB_WRITE);
if (!g_slist_find_custom(info->callbacks, reqs,
find_callback)) {
error("Callback for write required");
return FALSE;
}
}
/* characteristic declaration */
bt_uuid16_create(&bt_uuid, GATT_CHARAC_UUID);
atval[0] = info->props;
put_le16(h + 1, &atval[1]);
put_uuid_le(&info->uuid, &atval[3]);
if (attrib_db_add(adapter, h++, &bt_uuid, ATT_NONE, ATT_NOT_PERMITTED,
atval, 3 + info->uuid.type / 8) == NULL)
return FALSE;
/* characteristic value */
a = attrib_db_add(adapter, h++, &info->uuid, read_req, write_req,
NULL, 0);
if (a == NULL)
return FALSE;
for (l = info->callbacks; l != NULL; l = l->next) {
struct attrib_cb *cb = l->data;
switch (cb->event) {
case ATTRIB_READ:
a->read_cb = cb->fn;
break;
case ATTRIB_WRITE:
a->write_cb = cb->fn;
break;
}
a->cb_user_data = cb->user_data;
}
if (info->value_handle != NULL)
*info->value_handle = a->handle;
/* client characteristic configuration descriptor */
if (info->props & (GATT_CHR_PROP_NOTIFY | GATT_CHR_PROP_INDICATE)) {
uint8_t cfg_val[2];
bt_uuid16_create(&bt_uuid, GATT_CLIENT_CHARAC_CFG_UUID);
cfg_val[0] = 0x00;
cfg_val[1] = 0x00;
a = attrib_db_add(adapter, h++, &bt_uuid, ATT_NONE,
ATT_AUTHENTICATION, cfg_val, sizeof(cfg_val));
if (a == NULL)
return FALSE;
if (info->ccc_handle != NULL)
*info->ccc_handle = a->handle;
}
*handle = h;
return TRUE;
}
static void free_gatt_info(void *data)
{
struct gatt_info *info = data;
g_slist_free_full(info->callbacks, g_free);
g_free(info);
}
static void service_attr_del(struct btd_adapter *adapter, uint16_t start_handle,
uint16_t end_handle)
{
uint16_t handle;
/* For a 128-bit category primary service below handle should be checked
* for both non-zero as well as >= 0xffff. As on last iteration the
* handle will turn to 0 from 0xffff and loop will be infinite.
*/
for (handle = start_handle; (handle != 0 && handle <= end_handle);
handle++) {
if (attrib_db_del(adapter, handle) < 0)
error("Can't delete handle 0x%04x", handle);
}
}
gboolean gatt_service_add(struct btd_adapter *adapter, uint16_t uuid,
bt_uuid_t *svc_uuid, gatt_option opt1, ...)
{
char uuidstr[MAX_LEN_UUID_STR];
uint16_t start_handle, h;
unsigned int size;
va_list args;
GSList *chrs, *l;
bt_uuid_to_string(svc_uuid, uuidstr, MAX_LEN_UUID_STR);
if (svc_uuid->type != BT_UUID16 && svc_uuid->type != BT_UUID128) {
error("Invalid service uuid: %s", uuidstr);
return FALSE;
}
va_start(args, opt1);
chrs = parse_opts(opt1, args);
va_end(args);
/* calculate how many attributes are necessary for this service */
for (l = chrs, size = 1; l != NULL; l = l->next) {
struct gatt_info *info = l->data;
size += info->num_attrs;
}
start_handle = attrib_db_find_avail(adapter, svc_uuid, size);
if (start_handle == 0) {
error("Not enough free handles to register service");
goto fail;
}
DBG("New service: handle 0x%04x, UUID %s, %d attributes",
start_handle, uuidstr, size);
/* service declaration */
h = start_handle;
if (add_service_declaration(adapter, h++, uuid, svc_uuid) == NULL)
goto fail;
for (l = chrs; l != NULL; l = l->next) {
struct gatt_info *info = l->data;
DBG("New characteristic: handle 0x%04x", h);
if (!add_characteristic(adapter, &h, info)) {
service_attr_del(adapter, start_handle, h - 1);
goto fail;
}
}
g_assert(size < USHRT_MAX);
g_assert(h == 0 || (h - start_handle == (uint16_t) size));
g_slist_free_full(chrs, free_gatt_info);
return TRUE;
fail:
g_slist_free_full(chrs, free_gatt_info);
return FALSE;
}

View File

@ -1,44 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
*
* BlueZ - Bluetooth protocol stack for Linux
*
* Copyright (C) 2011 Nokia Corporation
* Copyright (C) 2011 Marcel Holtmann <marcel@holtmann.org>
*
*
*/
typedef enum {
GATT_OPT_INVALID = 0,
/* bt_uuid_t* value */
GATT_OPT_CHR_UUID,
/* a uint16 value */
GATT_OPT_CHR_UUID16,
GATT_OPT_CHR_PROPS,
GATT_OPT_CHR_VALUE_CB,
GATT_OPT_CHR_AUTHENTICATION,
GATT_OPT_CHR_AUTHORIZATION,
/* Get attribute handle for characteristic value */
GATT_OPT_CHR_VALUE_GET_HANDLE,
/* Get handle for ccc attribute */
GATT_OPT_CCC_GET_HANDLE,
/* arguments for authentication/authorization */
GATT_CHR_VALUE_READ,
GATT_CHR_VALUE_WRITE,
GATT_CHR_VALUE_BOTH,
} gatt_option;
typedef enum {
ATTRIB_READ,
ATTRIB_WRITE,
} attrib_event_t;
gboolean gatt_service_add(struct btd_adapter *adapter, uint16_t uuid,
bt_uuid_t *svc_uuid, gatt_option opt1, ...);

View File

@ -62,7 +62,6 @@
#include "attrib/gattrib.h"
#include "attrib/att.h"
#include "attrib/gatt.h"
#include "attrib-server.h"
#include "gatt-database.h"
#include "advertising.h"
#include "adv_monitor.h"
@ -827,10 +826,6 @@ static void local_name_changed_callback(uint16_t index, uint16_t length,
g_dbus_emit_property_changed(dbus_conn, adapter->path,
ADAPTER_INTERFACE, "Alias");
attrib_gap_set(adapter, GATT_CHARAC_DEVICE_NAME,
(const uint8_t *) adapter->current_alias,
strlen(adapter->current_alias));
}
static void set_local_name_complete(uint8_t status, uint16_t length,

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
*
* BlueZ - Bluetooth protocol stack for Linux
*
* Copyright (C) 2010 Nokia Corporation
* Copyright (C) 2010 Marcel Holtmann <marcel@holtmann.org>
*
*
*/
uint16_t attrib_db_find_avail(struct btd_adapter *adapter, bt_uuid_t *svc_uuid,
uint16_t nitems);
struct attribute *attrib_db_add(struct btd_adapter *adapter, uint16_t handle,
bt_uuid_t *uuid, int read_req,
int write_req, const uint8_t *value,
size_t len);
int attrib_db_update(struct btd_adapter *adapter, uint16_t handle,
bt_uuid_t *uuid, const uint8_t *value,
size_t len, struct attribute **attr);
int attrib_db_del(struct btd_adapter *adapter, uint16_t handle);
int attrib_gap_set(struct btd_adapter *adapter, uint16_t uuid,
const uint8_t *value, size_t len);
uint32_t attrib_create_sdp(struct btd_adapter *adapter, uint16_t handle,
const char *name);
void attrib_free_sdp(struct btd_adapter *adapter, uint32_t sdp_handle);
GAttrib *attrib_from_device(struct btd_device *device);
guint attrib_channel_attach(GAttrib *attrib);
gboolean attrib_channel_detach(GAttrib *attrib, guint id);

View File

@ -62,7 +62,6 @@
#include "agent.h"
#include "textfile.h"
#include "storage.h"
#include "attrib-server.h"
#include "eir.h"
#define DISCONNECT_TIMER 2