return 0;
}
+static char *get_bssid(struct connman_device *device)
+{
+ char *bssid;
+ unsigned char ioctl_bssid[ETH_ALEN];
+ int fd, ret;
+ struct iwreq wrq;
+
+ if (connman_device_get_type(device) != CONNMAN_DEVICE_TYPE_WIFI)
+ return NULL;
+
+ fd = socket(PF_INET, SOCK_DGRAM, 0);
+ if (fd < 0)
+ return NULL;
+
+ memset(&wrq, 0, sizeof(wrq));
+ strncpy(wrq.ifr_name, connman_device_get_interface(device), IFNAMSIZ);
+
+ ret = ioctl(fd, SIOCGIWAP, &wrq);
+ close(fd);
+ if (ret != 0)
+ return NULL;
+
+ memcpy(ioctl_bssid, wrq.u.ap_addr.sa_data, ETH_ALEN);
+
+ bssid = g_try_malloc0(13);
+ if (bssid == NULL)
+ return NULL;
+
+ snprintf(bssid, 13, "%02x%02x%02x%02x%02x%02x",
+ ioctl_bssid[0], ioctl_bssid[1],
+ ioctl_bssid[2], ioctl_bssid[3],
+ ioctl_bssid[4], ioctl_bssid[5]);
+
+ return bssid;
+}
+
+
static void state_change(struct supplicant_task *task, DBusMessage *msg)
{
DBusError error;
switch (task->state) {
case WPA_COMPLETED:
/* carrier on */
+ if (connman_network_get_group(task->network) == NULL) {
+ const char *name, *mode, *security;
+ char *group, *bssid;
+
+ /*
+ * This is a hidden network, we need to set its
+ * group based on the BSSID we just joined.
+ */
+ bssid = get_bssid(task->device);
+
+ name = connman_network_get_string(task->network,
+ "Name");
+ mode = connman_network_get_string(task->network,
+ "WiFi.Mode");
+ security = connman_network_get_string(task->network,
+ "WiFi.Security");
+
+ if (bssid && name && mode && security) {
+ group = build_group(bssid, name, NULL, 0,
+ mode, security);
+ connman_network_set_group(task->network, group);
+ }
+
+ g_free(bssid);
+ g_free(group);
+ }
connman_network_set_connected(task->network, TRUE);
connman_device_set_scanning(task->device, FALSE);
break;