summaryrefslogtreecommitdiff
path: root/plugins/bluetooth.c
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2010-11-08 23:56:54 +0100
committerSamuel Ortiz <sameo@linux.intel.com>2010-11-08 23:56:54 +0100
commitb8015e1eddca7c246826f74e6a06fb3da1b011d4 (patch)
tree6ebafc0a2a6ee987601af51ec34a9b903e0762c4 /plugins/bluetooth.c
parenteb93dcfa05a8ddcaea9d80b990f3055c1f4e0edf (diff)
downloadconnman-b8015e1eddca7c246826f74e6a06fb3da1b011d4.tar.gz
connman-b8015e1eddca7c246826f74e6a06fb3da1b011d4.tar.bz2
connman-b8015e1eddca7c246826f74e6a06fb3da1b011d4.zip
bluetooth: Implement tethering hook
Diffstat (limited to 'plugins/bluetooth.c')
-rw-r--r--plugins/bluetooth.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/plugins/bluetooth.c b/plugins/bluetooth.c
index b34ca1c3..9a73e96f 100644
--- a/plugins/bluetooth.c
+++ b/plugins/bluetooth.c
@@ -44,6 +44,7 @@
#define BLUEZ_ADAPTER_INTERFACE BLUEZ_SERVICE ".Adapter"
#define BLUEZ_DEVICE_INTERFACE BLUEZ_SERVICE ".Device"
#define BLUEZ_NETWORK_INTERFACE BLUEZ_SERVICE ".Network"
+#define BLUEZ_NETWORK_SERVER BLUEZ_SERVICE ".NetworkServer"
#define LIST_ADAPTERS "ListAdapters"
#define ADAPTER_ADDED "AdapterAdded"
@@ -57,6 +58,9 @@
#define CONNECT "Connect"
#define DISCONNECT "Disconnect"
+#define REGISTER "Register"
+#define UNREGISTER "Unregister"
+
#define UUID_NAP "00001116-0000-1000-8000-00805f9b34fb"
#define TIMEOUT 5000
@@ -942,9 +946,117 @@ static void tech_remove(struct connman_technology *technology)
{
}
+static void server_register_reply(DBusPendingCall *call, void *user_data)
+{
+ DBusError error;
+ DBusMessage *reply;
+
+ DBG("");
+
+ reply = dbus_pending_call_steal_reply(call);
+
+ dbus_error_init(&error);
+
+ if (dbus_set_error_from_message(&error, reply) == TRUE) {
+ connman_error("%s", error.message);
+ dbus_error_free(&error);
+ dbus_message_unref(reply);
+ dbus_pending_call_unref(call);
+ return;
+ }
+
+ dbus_message_unref(reply);
+ dbus_pending_call_unref(call);
+
+}
+
+static void server_register(const char *path, const char *uuid,
+ const char *bridge, connman_bool_t enabled)
+{
+ DBusMessage *message;
+ DBusPendingCall *call;
+ char *command;
+
+ DBG("path %s enabled %d", path, enabled);
+
+ command = enabled ? REGISTER : UNREGISTER;
+
+ message = dbus_message_new_method_call(BLUEZ_SERVICE, path,
+ BLUEZ_NETWORK_SERVER, command);
+ if (message == NULL)
+ return;
+
+ dbus_message_set_auto_start(message, FALSE);
+
+ dbus_message_append_args(message, DBUS_TYPE_STRING, &uuid,
+ DBUS_TYPE_INVALID);
+
+ if (enabled == TRUE)
+ dbus_message_append_args(message, DBUS_TYPE_STRING, &bridge,
+ DBUS_TYPE_INVALID);
+
+ if (dbus_connection_send_with_reply(connection, message,
+ &call, TIMEOUT) == FALSE) {
+ connman_error("Failed to enable PAN server");
+ dbus_message_unref(message);
+ return;
+ }
+
+ if (call == NULL) {
+ connman_error("D-Bus connection not available");
+ dbus_message_unref(message);
+ return;
+ }
+
+ dbus_pending_call_set_notify(call, server_register_reply,
+ g_strdup(path), g_free);
+
+ dbus_message_unref(message);
+}
+
+static void enable_nap(gpointer key, gpointer value,
+ gpointer user_data)
+{
+ struct connman_device *device = value;
+ const char *bridge = user_data;
+ const char *path;
+
+ path = connman_device_get_string(device, "Path");
+
+ server_register(path, "nap", bridge, TRUE);
+}
+
+static void disable_nap(gpointer key, gpointer value,
+ gpointer user_data)
+{
+ struct connman_device *device = value;
+ const char *bridge = user_data;
+ const char *path;
+
+ path = connman_device_get_string(device, "Path");
+
+ server_register(path, "nap", bridge, FALSE);
+}
+
static int tech_set_tethering(struct connman_technology *technology,
const char *bridge, connman_bool_t enabled)
{
+ char *bridge_name = g_strdup(bridge);
+
+ DBG("bridge %s", bridge);
+
+ if (bridge_name == NULL)
+ return -ENOMEM;
+
+ if (enabled)
+ g_hash_table_foreach(bluetooth_devices,
+ enable_nap, bridge_name);
+ else
+ g_hash_table_foreach(bluetooth_devices,
+ disable_nap, bridge_name);
+
+ g_free(bridge_name);
+
return 0;
}