diff options
author | Szymon Janc <szymon.janc@tieto.com> | 2014-02-06 16:28:38 +0100 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2014-02-07 11:21:22 +0200 |
commit | 375bed1c4df456c1cf675ffb6458b637c00abe46 (patch) | |
tree | fc4d624c0b3234396c5ef392065ce2595277a26a /android/pan.c | |
parent | 29bf1a3aab5429d382848d4159d869c72ae1cb0a (diff) | |
download | bluez-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.c | 26 |
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, |