static void pan_create_nap(struct bluetooth_pan *pan) { struct connman_device *device; const char* role; const char *adapter; role = proxy_get_role(pan->btdevice_proxy); if (!role) { pan_remove_nap(pan); return; } adapter = proxy_get_string(pan->btdevice_proxy, "Adapter"); if (!adapter) return; device = g_hash_table_lookup(devices, adapter); if (!device || !connman_device_get_powered(device)) return; if (!pan->network) { const char *address; char ident[BLUETOOTH_ADDR_LEN * 2 + 1]; const char *name, *path; address = proxy_get_string(pan->btdevice_proxy, "Address"); if (!address) { connman_warn("Bluetooth device address missing"); return; } address2ident(address, ident); pan->network = connman_network_create(ident, CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN); name = proxy_get_string(pan->btdevice_proxy, "Alias"); path = g_dbus_proxy_get_path(pan->btnetwork_proxy); DBG("network %p %s %s", pan->network, path, name); if (!pan->network) { connman_warn("Bluetooth network %s creation failed", path); return; } connman_network_set_data(pan->network, pan); connman_network_set_name(pan->network, name); connman_network_set_group(pan->network, ident); } pan->pan_role = role; connman_device_add_network(device, pan->network); if (pan_connect(pan, NULL)) DBG("network %p already connected", pan->network); }
static void pan_connect_cb(DBusMessage *message, void *user_data) { const char *path = user_data; const char *iface = NULL; struct bluetooth_pan *pan; DBusMessageIter iter; pan = g_hash_table_lookup(networks, path); if (pan == NULL) { DBG("network already removed"); return; } if (dbus_message_get_type(message) == DBUS_MESSAGE_TYPE_ERROR) { const char *dbus_error = dbus_message_get_error_name(message); DBG("network %p %s", pan->network, dbus_error); if (strcmp(dbus_error, "org.bluez.Error.AlreadyConnected") != 0) { connman_network_set_error(pan->network, CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL); return; } } else { if (dbus_message_iter_init(message, &iter) == TRUE && dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING) dbus_message_iter_get_basic(&iter, &iface); } DBG("network %p interface %s", pan->network, iface); pan_connect(pan, iface); }
bool pan_disconnect() { int error; if (!pan_connect()) { return false; } CALL_AND_WAIT(error = pan_interface->disconnect(&bt_remote_bdaddr), pan_connection_state_changed); TASSERT(error == BT_STATUS_SUCCESS, "Error disconnecting from remote host: %d", error); TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error disconnecting from BT device: %d", pan_get_error()); TASSERT(pan_get_connection_state() == BTPAN_STATE_DISCONNECTING, "Invalid PAN state after disconnect: %d", pan_get_connection_state()); WAIT(pan_connection_state_changed); TASSERT(pan_get_error() == BT_STATUS_SUCCESS, "Error disconnecting from BT device: %d", pan_get_error()); TASSERT(pan_get_connection_state() == BTPAN_STATE_DISCONNECTED, "Invalid PAN state after disconnect: %d", pan_get_connection_state()); return true; }