{
struct wifi_data *wifi = user_data;
- DBG("result %d ifname %s", result,
- g_supplicant_interface_get_ifname(interface));
+ DBG("result %d ifname %s, wifi %p", result,
+ g_supplicant_interface_get_ifname(interface),
+ wifi);
- if (result < 0)
+ if (result < 0 || wifi == NULL)
return;
wifi->interface = interface;
{
struct wifi_data *wifi = user_data;
- DBG("result %d", result);
+ DBG("result %d wifi %p", result, wifi);
- if (result < 0)
+ if (result < 0 || wifi == NULL)
return;
wifi->interface = NULL;
connman_device_reset_scanning(device);
else
connman_device_set_scanning(device, FALSE);
+ connman_device_unref(device);
}
static int wifi_scan(struct connman_device *device)
if (wifi->tethering == TRUE)
return 0;
+ connman_device_ref(device);
ret = g_supplicant_interface_scan(wifi->interface, scan_callback,
device);
if (ret == 0)
connman_device_set_scanning(device, TRUE);
+ else
+ connman_device_unref(device);
return ret;
}
static void network_remove(struct connman_network *network)
{
+ struct connman_device *device = connman_network_get_device(network);
+ struct wifi_data *wifi;
+
DBG("network %p", network);
+
+ wifi = connman_device_get_data(device);
+ if (wifi == NULL)
+ return;
+
+ if (wifi->network != network)
+ return;
+
+ wifi->network = NULL;
}
static void connect_callback(int result, GSupplicantInterface *interface,
static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
{
- const char *security, *passphrase;
+ const char *security, *passphrase, *agent_passphrase;
memset(ssid, 0, sizeof(*ssid));
ssid->mode = G_SUPPLICANT_MODE_INFRA;
ssid->security = network_security(security);
passphrase = connman_network_get_string(network,
"WiFi.Passphrase");
- if (passphrase == NULL || strlen(passphrase) == 0)
- ssid->passphrase = NULL;
- else
+ if (passphrase == NULL || strlen(passphrase) == 0) {
+
+ /* Use agent provided passphrase as a fallback */
+ agent_passphrase = connman_network_get_string(network,
+ "WiFi.AgentPassphrase");
+
+ if (agent_passphrase == NULL || strlen(agent_passphrase) == 0)
+ ssid->passphrase = NULL;
+ else
+ ssid->passphrase = agent_passphrase;
+ } else
ssid->passphrase = passphrase;
ssid->eap = connman_network_get_string(network, "WiFi.EAP");
ssid->passphrase);
/* We must have an identity for both PEAP and TLS */
ssid->identity = connman_network_get_string(network, "WiFi.Identity");
+
+ /* Use agent provided identity as a fallback */
+ if (ssid->identity == NULL || strlen(ssid->identity) == 0)
+ ssid->identity = connman_network_get_string(network,
+ "WiFi.AgentIdentity");
+
ssid->ca_cert_path = connman_network_get_string(network,
"WiFi.CACertFile");
ssid->client_cert_path = connman_network_get_string(network,
static void scan_started(GSupplicantInterface *interface)
{
- struct wifi_data *wifi;
-
DBG("");
-
- wifi = g_supplicant_interface_get_data(interface);
-
- if (wifi == NULL)
- return;
}
static void scan_finished(GSupplicantInterface *interface)
{
- struct wifi_data *wifi;
-
DBG("");
-
- wifi = g_supplicant_interface_get_data(interface);
-
- if (wifi == NULL)
- return;
}
static unsigned char calculate_strength(GSupplicantNetwork *supplicant_network)
calculate_strength(supplicant_network));
connman_network_set_bool(network, "WiFi.WPS", wps);
+ connman_network_set_frequency(network,
+ g_supplicant_network_get_frequency(supplicant_network));
+
connman_network_set_available(network, TRUE);
if (ssid != NULL)
connman_network_unref(connman_network);
}
+static void network_changed(GSupplicantNetwork *network, const char *property)
+{
+ GSupplicantInterface *interface;
+ struct wifi_data *wifi;
+ const char *name, *identifier;
+ struct connman_network *connman_network;
+
+ interface = g_supplicant_network_get_interface(network);
+ wifi = g_supplicant_interface_get_data(interface);
+ identifier = g_supplicant_network_get_identifier(network);
+ name = g_supplicant_network_get_name(network);
+
+ DBG("name %s", name);
+
+ if (wifi == NULL)
+ return;
+
+ connman_network = connman_device_get_network(wifi->device, identifier);
+ if (connman_network == NULL)
+ return;
+
+ if (g_str_equal(property, "Signal") == TRUE) {
+ connman_network_set_strength(connman_network,
+ calculate_strength(network));
+ connman_network_update(connman_network);
+ }
+}
+
static void debug(const char *str)
{
if (getenv("CONNMAN_SUPPLICANT_DEBUG"))
.scan_finished = scan_finished,
.network_added = network_added,
.network_removed = network_removed,
+ .network_changed = network_changed,
.debug = debug,
};