2013-08-29 09:56:43

by Grzegorz Kolodziejczyk

[permalink] [raw]
Subject: [PATCH 0/4] Make sdp independent from adapter

Make sdp independent from adapter. Now adapter invokes sdp functions
without revoking itself.

Solutions to consider:
- Access db has been expanded via sdp_get_access_list
- sdp_access_t moved to sdpd.h

Grzegorz Kolodziejczyk (4):
sdp: Move sdp server init to adapter
sdp: Move spd_init_services_list to adapter
sdp: Make sdp_record_add to be handled by adapter
sdp: Make sdp_record_remove to be handled by adapter

profiles/audio/a2dp.c | 10 ++--
profiles/audio/avrcp.c | 8 ++--
profiles/health/hdp.c | 2 +-
profiles/health/hdp_util.c | 4 +-
profiles/network/server.c | 6 +--
profiles/sap/server.c | 4 +-
src/adapter.c | 109 +++++++++++++++++++++++++++++++++++++++++++-
src/adapter.h | 7 +++
src/attrib-server.c | 8 ++--
src/main.c | 2 +-
src/profile.c | 9 ++--
src/sdpd-database.c | 53 ++++-----------------
src/sdpd.h | 8 +++-
13 files changed, 155 insertions(+), 75 deletions(-)

--
1.7.9.5



2013-08-29 09:56:46

by Grzegorz Kolodziejczyk

[permalink] [raw]
Subject: [PATCH 3/4] sdp: Make sdp_record_add to be handled by adapter

Make sdp_record_add to be called from adapter. First write services to
sdp db then to adapter db without revokes to adapter.

Change-Id: I65d638096c91aadacc3cb5ef7a8a9181fa4dae6e
---
profiles/audio/a2dp.c | 2 +-
profiles/audio/avrcp.c | 4 ++--
profiles/health/hdp_util.c | 2 +-
profiles/network/server.c | 2 +-
profiles/sap/server.c | 2 +-
src/adapter.c | 28 ++++++++++++++++++++++++++++
src/adapter.h | 3 +++
src/attrib-server.c | 2 +-
src/profile.c | 7 +++----
src/sdpd-database.c | 10 ----------
10 files changed, 41 insertions(+), 21 deletions(-)

diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
index 3f3cc1b..4b8d4f3 100644
--- a/profiles/audio/a2dp.c
+++ b/profiles/audio/a2dp.c
@@ -1298,7 +1298,7 @@ struct a2dp_sep *a2dp_add_sep(struct btd_adapter *adapter, uint8_t type,
return NULL;
}

