summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--network/common.c46
-rw-r--r--network/common.h4
-rw-r--r--network/connection.c18
-rw-r--r--network/manager.c25
4 files changed, 59 insertions, 34 deletions
diff --git a/network/common.c b/network/common.c
index 1649eb70..1be7bbe4 100644
--- a/network/common.c
+++ b/network/common.c
@@ -40,6 +40,10 @@
static int ctl;
+#define PANU_UUID "00001115-0000-1000-8000-00805f9b34fb"
+#define NAP_UUID "00001116-0000-1000-8000-00805f9b34fb"
+#define GN_UUID "00001117-0000-1000-8000-00805f9b34fb"
+
/* Compatibility with old ioctls */
#define OLD_BNEPCONADD 1
#define OLD_BNEPCONDEL 2
@@ -52,32 +56,44 @@ static unsigned long bnepgetconnlist;
static unsigned long bnepgetconninfo;
static struct {
- char *str;
- uint16_t uuid;
+ const char *name; /* Friendly name */
+ const char *uuid128; /* UUID 128 */
+ uint16_t id; /* Service class identifier */
} __svc[] = {
- { "PANU", BNEP_SVC_PANU },
- { "NAP", BNEP_SVC_NAP },
- { "GN", BNEP_SVC_GN },
+ { "PANU", PANU_UUID, BNEP_SVC_PANU },
+ { "GN", GN_UUID, BNEP_SVC_GN },
+ { "NAP", NAP_UUID, BNEP_SVC_NAP },
{ NULL }
};
-int bnep_str2svc(char *svc, uint16_t *uuid)
+uint16_t bnep_service_id(const char *svc)
{
int i;
- for (i = 0; __svc[i].str; i++)
- if (!strcasecmp(svc, __svc[i].str)) {
- *uuid = __svc[i].uuid;
- return 0;
+
+ /* Friendly service name */
+ for (i = 0; __svc[i].name; i++)
+ if (!strcasecmp(svc, __svc[i].name)) {
+ return __svc[i].id;
+ }
+
+ /* UUID 128 string */
+ for (i = 0; __svc[i].uuid128; i++)
+ if (!strcasecmp(svc, __svc[i].uuid128)) {
+ return __svc[i].id;
}
- return -1;
+
+ /* FIXME: Missing HEX string verification */
+
+ return 0;
}
-char *bnep_svc2str(uint16_t uuid)
+const char *bnep_uuid(uint16_t id)
{
int i;
- for (i = 0; __svc[i].str; i++)
- if (__svc[i].uuid == uuid)
- return __svc[i].str;
+
+ for (i = 0; __svc[i].uuid128; i++)
+ if (__svc[i].id == id)
+ return __svc[i].uuid128;
return NULL;
}
diff --git a/network/common.h b/network/common.h
index 11e0b77b..7dfc920a 100644
--- a/network/common.h
+++ b/network/common.h
@@ -24,8 +24,8 @@
int bnep_init(void);
int bnep_cleanup(void);
-int bnep_str2svc(char *svc, uint16_t *uuid);
-char *bnep_svc2str(uint16_t uuid);
+uint16_t bnep_service_id(const char *svc);
+const char *bnep_uuid(uint16_t uuid);
int bnep_kill_connection(const char *addr);
int bnep_kill_all_connections(void);
diff --git a/network/connection.c b/network/connection.c
index 12a563ad..97034ad6 100644
--- a/network/connection.c
+++ b/network/connection.c
@@ -50,10 +50,10 @@
struct network_conn {
DBusConnection *conn;
- char *raddr;
- char *path;
- char *dev;
- uint16_t uuid;
+ char *raddr; /* Remote Bluetooth Address */
+ char *path; /* D-Bus path */
+ char *dev; /* BNEP interface name */
+ uint16_t id; /* Service Class Identifier */
gboolean up;
};
@@ -149,7 +149,7 @@ int bnep_create_connection(int sk, struct network_conn *nc)
req->ctrl = BNEP_SETUP_CONN_REQ;
req->uuid_size = 2; /* 16bit UUID */
s = (void *) req->service;
- s->dst = htons(nc->uuid);
+ s->dst = htons(nc->id);
s->src = htons(BNEP_SVC_PANU);
if (send(sk, pkt, sizeof(*req) + sizeof(*s), 0) != -1) {
@@ -182,15 +182,15 @@ static DBusHandlerResult get_uuid(DBusConnection *conn, DBusMessage *msg,
void *data)
{
struct network_conn *nc = data;
- char *svc;
+ const char *uuid;
DBusMessage *reply;
- svc = bnep_svc2str(nc->uuid);
+ uuid = bnep_uuid(nc->id);
reply = dbus_message_new_method_return(msg);
if (!reply)
return DBUS_HANDLER_RESULT_NEED_MEMORY;
- dbus_message_append_args(reply, DBUS_TYPE_STRING, &svc,
+ dbus_message_append_args(reply, DBUS_TYPE_STRING, &uuid,
DBUS_TYPE_INVALID);
return send_message_and_unref(conn, reply);
@@ -433,7 +433,7 @@ int connection_register(DBusConnection *conn, const char *path,
nc->path = g_strdup(path);
nc->raddr = g_strdup(addr);
/* FIXME: Check uuid format */
- bnep_str2svc(uuid, &nc->uuid);
+ nc->id = bnep_service_id(uuid);
/* FIXME: Check for device */
nc->dev = g_new(char, 16);
snprintf(nc->dev, 16, "bnep%d", bnep++);
diff --git a/network/manager.c b/network/manager.c
index dde8c908..ff4d05d4 100644
--- a/network/manager.c
+++ b/network/manager.c
@@ -28,6 +28,7 @@
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
+#include <bluetooth/bnep.h>
#include <glib.h>
@@ -120,26 +121,32 @@ static DBusHandlerResult create_server(DBusConnection *conn,
{
struct manager *mgr = data;
DBusError derr;
- const char *uuid;
+ const char *str;
char *path;
+ uint16_t id;
dbus_error_init(&derr);
if (!dbus_message_get_args(msg, &derr,
- DBUS_TYPE_STRING, &uuid,
+ DBUS_TYPE_STRING, &str,
DBUS_TYPE_INVALID)) {
err_invalid_args(conn, msg, derr.message);
dbus_error_free(&derr);
return DBUS_HANDLER_RESULT_HANDLED;
}
+ id = bnep_service_id(str);
+ if ((id != BNEP_SVC_GN) && (id != BNEP_SVC_NAP))
+ return err_invalid_args(conn, msg, "Not supported");
+
path = g_new0(char, 32);
- snprintf(path, 32, NETWORK_PATH "/server/%s", uuid);
+ snprintf(path, 32, NETWORK_PATH "/server/%X", id);
/* Path already registered */
if (g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp))
- return create_path(conn, msg, path, NULL);
+ return create_path(conn, msg, path, NULL); /* Return already exist error */
- if (server_register(conn, path, uuid) == -1) {
+ /* FIXME: define which type should be used -- string/uuid str/uui128 */
+ if (server_register(conn, path, str) == -1) {
err_failed(conn, msg, "D-Bus path registration failed");
g_free(path);
return DBUS_HANDLER_RESULT_HANDLED;
@@ -217,23 +224,25 @@ static DBusHandlerResult create_connection(DBusConnection *conn,
static int uid = 0;
DBusError derr;
const char *addr;
- const char *uuid;
+ const char *str;
char *path;
dbus_error_init(&derr);
if (!dbus_message_get_args(msg, &derr,
DBUS_TYPE_STRING, &addr,
- DBUS_TYPE_STRING, &uuid,
+ DBUS_TYPE_STRING, &str,
DBUS_TYPE_INVALID)) {
err_invalid_args(conn, msg, derr.message);
dbus_error_free(&derr);
return DBUS_HANDLER_RESULT_HANDLED;
}
+ /* FIXME: Check for supported/implemented client connection */
+
path = g_new0(char, 32);
snprintf(path, 32, NETWORK_PATH "/connection%d", uid++);
- if (connection_register(conn, path, addr, uuid) == -1) {
+ if (connection_register(conn, path, addr, str) == -1) {
err_failed(conn, msg, "D-Bus path registration failed");
g_free(path);
return DBUS_HANDLER_RESULT_HANDLED;