aboutsummaryrefslogtreecommitdiff
path: root/network
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2010-07-13 10:30:36 -0300
committerMarcel Holtmann <marcel@holtmann.org>2010-07-13 10:30:36 -0300
commit4c421dbfdbf061a881a165f14963510292c07c53 (patch)
tree9d3d59ab5c54f97b227c8d1a0e299e865c14ab34 /network
parentd078b85e5737462abec2318f6078c97ed2cd30e0 (diff)
downloadbluez-4c421dbfdbf061a881a165f14963510292c07c53.tar.gz
Add support for starting/stopping network NAP server
Diffstat (limited to 'network')
-rw-r--r--network/server.c68
1 files changed, 53 insertions, 15 deletions
diff --git a/network/server.c b/network/server.c
index 3b062057..d356c305 100644
--- a/network/server.c
+++ b/network/server.c
@@ -75,7 +75,7 @@ struct network_server {
bdaddr_t src; /* Bluetooth Local Address */
char *iface; /* DBus interface */
char *name; /* Server service name */
- char *range; /* IP Address range */
+ char *bridge; /* Bridge name */
uint32_t record_id; /* Service record id */
uint16_t id; /* Service class identifier */
GSList *sessions; /* Active connections */
@@ -270,7 +270,6 @@ static int server_connadd(struct network_server *ns,
struct network_session *session,
uint16_t dst_role)
{
- const char *bridge = "tether";
char devname[16];
int err, nsk;
@@ -284,9 +283,9 @@ static int server_connadd(struct network_server *ns,
info("Added new connection: %s", devname);
- if (bnep_add_to_bridge(devname, bridge) < 0) {
+ if (bnep_add_to_bridge(devname, ns->bridge) < 0) {
error("Can't add %s to the bridge %s: %s(%d)",
- devname, bridge, strerror(errno), errno);
+ devname, ns->bridge, strerror(errno), errno);
return -EPERM;
}
@@ -413,6 +412,16 @@ static gboolean bnep_setup(GIOChannel *chan,
goto reply;
}
+ if (!ns->record_id) {
+ error("Service record not available");
+ goto reply;
+ }
+
+ if (!ns->bridge) {
+ error("Bridge interface not configured");
+ goto reply;
+ }
+
if (server_connadd(ns, na->setup, dst_role) < 0)
goto reply;
@@ -564,26 +573,60 @@ static inline DBusMessage *invalid_arguments(DBusMessage *msg,
static DBusMessage *register_server(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- //struct network_server *ns = data;
+ struct network_server *ns = data;
DBusMessage *reply;
+ const char *uuid, *bridge;
+
+ if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &uuid,
+ DBUS_TYPE_STRING, &bridge, DBUS_TYPE_INVALID))
+ return NULL;
+
+ if (g_strcmp0(uuid, "nap"))
+ return failed(msg, "Invalid UUID");
+
+ if (ns->record_id)
+ return failed(msg, "Already registered");
reply = dbus_message_new_method_return(msg);
if (!reply)
return NULL;
+ ns->record_id = register_server_record(ns);
+ if (!ns->record_id)
+ return failed(msg, "SDP record registration failed");
+
+ g_free(ns->bridge);
+ ns->bridge = g_strdup(bridge);
+
return reply;
}
static DBusMessage *unregister_server(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- //struct network_server *ns = data;
+ struct network_server *ns = data;
DBusMessage *reply;
+ const char *uuid;
+
+ if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &uuid,
+ DBUS_TYPE_INVALID))
+ return NULL;
+
+ if (g_strcmp0(uuid, "nap"))
+ return failed(msg, "Invalid UUID");
reply = dbus_message_new_method_return(msg);
if (!reply)
return NULL;
+ if (ns->record_id) {
+ remove_record_from_server(ns->record_id);
+ ns->record_id = 0;
+ }
+
+ g_free(ns->bridge);
+ ns->bridge = NULL;
+
return reply;
}
@@ -608,14 +651,9 @@ static void server_free(struct network_server *ns)
if (ns->record_id)
remove_record_from_server(ns->record_id);
- if (ns->iface)
- g_free(ns->iface);
-
- if (ns->name)
- g_free(ns->name);
-
- if (ns->range)
- g_free(ns->range);
+ g_free(ns->iface);
+ g_free(ns->name);
+ g_free(ns->bridge);
if (ns->sessions) {
g_slist_foreach(ns->sessions, (GFunc) session_free, NULL);
@@ -721,7 +759,7 @@ int server_register(struct btd_adapter *adapter)
adapter_get_address(adapter, &ns->src);
ns->id = id;
ns->na = na;
- ns->record_id = register_server_record(ns);
+ ns->record_id = 0;
na->servers = g_slist_append(na->servers, ns);
DBG("Registered interface %s on path %s", ns->iface, path);