- if (add_record_to_server(adapter_get_address(server->adapter),
+ if (adapter_add_record_to_server_adapter(server->adapter,
record) < 0) {
error("Unable to register A2DP service record");
sdp_record_free(record);
diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index 9f164e4..d64f228 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
@@ -3829,7 +3829,7 @@ done:
return -1;
}

- if (add_record_to_server(adapter_get_address(adapter), record) < 0) {
+ if (adapter_add_record_to_server_adapter(adapter, record) < 0) {
error("Unable to register AVRCP target service record");
avrcp_target_server_remove(p, adapter);
sdp_record_free(record);
@@ -3912,7 +3912,7 @@ done:
return -1;
}

- if (add_record_to_server(adapter_get_address(adapter), record) < 0) {
+ if (adapter_add_record_to_server_adapter(adapter, record) < 0) {
error("Unable to register AVRCP service record");
avrcp_controller_server_remove(p, adapter);
sdp_record_free(record);
diff --git a/profiles/health/hdp_util.c b/profiles/health/hdp_util.c
index b53f1db..7692ca2 100644
--- a/profiles/health/hdp_util.c
+++ b/profiles/health/hdp_util.c
@@ -733,7 +733,7 @@ gboolean hdp_update_sdp_record(struct hdp_adapter *adapter, GSList *app_list)
if (sdp_set_record_state(sdp_record, adapter->record_state++) < 0)
goto fail;

- if (add_record_to_server(adapter_get_address(adapter->btd_adapter),
+ if (adapter_add_record_to_server_adapter(adapter->btd_adapter,
sdp_record) < 0)
goto fail;
adapter->sdp_handler = sdp_record->handle;
diff --git a/profiles/network/server.c b/profiles/network/server.c
index de48bec..d321998 100644
--- a/profiles/network/server.c
+++ b/profiles/network/server.c
@@ -587,7 +587,7 @@ static uint32_t register_server_record(struct network_server *ns)
return 0;
}

- if (add_record_to_server(&ns->src, record) < 0) {
+ if (adapter_add_record_to_server_bdaddr(&ns->src, record) < 0) {
error("Failed to register service record");
sdp_record_free(record);
return 0;
diff --git a/profiles/sap/server.c b/profiles/sap/server.c
index dfcf0f1..d1e2581 100644
--- a/profiles/sap/server.c
+++ b/profiles/sap/server.c
@@ -1358,7 +1358,7 @@ int sap_server_register(const char *path, const bdaddr_t *src)
goto sdp_err;
}

- if (add_record_to_server(src, record) < 0) {
+ if (adapter_add_record_to_server_bdaddr(src, record) < 0) {
error("Adding SAP SDP record to the SDP server failed.");
sdp_record_free(record);
goto sdp_err;
diff --git a/src/adapter.c b/src/adapter.c
index ba7be8a..6478ca7 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -6308,6 +6308,34 @@ void adapter_start_sdp_server(uint16_t sdp_mtu, uint32_t sdp_flags)
adapter_foreach(adapter_service_insert, services->data);
}

+int adapter_add_record_to_server_adapter(struct btd_adapter *adapter, sdp_record_t *rec)
+{
+ return adapter_add_record_to_server_bdaddr(adapter_get_address(adapter), rec);
+}
+
+int adapter_add_record_to_server_bdaddr(const bdaddr_t *device, sdp_record_t *rec)
+{
+ int error;
+ struct btd_adapter *adapter;
+
+ error = add_record_to_server(device, rec);
+
+ /* Check if add_record_to server error occurs */
+ if (!error) {
+ /* Add rec for each adapter */
+ if (bacmp(device, BDADDR_ANY) == 0) {
+ adapter_foreach(adapter_service_insert, rec);
+ return error;
+ }
+ /* Add rec for single adapter */
+ adapter = adapter_find(device);
+ if (adapter)
+ adapter_service_insert(adapter, rec);
+ }
+
+ return error;
+}
+
void adapter_sdp_init_services_list(bdaddr_t *device)
{
sdp_list_t *p;
diff --git a/src/adapter.h b/src/adapter.h
index bd54372..8a5fc73 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -214,4 +214,7 @@ gboolean btd_adapter_check_oob_handler(struct btd_adapter *adapter);
void btd_adapter_for_each_device(struct btd_adapter *adapter,
void (*cb)(struct btd_device *device, void *data),
void *data);
+
+int adapter_add_record_to_server_adapter(struct btd_adapter *adapter, sdp_record_t *rec);
+int adapter_add_record_to_server_bdaddr(const bdaddr_t *device, sdp_record_t *rec);
void adapter_sdp_init_services_list(bdaddr_t *device);
diff --git a/src/attrib-server.c b/src/attrib-server.c
index 3f629b0..19b878d 100644
--- a/src/attrib-server.c
+++ b/src/attrib-server.c
@@ -326,7 +326,7 @@ static uint32_t attrib_create_sdp_new(struct gatt_server *server,
"http://www.bluez.org/");
}

- if (add_record_to_server(adapter_get_address(server->adapter), record)
+ if (adapter_add_record_to_server_adapter(server->adapter, record)
== 0)
return record->handle;

diff --git a/src/profile.c b/src/profile.c
index 90c3535..9a1687d 100644
--- a/src/profile.c
+++ b/src/profile.c
@@ -1197,7 +1197,7 @@ static void ext_direct_connect(GIOChannel *io, GError *err, gpointer user_data)
static uint32_t ext_register_record(struct ext_profile *ext,
struct ext_io *l2cap,
struct ext_io *rfcomm,
- const bdaddr_t *src)
+ struct btd_adapter *adapter)
{
sdp_record_t *rec;
char *dyn_record = NULL;
@@ -1220,7 +1220,7 @@ static uint32_t ext_register_record(struct ext_profile *ext,
return 0;
}

- if (add_record_to_server(src, rec) < 0) {
+ if (adapter_add_record_to_server_adapter(adapter, rec) < 0) {
error("Failed to register service record");
sdp_record_free(rec);
return 0;
@@ -1322,8 +1322,7 @@ static uint32_t ext_start_servers(struct ext_profile *ext,
}
}

- return ext_register_record(ext, l2cap, rfcomm,
- adapter_get_address(adapter));
+ return ext_register_record(ext, l2cap, rfcomm, adapter);

failed:
if (l2cap) {
diff --git a/src/sdpd-database.c b/src/sdpd-database.c
index 7228cd7..335ea0e 100644
--- a/src/sdpd-database.c
+++ b/src/sdpd-database.c
@@ -168,7 +168,6 @@ void sdp_svcdb_set_collectable(sdp_record_t *record, int sock)
*/
void sdp_record_add(const bdaddr_t *device, sdp_record_t *rec)
{
- struct btd_adapter *adapter;
sdp_access_t *dev;

SDPDBG("Adding rec : 0x%lx", (long) rec);
@@ -184,15 +183,6 @@ void sdp_record_add(const bdaddr_t *device, sdp_record_t *rec)
dev->handle = rec->handle;

access_db = sdp_list_insert_sorted(access_db, dev, access_sort);
-
- if (bacmp(device, BDADDR_ANY) == 0) {
- adapter_foreach(adapter_service_insert, rec);
- return;
- }
-
- adapter = adapter_find(device);
- if (adapter)
- adapter_service_insert(adapter, rec);
}

static sdp_list_t *record_locate(uint32_t handle)
--
1.7.9.5


2013-08-29 09:56:45

by Grzegorz Kolodziejczyk

[permalink] [raw]
Subject: [PATCH 2/4] sdp: Move spd_init_services_list to adapter

Make sdp_init_services_list to be runned in adapter instead of
sdp-database. sdp_init_service is invoked by adapter_register function.

Change-Id: Iddf5afbe410608ca96df727a7c9bb791e457ca77
---
src/adapter.c | 27 ++++++++++++++++++++++++++-
src/adapter.h | 1 +
src/sdpd-database.c | 31 ++++++++-----------------------
src/sdpd.h | 3 +--
4 files changed, 36 insertions(+), 26 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index d2d829e..ba7be8a 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -5603,7 +5603,7 @@ static int adapter_register(struct btd_adapter *adapter)
agent_unref(agent);
}

- sdp_init_services_list(&adapter->bdaddr);
+ adapter_sdp_init_services_list(&adapter->bdaddr);

btd_adapter_gatt_server_start(adapter);

@@ -6307,3 +6307,28 @@ void adapter_start_sdp_server(uint16_t sdp_mtu, uint32_t sdp_flags)
for (; services; services = services->next)
adapter_foreach(adapter_service_insert, services->data);
}
+
+void adapter_sdp_init_services_list(bdaddr_t *device)
+{
+ sdp_list_t *p;
+
+ p = sdp_get_access_list();
+
+ DBG("");
+
+ for (; p != NULL; p = p->next) {
+ sdp_access_t *access = p->data;
+ sdp_record_t *rec;
+
+ if (bacmp(BDADDR_ANY, &access->device))
+ continue;
+
+ rec = sdp_record_find(access->handle);
+ if (rec == NULL)
+ continue;
+
+ SDPDBG("adding record with handle %x", access->handle);
+
+ adapter_foreach(adapter_service_insert, rec);
+ }
+}
diff --git a/src/adapter.h b/src/adapter.h
index a60a29f..bd54372 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -214,3 +214,4 @@ gboolean btd_adapter_check_oob_handler(struct btd_adapter *adapter);
void btd_adapter_for_each_device(struct btd_adapter *adapter,
void (*cb)(struct btd_device *device, void *data),
void *data);
+void adapter_sdp_init_services_list(bdaddr_t *device);
diff --git a/src/sdpd-database.c b/src/sdpd-database.c
index cf33f19..7228cd7 100644
--- a/src/sdpd-database.c
+++ b/src/sdpd-database.c
@@ -285,6 +285,14 @@ sdp_list_t *sdp_get_record_list(void)
return service_db;
}

+/*
+ * Return a pointer to the linked list containing the access db in sorted order
+ */
+sdp_list_t *sdp_get_access_list(void)
+{
+ return access_db;
+}
+
int sdp_check_access(uint32_t handle, bdaddr_t *device)
{
sdp_list_t *p = access_locate(handle);
@@ -314,26 +322,3 @@ uint32_t sdp_next_handle(void)

return handle;
}
-
-void sdp_init_services_list(bdaddr_t *device)
-{
- sdp_list_t *p;
-
- DBG("");
-
- for (p = access_db; p != NULL; p = p->next) {
- sdp_access_t *access = p->data;
- sdp_record_t *rec;
-
- if (bacmp(BDADDR_ANY, &access->device))
- continue;
-
- rec = sdp_record_find(access->handle);
- if (rec == NULL)
- continue;
-
- SDPDBG("adding record with handle %x", access->handle);
-
- adapter_foreach(adapter_service_insert, rec);
- }
-}
diff --git a/src/sdpd.h b/src/sdpd.h
index 9a0e1e9..ad384bd 100644
--- a/src/sdpd.h
+++ b/src/sdpd.h
@@ -68,6 +68,7 @@ sdp_record_t *sdp_record_find(uint32_t handle);
void sdp_record_add(const bdaddr_t *device, sdp_record_t *rec);
int sdp_record_remove(uint32_t handle);
sdp_list_t *sdp_get_record_list(void);
+sdp_list_t *sdp_get_access_list(void);
int sdp_check_access(uint32_t handle, bdaddr_t *device);
uint32_t sdp_next_handle(void);

@@ -81,5 +82,3 @@ void stop_sdp_server(void);

int add_record_to_server(const bdaddr_t *src, sdp_record_t *rec);
int remove_record_from_server(uint32_t handle);
-
-void sdp_init_services_list(bdaddr_t *device);
--
1.7.9.5


2013-08-29 09:56:47

by Grzegorz Kolodziejczyk

[permalink] [raw]
Subject: [PATCH 4/4] sdp: Make sdp_record_remove to be handled by adapter

Make sdp_record_remove to be called from adapter. First remove service
from sdp db then from adapter db without revokes to adapter.

Change-Id: I13a3113909bab2b4494a00ef05e25dc8d113e3ac
---
profiles/audio/a2dp.c | 8 ++++----
profiles/audio/avrcp.c | 4 ++--
profiles/health/hdp.c | 2 +-
profiles/health/hdp_util.c | 2 +-
profiles/network/server.c | 4 ++--
profiles/sap/server.c | 2 +-
src/adapter.c | 42 ++++++++++++++++++++++++++++++++++++++++++
src/adapter.h | 2 ++
src/attrib-server.c | 6 +++---
src/profile.c | 2 +-
src/sdpd-database.c | 12 ------------
src/sdpd.h | 5 +++++
12 files changed, 64 insertions(+), 27 deletions(-)

diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
index 4b8d4f3..364383b 100644
--- a/profiles/audio/a2dp.c
+++ b/profiles/audio/a2dp.c
@@ -1327,7 +1327,7 @@ void a2dp_remove_sep(struct a2dp_sep *sep)
return;
server->sources = g_slist_remove(server->sources, sep);
if (server->sources == NULL && server->source_record_id) {
- remove_record_from_server(server->source_record_id);
+ adapter_remove_record_from_server(server->source_record_id);
server->source_record_id = 0;
}
} else {
@@ -1335,7 +1335,7 @@ void a2dp_remove_sep(struct a2dp_sep *sep)
return;
server->sinks = g_slist_remove(server->sinks, sep);
if (server->sinks == NULL && server->sink_record_id) {
- remove_record_from_server(server->sink_record_id);
+ adapter_remove_record_from_server(server->sink_record_id);
server->sink_record_id = 0;
}
}
@@ -1944,7 +1944,7 @@ static void a2dp_source_server_remove(struct btd_profile *p,
(GDestroyNotify) a2dp_unregister_sep);

if (server->source_record_id) {
- remove_record_from_server(server->source_record_id);
+ adapter_remove_record_from_server(server->source_record_id);
server->source_record_id = 0;
}

@@ -1989,7 +1989,7 @@ static void a2dp_sink_server_remove(struct btd_profile *p,
g_slist_free_full(server->sinks, (GDestroyNotify) a2dp_unregister_sep);

if (server->sink_record_id) {
- remove_record_from_server(server->sink_record_id);
+ adapter_remove_record_from_server(server->sink_record_id);
server->sink_record_id = 0;
}

diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index d64f228..da8d06a 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
@@ -3797,7 +3797,7 @@ static void avrcp_target_server_remove(struct btd_profile *p,
return;

if (server->tg_record_id != 0) {
- remove_record_from_server(server->tg_record_id);
+ adapter_remove_record_from_server(server->tg_record_id);
server->tg_record_id = 0;
}

@@ -3880,7 +3880,7 @@ static void avrcp_controller_server_remove(struct btd_profile *p,
return;

if (server->ct_record_id != 0) {
- remove_record_from_server(server->ct_record_id);
+ adapter_remove_record_from_server(server->ct_record_id);
server->ct_record_id = 0;
}

diff --git a/profiles/health/hdp.c b/profiles/health/hdp.c
index 7f24756..eeac102 100644
--- a/profiles/health/hdp.c
+++ b/profiles/health/hdp.c
@@ -1403,7 +1403,7 @@ void hdp_adapter_unregister(struct btd_adapter *adapter)
hdp_adapter = l->data;
adapters = g_slist_remove(adapters, hdp_adapter);
if (hdp_adapter->sdp_handler > 0)
- remove_record_from_server(hdp_adapter->sdp_handler);
+ adapter_remove_record_from_server(hdp_adapter->sdp_handler);
release_adapter_instance(hdp_adapter);
btd_adapter_unref(hdp_adapter->btd_adapter);
g_free(hdp_adapter);
diff --git a/profiles/health/hdp_util.c b/profiles/health/hdp_util.c
index 7692ca2..55f1fb9 100644
--- a/profiles/health/hdp_util.c
+++ b/profiles/health/hdp_util.c
@@ -693,7 +693,7 @@ gboolean hdp_update_sdp_record(struct hdp_adapter *adapter, GSList *app_list)
sdp_record_t *sdp_record;

if (adapter->sdp_handler > 0)
- remove_record_from_server(adapter->sdp_handler);
+ adapter_remove_record_from_server(adapter->sdp_handler);

if (app_list == NULL) {
adapter->sdp_handler = 0;
diff --git a/profiles/network/server.c b/profiles/network/server.c
index d321998..6e36818 100644
--- a/profiles/network/server.c
+++ b/profiles/network/server.c
@@ -628,7 +628,7 @@ static void server_disconnect(DBusConnection *conn, void *user_data)
ns->watch_id = 0;

if (ns->record_id) {
- remove_record_from_server(ns->record_id);
+ adapter_remove_record_from_server(ns->record_id);
ns->record_id = 0;
}

@@ -722,7 +722,7 @@ static void server_free(void *data)
server_remove_sessions(ns);

if (ns->record_id)
- remove_record_from_server(ns->record_id);
+ adapter_remove_record_from_server(ns->record_id);

g_free(ns->name);
g_free(ns->bridge);
diff --git a/profiles/sap/server.c b/profiles/sap/server.c
index d1e2581..c837668 100644
--- a/profiles/sap/server.c
+++ b/profiles/sap/server.c
@@ -1318,7 +1318,7 @@ static void server_remove(struct sap_server *server)

sap_server_remove_conn(server);

- remove_record_from_server(server->record_id);
+ adapter_remove_record_from_server(server->record_id);

if (server->listen_io) {
g_io_channel_shutdown(server->listen_io, TRUE, NULL);
diff --git a/src/adapter.c b/src/adapter.c
index 6478ca7..57ae6b3 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -6336,6 +6336,48 @@ int adapter_add_record_to_server_bdaddr(const bdaddr_t *device, sdp_record_t *re
return error;
}

+int adapter_remove_record_from_server(uint32_t handle)
+{
+ int error;
+ sdp_list_t *p;
+ sdp_record_t *r;
+ sdp_access_t *a;
+ sdp_record_t rh, ah;
+
+ error = remove_record_from_server(handle);
+
+ /* if no errors for removing records from sdp server */
+ if (!error) {
+ /* record locate */
+ rh.handle = handle;
+ p = sdp_list_find(sdp_get_record_list(), &rh, record_sort);
+
+ r = p->data;
+
+ /* device locate */
+ ah.handle = handle;
+ p = sdp_list_find(sdp_get_access_list(), &ah, record_sort);
+
+ if (p == NULL || p->data == NULL)
+ return 0;
+
+ a = p->data;
+
+ /* remove services from adapter/s */
+ if (bacmp(&a->device, BDADDR_ANY) != 0) {
+ struct btd_adapter *adapter = adapter_find(&a->device);
+ if (adapter)
+ adapter_service_remove(adapter, r);
+ } else
+ adapter_foreach(adapter_service_remove, r);
+
+ free(a);
+ }
+
+ /* return 0 if no error */
+ return error;
+}
+
void adapter_sdp_init_services_list(bdaddr_t *device)
{
sdp_list_t *p;
diff --git a/src/adapter.h b/src/adapter.h
index 8a5fc73..a56e8f7 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -217,4 +217,6 @@ void btd_adapter_for_each_device(struct btd_adapter *adapter,

int adapter_add_record_to_server_adapter(struct btd_adapter *adapter, sdp_record_t *rec);
int adapter_add_record_to_server_bdaddr(const bdaddr_t *device, sdp_record_t *rec);
+int adapter_remove_record_from_server(uint32_t handle);
+
void adapter_sdp_init_services_list(bdaddr_t *device);
diff --git a/src/attrib-server.c b/src/attrib-server.c
index 19b878d..65952d3 100644
--- a/src/attrib-server.c
+++ b/src/attrib-server.c
@@ -139,10 +139,10 @@ static void gatt_server_free(struct gatt_server *server)
g_slist_free_full(server->clients, (GDestroyNotify) channel_free);

if (server->gatt_sdp_handle > 0)
- remove_record_from_server(server->gatt_sdp_handle);
+ adapter_remove_record_from_server(server->gatt_sdp_handle);

if (server->gap_sdp_handle > 0)
- remove_record_from_server(server->gap_sdp_handle);
+ adapter_remove_record_from_server(server->gap_sdp_handle);

if (server->adapter != NULL)
btd_adapter_unref(server->adapter);
@@ -1380,7 +1380,7 @@ uint32_t attrib_create_sdp(struct btd_adapter *adapter, uint16_t handle,

void attrib_free_sdp(uint32_t sdp_handle)
{
- remove_record_from_server(sdp_handle);
+ adapter_remove_record_from_server(sdp_handle);
}

static uint16_t find_uuid16_avail(struct btd_adapter *adapter, uint16_t nitems)
diff --git a/src/profile.c b/src/profile.c
index 9a1687d..08ce410 100644
--- a/src/profile.c
+++ b/src/profile.c
@@ -1389,7 +1389,7 @@ static void ext_remove_records(struct ext_profile *ext,

ext->records = g_slist_remove(ext->records, r);

- remove_record_from_server(r->handle);
+ adapter_remove_record_from_server(r->handle);
btd_adapter_unref(r->adapter);
g_free(r);
}
diff --git a/src/sdpd-database.c b/src/sdpd-database.c
index 335ea0e..0bfb118 100644
--- a/src/sdpd-database.c
+++ b/src/sdpd-database.c
@@ -41,11 +41,6 @@
static sdp_list_t *service_db;
static sdp_list_t *access_db;

-typedef struct {
- uint32_t handle;
- bdaddr_t device;
-} sdp_access_t;
-
/*
* Ordering function called when inserting a service record.
* The service repository is a linked list in sorted order
@@ -254,13 +249,6 @@ int sdp_record_remove(uint32_t handle)

a = p->data;

- if (bacmp(&a->device, BDADDR_ANY) != 0) {
- struct btd_adapter *adapter = adapter_find(&a->device);
- if (adapter)
- adapter_service_remove(adapter, r);
- } else
- adapter_foreach(adapter_service_remove, r);
-
access_db = sdp_list_remove(access_db, a);
access_free(a);

diff --git a/src/sdpd.h b/src/sdpd.h
index ad384bd..769dc63 100644
--- a/src/sdpd.h
+++ b/src/sdpd.h
@@ -45,6 +45,11 @@ typedef struct request {
int len;
} sdp_req_t;

+typedef struct {
+ uint32_t handle;
+ bdaddr_t device;
+} sdp_access_t;
+
void handle_internal_request(int sk, int mtu, void *data, int len);
void handle_request(int sk, uint8_t *data, int len);

--
1.7.9.5


2013-08-29 09:56:44

by Grzegorz Kolodziejczyk

[permalink] [raw]
Subject: [PATCH 1/4] sdp: Move sdp server init to adapter

Change-Id: Ie8440d59a00750f3d8aec49924d6b209bc6ebe2f
---
src/adapter.c | 12 ++++++++++++
src/adapter.h | 1 +
src/main.c | 2 +-
3 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/adapter.c b/src/adapter.c
index 17f5508..d2d829e 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -6295,3 +6295,15 @@ void adapter_shutdown(void)
if (!adapter_remaining)
btd_exit();
}
+
+void adapter_start_sdp_server(uint16_t sdp_mtu, uint32_t sdp_flags)
+{
+ sdp_list_t *services;
+
+ info("Start sdp server");
+ start_sdp_server(sdp_mtu, sdp_flags);
+
+ services = sdp_get_record_list();
+ for (; services; services = services->next)
+ adapter_foreach(adapter_service_insert, services->data);
+}
diff --git a/src/adapter.h b/src/adapter.h
index 32b12c0..a60a29f 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -79,6 +79,7 @@ struct smp_ltk_info {
int adapter_init(void);
void adapter_cleanup(void);
void adapter_shutdown(void);
+void adapter_start_sdp_server(uint16_t sdp_mtu, uint32_t sdp_flags);

struct btd_adapter *adapter_find(const bdaddr_t *sba);
struct btd_adapter *adapter_find_by_id(int id);
diff --git a/src/main.c b/src/main.c
index dc0478e..7e68d1e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -548,7 +548,7 @@ int main(int argc, char *argv[])
if (option_compat == TRUE)
sdp_flags |= SDP_SERVER_COMPAT;

- start_sdp_server(sdp_mtu, sdp_flags);
+ adapter_start_sdp_server(sdp_mtu, sdp_flags);

/* Loading plugins has to be done after D-Bus has been setup since
* the plugins might wanna expose some paths on the bus. However the
--
1.7.9.5


2013-08-28 10:04:06

by Frederic Danis

[permalink] [raw]
Subject: Re: [PATCH 4/4] sdp: Make sdp_record_remove to be handled by adapter

Hello Grzegorz,

On 26/08/2013 15:07, Grzegorz Kolodziejczyk wrote:
<snip>
> diff --git a/src/adapter.c b/src/adapter.c
> index 8e897ce..8a5398f 100644
> --- a/src/adapter.c
> +++ b/src/adapter.c
> @@ -6338,6 +6338,46 @@ int adapter_add_record_to_server(const bdaddr_t *device, sdp_record_t *rec)
> return chck;
> }
>
> +int adapter_remove_record_from_server(uint32_t handle)
> +{
> + int chck;
> + sdp_list_t *p;
> + sdp_record_t *r;
> + sdp_access_t *a;
> + sdp_record_t rh, ah;
> +
> + chck = remove_record_from_server(handle);
> +
> + if (chck == 0) {
> + // record_locate section

Please use C89 coding style for comments.

> + rh.handle = handle;
> + p = sdp_list_find(sdp_get_record_list(), &rh, record_sort);
> +
> + r = p->data;
> +
> + // access_locate section

idem here

> + ah.handle = handle;
> + p = sdp_list_find(sdp_get_access_list(), &ah, record_sort);
> +
> + if (p == NULL || p->data == NULL)
> + return 0;
> +
> + a = p->data;
> +
> + // remove from adapter services

and here

> + if (bacmp(&a->device, BDADDR_ANY) != 0) {
> + struct btd_adapter *adapter = adapter_find(&a->device);
> + if (adapter)
> + adapter_service_remove(adapter, r);
> + } else
> + adapter_foreach(adapter_service_remove, r);
> +
> + free(a);
> + }
> +
> + return chck;
> +}
> +

Regards

Fred

--
Frederic Danis Open Source Technology Center
[email protected] Intel Corporation


2013-08-28 10:02:18

by Frederic Danis

[permalink] [raw]
Subject: Re: [PATCH 3/4] sdp: Make sdp_record_add to be handled by adapter

Hello Grzegorz,

On 26/08/2013 15:07, Grzegorz Kolodziejczyk wrote:
<snip>
> diff --git a/src/adapter.c b/src/adapter.c
> index fd20d61..8e897ce 100644
> --- a/src/adapter.c
> +++ b/src/adapter.c
> @@ -6307,6 +6307,37 @@ void adapter_start_sdp_server(uint16_t sdp_mtu, uint32_t sdp_flags) {
> adapter_foreach(adapter_service_insert, services->data);
> }
>
> +int adapter_add_record_to_server(const bdaddr_t *device, sdp_record_t *rec)
> +{
> + int chck;
> + struct btd_adapter *adapter;
> +
> + chck = add_record_to_server(device, rec);
> +
> + // Check if rec handle error occure
> + //
> + // 0 - Ok
> + //
> + // handle == 0xffffffff
> + // -ENOSPC - next handle < 0x10000
> + //
> + // -EEXIST - record already exist

Please use C89 coding style for comments, like defined for the Linux
kernel. I.e.:
/*
* comment
* comment
*/

> + if (chck == 0) {
> + // Add rec for each adapter

idem here ( /* comment */ )

> + if (bacmp(device, BDADDR_ANY) == 0) {
> + adapter_foreach(adapter_service_insert, rec);
> + return chck;
> + }
> +
> + // Add rec for single adapter

and here

> + adapter = adapter_find(device);
> + if (adapter)
> + adapter_service_insert(adapter, rec);
> + }
> +
> + return chck;
> +}
> +

Regards

Fred

--
Frederic Danis Open Source Technology Center
[email protected] Intel Corporation


2013-08-28 10:01:37

by Frederic Danis

[permalink] [raw]
Subject: Re: [PATCH 1/4] sdp: Move sdp server init to adapter

Hello Grzegorz,

On 26/08/2013 15:07, Grzegorz Kolodziejczyk wrote:
> Change-Id: Ie8440d59a00750f3d8aec49924d6b209bc6ebe2f
> ---
> src/adapter.c | 11 +++++++++++
> src/adapter.h | 1 +
> src/main.c | 2 +-
> 3 files changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/src/adapter.c b/src/adapter.c
> index 17f5508..723e3a8 100644
> --- a/src/adapter.c
> +++ b/src/adapter.c
> @@ -6295,3 +6295,14 @@ void adapter_shutdown(void)
> if (!adapter_remaining)
> btd_exit();
> }
> +
> +void adapter_start_sdp_server(uint16_t sdp_mtu, uint32_t sdp_flags) {

Place opening brace of function at the beginning of the next line, please.

Regards

Fred

--
Frederic Danis Open Source Technology Center
[email protected] Intel Corporation