summaryrefslogtreecommitdiff
path: root/android/pan.c
diff options
context:
space:
mode:
authorSzymon Janc <szymon.janc@tieto.com>2014-02-06 16:28:38 +0100
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2014-02-07 11:21:22 +0200
commit375bed1c4df456c1cf675ffb6458b637c00abe46 (patch)
treefc4d624c0b3234396c5ef392065ce2595277a26a /android/pan.c
parent29bf1a3aab5429d382848d4159d869c72ae1cb0a (diff)
downloadbluez-375bed1c4df456c1cf675ffb6458b637c00abe46.tar.gz
android/pan: Fix unregistering NAP bridge
This fix not removing NAP bridge in case of error or last device disconnect.
Diffstat (limited to 'android/pan.c')
-rw-r--r--android/pan.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/android/pan.c b/android/pan.c
index d010e091a..0d6adafdb 100644
--- a/android/pan.c
+++ b/android/pan.c
@@ -72,11 +72,14 @@ struct pan_device {
static struct {
uint32_t record_id;
GIOChannel *io;
+ bool bridge;
} nap_dev = {
.record_id = 0,
.io = NULL,
+ .bridge = false,
};
+
static int set_forward_delay(void)
{
int fd, ret;
@@ -103,6 +106,9 @@ static int nap_create_bridge(void)
DBG("%s", BNEP_BRIDGE);
+ if (nap_dev.bridge)
+ return 0;
+
sk = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
if (sk < 0)
return -EOPNOTSUPP;
@@ -121,6 +127,8 @@ static int nap_create_bridge(void)
close(sk);
+ nap_dev.bridge = err == 0;
+
return err;
}
@@ -130,6 +138,9 @@ static int nap_remove_bridge(void)
DBG("%s", BNEP_BRIDGE);
+ if (!nap_dev.bridge)
+ return 0;
+
sk = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
if (sk < 0)
return -EOPNOTSUPP;
@@ -140,6 +151,8 @@ static int nap_remove_bridge(void)
if (err < 0)
return -EOPNOTSUPP;
+ nap_dev.bridge = false;
+
return 0;
}
@@ -175,8 +188,10 @@ static void pan_device_remove(struct pan_device *dev)
{
devices = g_slist_remove(devices, dev);
- if (g_slist_length(devices) == 0)
+ if (g_slist_length(devices) == 0) {
local_role = HAL_PAN_ROLE_NONE;
+ nap_remove_bridge();
+ }
pan_device_free(dev);
}
@@ -455,8 +470,12 @@ static gboolean nap_setup_cb(GIOChannel *chan, GIOCondition cond,
goto failed;
}
+ if (nap_create_bridge() < 0)
+ goto failed;
+
if (bnep_server_add(sk, dst_role, BNEP_BRIDGE, dev->iface,
&dev->dst) < 0) {
+ nap_remove_bridge();
error("server_connadd failed");
rsp = BNEP_CONN_NOT_ALLOWED;
goto failed;
@@ -557,14 +576,9 @@ static void destroy_nap_device(void)
static int register_nap_server(void)
{
GError *gerr = NULL;
- int err;
DBG("");
- err = nap_create_bridge();
- if (err < 0)
- return err;
-
nap_dev.io = bt_io_listen(NULL, nap_confirm_cb, NULL, NULL, &gerr,
BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
BT_IO_OPT_PSM, BNEP_PSM,